PrefabPasteUtil class
Пакет: com.hypixel.hytale.server.worldgen.prefab
Файл: com/hypixel/hytale/server/worldgen/prefab/PrefabPasteUtil.java
Поля (49)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
int |
MAX_RECURSION_DEPTH |
|
public BlockMaskCondition |
blockMask |
|
public final Random |
childRandom |
|
public boolean |
deepSearch |
|
private int |
depth |
|
public int |
environmentId |
|
public ChunkGeneratorExecution |
execution |
|
public boolean |
fitHeightmap |
|
public ICoordinateCondition |
heightCondition |
|
public int |
instanceSeed |
|
public int |
originHeight |
|
public final Vector3i |
posChunk |
|
public final Vector3i |
posWorld |
|
public byte |
priority |
|
|
return |
|
public int |
seed |
|
public ICoordinateRndCondition |
spawnCondition |
|
public int |
specificSeed |
|
public WorldGenPrefabSupplier |
supplier |
|
int |
var10 |
|
int |
var11 |
|
int |
var11 |
|
int |
var11 |
|
int |
var12 |
|
int |
var12 |
|
boolean |
var12 |
|
int |
var13 |
|
int |
var13 |
|
int |
var13 |
|
int |
var14 |
|
int |
var14 |
|
WorldGenPrefabSupplier |
var14 |
|
int |
var15 |
|
int |
var15 |
|
WorldGenPrefabSupplier[] |
var15 |
|
int |
var16 |
|
int |
var17 |
|
int |
var18 |
|
int |
var19 |
|
IPrefabBuffer |
var2 |
|
PrefabRotation |
var20 |
|
boolean |
var21 |
|
WorldGenPrefabSupplier |
var3 |
|
|
var3 |
|
int |
var4 |
|
Holder[] |
var4 |
|
int |
var5 |
|
Vector3i |
var6 |
|
public int |
yOffset |
Методы (25)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
PrefabPasteBufferpublic PrefabPasteBuffer() |
|
|
for for(int var5 = 0; var5 < var2x.length; var5++) |
static |
void |
generatevoid generate(@Nonnull PrefabPasteUtil.PrefabPasteBuffer var0,
@Nonnull PrefabRotation var1,
@Nonnull WorldGenPrefabSupplier var2,
int var3,
int var4,
int var5,
int var6,
int var7) |
static |
void |
generate0void generate0(@Nonnull PrefabPasteUtil.PrefabPasteBuffer var0, @Nonnull WorldGenPrefabSupplier var1) |
abstract |
|
generate0 generate0(var0, var2) |
abstract |
|
generate0 generate0(var9, var14) |
static |
void |
generateChildvoid generateChild(int var0,
int var1,
int var2,
String var3,
boolean var4,
boolean var5,
boolean var6,
@Nonnull PrefabWeights var7,
@Nonnull PrefabRotation var8,
@Nonnull PrefabPasteUtil.PrefabPasteBuffer var9,
Random var10) |
abstract |
|
generateChild generateChild(var0x, var1x, var2x, var3, var4, var5, var6, var7, var8, var9, var9.childRandom) |
static |
int |
getInstanceSeedint getInstanceSeed(int var0, @Nonnull Vector3i var1) |
|
|
if if(var0.execution != null) |
|
|
if if(var2 != null) |
|
|
if if(var0.fitHeightmap) |
|
|
if if(var3.fitHeightmap) |
|
|
if if(var8.blockMask != BlockMaskCondition.DEFAULT_FALSE) |
|
|
if if(var12 >= 0 && var12 < 320) |
|
|
if if(var8.blockMask != BlockMaskCondition.DEFAULT_TRUE) |
|
|
if if(var2x != null && var2x.length != 0) |
|
|
if if(var9.depth < 10) |
|
|
if if(!var5) |
|
|
if if(var9.specificSeed == var11) |
|
|
if if(var12) |
|
|
if if(var15 != null && var15.length != 0) |
|
|
if if(var1.length == 1) |
|
void |
resetvoid reset() |
|
public void |
setSeedpublic void setSeed(int var1, long var2) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.prefab;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import com.hypixel.hytale.procedurallib.condition.DefaultCoordinateCondition;
class="kw">import com.hypixel.hytale.procedurallib.condition.DefaultCoordinateRndCondition;
class="kw">import com.hypixel.hytale.procedurallib.condition.ICoordinateCondition;
class="kw">import com.hypixel.hytale.procedurallib.condition.ICoordinateRndCondition;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabRotation;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabWeights;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferCall;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.IPrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.ChunkGeneratorExecution;
class="kw">import com.hypixel.hytale.server.worldgen.loader.WorldGenPrefabSupplier;
class="kw">import com.hypixel.hytale.server.worldgen.util.condition.BlockMaskCondition;
class="kw">import it.unimi.dsi.fastutil.HashCommon;
class="kw">import java.util.Random;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;
class="kw">public class PrefabPasteUtil {
class="kw">public class="kw">static class="kw">final int MAX_RECURSION_DEPTH = 10;
class="kw">public PrefabPasteUtil() {
}
class="kw">public class="kw">static void generate(
@Nonnull PrefabPasteUtil.PrefabPasteBuffer var0,
@Nonnull PrefabRotation var1,
@Nonnull WorldGenPrefabSupplier var2,
int var3,
int var4,
int var5,
int var6,
int var7
) {
var0.supplier = var2;
var0.posWorld.set(var3, var4, var5);
var0.posChunk.set(var6, var4, var7);
var0.rotation = var1;
try {
generate0(var0, var2);
} class="kw">finally {
var0.reset();
}
}
class="kw">private class="kw">static void generate0(@Nonnull PrefabPasteUtil.PrefabPasteBuffer var0, @Nonnull WorldGenPrefabSupplier var1) {
if (var0.execution != null) {
IPrefabBuffer var2 = var1.get();
if (var2 != null) {
if (var0.fitHeightmap) {
var0.originHeight = var0.execution.getChunkGenerator().getHeight(var0.seed, var0.posWorld.x, var0.posWorld.z);
var0.posChunk.y = var0.originHeight;
var0.posWorld.y = var0.originHeight;
}
var0.instanceSeed = getInstanceSeed(var0.seed, var0.posWorld);
var2.forEach((var0x, var1x, var2x, var3) -> {
assert var3.execution != null;
int var4 = var0x + var3.posChunk.x;
int var5 = var1x + var3.posChunk.z;
if (!ChunkUtil.isWithinLocalChunk(var4, var5)) {
class="kw">return false;
}
if (var3.fitHeightmap) {
var3.yOffset = var3.execution.getChunkGenerator().getHeight(var3.seed, var3.posWorld.x + var0x, var3.posWorld.z + var1x) - var3.originHeight;
} else {
var3.yOffset = 0;
}
class="kw">return true;
}, (var0x, var1x, var2x, var3, var4, var5, var6, var7, var8, var9, var10) -> {
assert var8.execution != null;
if (var8.blockMask != BlockMaskCondition.DEFAULT_FALSE) {
int var11 = var0x + var8.posChunk.x;
int var12 = var1x + var8.posChunk.y + var8.yOffset;
int var13 = var2x + var8.posChunk.z;
if (var12 >= 0 && var12 < 320) {
if (var8.blockMask != BlockMaskCondition.DEFAULT_TRUE) {
int var14 = var8.execution.getBlock(var11, var12, var13);
int var15 = var8.execution.getFluid(var11, var12, var13);
if (!var8.blockMask.eval(var14, var15, var3, var9)) {
class="kw">return;
}
}
var8.execution.setBlock(var11, var12, var13, var8.priority, var3, var4 != null ? var4.clone() : null, var5, var6, var7);
var8.execution.setFluid(var11, var12, var13, var8.priority, var9, (byte)var10);
var8.execution.setEnvironment(var11, var12, var13, var8.environmentId);
}
}
}, (var0x, var1x, var2x, var3) -> {
assert var3.execution != null;
if (var2x != null && var2x.length != 0) {
Holder[] var4 = new Holder[var2x.length];
for (int var5 = 0; var5 < var2x.length; var5++) {
var4[var5] = var2x[var5].clone();
}
Vector3i var6 = new Vector3i(var3.posWorld.x, var3.posWorld.y + var3.yOffset, var3.posWorld.z);
var3.execution.getEntityChunk().addEntities(var6, var3.rotation, var4, var3.specificSeed, var3.instanceSeed);
}
}, (var0x, var1x, var2x, var3, var4, var5, var6, var7, var8, var9) -> {
assert var9.execution != null;
if (var9.depth < 10) {
var9.depth++;
int var10 = var9.posChunk.x;
int var11 = var9.posChunk.y;
int var12 = var9.posChunk.z;
int var13 = var9.posWorld.x;
int var14 = var9.posWorld.y;
int var15 = var9.posWorld.z;
int var16 = var9.yOffset;
int var17 = var9.originHeight;
int var18 = var9.specificSeed;
int var19 = var9.instanceSeed;
PrefabRotation var20 = var9.rotation;
boolean var21 = var9.fitHeightmap;
generateChild(var0x, var1x, var2x, var3, var4, var5, var6, var7, var8, var9, var9.childRandom);
var9.posChunk.set(var10, var11, var12);
var9.posWorld.set(var13, var14, var15);
var9.yOffset = var16;
var9.originHeight = var17;
var9.rotation = var20;
var9.specificSeed = var18;
var9.instanceSeed = var19;
var9.fitHeightmap = var21;
var9.depth--;
}
}, var0);
}
}
}
class="kw">private class="kw">static void generateChild(
int var0,
int var1,
int var2,
String var3,
boolean var4,
boolean var5,
boolean var6,
@Nonnull PrefabWeights var7,
@Nonnull PrefabRotation var8,
@Nonnull PrefabPasteUtil.PrefabPasteBuffer var9,
Random var10
) {
int var11 = var9.specificSeed;
boolean var12 = var9.fitHeightmap;
var9.posChunk.add(var0, var1, var2);
var9.posWorld.add(var0, var1, var2);
var9.fitHeightmap = var4;
var9.rotation = var9.rotation.add(var8);
if (!var5) {
var9.specificSeed = var11;
} else {
var9.specificSeed = (int)HashUtil.hash(var11, var0, var1, var2);
if (var9.specificSeed == var11) {
var9.specificSeed++;
}
}
if (var12) {
int var13 = var9.execution.getChunkGenerator().getHeight(var9.seed, var9.posWorld.x, var9.posWorld.z) - var9.originHeight;
var9.posChunk.y += var13;
var9.posWorld.y += var13;
}
if (var9.posChunk.y >= 0 && var9.posChunk.y < 320 && ChunkUtil.isWithinLocalChunk(var9.posChunk.x, var9.posChunk.z)) {
var9.execution.setBlock(var9.posChunk.x, var9.posChunk.y, var9.posChunk.z, var9.priority, 0, null);
}
if (!var6 || var9.spawnCondition.eval(var9.seed, var9.posWorld.x, var9.posWorld.z, var9.posWorld.y, var10)) {
WorldGenPrefabSupplier[] var15 = var9.supplier.getLoader().get(var3);
if (var15 != null && var15.length != 0) {
WorldGenPrefabSupplier var14 = nextPrefab(var9.childRandom, var15, var7);
generate0(var9, var14);
}
}
}
@Nonnull
class="kw">private class="kw">static WorldGenPrefabSupplier nextPrefab(@Nonnull Random var0, @Nonnull WorldGenPrefabSupplier[] var1, @Nonnull PrefabWeights var2) {
if (var1.length == 1) {
class="kw">return var1[0];
}
WorldGenPrefabSupplier var3 = null;
if (var2.size() > 0) {
var3 = var2.get(var1, WorldGenPrefabSupplier::getPrefabName, var0);
}
class="kw">return var3 == null ? nextRandomPrefab(var0, var1) : var3;
}
@Nonnull
class="kw">private class="kw">static WorldGenPrefabSupplier nextRandomPrefab(@Nonnull Random var0, @Nonnull WorldGenPrefabSupplier[] var1) {
class="kw">return var1[var0.nextInt(var1.length)];
}
class="kw">private class="kw">static int getInstanceSeed(int var0, @Nonnull Vector3i var1) {
class="kw">return HashCommon.long2int(HashUtil.hash(var0, var1.x, var1.y, var1.z));
}
class="kw">public class="kw">static class PrefabPasteBuffer class="kw">extends PrefabBufferCall {
@Nullable
class="kw">public ChunkGeneratorExecution execution;
class="kw">public class="kw">final Vector3i posWorld = new Vector3i();
class="kw">public class="kw">final Vector3i posChunk = new Vector3i();
class="kw">public class="kw">final Random childRandom = new FastRandom(0L);
class="kw">public int originHeight;
class="kw">public int yOffset;
class="kw">public int seed;
class="kw">public int specificSeed;
class="kw">public int instanceSeed;
class="kw">public boolean fitHeightmap;
class="kw">public boolean deepSearch;
class="kw">public BlockMaskCondition blockMask;
class="kw">public int environmentId;
class="kw">public byte priority;
class="kw">public ICoordinateCondition heightCondition;
class="kw">public ICoordinateRndCondition spawnCondition;
@Nullable
class="kw">public WorldGenPrefabSupplier supplier;
class="kw">private int depth;
class="kw">public PrefabPasteBuffer() {
this.random = new FastRandom(0L);
this.reset();
}
class="kw">public void setSeed(int var1, long var2) {
this.seed = var1;
this.specificSeed = (int)var2;
this.random.setSeed(var2);
this.childRandom.setSeed(var2);
}
void reset() {
this.execution = null;
this.fitHeightmap = false;
this.deepSearch = false;
this.blockMask = BlockMaskCondition.DEFAULT_TRUE;
this.environmentId = Integer.MIN_VALUE;
this.heightCondition = DefaultCoordinateCondition.DEFAULT_TRUE;
this.spawnCondition = DefaultCoordinateRndCondition.DEFAULT_TRUE;
this.supplier = null;
this.depth = 0;
}
}
}