BlockSink interface

Пакет: com.hypixel.hytale.server.core.universe.world.worldgen.provider

Файл: com/hypixel/hytale/server/core/universe/world/worldgen/provider/CubicTestWorldGenProvider.java

Методы (1)

МодификаторыВозвратСигнатура
abstract void putvoid put(int var1, int var2, int var3, int var4, int var5, int var6)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.worldgen.provider;

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.procedurallib.logic.GeneralNoise;
class="kw">import com.hypixel.hytale.protocol.Color;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.asset.util.ColorParseUtil;
class="kw">import com.hypixel.hytale.server.core.codec.ProtocolCodecs;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabLoadException;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.FluidSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.spawn.ISpawnProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.spawn.IndividualSpawnProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.GeneratedBlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.GeneratedChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.GeneratedChunkSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.GeneratedEntityChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.IWorldGen;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.WorldGenLoadException;
class="kw">import com.hypixel.hytale.server.core.universe.world.worldgen.WorldGenTimingsCollector;
class="kw">import it.unimi.dsi.fastutil.longs.Long2FloatFunction;
class="kw">import java.util.Arrays;
class="kw">import java.util.Random;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.function.LongPredicate;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class CubicTestWorldGenProvider class="kw">implements IWorldGenProvider {
   class="kw">public class="kw">static class="kw">final String ID = "CubicTest";
   class="kw">private class="kw">static class="kw">final boolean PREFAB_PLACE_BLOCK_COMPONENTS = false;
   class="kw">private class="kw">static class="kw">final boolean PREFAB_PLACE_ENTITIES = false;
   class="kw">public class="kw">static class="kw">final Color DEFAULT_TINT = new Color((byte)91, (byte)-98, (byte)40);
   class="kw">public class="kw">static class="kw">final int DEFAULT_PLATFORM_Y = 160;
   class="kw">public class="kw">static class="kw">final int DEFAULT_PLATFORM_HALF_EXTENT = 32;
   class="kw">public class="kw">static class="kw">final int DEFAULT_CLEAR_HEIGHT = 16;
   class="kw">public class="kw">static class="kw">final int DEFAULT_GRID_STRIDE = 16;
   class="kw">public class="kw">static class="kw">final int DEFAULT_PREFAB_CELL_SIZE = 64;
   class="kw">public class="kw">static class="kw">final int DEFAULT_MAX_PREFAB_EXTENT = 32;
   class="kw">public class="kw">static class="kw">final float DEFAULT_PREFAB_DENSITY = 0.4F;
   class="kw">public class="kw">static class="kw">final BuilderCodec<CubicTestWorldGenProvider> CODEC = BuilderCodec.builder(CubicTestWorldGenProvider.class, CubicTestWorldGenProvider::new)
      .documentation("A cubic-aware test generator that produces a flat spawn platform plus an infinite 3D wireframe pattern.")
      .<Color>append(new KeyedCodec<>("Tint", ProtocolCodecs.COLOR), (var0, var1) -> var0.tint = var1, var0 -> var0.tint)
      .documentation("The tint applied to every column.")
      .add()
      .<String>append(new KeyedCodec<>("Environment", Codec.STRING), (var0, var1) -> var0.environment = var1, var0 -> var0.environment)
      .documentation("The environment applied across the legacy column range. Cubic sections do not carry environment data.")
      .addValidator(Environment.VALIDATOR_CACHE.getValidator())
      .add()
      .<String>append(new KeyedCodec<>("PlatformBlockType", Codec.STRING), (var0, var1) -> var0.platformBlockType = var1, var0 -> var0.platformBlockType)
      .documentation("The block type used for the flat spawn platform at PlatformY.")
      .addValidator(Validators.nonNull())
      .addValidator(BlockType.VALIDATOR_CACHE.getValidator())
      .add()
      .<String>append(new KeyedCodec<>("EdgeBlockType", Codec.STRING), (var0, var1) -> var0.edgeBlockType = var1, var0 -> var0.edgeBlockType)
      .documentation("The block type used along the edges of the 3D wireframe grid.")
      .addValidator(Validators.nonNull())
      .addValidator(BlockType.VALIDATOR_CACHE.getValidator())
      .add()
      .<String>append(new KeyedCodec<>("CornerBlockType", Codec.STRING), (var0, var1) -> var0.cornerBlockType = var1, var0 -> var0.cornerBlockType)
      .documentation("The block type used at the corners of the 3D wireframe grid. Falls back to EdgeBlockType if unset.")
      .add()
      .<Integer>append(new KeyedCodec<>("GridStride", Codec.INTEGER), (var0, var1) -> var0.gridStride = var1, var0 -> var0.gridStride)
      .documentation("The spacing in blocks between wireframe lines along each axis. Must be a power of two so chunk boundaries land cleanly on grid lines.")
      .add()
      .<Integer>append(new KeyedCodec<>("PlatformY", Codec.INTEGER), (var0, var1) -> var0.platformY = var1, var0 -> var0.platformY)
      .documentation("The Y coordinate of the flat spawn platform top.")
      .add()
      .<Integer>append(new KeyedCodec<>("PlatformHalfExtent", Codec.INTEGER), (var0, var1) -> var0.platformHalfExtent = var1, var0 -> var0.platformHalfExtent)
      .documentation("Platform spans [-PlatformHalfExtent, PlatformHalfExtent) in both X and Z.")
      .add()
      .<Integer>append(new KeyedCodec<>("ClearHeight", Codec.INTEGER), (var0, var1) -> var0.clearHeight = var1, var0 -> var0.clearHeight)
      .documentation("Vertical extent above and below the platform that is forced to air, so the wireframe never blocks the spawn.")
      .add()
      .<String[]>append(
         new KeyedCodec<>("PrefabPaths", new ArrayCodec<>(Codec.STRING, String[]::new)), (var0, var1) -> var0.prefabPaths = var1, var0 -> var0.prefabPaths
      )
      .documentation("Asset-relative prefab paths (e.g. \"Trees/Oak/Stage_3/Oak_Stage3_001.prefab.json\") to sprinkle deterministically through the world.")
      .add()
      .<Integer>append(new KeyedCodec<>("PrefabCellSize", Codec.INTEGER), (var0, var1) -> var0.prefabCellSize = var1, var0 -> var0.prefabCellSize)
      .documentation("Edge length of the 3D cells used for prefab placement; one cell rolls at most one prefab.")
      .add()
      .<Integer>append(new KeyedCodec<>("MaxPrefabExtent", Codec.INTEGER), (var0, var1) -> var0.maxPrefabExtent = var1, var0 -> var0.maxPrefabExtent)
      .documentation("Maximum half-extent (in blocks) any configured prefab can span from its anchor. Used to bound the cells inspected per section.")
      .add()
      .<Float>append(new KeyedCodec<>("PrefabDensity", Codec.FLOAT), (var0, var1) -> var0.prefabDensity = var1, var0 -> var0.prefabDensity)
      .documentation("Probability [0, 1] that a given spawn cell rolls a prefab.")
      .add()
      .build();
   class="kw">private Color tint = DEFAULT_TINT;
   class="kw">private String environment;
   class="kw">private String platformBlockType;
   class="kw">private String edgeBlockType;
   class="kw">private String cornerBlockType;
   class="kw">private int gridStride = 16;
   class="kw">private int platformY = 160;
   class="kw">private int platformHalfExtent = 32;
   class="kw">private int clearHeight = 16;
   class="kw">private String[] prefabPaths = new String[0];
   class="kw">private int prefabCellSize = 64;
   class="kw">private int maxPrefabExtent = 32;
   class="kw">private float prefabDensity = 0.4F;

