WeightedPathAsset class

Пакет: com.hypixel.hytale.builtin.hytalegenerator.assets.props.prefabprop

Файл: com/hypixel/hytale/builtin/hytalegenerator/assets/props/prefabprop/PrefabPropAsset.java

implements: JsonAssetWithMap<String, DefaultAssetMap<String, PrefabPropAsset.WeightedPathAsset>>

Поля (5)

МодификаторыТипИмя
public static final AssetBuilderCodec<String, PrefabPropAsset.WeightedPathAsset> CODEC
private AssetExtraInfo.Data data
private String id
private String path
private double weight

Методы (1)

МодификаторыВозвратСигнатура
public String getIdpublic String getId()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.assets.props.prefabprop;

class="kw">import com.hypixel.hytale.assetstore.AssetExtraInfo;
class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetBuilderCodec;
class="kw">import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.JsonAssetWithMap;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.BlockMask;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.LoggerUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.WeightedMap;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.blockmask.BlockMaskAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.patterns.ConstantPatternAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.patterns.PatternAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.props.PropAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.props.prefabprop.directionality.DirectionalityAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.scanners.DirectScannerAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.assets.scanners.ScannerAsset;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.patterns.ConstantPattern;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.patterns.Pattern;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.EmptyProp;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.Prop;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.directionality.Directionality;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.MoldingDirection;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabMoldingConfiguration;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.scanners.EmptyScanner;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.scanners.Scanner;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.common.util.ExceptionUtil;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.IPrefabBuffer;
class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Comparator;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Set;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class PrefabPropAsset class="kw">extends PropAsset {
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<PrefabPropAsset> CODEC = BuilderCodec.builder(PrefabPropAsset.class, PrefabPropAsset::new, PropAsset.ABSTRACT_CODEC)
      .append(
         new KeyedCodec<>("WeightedPrefabPaths", new ArrayCodec<>(PrefabPropAsset.WeightedPathAsset.CODEC, PrefabPropAsset.WeightedPathAsset[]::new), true),
         (var0, var1) -> var0.weightedPrefabPathAssets = var1,
         var0 -> var0.weightedPrefabPathAssets
      )
      .add()
      .append(new KeyedCodec<>("LegacyPath", Codec.BOOLEAN, false), (var0, var1) -> var0.legacyPath = var1, var0 -> var0.legacyPath)
      .add()
      .append(
         new KeyedCodec<>("Directionality", DirectionalityAsset.CODEC, true), (var0, var1) -> var0.directionalityAsset = var1, var0 -> var0.directionalityAsset
      )
      .add()
      .append(new KeyedCodec<>("Scanner", ScannerAsset.CODEC, true), (var0, var1) -> var0.scannerAsset = var1, var0 -> var0.scannerAsset)
      .add()
      .append(new KeyedCodec<>("BlockMask", BlockMaskAsset.CODEC, false), (var0, var1) -> var0.blockMaskAsset = var1, var0 -> var0.blockMaskAsset)
      .add()
      .append(
         new KeyedCodec<>("MoldingDirection", MoldingDirection.CODEC, false),
         (var0, var1) -> var0.moldingDirectionName = var1,
         var0 -> var0.moldingDirectionName
      )
      .add()
      .append(new KeyedCodec<>("MoldingPattern", PatternAsset.CODEC, false), (var0, var1) -> var0.moldingPatternAsset = var1, var0 -> var0.moldingPatternAsset)
      .add()
      .append(new KeyedCodec<>("MoldingScanner", ScannerAsset.CODEC, false), (var0, var1) -> var0.moldingScannerAsset = var1, var0 -> var0.moldingScannerAsset)
      .add()
      .append(new KeyedCodec<>("MoldingChildren", Codec.BOOLEAN, false), (var0, var1) -> var0.moldChildren = var1, var0 -> var0.moldChildren)
      .add()
      .append(new KeyedCodec<>("LoadEntities", Codec.BOOLEAN, false), (var0, var1) -> var0.loadEntities = var1, var0 -> var0.loadEntities)
      .add()
      .build();
   class="kw">private PrefabPropAsset.WeightedPathAsset[] weightedPrefabPathAssets = new PrefabPropAsset.WeightedPathAsset[0];
   class="kw">private DirectionalityAsset directionalityAsset = null;
   class="kw">private ScannerAsset scannerAsset = null;
   class="kw">private boolean legacyPath = false;
   class="kw">private boolean loadEntities = true;
   class="kw">private BlockMaskAsset blockMaskAsset = new BlockMaskAsset();
   class="kw">private MoldingDirection moldingDirectionName = MoldingDirection.NONE;
   class="kw">private ScannerAsset moldingScannerAsset = new DirectScannerAsset();
   class="kw">private PatternAsset moldingPatternAsset = new ConstantPatternAsset();
   class="kw">private boolean moldChildren = false;

   class="kw">public PrefabPropAsset() {
   }

