CachedAccessor class

Пакет: com.hypixel.hytale.server.core.asset.type.fluid

Файл: com/hypixel/hytale/server/core/asset/type/fluid/FluidTicker.java

extends: AbstractCachedAccessor

implements: FluidTicker.Accessor

Поля (9)

МодификаторыТипИмя
private static final AbstractCachedAccessor.Key<BlockSection> BLOCK_COMPONENT
private static final AbstractCachedAccessor.Key<FluidSection> FLUID_COMPONENT
private static final AbstractCachedAccessor.Registry REGISTRY
private static final ThreadLocal<FluidTicker.CachedAccessor> THREAD_LOCAL
private CommandBuffer<ChunkStore> commandBuffer
public BlockSection selfBlockSection
public FluidSection selfFluidSection
FluidTicker.CachedAccessor var4
Ref var5

Методы (6)

МодификаторыВозвратСигнатура
public BlockSection getBlockSectionpublic BlockSection getBlockSection(int var1, int var2, int var3)
public FluidSection getFluidSectionpublic FluidSection getFluidSection(int var1, int var2, int var3)
private void initprivate void init(CommandBuffer<ChunkStore> var1, @Nonnull FluidSection var2, BlockSection var3, int var4)
public static FluidTicker.CachedAccessor ofpublic static FluidTicker.CachedAccessor of(CommandBuffer<ChunkStore> var0, @Nonnull FluidSection var1, BlockSection var2, int var3)
public void setBlockpublic void setBlock(int var1, int var2, int var3, int var4)
abstract super super(REGISTRY)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.asset.type.fluid;

class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
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.lookup.CodecMapCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.protocol.DrawType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktick.BlockTickStrategy;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.AbstractCachedAccessor;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
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.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector2i;

class="kw">public class="kw">abstract class FluidTicker {
   class="kw">public class="kw">static class="kw">final BuilderCodec<FluidTicker> BASE_CODEC = BuilderCodec.abstractBuilder(FluidTicker.class)
      .appendInherited(
         new KeyedCodec<>("FlowRate", Codec.FLOAT), (var0, var1) -> var0.flowRate = var1, var0 -> var0.flowRate, (var0, var1) -> var0.flowRate = var1.flowRate
      )
      .documentation("The tick frequency for this fluid type, in seconds")
      .addValidator(Validators.greaterThan(0.0F))
      .add()
      .<Boolean>appendInherited(
         new KeyedCodec<>("CanDemote", Codec.BOOLEAN),
         (var0, var1) -> var0.canDemote = var1,
         var0 -> var0.canDemote,
         (var0, var1) -> var0.canDemote = var1.canDemote
      )
      .documentation("If false then the fluid will stay at its level")
      .add()
      .appendInherited(
         new KeyedCodec<>("SupportedBy", Codec.STRING),
         (var0, var1) -> var0.supportedBy = var1,
         var0 -> var0.supportedBy,
         (var0, var1) -> var0.supportedBy = var1.supportedBy
      )
      .add()
      .build();
   class="kw">public class="kw">static class="kw">final CodecMapCodec<FluidTicker> CODEC = new CodecMapCodec<>("Type", true);
   class="kw">protected class="kw">static class="kw">final Vector2i[] ORTO_OFFSETS = new Vector2i[]{new Vector2i(-1, 0), new Vector2i(1, 0), new Vector2i(0, -1), new Vector2i(0, 1)};
   class="kw">protected class="kw">static class="kw">final int SPREAD_NO_PATH = Integer.MAX_VALUE;
   class="kw">protected class="kw">static class="kw">final int SPREAD_NO_CHUNK = 2147483646;
   class="kw">protected class="kw">static class="kw">final int OFFSET_DROP_NONE = 0;
   class="kw">public class="kw">static class="kw">final int FLUID_BLOCK_DISTANCE = 5;
   class="kw">private class="kw">static class="kw">final double FULL_DIMENSION_THRESHOLD = 0.9;
   class="kw">private class="kw">static class="kw">final double PARTIAL_DIMENSION_THRESHOLD = 0.6;
   class="kw">private class="kw">static class="kw">final double FACE_BLOCK_THRESHOLD = 0.1;
   class="kw">private float flowRate = 0.5F;
   class="kw">private boolean canDemote = true;
   class="kw">private String supportedBy;
   class="kw">private class="kw">transient int supportedById = 0;

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