   class="kw">public CubicTestWorldGenProvider() {
   }

   @Nonnull
   @Override
   class="kw">public IWorldGen getGenerator() class="kw">throws WorldGenLoadException {
      int var1 = ColorParseUtil.colorToARGBInt(this.tint);
      int var2;
      if (this.environment != null) {
         int var3 = Environment.getAssetMap().getIndex(this.environment);
         if (var3 == Integer.MIN_VALUE) {
            throw new WorldGenLoadException("Unknown environment: " + this.environment);
         }

         var2 = var3;
      } else {
         var2 = 0;
      }

      int var10 = resolveBlock(this.platformBlockType, "PlatformBlockType");
      int var4 = resolveBlock(this.edgeBlockType, "EdgeBlockType");
      int var5 = this.cornerBlockType != null ? resolveBlock(this.cornerBlockType, "CornerBlockType") : var4;
      if (this.gridStride <= 0 || Integer.bitCount(this.gridStride) != 1) {
         throw new WorldGenLoadException("GridStride must be a positive power of two, got " + this.gridStride);
      } else if (this.platformHalfExtent < 0) {
         throw new WorldGenLoadException("PlatformHalfExtent must be non-negative, got " + this.platformHalfExtent);
      } else if (this.clearHeight < 0) {
         throw new WorldGenLoadException("ClearHeight must be non-negative, got " + this.clearHeight);
      } else if (this.prefabCellSize <= 0) {
         throw new WorldGenLoadException("PrefabCellSize must be positive, got " + this.prefabCellSize);
      } else if (this.maxPrefabExtent < 0) {
         throw new WorldGenLoadException("MaxPrefabExtent must be non-negative, got " + this.maxPrefabExtent);
      } else if (!(this.prefabDensity < 0.0F) && !(this.prefabDensity > 1.0F)) {
         BlockSelection[] var6 = this.loadPrefabs();
         int var7 = this.platformHalfExtent + this.maxPrefabExtent;
         int var8 = this.platformY - this.clearHeight - this.maxPrefabExtent;
         int var9 = this.platformY + this.clearHeight + this.maxPrefabExtent;
         class="kw">return new CubicTestWorldGenProvider.CubicTestWorldGen(
            var1,
            var2,
            var10,
            var4,
            var5,
            this.gridStride,
            this.platformY,
            this.platformHalfExtent,
            this.clearHeight,
            var6,
            this.prefabPaths,
            this.prefabCellSize,
            this.maxPrefabExtent,
            this.prefabDensity,
            var7,
            var8,
            var9
         );
      } else {
         throw new WorldGenLoadException("PrefabDensity must be in [0, 1], got " + this.prefabDensity);
      }
   }

