PrefabPathCollector class
Пакет: com.hypixel.hytale.server.worldgen.loader
Файл: com/hypixel/hytale/server/worldgen/loader/WorldGenPrefabLoader.java
implements: Consumer<Path>, AutoCloseable
Поля (6)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private transient String |
key |
|
private final ObjectList<WorldGenPrefabSupplier> |
list |
|
private transient WorldGenPrefabLoader |
loader |
|
private transient Path |
root |
|
Path |
var2 |
|
private final ObjectSet<Path> |
visited |
Методы (4)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public void |
acceptpublic void accept(@Nonnull Path var1) |
|
public void |
closepublic void close() |
|
|
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);
}
}
}