   class="kw">public int getSupportedById() {
      if (this.supportedById == 0) {
         if (this.supportedBy != null) {
            this.supportedById = Fluid.getAssetMap().getIndex(this.supportedBy);
         } else {
            this.supportedById = Integer.MIN_VALUE;
         }
      }

      class="kw">return this.supportedById;
   }

   class="kw">public BlockTickStrategy tick(
      @Nonnull CommandBuffer<ChunkStore> var1,
      @Nonnull FluidTicker.CachedAccessor var2,
      @Nonnull FluidSection var3,
      @Nonnull BlockSection var4,
      @Nonnull Fluid var5,
      int var6,
      int var7,
      int var8,
      int var9
   ) {
      int var10 = var4.get(var7, var8, var9);
      if (!this.canOccupySolidBlocks() && isFullySolid(BlockType.getAssetMap().getAsset(var10))) {
         var3.setFluid(var7, var8, var9, 0, (byte)0);
         setTickingSurrounding(var2, var4, var7, var8, var9);
         class="kw">return BlockTickStrategy.SLEEP;
      } else {
         World var11 = var1.getExternalData().getWorld();
         long var12 = HashUtil.rehash(var7, var8, var9, 4030921250L);
         long var14 = var1.getExternalData().getWorld().getTick();
         int var16 = Math.round(this.flowRate * var11.getTps());
         class="kw">return (var12 + var14) % var16 != 0L ? BlockTickStrategy.CONTINUE : this.process(var11, var14, var2, var3, var4, var5, var6, var7, var8, var9);
      }
   }

   class="kw">public boolean canOccupySolidBlocks() {
      class="kw">return false;
   }

   class="kw">public BlockTickStrategy process(
      World var1,
      long var2,
      @Nonnull FluidTicker.Accessor var4,
      @Nonnull FluidSection var5,
      @Nonnull BlockSection var6,
      @Nonnull Fluid var7,
      int var8,
      int var9,
      int var10,
      int var11
   ) {
      byte var12 = var5.getFluidLevel(var9, var10, var11);

      class="kw">return class="kw">switch (this.isAlive(var4, var5, var6, var7, var8, var12, var9, var10, var11)) {
         case ALIVE -> this.spread(var1, var2, var4, var5, var6, var7, var8, var12, var9, var10, var11);
         case DEMOTE -> {
            if (var12 == 1) {
               var5.setFluid(var9, var10, var11, 0, (byte)0);
               setTickingSurrounding(var4, var6, var9, var10, var11);
               yield BlockTickStrategy.SLEEP;
            } else {
               var5.setFluid(var9, var10, var11, var8, (byte)((var12 == 0 ? var7.getMaxFluidLevel() : var12) - 1));
               setTickingSurrounding(var4, var6, var9, var10, var11);
               yield BlockTickStrategy.SLEEP;
            }
         }
         case WAIT_FOR_ADJACENT_CHUNK -> BlockTickStrategy.WAIT_FOR_ADJACENT_CHUNK_LOAD;
      };
   }