   class="kw">private BlockSelection[] loadPrefabs() class="kw">throws WorldGenLoadException {
      if (this.prefabPaths.length == 0) {
         class="kw">return new BlockSelection[0];
      }

      BlockSelection[] var1 = new BlockSelection[this.prefabPaths.length];

      for (int var2 = 0; var2 < this.prefabPaths.length; var2++) {
         try {
            var1[var2] = PrefabStore.get().getAssetPrefab(this.prefabPaths[var2]);
         } catch (PrefabLoadException var4) {
            throw new WorldGenLoadException("Failed to load prefab " + this.prefabPaths[var2], var4);
         }
      }

      class="kw">return var1;
   }

   class="kw">private class="kw">static int resolveBlock(@Nullable String var0, @Nonnull String var1) class="kw">throws WorldGenLoadException {
      if (var0 == null) {
         throw new WorldGenLoadException(var1 + " must be set.");
      } else {
         int var2 = BlockType.getAssetMap().getIndex(var0);
         if (var2 == Integer.MIN_VALUE) {
            throw new WorldGenLoadException("Unknown " + var1 + ": " + var0);
         } else {
            class="kw">return var2;
         }
      }
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "CubicTestWorldGenProvider{tint="
         + this.tint
         + ", environment='"
         + this.environment
         + "', platformBlockType='"
         + this.platformBlockType
         + "', edgeBlockType='"
         + this.edgeBlockType
         + "', cornerBlockType='"
         + this.cornerBlockType
         + "', gridStride="
         + this.gridStride
         + ", platformY="
         + this.platformY
         + ", platformHalfExtent="
         + this.platformHalfExtent
         + ", clearHeight="
         + this.clearHeight
         + ", prefabPaths="
         + Arrays.toString(this.prefabPaths)
         + ", prefabCellSize="
         + this.prefabCellSize
         + ", maxPrefabExtent="
         + this.maxPrefabExtent
         + ", prefabDensity="
         + this.prefabDensity
         + "}";
   }

   @FunctionalInterface
   class="kw">private class="kw">interface BlockSink {
      void put(int var1, int var2, int var3, int var4, int var5, int var6);
   }

