RecursivePrefabLoader class
Пакет: com.hypixel.hytale.builtin.buildertools.utils
Файл: com/hypixel/hytale/builtin/buildertools/utils/RecursivePrefabLoader.java
implements: BiFunction<String, Random, T>
Поля (19)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
int |
MAX_RECURSION_DEPTH |
|
Rotation |
var1 |
|
Path |
var10 |
|
Holder |
var11 |
|
PrefabSpawnerBlock |
var12 |
|
BlockType |
var13 |
|
int |
var14 |
|
int |
var15 |
|
int |
var16 |
|
String |
var17 |
|
PrefabWeights |
var18 |
|
PrefabRotation |
var19 |
|
BlockSelection |
var20 |
|
String |
var7 |
|
Path |
var7 |
|
BlockSelection |
var7 |
|
RecursivePrefabLoader.DistinctCollector |
var8 |
|
List |
var8 |
|
Path[] |
var9 |
Методы (18)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
BlockSelectionLoaderpublic BlockSelectionLoader(Path var1, @Nonnull Function<String, BlockSelection> var2) |
|
protected |
DistinctCollectorprotected DistinctCollector() |
abstract |
throw new |
PrefabLoadExceptionthrow new PrefabLoadException(PrefabLoadException.Type.NOT_FOUND, "Prefab nesting limit exceeded!") |
abstract |
throw new |
PrefabLoadExceptionthrow new PrefabLoadException(PrefabLoadException.Type.NOT_FOUND, "Could not locate prefab: " + var4) |
abstract |
throw new |
PrefabLoadExceptionthrow new PrefabLoadException(PrefabLoadException.Type.ERROR, var13) |
abstract |
throw new |
PrefabLoadExceptionthrow new PrefabLoadException(PrefabLoadException.Type.ERROR, "Cyclic prefab dependency detected: " + var4) |
|
public void |
acceptpublic void accept(T var1) |
abstract |
|
for for(int var9 = 0; var9 < var8.size() |
|
private static PrefabRotation |
getRotationprivate static PrefabRotation getRotation(@Nonnull BlockType var0) |
|
|
if if(this.depthTracker >= 10) |
|
|
if if(var10 != null) |
|
|
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) |
abstract abstract |
T |
loadPrefabT loadPrefab(int var1, int var2, int var3, String var4, PrefabRotation var5, Random var6) |
protected |
T |
loadRandomPrefabT loadRandomPrefab(int var1, int var2, int var3, @Nonnull List<Path> var4, PrefabRotation var5, @Nonnull Random var6) |
protected |
T |
loadSinglePrefabT loadSinglePrefab(int var1, int var2, int var3, @Nonnull Path var4, PrefabRotation var5, Random var6) |
protected |
T |
loadWeightedPrefabT loadWeightedPrefab(int var1, int var2, int var3, @Nonnull String var4, @Nonnull List<Path> var5, PrefabRotation var6, @Nonnull PrefabWeights var7, @Nonnull Random var8) |
Исходный код
Показать/скрыть
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);
}
}
}
}