   @Nonnull
   class="kw">protected FluidTicker.AliveStatus isAlive(
      @Nonnull FluidTicker.Accessor var1, @Nonnull FluidSection var2, @Nonnull BlockSection var3, Fluid var4, int var5, byte var6, int var7, int var8, int var9
   ) {
      if (!this.canDemote) {
         class="kw">return FluidTicker.AliveStatus.ALIVE;
      }

      int var10 = this.getSupportedById();
      BlockTypeAssetMap var11 = BlockType.getAssetMap();
      FluidSection var12 = ChunkUtil.chunkCoordinate(var8 + 1) == var2.getY() ? var2 : var1.getFluidSectionByBlock(var7, var8 + 1, var9);
      if (var12 == null) {
         class="kw">return FluidTicker.AliveStatus.WAIT_FOR_ADJACENT_CHUNK;
      }

      int var13 = var12.getFluidId(var7, var8 + 1, var9);
      if (var13 != var5 && var13 != var10) {
         BlockType var14 = var11.getAsset(var3.get(var7, var8, var9));
         int var15 = var3.getRotationIndex(var7, var8, var9);
         int var16 = var3.getFiller(var7, var8, var9);
         boolean var17 = false;

         for (Vector2i var21 : ORTO_OFFSETS) {
            int var22 = var21.x;
            int var23 = var21.y;
            int var24 = var22 + var7;
            int var25 = var8;
            int var26 = var23 + var9;
            boolean var27 = !ChunkUtil.isSameChunkSection(var7, var8, var9, var24, var25, var26);
            FluidSection var28 = var27 ? var1.getFluidSectionByBlock(var24, var25, var26) : var2;
            BlockSection var29 = var27 ? var1.getBlockSectionByBlock(var24, var25, var26) : var3;
            if (var28 != null && var29 != null) {
               int var30 = var28.getFluidId(var24, var8, var26);
               if (var10 != Integer.MIN_VALUE && var30 == var10) {
                  BlockType var35 = var11.getAsset(var29.get(var24, var25, var26));
                  if (var35 != null) {
                     int var36 = var29.getRotationIndex(var24, var25, var26);
                     int var37 = var29.getFiller(var24, var25, var26);
                     if (!this.blocksFluidFrom(var35, var36, var22, var23, var37) && !this.blocksFluidFrom(var14, var15, -var22, -var23, var16)) {
                        class="kw">return FluidTicker.AliveStatus.ALIVE;
                     }
                  }
               } else {
                  byte var31 = var28.getFluidLevel(var24, var25, var26);
                  if (var30 != 0 && var30 == var5 && var31 > var6) {
                     BlockType var32 = var11.getAsset(var29.get(var24, var25, var26));
                     if (var32 != null) {
                        int var33 = var29.getRotationIndex(var24, var25, var26);
                        int var34 = var29.getFiller(var24, var25, var26);
                        if (!this.blocksFluidFrom(var32, var33, var22, var23, var34) && !this.blocksFluidFrom(var14, var15, -var22, -var23, var16)) {
                           class="kw">return FluidTicker.AliveStatus.ALIVE;
                        }
                     }
                  }
               }
            } else {
               var17 = true;
            }
         }

         class="kw">return var17 ? FluidTicker.AliveStatus.WAIT_FOR_ADJACENT_CHUNK : FluidTicker.AliveStatus.DEMOTE;
      } else {
         class="kw">return FluidTicker.AliveStatus.ALIVE;
      }
   }

   class="kw">protected class="kw">abstract BlockTickStrategy spread(
      World var1, long var2, FluidTicker.Accessor var4, FluidSection var5, BlockSection var6, Fluid var7, int var8, byte var9, int var10, int var11, int var12
   );

   class="kw">public class="kw">static void setTickingSurrounding(@Nonnull FluidTicker.Accessor var0, BlockSection var1, int var2, int var3, int var4) {
      for (int var5 = -1; var5 <= 1; var5++) {
         for (int var6 = -1; var6 <= 1; var6++) {
            for (int var7 = -1; var7 <= 1; var7++) {
               int var8 = var2 + var7;
               int var9 = var3 + var5;
               int var10 = var4 + var6;
               BlockSection var11 = ChunkUtil.isSameChunkSection(var2, var3, var4, var8, var9, var10) ? var1 : var0.getBlockSectionByBlock(var8, var9, var10);
               if (var11 != null) {
                  var11.setTicking(var8, var9, var10, true);
               }
            }
         }
      }
   }

   class="kw">protected int getSpreadOffsets(
      @Nonnull BlockTypeAssetMap<String, BlockType> var1,
      @Nonnull FluidTicker.Accessor var2,
      @Nonnull FluidSection var3,
      BlockSection var4,
      int var5,
      int var6,
      int var7,
      @Nonnull Vector2i[] var8,
      int var9,
      int var10
   ) {
      int var11 = Integer.MAX_VALUE;
      int var12 = 0;

      for (int var13 = 0; var13 < var8.length; var13++) {
         Vector2i var14 = var8[var13];
         int var15 = this.distanceToDrop(var1, var2, var3, var4, var5, var6, var7, var14, var9, var10);
         if (var15 == 2147483646) {
            class="kw">return 2147483646;
         }

         if (var15 < var11) {
            var12 = 0;
            var11 = var15;
         }

         if (var15 <= var11 && var15 != Integer.MAX_VALUE) {
            var12 |= 1 << var13;
         }
      }

      class="kw">return var12;
   }