   class="kw">private class="kw">static class CubicTestWorldGen class="kw">implements IWorldGen.Cubic {
      class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
      class="kw">private class="kw">final int tintId;
      class="kw">private class="kw">final int environmentId;
      class="kw">private class="kw">final int platformBlockId;
      class="kw">private class="kw">final int edgeBlockId;
      class="kw">private class="kw">final int cornerBlockId;
      class="kw">private class="kw">final int gridStride;
      class="kw">private class="kw">final int gridStrideMask;
      class="kw">private class="kw">final int platformY;
      class="kw">private class="kw">final int platformHalfExtent;
      class="kw">private class="kw">final int clearHeight;
      class="kw">private class="kw">final BlockSelection[] prefabs;
      class="kw">private class="kw">final String[] prefabPaths;
      class="kw">private class="kw">final int prefabCellSize;
      class="kw">private class="kw">final int maxPrefabExtent;
      class="kw">private class="kw">final float prefabDensity;
      class="kw">private class="kw">final int spawnSuppressXZ;
      class="kw">private class="kw">final int spawnSuppressYMin;
      class="kw">private class="kw">final int spawnSuppressYMax;

      CubicTestWorldGen(
         int var1,
         int var2,
         int var3,
         int var4,
         int var5,
         int var6,
         int var7,
         int var8,
         int var9,
         @Nonnull BlockSelection[] var10,
         @Nonnull String[] var11,
         int var12,
         int var13,
         float var14,
         int var15,
         int var16,
         int var17
      ) {
         this.tintId = var1;
         this.environmentId = var2;
         this.platformBlockId = var3;
         this.edgeBlockId = var4;
         this.cornerBlockId = var5;
         this.gridStride = var6;
         this.gridStrideMask = var6 - 1;
         this.platformY = var7;
         this.platformHalfExtent = var8;
         this.clearHeight = var9;
         this.prefabs = var10;
         this.prefabPaths = var11;
         this.prefabCellSize = var12;
         this.maxPrefabExtent = var13;
         this.prefabDensity = var14;
         this.spawnSuppressXZ = var15;
         this.spawnSuppressYMin = var16;
         this.spawnSuppressYMax = var17;
      }

      @Nullable
      @Override
      class="kw">public WorldGenTimingsCollector getTimings() {
         class="kw">return null;
      }

      @Nonnull
      @Override
      class="kw">public Transform[] getSpawnPoints(int var1) {
         class="kw">return new Transform[]{new Transform(0.5, this.platformY + 1.0F, 0.5)};
      }

      @Nonnull
      @Override
      class="kw">public ISpawnProvider getDefaultSpawnProvider(int var1) {
         class="kw">return new IndividualSpawnProvider(this.getSpawnPoints(var1));
      }

      @Nonnull
      @Override
      class="kw">public CompletableFuture<GeneratedChunk> generate(int var1, long var2, int var4, int var5, LongPredicate var6, Long2FloatFunction var7) {
         GeneratedBlockChunk var8 = new GeneratedBlockChunk(var2, var4, var5);
         Holder[] var9 = GeneratedChunk.makeSections();

         for (int var10 = 0; var10 < 32; var10++) {
            for (int var11 = 0; var11 < 32; var11++) {
               var8.setTint(var10, var11, this.tintId);
               if (this.environmentId != 0) {
                  var8.setEnvironmentColumn(var10, var11, this.environmentId);
               }
            }
         }

         int var19 = var4 << 5;
         int var20 = var5 << 5;

         for (int var12 = 0; var12 < 32; var12++) {
            int var13 = var19 + var12;

            for (int var14 = 0; var14 < 32; var14++) {
               int var15 = var20 + var14;
               boolean var16 = this.inPlatformXZ(var13, var15);

               for (int var17 = 0; var17 < 320; var17++) {
                  int var18 = this.blockAt(var13, var17, var15, var16);
                  if (var18 != 0) {
                     var8.setBlock(var12, var17, var14, var18, 0, 0);
                  }
               }
            }
         }

