WorldGenPrefabLoader class

Пакет: com.hypixel.hytale.server.worldgen.loader

Файл: com/hypixel/hytale/server/worldgen/loader/WorldGenPrefabLoader.java

Поля (14)

МодификаторыТипИмя
final String PREFAB_FOLDER
private transient String key
private final ObjectList<WorldGenPrefabSupplier> list
private transient WorldGenPrefabLoader loader
private transient Path root
AssetModule var2
Path var2
Path var3
Path var3
Path var4
List var5
Path[] var6
PrefabLoader[] var7
private final ObjectSet<Path> visited

Методы (11)

МодификаторыВозвратСигнатура
abstract throw new Errorthrow new Error("Failed to find prefab: " + var1)
public PrefabPathCollectorpublic PrefabPathCollector()
public void acceptpublic void accept(@Nonnull Path var1)
public void closepublic void close()
private WorldGenPrefabSupplier[] computeWorldGenPrefabSupplier[] compute(@Nonnull String var1)
for for(PrefabLoader var6 : this.prefabLoaders)
for for(int var8 = 0; var8 < var6.length; var8++)
static PrefabLoader[] getPrefabLoadersPrefabLoader[] getPrefabLoaders(@Nonnull WorldGenConfig var0, @Nonnull Path var1)
public Path getRootFolderPath getRootFolder()
if if(this.key != null && this.loader != null && this.root != null)
public WorldGenPrefabSupplier[] resultpublic WorldGenPrefabSupplier[] result()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.loader;

class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.procedurallib.file.FileIO;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabLoader;
class="kw">import com.hypixel.hytale.server.worldgen.WorldGenConfig;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
class="kw">import com.hypixel.hytale.server.worldgen.prefab.PrefabStoreRoot;
class="kw">import com.hypixel.hytale.server.worldgen.util.cache.TimeoutCache;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectSet;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Path;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.function.Consumer;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class WorldGenPrefabLoader {
   class="kw">public class="kw">static class="kw">final String PREFAB_FOLDER = "Prefabs";
   @Nonnull
   class="kw">private class="kw">final Path root;
   @Nonnull
   class="kw">private class="kw">final PrefabStoreRoot store;
   @Nonnull
   class="kw">private class="kw">final PrefabLoader[] prefabLoaders;
   @Nonnull
   class="kw">private class="kw">final TimeoutCache<String, WorldGenPrefabSupplier[]> cache;

   class="kw">public WorldGenPrefabLoader(@Nonnull PrefabStoreRoot var1, @Nonnull WorldGenConfig var2) {
      Path var3 = PrefabStoreRoot.resolvePrefabStore(var1, var2.path());
      this.root = var3;
      this.store = var1;
      this.prefabLoaders = getPrefabLoaders(var2, var3);
      this.cache = new TimeoutCache<>(30L, TimeUnit.SECONDS, SneakyThrow.sneakyFunction(this::compute), null);
   }

   @Nonnull
   class="kw">public PrefabStoreRoot getStore() {
      class="kw">return this.store;
   }

   class="kw">public Path getRootFolder() {
      class="kw">return this.root;
   }

   @Nullable
   class="kw">public WorldGenPrefabSupplier[] get(@Nonnull String var1) {
      class="kw">return this.cache.get(var1);
   }

   class="kw">private WorldGenPrefabSupplier[] compute(@Nonnull String var1) class="kw">throws IOException {
      try (WorldGenPrefabLoader.PrefabPathCollector var2 = ChunkGenerator.getResource().prefabCollector) {
         var2.key = var1;
         var2.loader = this;

         for (PrefabLoader var6 : this.prefabLoaders) {
            var2.root = var6.getRootFolder();
            var6.resolvePrefabs(var1, var2);
         }

         if (var2.list.isEmpty()) {
            throw new Error("Failed to find prefab: " + var1);
         } else {
            class="kw">return var2.result();
         }
      }
   }

   class="kw">private class="kw">static PrefabLoader[] getPrefabLoaders(@Nonnull WorldGenConfig var0, @Nonnull Path var1) {
      AssetModule var2 = AssetModule.get();
      Path var3 = var2.getBaseAssetPack().getRoot();
      Path var4 = FileIO.relativize(var1, var3);
      List var5 = AssetFileSystem.getAssetPacks(var0, var1x -> FileIO.exists(var1x, var4));
      Path[] var6 = AssetFileSystem.getAssetRoots(var5);
      PrefabLoader[] var7 = new PrefabLoader[var6.length];

      for (int var8 = 0; var8 < var6.length; var8++) {
         var7[var8] = new PrefabLoader(FileIO.append(var6[var8], var4));
      }

      class="kw">return var7;
   }

   class="kw">public class="kw">static class PrefabPathCollector class="kw">implements Consumer<Path>, AutoCloseable {
      class="kw">private class="kw">final ObjectSet<Path> visited = new ObjectOpenCustomHashSet(FileIO.PATH_STRATEGY);
      class="kw">private class="kw">final ObjectList<WorldGenPrefabSupplier> list = new ObjectArrayList();
      @Nullable
      class="kw">private class="kw">transient String key = null;
      @Nullable
      class="kw">private class="kw">transient Path root = null;
      @Nullable
      class="kw">private class="kw">transient WorldGenPrefabLoader loader = null;

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

      class="kw">public void accept(@Nonnull Path var1) {
         if (this.key != null && this.loader != null && this.root != null) {
            Path var2 = FileIO.relativize(var1, this.root);
            if (this.visited.add(var2)) {
               this.list.add(new WorldGenPrefabSupplier(this.loader, this.key, var1));
            }
         }
      }

      @Override
      class="kw">public void close() {
         this.visited.clear();
         this.list.clear();
         this.key = null;
         this.loader = null;
      }

      class="kw">public WorldGenPrefabSupplier[] result() {
         class="kw">return (WorldGenPrefabSupplier[])this.list.toArray(WorldGenPrefabSupplier[]::new);
      }
   }
}