   class="kw">protected int distanceToDrop(
      @Nonnull BlockTypeAssetMap<String, BlockType> var1,
      @Nonnull FluidTicker.Accessor var2,
      @Nonnull FluidSection var3,
      BlockSection var4,
      int var5,
      int var6,
      int var7,
      @Nonnull Vector2i var8,
      int var9,
      int var10
   ) {
      int var11 = var8.x;
      int var12 = var8.y;
      int var13 = var6 - 1;
      FluidSection var14 = var3;
      BlockSection var15 = var4;
      boolean var16 = var3.getY() != ChunkUtil.chunkCoordinate(var13);
      if (var16) {
         var14 = var2.getFluidSectionByBlock(var5, var13, var7);
         var15 = var2.getBlockSectionByBlock(var5, var13, var7);
      }

      int var17 = var5;
      int var18 = var7;
      int var19 = this.getSupportedById();

      for (int var20 = 1; var20 < var10; var20++) {
         int var21 = var5 + var11 * var20;
         int var22 = var7 + var12 * var20;
         if (!ChunkUtil.isSameChunk(var17, var18, var21, var22)) {
            var17 = var21;
            var18 = var22;
            var3 = var2.getFluidSectionByBlock(var21, var6, var22);
            var4 = var2.getBlockSectionByBlock(var21, var6, var22);
            if (var16) {
               var14 = var2.getFluidSectionByBlock(var5, var13, var7);
               var15 = var2.getBlockSectionByBlock(var5, var13, var7);
            } else {
               var14 = var3;
               var15 = var4;
            }
         }

         if (var3 == null || var4 == null || var14 == null || var15 == null) {
            class="kw">return 2147483646;
         }

         int var23 = var3.getFluidId(var21, var6, var22);
         BlockType var24 = var1.getAsset(var4.get(var21, var6, var22));
         if (var23 != 0 && (var23 != var9 || var23 == var19 || var19 == Integer.MIN_VALUE) || var23 == 0 && isSolid(var24)) {
            break;
         }

         BlockType var25 = var1.getAsset(var15.get(var21, var13, var22));
         if (!isSolid(var25)) {
            class="kw">return var20;
         }
      }

      class="kw">return Integer.MAX_VALUE;
   }

   class="kw">public class="kw">static boolean isFullySolid(@Nonnull BlockType var0) {
      DrawType var1 = var0.getDrawType();
      class="kw">return var0.getMaterial() == BlockMaterial.Solid && (var1 == DrawType.Cube || var1 == DrawType.CubeWithModel);
   }

   class="kw">public class="kw">static boolean isSolid(@Nonnull BlockType var0) {
      DrawType var1 = var0.getDrawType();
      class="kw">return var1 == DrawType.Cube || var1 == DrawType.CubeWithModel;
   }

   class="kw">public boolean blocksFluidFrom(@Nonnull BlockType var1, int var2, int var3, int var4) {
      class="kw">return this.blocksFluidFrom(var1, var2, var3, var4, 0);
   }

   class="kw">public boolean blocksFluidFrom(@Nonnull BlockType var1, int var2, int var3, int var4, int var5) {
      if (var1.getMaterial() != BlockMaterial.Solid) {
         class="kw">return false;
      }

      if (isFullySolid(var1)) {
         class="kw">return true;
      }

      int var6 = var1.getHitboxTypeIndex();
      BlockBoundingBoxes var7 = BlockBoundingBoxes.getAssetMap().getAsset(var6);
      if (var7 == null) {
         class="kw">return true;
      }