         this.applyPrefabs(
            var1,
            var19,
            0,
            var20,
            var19 + 32,
            320,
            var20 + 32,
            (var3, var4x, var5x, var6x, var7x, var8x) -> var8.setBlock(var3 - var19, var4x, var5x - var20, var6x, var7x, var8x),
            (var3, var4x, var5x, var6x, var7x) -> {
               int var8 = ChunkUtil.indexSection(var4x);
               int var9 = var4x & 31;
               FluidSection var10 = var9[var8].ensureAndGetComponent(FluidSection.getComponentType());
               var10.setFluid(var3 - var19, var9, var5x - var20, var6x, var7x);
            }
         );
         class="kw">return CompletableFuture.completedFuture(new GeneratedChunk(var8, new GeneratedEntityChunk(), var9));
      }

      @Nonnull
      @Override
      class="kw">public CompletableFuture<Holder<ChunkStore>> generate(
         int var1, int var2, int var3, int var4, IWorldGen.StillNeededSection var5, IWorldGen.SectionPriority var6
      ) {
         GeneratedChunkSection var7 = new GeneratedChunkSection();
         int var8 = var2 << 5;
         int var9 = var3 << 5;
         int var10 = var4 << 5;

         for (int var11 = 0; var11 < 32; var11++) {
            int var12 = var9 + var11;

            for (int var13 = 0; var13 < 32; var13++) {
               int var14 = var10 + var13;

               for (int var15 = 0; var15 < 32; var15++) {
                  int var16 = var8 + var15;
                  int var17 = this.wireframeAt(var16, var12, var14);
                  if (var17 != 0) {
                     var7.setBlock(var15, var11, var13, var17, 0, 0);
                  }
               }
            }
         }

         Holder var18 = ChunkStore.REGISTRY.newHolder();
         this.applyPrefabs(
            var1,
            var8,
            var9,
            var10,
            var8 + 32,
            var9 + 32,
            var10 + 32,
            (var4x, var5x, var6x, var7x, var8x, var9x) -> var7.setBlock(var4x - var8, var5x - var9, var6x - var10, var7x, var8x, var9x),
            (var4x, var5x, var6x, var7x, var8x) -> {
               FluidSection var9 = var18.ensureAndGetComponent(FluidSection.getComponentType());
               var9.setFluid(var4x - var8, var5x - var9, var6x - var10, var7x, var8x);
            }
         );
         var18.putComponent(BlockSection.getComponentType(), var7.toChunkSection());
         class="kw">return CompletableFuture.completedFuture(var18);
      }

      class="kw">private int blockAt(int var1, int var2, int var3, boolean var4) {
         if (var4) {
            if (var2 == this.platformY) {
               class="kw">return this.platformBlockId;
            }

            if (var2 > this.platformY - this.clearHeight && var2 < this.platformY + this.clearHeight) {
               class="kw">return 0;
            }
         }

         class="kw">return this.wireframeAt(var1, var2, var3);
      }

      class="kw">private int wireframeAt(int var1, int var2, int var3) {
         int var4 = (var1 & this.gridStrideMask) == 0 ? 1 : 0;
         int var5 = (var2 & this.gridStrideMask) == 0 ? 1 : 0;
         int var6 = (var3 & this.gridStrideMask) == 0 ? 1 : 0;
         int var7 = var4 + var5 + var6;
         if (var7 == 3) {
            class="kw">return this.cornerBlockId;
         } else {
            class="kw">return var7 == 2 ? this.edgeBlockId : 0;
         }
      }

      class="kw">private boolean inPlatformXZ(int var1, int var2) {
         class="kw">return var1 >= -this.platformHalfExtent && var1 < this.platformHalfExtent && var2 >= -this.platformHalfExtent && var2 < this.platformHalfExtent;
      }

      class="kw">private void applyPrefabs(
         int var1,
         int var2,
         int var3,
         int var4,
         int var5,
         int var6,
         int var7,
         @Nonnull CubicTestWorldGenProvider.BlockSink var8,
         @Nonnull CubicTestWorldGenProvider.FluidSink var9
      ) {
         if (this.prefabs.length != 0) {
            int var10 = Math.floorDiv(var2 - this.maxPrefabExtent, this.prefabCellSize);
            int var11 = Math.floorDiv(var5 + this.maxPrefabExtent - 1, this.prefabCellSize);
            int var12 = Math.floorDiv(var3 - this.maxPrefabExtent, this.prefabCellSize);
            int var13 = Math.floorDiv(var6 + this.maxPrefabExtent - 1, this.prefabCellSize);
            int var14 = Math.floorDiv(var4 - this.maxPrefabExtent, this.prefabCellSize);
            int var15 = Math.floorDiv(var7 + this.maxPrefabExtent - 1, this.prefabCellSize);

            for (int var16 = var10; var16 <= var11; var16++) {
               for (int var17 = var12; var17 <= var13; var17++) {
                  for (int var18 = var14; var18 <= var15; var18++) {
                     this.applyPrefabCell(var1, var16, var17, var18, var2, var3, var4, var5, var6, var7, var8, var9);
                  }
               }
            }
         }
      }

