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;
      }
   }
}