      BlockBoundingBoxes.RotatedVariantBoxes var8 = var7.get(var2);
      Box var9 = var8.getBoundingBox();
      if (!var7.protrudesUnitBox() && var5 == 0) {
         double var40 = var9.max.x - var9.min.x;
         double var41 = var9.max.y - var9.min.y;
         double var42 = var9.max.z - var9.min.z;
         boolean var43 = var41 > 0.9;
         if (!var43) {
            class="kw">return false;
         }

         boolean var44 = var42 > 0.9;
         boolean var45 = var40 < 0.6;
         if (!var45 || !var44) {
            boolean var46 = var40 > 0.9;
            boolean var47 = var42 < 0.6;
            if (!var46 || !var47) {
               Box[] var21 = var8.getDetailBoxes();
               if (var21.length > 1) {
                  class="kw">return boxesBlockFace(var21, var3, var4);
               }

               double var48 = 0.0;
               if (var3 > 0 && var9.min.x < 0.1) {
                  var48 = var41 * var42;
               } else if (var3 < 0 && var9.max.x > 0.9) {
                  var48 = var41 * var42;
               } else if (var4 > 0 && var9.min.z < 0.1) {
                  var48 = var41 * var40;
               } else if (var4 < 0 && var9.max.z > 0.9) {
                  var48 = var41 * var40;
               }

               class="kw">return var48 > 0.9;
            } else if (var4 == 0) {
               class="kw">return false;
            } else {
               class="kw">return var4 > 0 ? var9.min.z < 0.1 : var9.max.z > 0.9;
            }
         } else if (var3 == 0) {
            class="kw">return false;
         } else {
            class="kw">return var3 > 0 ? var9.min.x < 0.1 : var9.max.x > 0.9;
         }
      } else {
         int var10 = FillerBlockUtil.unpackX(var5);
         int var11 = FillerBlockUtil.unpackY(var5);
         int var12 = FillerBlockUtil.unpackZ(var5);
         Box[] var13 = var8.getDetailBoxes();
         double var14 = 0.0;

         for (Box var19 : var13) {
            double var20 = Math.max(var19.min.x, var10);
            double var22 = Math.min(var19.max.x, var10 + 1);
            double var24 = Math.max(var19.min.y, var11);
            double var26 = Math.min(var19.max.y, var11 + 1);
            double var28 = Math.max(var19.min.z, var12);
            double var30 = Math.min(var19.max.z, var12 + 1);
            if (!(var22 <= var20) && !(var26 <= var24) && !(var30 <= var28)) {
               double var32 = var22 - var20;
               double var34 = var26 - var24;
               double var36 = var30 - var28;
               double var38 = 0.0;
               if (var3 != 0) {
                  var38 = var34 * var36;
               } else if (var4 != 0) {
                  var38 = var34 * var32;
               }

               var14 = Math.max(var14, var38);
            }
         }

         class="kw">return var14 > 0.9;
      }
   }

   class="kw">private class="kw">static boolean boxesBlockFace(Box[] var0, int var1, int var2) {
      double var3 = 0.0;

      for (Box var8 : var0) {
         double var9 = 0.0;
         if (var1 > 0 && var8.min.x < 0.1) {
            double var17 = var8.max.y - var8.min.y;
            double var20 = var8.max.z - var8.min.z;
            var9 = var17 * var20;
         } else if (var1 < 0 && var8.max.x > 0.9) {
            double var16 = var8.max.y - var8.min.y;
            double var19 = var8.max.z - var8.min.z;
            var9 = var16 * var19;
         } else if (var2 > 0 && var8.min.z < 0.1) {
            double var15 = var8.max.y - var8.min.y;
            double var18 = var8.max.x - var8.min.x;
            var9 = var15 * var18;
         } else if (var2 < 0 && var8.max.z > 0.9) {
            double var11 = var8.max.y - var8.min.y;
            double var13 = var8.max.x - var8.min.x;
            var9 = var11 * var13;
         }

         var3 += var9;
      }

      class="kw">return var3 > 0.9;
   }

   class="kw">public boolean isSelfFluid(int var1, int var2) {
      class="kw">return var1 == var2 || var2 == this.getSupportedById();
   }

   class="kw">public boolean canDemote() {
      class="kw">return this.canDemote;
   }

