DistinctCollector class

Пакет: com.hypixel.hytale.builtin.buildertools.utils

Файл: com/hypixel/hytale/builtin/buildertools/utils/RecursivePrefabLoader.java

extends: ArrayList<T>

implements: Consumer<T>

Методы (1)

МодификаторыВозвратСигнатура
public void acceptpublic void accept(T var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.buildertools.utils;

class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
class="kw">import com.hypixel.hytale.server.core.modules.prefabspawner.PrefabSpawnerBlock;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabLoadException;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabRotation;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabWeights;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabLoader;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Random;
class="kw">import java.util.Set;
class="kw">import java.util.function.BiFunction;
class="kw">import java.util.function.Consumer;
class="kw">import java.util.function.Function;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class="kw">abstract class RecursivePrefabLoader<T> class="kw">implements BiFunction<String, Random, T> {
   class="kw">private class="kw">static class="kw">final int MAX_RECURSION_DEPTH = 10;
   class="kw">protected class="kw">final Path rootPrefabsDir;
   class="kw">protected class="kw">final Function<String, T> prefabsLoader;
   class="kw">protected class="kw">final Set<Path> visitedFiles = new HashSet<>();
   @Nullable
   class="kw">protected class="kw">final ComponentType<ChunkStore, PrefabSpawnerBlock> prefabComponentType = PrefabSpawnerBlock.getComponentType();
   class="kw">private int depthTracker = 0;

   class="kw">public RecursivePrefabLoader(Path var1, Function<String, T> var2) {
      this.rootPrefabsDir = var1;
      this.prefabsLoader = var2;
   }

   @Nonnull
   class="kw">public T apply(@Nonnull String var1, @Nonnull Random var2) {
      class="kw">return this.load(var1, var2);
   }

   @Nonnull
   class="kw">public T load(@Nonnull String var1, @Nonnull Random var2) {
      class="kw">return this.load(0, 0, 0, var1, PrefabRotation.ROTATION_0, PrefabWeights.NONE, var2);
   }

   @Nonnull
   class="kw">protected T load(int var1, int var2, int var3, @Nonnull String var4, PrefabRotation var5, @Nonnull PrefabWeights var6, @Nonnull Random var7) {
      if (this.depthTracker >= 10) {
         throw new PrefabLoadException(PrefabLoadException.Type.NOT_FOUND, "Prefab nesting limit exceeded!");
      }

      try {
         this.depthTracker++;
         RecursivePrefabLoader.DistinctCollector var8 = new RecursivePrefabLoader.DistinctCollector<>();
         PrefabLoader.resolvePrefabs(this.rootPrefabsDir, stripSuffix(var4), var8);
         if (var8.isEmpty()) {
            throw new PrefabLoadException(PrefabLoadException.Type.NOT_FOUND, "Could not locate prefab: " + var4);
         } else if (var8.size() == 1) {
            class="kw">return this.loadSinglePrefab(var1, var2, var3, var8.getFirst(), var5, var7);
         } else {
            class="kw">return var6.size() > 0
               ? this.loadWeightedPrefab(var1, var2, var3, var4, var8, var5, var6, var7)
               : this.loadRandomPrefab(var1, var2, var3, var8, var5, var7);
         }
      } catch (IOException var13) {
         throw new PrefabLoadException(PrefabLoadException.Type.ERROR, var13);
      } class="kw">finally {
         this.depthTracker--;
      }
   }

   class="kw">protected T loadSinglePrefab(int var1, int var2, int var3, @Nonnull Path var4, PrefabRotation var5, Random var6) {
      if (!this.visitedFiles.add(var4)) {
         throw new PrefabLoadException(PrefabLoadException.Type.ERROR, "Cyclic prefab dependency detected: " + var4);
      }

      try {
         String var7 = this.rootPrefabsDir.relativize(var4).toString();
         class="kw">return this.loadPrefab(var1, var2, var3, appendSuffix(var7), var5, var6);
      } class="kw">finally {
         this.visitedFiles.remove(var4);
      }
   }

   class="kw">protected T loadWeightedPrefab(
      int var1, int var2, int var3, @Nonnull String var4, @Nonnull List<Path> var5, PrefabRotation var6, @Nonnull PrefabWeights var7, @Nonnull Random var8
   ) {
      Path[] var9 = var5.toArray(Path[]::new);
      Path var10 = var7.get(var9, var2x -> PrefabLoader.resolveRelativeJsonPath(var4, var2x, this.rootPrefabsDir), var8);
      if (var10 != null) {
         class="kw">return this.loadSinglePrefab(var1, var2, var3, var10, var6, var8);
      } else {
         throw new PrefabLoadException(PrefabLoadException.Type.ERROR, String.format("Unable to pick weighted prefab! Files: %s, Weights: %s", var5, var7));
      }
   }

   class="kw">protected T loadRandomPrefab(int var1, int var2, int var3, @Nonnull List<Path> var4, PrefabRotation var5, @Nonnull Random var6) {
      Path var7 = var4.get(var6.nextInt(var4.size()));
      class="kw">return this.loadSinglePrefab(var1, var2, var3, var7, var5, var6);
   }

   class="kw">protected class="kw">abstract T loadPrefab(int var1, int var2, int var3, String var4, PrefabRotation var5, Random var6);

   @Nonnull
   class="kw">private class="kw">static String stripSuffix(@Nonnull String var0) {
      class="kw">return PrefabStore.stripPrefabSuffix(var0);
   }

   @Nonnull
   class="kw">private class="kw">static String appendSuffix(@Nonnull String var0) {
      class="kw">return PrefabStore.isPrefabFileName(var0) ? var0 : var0 + ".prefab.json";
   }

   class="kw">public class="kw">static class BlockSelectionLoader class="kw">extends RecursivePrefabLoader<BlockSelection> {
      class="kw">public BlockSelectionLoader(Path var1, @Nonnull Function<String, BlockSelection> var2) {
         super(var1, var2.andThen(BlockSelection::cloneSelection));
      }

      @Nonnull
      class="kw">protected BlockSelection loadPrefab(int var1, int var2, int var3, String var4, @Nonnull PrefabRotation var5, @Nonnull Random var6) {
         BlockSelection var7 = this.prefabsLoader.apply(var4);
         var7.setPosition(var1, var2, var3);
         List var8 = new ObjectArrayList();
         var7.forEachBlock((var7x, var8x, var9x, var10) -> {
            Holder var11 = var10.holder();
            if (var11 != null) {
               PrefabSpawnerBlock var12 = var11.getComponent(this.prefabComponentType);
               if (var12 != null) {
                  BlockType var13 = BlockType.getAssetMap().getAsset(var10.blockId());
                  int var14 = var1 + var5.getX(var7x, var9x);
                  int var15 = var2 + var8x;
                  int var16 = var3 + var5.getZ(var7x, var9x);
                  String var17 = var12.getPrefabPath();
                  PrefabWeights var18 = var12.getPrefabWeights();
                  PrefabRotation var19 = var5.add(getRotation(var13));
                  BlockSelection var20 = (BlockSelection)this.load(var14, var15, var16, var17, var19, var18, var6);
                  var8.add(var20);
               }
            }
         });

         for (int var9 = 0; var9 < var8.size(); var9++) {
            var7.add(var8.get(var9));
         }

         class="kw">return var7;
      }

      @Nonnull
      class="kw">private class="kw">static PrefabRotation getRotation(@Nonnull BlockType var0) {
         Rotation var1 = var0.getRotationYawPlacementOffset();
         class="kw">return var1 == null ? PrefabRotation.ROTATION_0 : PrefabRotation.fromRotation(var1);
      }
   }

   class="kw">protected class="kw">static class DistinctCollector<T> class="kw">extends ArrayList<T> class="kw">implements Consumer<T> {
      class="kw">protected DistinctCollector() {
      }

      @Override
      class="kw">public void accept(T var1) {
         if (!this.contains(var1)) {
            this.add(var1);
         }
      }
   }
}