   @Nonnull
   @Override
   class="kw">public Prop build(@Nonnull PropAsset.Argument var1) {
      if (!super.skip() && this.weightedPrefabPathAssets.length != 0) {
         WeightedMap var2 = new WeightedMap<>();

         for (PrefabPropAsset.WeightedPathAsset var6 : this.weightedPrefabPathAssets) {
            List var7 = this.loadPrefabBuffersFrom(var6.path);
            if (var7 != null && !var7.isEmpty()) {
               var2.add(var7, var6.weight);
            }
         }

         if (var2.size() == 0) {
            class="kw">return EmptyProp.INSTANCE;
         }

         if (this.scannerAsset != null && this.directionalityAsset != null) {
            BlockMask var10 = this.blockMaskAsset.build(var1.materialCache);
            Scanner var11 = this.scannerAsset.build(ScannerAsset.argumentFrom(var1));
            Directionality var12 = this.directionalityAsset.build(DirectionalityAsset.argumentFrom(var1));
            MoldingDirection var13 = this.moldingDirectionName;
            PrefabMoldingConfiguration var14 = null;
            if (var13 != MoldingDirection.DOWN && var13 != MoldingDirection.UP) {
               var14 = PrefabMoldingConfiguration.none();
            } else {
               Scanner var8 = this.moldingScannerAsset == null ? EmptyScanner.INSTANCE : this.moldingScannerAsset.build(ScannerAsset.argumentFrom(var1));
               Pattern var9 = this.moldingPatternAsset == null
                  ? ConstantPattern.INSTANCE_FALSE
                  : this.moldingPatternAsset.build(PatternAsset.argumentFrom(var1));
               var14 = new PrefabMoldingConfiguration(var8, var9, var13, this.moldChildren);
            }

            class="kw">return new PrefabProp(var2, var11, var12, var1.materialCache, var10, var14, this::loadPrefabBuffersFrom, var1.parentSeed, this.loadEntities);
         } else {
            class="kw">return new com.hypixel.hytale.builtin.hytalegenerator.props.PrefabProp(var2, var1.materialCache, var1.parentSeed, this::loadPrefabBuffersFrom);
         }
      } else {
         class="kw">return EmptyProp.INSTANCE;
      }
   }

   @Nullable
   class="kw">private List<IPrefabBuffer> loadPrefabBuffersFrom(@Nonnull String var1) {
      List var2 = new ArrayList<>();
      Set var3 = new HashSet<>();
      List var4 = AssetModule.get().getAssetPacks();

      for (int var5 = var4.size() - 1; var5 >= 0; var5--) {
         Path var6 = var4.get(var5).getRoot();
         Path var7 = var6.resolve("Server");
         if (this.legacyPath) {
            var7 = var7.resolve("World").resolve("Default").resolve("Prefabs");
         } else {
            var7 = var7.resolve("Prefabs");
         }

         Path var8 = PathUtil.resolvePathWithinDir(var7, var1);
         if (var8 != null) {
            try {
               List var9 = new ArrayList<>();
               PrefabLoader.traverseAllPrefabBuffersUnder(var8, (var3x, var4x) -> {
                  Path var5 = var3x.subpath(var6.getNameCount(), var3x.getNameCount());
                  if (!var3.contains(var5)) {
                     var3.add(var5);
                     var9.add(new PrefabPropAsset.LoadedPrefabEntry(var5.toString(), var4x));
                  }
               });
               var9.sort(Comparator.comparing(var0 -> var0.path.replace('\\', '/'), String.CASE_INSENSITIVE_ORDER));

               for (int var15 = 0; var15 < var9.size(); var15++) {
                  var2.add(var9.get(var15).prefab);
               }
            } catch (Exception var11) {
               String var10 = "Couldn't load prefab with path: " + var1;
               var10 = var10 + "\n";
               var10 = var10 + ExceptionUtil.toStringWithStack(var11);
               LoggerUtil.getLogger().severe(var10);
               class="kw">return null;
            }
         }
      }

      class="kw">return var2;
   }

   @Override
   class="kw">public void cleanUp() {
      if (this.directionalityAsset != null) {
         this.directionalityAsset.cleanUp();
      }

      if (this.scannerAsset != null) {
         this.scannerAsset.cleanUp();
      }

      this.blockMaskAsset.cleanUp();
      this.moldingScannerAsset.cleanUp();
      this.moldingPatternAsset.cleanUp();
   }

   class="kw">private record LoadedPrefabEntry(String path, IPrefabBuffer prefab) {
      class="kw">private LoadedPrefabEntry {
      }
   }

   class="kw">public class="kw">static class WeightedPathAsset class="kw">implements JsonAssetWithMap<String, DefaultAssetMap<String, PrefabPropAsset.WeightedPathAsset>> {
      @Nonnull
      class="kw">public class="kw">static class="kw">final AssetBuilderCodec<String, PrefabPropAsset.WeightedPathAsset> CODEC = AssetBuilderCodec.builder(
            PrefabPropAsset.WeightedPathAsset.class,
            PrefabPropAsset.WeightedPathAsset::new,
            Codec.STRING,
            (var0, var1) -> var0.id = var1,
            var0 -> var0.id,
            (var0, var1) -> var0.data = var1,
            var0 -> var0.data
         )
         .append(new KeyedCodec<>("Weight", Codec.DOUBLE, true), (var0, var1) -> var0.weight = var1, var0 -> var0.weight)
         .addValidator(Validators.greaterThanOrEqual(0.0))
         .add()
         .append(new KeyedCodec<>("Path", Codec.STRING, true), (var0, var1) -> var0.path = var1, var0 -> var0.path)
         .add()
         .build();
      class="kw">private String id;
      class="kw">private AssetExtraInfo.Data data;
      class="kw">private double weight = 1.0;
      class="kw">private String path = "";

      class="kw">public WeightedPathAsset() {
      }

      class="kw">public String getId() {
         class="kw">return this.id;
      }
   }
}