BlockSelectionLoader class

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

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

extends: RecursivePrefabLoader<BlockSelection>

Поля (13)

МодификаторыТипИмя
Rotation var1
Holder var11
PrefabSpawnerBlock var12
BlockType var13
int var14
int var15
int var16
String var17
PrefabWeights var18
PrefabRotation var19
BlockSelection var20
BlockSelection var7
List var8

Методы (5)

МодификаторыВозвратСигнатура
abstract for for(int var9 = 0; var9 < var8.size()
private static PrefabRotation getRotationprivate static PrefabRotation getRotation(@Nonnull BlockType var0)
if if(var11 != null)
if if(var12 != null)
protected BlockSelection loadPrefabprotected BlockSelection loadPrefab(int var1, int var2, int var3, String var4, @Nonnull PrefabRotation var5, @Nonnull Random var6)

Исходный код

Показать/скрыть
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);
         }
      }
   }
}