FluidTicker class

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

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

Поля (129)

МодификаторыТипИмя
final BuilderCodec<FluidTicker> BASE_CODEC
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
ALIVE, DEMOTE, WAIT_FOR_ADJACENT_CHUNK
break
private CommandBuffer<ChunkStore> commandBuffer
public BlockSection selfBlockSection
public FluidSection selfFluidSection
DrawType var1
DrawType var1
int var10
int var10
int var10
int var10
World var11
BlockTypeAssetMap var11
BlockSection var11
int var11
var11
int var11
int var11
double var11
long var12
byte var12
FluidSection var12
int var12
var12
int var12
int var12
int var13
int var13
Box[] var13
double var13
long var14
BlockType var14
Vector2i var14
FluidSection var14
var14
var14
var14
double var14
var14
int var15
int var15
BlockSection var15
var15
var15
var15
double var15
int var16
int var16
boolean var16
double var16
boolean var17
var17
int var17
var17
double var17
int var18
var18
double var18
int var19
double var19
double var20
double var20
int var21
Box[] var21
int var22
int var22
double var22
int var23
int var23
int var24
BlockType var24
double var24
int var25
BlockType var25
int var26
double var26
boolean var27
FluidSection var28
double var28
BlockSection var29
var3
double var3
int var30
double var30
byte var31
BlockType var32
double var32
int var33
int var34
double var34
BlockType var35
int var36
double var36
int var37
double var38
var38
var38
var4
FluidTicker.CachedAccessor var4
double var40
double var41
double var42
boolean var43
boolean var44
boolean var45
boolean var46
boolean var47
double var48
var48
var48
var48
var48
Ref var5
int var6
BlockBoundingBoxes var7
int var8
BlockBoundingBoxes.RotatedVariantBoxes var8
int var9
Box var9
double var9
var9
var9
var9
var9

Методы (65)

МодификаторыВозвратСигнатура
AliveStatus AliveStatus()
protected CachedAccessorprotected CachedAccessor()
public boolean blocksFluidFromboolean blocksFluidFrom(@Nonnull BlockType var1, int var2, int var3, int var4)
public boolean blocksFluidFromboolean blocksFluidFrom(@Nonnull BlockType var1, int var2, int var3, int var4, int var5)
static boolean boxesBlockFaceboolean boxesBlockFace(Box[] var0, int var1, int var2)
abstract return boxesBlockFacereturn boxesBlockFace(var21, var3, var4)
public boolean canDemoteboolean canDemote()
public boolean canOccupySolidBlocksboolean canOccupySolidBlocks()
protected int distanceToDropint 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)
for for(Vector2i var21 : ORTO_OFFSETS)
for for(int var5 = -1; var5 <= 1; var5++)
for for(int var6 = -1; var6 <= 1; var6++)
for for(int var7 = -1; var7 <= 1; var7++)
for for(int var13 = 0; var13 < var8.length; var13++)
for for(int var20 = 1; var20 < var10; var20++)
for for(Box var19 : var13)
for for(Box var8 : var0)
public BlockSection getBlockSectionpublic BlockSection getBlockSection(int var1, int var2, int var3)
abstract BlockSection getBlockSectionBlockSection getBlockSection(int var1, int var2, int var3)
default BlockSection getBlockSectionByBlockdefault BlockSection getBlockSectionByBlock(int var1, int var2, int var3)
public FluidSection getFluidSectionpublic FluidSection getFluidSection(int var1, int var2, int var3)
abstract FluidSection getFluidSectionFluidSection getFluidSection(int var1, int var2, int var3)
default FluidSection getFluidSectionByBlockdefault FluidSection getFluidSectionByBlock(int var1, int var2, int var3)
protected int getSpreadOffsetsint 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)
public int getSupportedByIdint getSupportedById()
if if(this.supportedById == 0)
if if(this.supportedBy != null)
if if(var12 == 1)
if if(!this.canDemote)
if if(var12 == null)
if if(var13 != var5 && var13 != var10)
if if(var28 != null && var29 != null)
if if(var10 != Integer.MIN_VALUE && var30 == var10)
if if(var35 != null)
if if(var30 != 0 && var30 == var5 && var31 > var6)
if if(var32 != null)
if if(var11 != null)
if if(var15 == 2147483646)
if if(var15 < var11)
if if(var15 <= var11 && var15 != Integer.MAX_VALUE)
if if(var16)
if if(var16)
if if(var3 == null || var4 == null || var14 == null || var15 == null)
if if(var7 == null)
if if(!var43)
if if(!var45 || !var44)
if if(!var46 || !var47)
if if(var21.length > 1)
if if(var3 > 0 && var9.min.x < 0.1)
if if(var3 != 0)
if if(var1 > 0 && var8.min.x < 0.1)
private void initprivate void init(CommandBuffer<ChunkStore> var1, @Nonnull FluidSection var2, BlockSection var3, int var4)
static boolean isFullySolidboolean isFullySolid(@Nonnull BlockType var0)
public boolean isSelfFluidboolean isSelfFluid(int var1, int var2)
static boolean isSolidboolean isSolid(@Nonnull BlockType var0)
public static FluidTicker.CachedAccessor ofpublic static FluidTicker.CachedAccessor of(CommandBuffer<ChunkStore> var0, @Nonnull FluidSection var1, BlockSection var2, int var3)
public BlockTickStrategy processBlockTickStrategy 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)
public void setBlockpublic void setBlock(int var1, int var2, int var3, int var4)
abstract void setBlockvoid setBlock(int var1, int var2, int var3, int var4)
static void setTickingSurroundingvoid setTickingSurrounding(@Nonnull FluidTicker.Accessor var0, BlockSection var1, int var2, int var3, int var4)
abstract setTickingSurrounding setTickingSurrounding(var2, var4, var7, var8, var9)
abstract setTickingSurrounding setTickingSurrounding(var4, var6, var9, var10, var11)
abstract abstract BlockTickStrategy spreadBlockTickStrategy spread(World var1, long var2, FluidTicker.Accessor var4, FluidSection var5, BlockSection var6, Fluid var7, int var8, byte var9, int var10, int var11, int var12)
abstract super super(REGISTRY)
public BlockTickStrategy tickBlockTickStrategy 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)

Исходный код

Показать/скрыть
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);
               }
            });
         }
      }
   }
}