   class="kw">public class="kw">interface Accessor {
      @Nullable
      FluidSection getFluidSection(int var1, int var2, int var3);

      @Nullable
      class="kw">default FluidSection getFluidSectionByBlock(int var1, int var2, int var3) {
         class="kw">return this.getFluidSection(ChunkUtil.chunkCoordinate(var1), ChunkUtil.chunkCoordinate(var2), ChunkUtil.chunkCoordinate(var3));
      }

      @Nullable
      BlockSection getBlockSection(int var1, int var2, int var3);

      @Nullable
      class="kw">default BlockSection getBlockSectionByBlock(int var1, int var2, int var3) {
         class="kw">return this.getBlockSection(ChunkUtil.chunkCoordinate(var1), ChunkUtil.chunkCoordinate(var2), ChunkUtil.chunkCoordinate(var3));
      }

      @Deprecated(forRemoval = true)
      void setBlock(int var1, int var2, int var3, int var4);
   }

   class="kw">public enum AliveStatus {
      ALIVE,
      DEMOTE,
      WAIT_FOR_ADJACENT_CHUNK;

      AliveStatus() {
      }
   }

   class="kw">public class="kw">static class CachedAccessor class="kw">extends AbstractCachedAccessor class="kw">implements FluidTicker.Accessor {
      class="kw">private class="kw">static class="kw">final ThreadLocal<FluidTicker.CachedAccessor> THREAD_LOCAL = ThreadLocal.withInitial(FluidTicker.CachedAccessor::new);
      class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Registry REGISTRY = new AbstractCachedAccessor.Registry();
      class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Key<FluidSection> FLUID_COMPONENT = REGISTRY.forSection(FluidSection::getComponentType);
      class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Key<BlockSection> BLOCK_COMPONENT = REGISTRY.forSection(BlockSection::getComponentType);
      class="kw">private CommandBuffer<ChunkStore> commandBuffer;
      class="kw">public FluidSection selfFluidSection;
      class="kw">public BlockSection selfBlockSection;

      class="kw">protected CachedAccessor() {
         super(REGISTRY);
      }

      @Nonnull
      class="kw">public class="kw">static FluidTicker.CachedAccessor of(CommandBuffer<ChunkStore> var0, @Nonnull FluidSection var1, BlockSection var2, int var3) {
         FluidTicker.CachedAccessor var4 = THREAD_LOCAL.get();
         var4.init(var0, var1, var2, var3);
         var4.insertSectionComponent(FLUID_COMPONENT, var1, var1.getX(), var1.getY(), var1.getZ());
         var4.insertSectionComponent(BLOCK_COMPONENT, var2, var1.getX(), var1.getY(), var1.getZ());
         class="kw">return var4;
      }

      class="kw">private void init(CommandBuffer<ChunkStore> var1, @Nonnull FluidSection var2, BlockSection var3, int var4) {
         this.init(var1, var2.getX(), var2.getY(), var2.getZ(), var4);
         this.commandBuffer = var1;
         this.selfFluidSection = var2;
         this.selfBlockSection = var3;
      }

      @Override
      class="kw">public FluidSection getFluidSection(int var1, int var2, int var3) {
         class="kw">return this.getComponentSection(var1, var2, var3, FLUID_COMPONENT);
      }

      @Override
      class="kw">public BlockSection getBlockSection(int var1, int var2, int var3) {
         class="kw">return this.getComponentSection(var1, var2, var3, BLOCK_COMPONENT);
      }

      @Override
      class="kw">public void setBlock(int var1, int var2, int var3, int var4) {
         Ref var5 = this.getSection(ChunkUtil.chunkCoordinate(var1), ChunkUtil.chunkCoordinate(var2), ChunkUtil.chunkCoordinate(var3));
         if (var5 != null && var5.isValid()) {
            this.commandBuffer.run(var5x -> {
               if (var5.isValid()) {
                  BlockOperations.setBlock(var5x.getExternalData(), var5, var1, var2, var3, var4, BlockType.getAssetMap().getAsset(var4), 0, 0, 0);
               }
            });
         }
      }
   }
}