      class="kw">private void applyPrefabCell(
         int var1,
         int var2,
         int var3,
         int var4,
         int var5,
         int var6,
         int var7,
         int var8,
         int var9,
         int var10,
         @Nonnull CubicTestWorldGenProvider.BlockSink var11,
         @Nonnull CubicTestWorldGenProvider.FluidSink var12
      ) {
         int var13 = GeneralNoise.hash3D(var1, var2, var3, var4);
         Random var14 = new Random(var13);
         if (!(var14.nextFloat() >= this.prefabDensity)) {
            int var15 = var14.nextInt(this.prefabs.length);
            int var16 = var2 * this.prefabCellSize + var14.nextInt(this.prefabCellSize);
            int var17 = var3 * this.prefabCellSize + var14.nextInt(this.prefabCellSize);
            int var18 = var4 * this.prefabCellSize + var14.nextInt(this.prefabCellSize);
            if (!this.isInSpawnKeepOut(var16, var17, var18)) {
               BlockSelection var19 = this.prefabs[var15];
               int var20 = var16 - var19.getAnchorX();
               int var21 = var17 - var19.getAnchorY();
               int var22 = var18 - var19.getAnchorZ();
               var19.forEachBlock(
                  (var15x, var16x, var17x, var18x) -> {
                     int var19 = var15x + var20;
                     int var20 = var16x + var21;
                     int var21 = var17x + var22;
                     if (var19 >= var5 && var19 < var8 && var20 >= var6 && var20 < var9 && var21 >= var7 && var21 < var10) {
                        if (Math.abs(var19 - var16) > this.maxPrefabExtent
                           || Math.abs(var20 - var17) > this.maxPrefabExtent
                           || Math.abs(var21 - var18) > this.maxPrefabExtent) {
                           LOGGER.at(Level.WARNING)
                              .log(
                                 "Prefab %s contains a block at offset (%d, %d, %d) beyond MaxPrefabExtent=%d; bump MaxPrefabExtent to render it correctly.",
                                 this.prefabPaths[var15],
                                 var19 - var16,
                                 var20 - var17,
                                 var21 - var18,
                                 this.maxPrefabExtent
                              );
                        } else if (var18x.blockId() != 0) {
                           var11.put(var19, var20, var21, var18x.blockId(), var18x.rotation(), var18x.filler());
                        }
                     }
                  }
               );
               var19.forEachFluid(
                  (var14x, var15x, var16x, var17x, var18x) -> {
                     if (var18x != 0) {
                        int var19 = var14x + var20;
                        int var20 = var15x + var21;
                        int var21 = var16x + var22;
                        if (var19 >= var5 && var19 < var8 && var20 >= var6 && var20 < var9 && var21 >= var7 && var21 < var10) {
                           if (Math.abs(var19 - var16) <= this.maxPrefabExtent
                              && Math.abs(var20 - var17) <= this.maxPrefabExtent
                              && Math.abs(var21 - var18) <= this.maxPrefabExtent) {
                              var12.put(var19, var20, var21, var17x, var18x);
                           }
                        }
                     }
                  }
               );
            }
         }
      }

      class="kw">private boolean isInSpawnKeepOut(int var1, int var2, int var3) {
         class="kw">return var1 >= -this.spawnSuppressXZ
            && var1 < this.spawnSuppressXZ
            && var3 >= -this.spawnSuppressXZ
            && var3 < this.spawnSuppressXZ
            && var2 >= this.spawnSuppressYMin
            && var2 < this.spawnSuppressYMax;
      }
   }

   @FunctionalInterface
   class="kw">private class="kw">interface FluidSink {
      void put(int var1, int var2, int var3, int var4, byte var5);
   }
}