PrefabPasteBuffer class

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

Файл: com/hypixel/hytale/server/worldgen/prefab/PrefabPasteUtil.java

extends: PrefabBufferCall

Поля (18)

МодификаторыТипИмя
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
public int seed
public ICoordinateRndCondition spawnCondition
public int specificSeed
public WorldGenPrefabSupplier supplier
public int yOffset

Методы (2)

МодификаторыВозвратСигнатура
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;
      }
   }
}