WorldSupportReader class

Пакет: com.hypixel.hytale.builtin.blockphysics

Файл: com/hypixel/hytale/builtin/blockphysics/BlockPhysicsUtil.java

implements: BlockPhysicsUtil.SupportReader

Поля (13)

МодификаторыТипИмя
private final BlockPhysics blockPhysics
private final BlockSection blockSection
private final BlockPhysicsSystems.CachedAccessor chunkAccessor
private final FluidSection fluidSection
private final int originX
private final int originY
private final int originZ
BlockSection var4
BlockPhysics var4
FluidSection var5
BlockSection var5
int var6
Fluid var7

Методы (8)

МодификаторыВозвратСигнатура
public BlockPhysicsUtil.SupportBlock getBlockpublic BlockPhysicsUtil.SupportBlock getBlock(int var1, int var2, int var3)
private BlockPhysics getBlockPhysicsprivate BlockPhysics getBlockPhysics(int var1, int var2, int var3)
private BlockSection getBlockSectionprivate BlockSection getBlockSection(int var1, int var2, int var3)
private FluidSection getFluidSectionprivate FluidSection getFluidSection(int var1, int var2, int var3)
public int getProtrudingFillerRotationpublic int getProtrudingFillerRotation(int var1, int var2, int var3, int var4)
public int getSupportValuepublic int getSupportValue(int var1, int var2, int var3)
if if(var4 != null && var5 != null)
public boolean isPositionAvailablepublic boolean isPositionAvailable(int var1, int var2, int var3)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.blockphysics;

class="kw">import com.hypixel.hytale.builtin.fallingblocks.FallingBlock;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockFace;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockFaceSupport;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RequiredBlockFaceSupport;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.modules.blockset.BlockSetModule;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.BlockHarvestUtils;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
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.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import java.util.Map;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;
class="kw">import org.joml.Vector3ic;

class="kw">public class BlockPhysicsUtil {
   class="kw">public class="kw">static class="kw">final int DOESNT_SATISFY = 0;
   class="kw">public class="kw">static class="kw">final int IGNORE = -1;
   class="kw">public class="kw">static class="kw">final int SATISFIES_SUPPORT = -2;
   class="kw">public class="kw">static class="kw">final int WAITING_CHUNK = -3;

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

   @Nonnull
   class="kw">public class="kw">static BlockPhysicsUtil.Result applyBlockPhysics(
      @Nonnull ComponentAccessor<EntityStore> var0,
      @Nonnull BlockPhysicsSystems.CachedAccessor var1,
      @Nonnull Ref<ChunkStore> var2,
      BlockSection var3,
      @Nonnull BlockPhysics var4,
      @Nonnull FluidSection var5,
      int var6,
      int var7,
      int var8,
      @Nonnull BlockType var9,
      int var10,
      int var11
   ) {
      if (var11 != 0) {
         class="kw">return BlockPhysicsUtil.Result.VALID;
      }

      int var12 = testBlockPhysics(var1, var3, var4, var5, var6, var7, var8, var9, var10, var11);
      if (var12 == 0) {
         World var15 = var0.getExternalData().getWorld();
         Store var14 = var15.getChunkStore().getStore();
         class="kw">switch (var9.getSupportDropType()) {
            case BREAK:
               BlockHarvestUtils.naturallyRemoveBlockByPhysics(new Vector3i(var6, var7, var8), var9, var11, 256, var2, var0, var14);
               break;
            case DESTROY:
               BlockHarvestUtils.naturallyRemoveBlockByPhysics(new Vector3i(var6, var7, var8), var9, var11, 2304, var2, var0, var14);
               break;
            case FALL:
               FallingBlock.fallBlock(var15, var0.getExternalData().getStore(), var6, var7, var8);
         }

         class="kw">return BlockPhysicsUtil.Result.INVALID;
      } else {
         if (var12 == -1) {
            class="kw">return BlockPhysicsUtil.Result.VALID;
         }

         if (var12 == -3) {
            class="kw">return BlockPhysicsUtil.Result.WAITING_CHUNK;
         }

         int var13 = var4.get(var6, var7, var8);
         if (var12 == -2) {
            if (var13 != 0) {
               var4.set(var6, var7, var8, 0);
               var1.performBlockUpdate(var6, var7, var8);
            }

            class="kw">return BlockPhysicsUtil.Result.VALID;
         } else {
            if (var13 == var12) {
               var1.performBlockUpdate(var6, var7, var8, var12 - 1);
            } else {
               var4.set(var6, var7, var8, var12);
               var1.performBlockUpdate(var6, var7, var8);
            }

            class="kw">return BlockPhysicsUtil.Result.VALID;
         }
      }
   }

   class="kw">public class="kw">static int testBlockPhysics(
      @Nonnull BlockPhysicsSystems.CachedAccessor var0,
      BlockSection var1,
      @Nullable BlockPhysics var2,
      @Nonnull FluidSection var3,
      int var4,
      int var5,
      int var6,
      @Nonnull BlockType var7,
      int var8,
      int var9
   ) {
      class="kw">return testBlockPhysics(new BlockPhysicsUtil.WorldSupportReader(var0, var1, var2, var3, var4, var5, var6), var4, var5, var6, var7, var8, var9);
   }

   class="kw">public class="kw">static int testBlockPhysics(@Nonnull BlockPhysicsUtil.SupportReader var0, int var1, int var2, int var3, @Nonnull BlockType var4, int var5, int var6) {
      int var7 = -1;
      if (var4.getHitboxTypeIndex() != 0) {
         BlockBoundingBoxes var8 = BlockBoundingBoxes.getAssetMap().getAsset(var4.getHitboxTypeIndex());
         if (var8 != null && var8.protrudesUnitBox()) {
            BlockBoundingBoxes.RotatedVariantBoxes var9 = var8.get(var5);
            Box var10 = var9.getBoundingBox();
            int var11 = (int)var10.min.x;
            int var12 = (int)var10.min.y;
            int var13 = (int)var10.min.z;
            if (var11 - var10.min.x > 0.0) {
               var11--;
            }

            if (var12 - var10.min.y > 0.0) {
               var12--;
            }

            if (var13 - var10.min.z > 0.0) {
               var13--;
            }

            int var14 = (int)var10.max.x;
            int var15 = (int)var10.max.y;
            int var16 = (int)var10.max.z;
            if (var10.max.x - var14 > 0.0) {
               var14++;
            }

            if (var10.max.y - var15 > 0.0) {
               var15++;
            }

            if (var10.max.z - var16 > 0.0) {
               var16++;
            }

            int var17 = Math.max(var14 - var11, 1);
            int var18 = Math.max(var15 - var12, 1);
            int var19 = Math.max(var16 - var13, 1);

            for (int var20 = 0; var20 < var17; var20++) {
               for (int var21 = 0; var21 < var18; var21++) {
                  for (int var22 = 0; var22 < var19; var22++) {
                     int var23 = var1 + var11 + var20;
                     int var24 = var2 + var12 + var21;
                     int var25 = var3 + var13 + var22;
                     int var26 = FillerBlockUtil.pack(var11 + var20, var12 + var21, var13 + var22);
                     if (!var0.isPositionAvailable(var23, var24, var25)) {
                        class="kw">return -3;
                     }

                     int var27 = var0.getProtrudingFillerRotation(var23, var24, var25, var5);
                     int var28 = testBlockPhysicsAtPosition(var0, var23, var24, var25, var4, var27, var26);
                     if (var28 != -1) {
                        class="kw">switch (var4.getBlockSupportsRequiredFor()) {
                           case Any:
                              if (var28 == -2) {
                                 byte var30 = -2;
                                 class="kw">return var30;
                              }

                              if (var28 == 0) {
                                 var7 = 0;
                              } else if (var7 < var28) {
                                 var7 = var28;
                              }
                              break;
                           case All:
                              if (var28 == 0) {
                                 byte var29 = 0;
                                 class="kw">return var29;
                              }

                              if (var28 == -2) {
                                 var7 = -2;
                              } else if (var7 == -1 && var7 < var28) {
                                 var7 = var28;
                              }
                        }
                     }
                  }
               }
            }
         } else {
            var7 = testBlockPhysicsAtPosition(var0, var1, var2, var3, var4, var5, var6);
         }
      } else {
         var7 = testBlockPhysicsAtPosition(var0, var1, var2, var3, var4, var5, var6);
      }

      class="kw">return var7;
   }

   class="kw">private class="kw">static int testBlockPhysicsAtPosition(
      @Nonnull BlockPhysicsUtil.SupportReader var0, int var1, int var2, int var3, @Nonnull BlockType var4, int var5, int var6
   ) {
      if (var4.isUnknown()) {
         class="kw">return -1;
      }

      Map var7 = var4.getSupport(var5);
      if (var7 != null && !var7.isEmpty()) {
         Vector3i var8 = new Vector3i(FillerBlockUtil.unpackX(var6), FillerBlockUtil.unpackY(var6), FillerBlockUtil.unpackZ(var6));
         Vector3i var9 = new Vector3i();
         BlockBoundingBoxes var10 = BlockBoundingBoxes.getAssetMap().getAsset(var4.getHitboxTypeIndex());
         if (var10 == null) {
            class="kw">return -1;
         }

         Box var11 = var10.get(var5).getBoundingBox();
         Vector3i var12 = new Vector3i(var1 - FillerBlockUtil.unpackX(var6), var2 - FillerBlockUtil.unpackY(var6), var3 - FillerBlockUtil.unpackZ(var6));
         boolean var13 = false;
         int var14 = var4.getMaxSupportDistance();
         int var15 = Integer.MAX_VALUE;

         for (BlockFace var19 : BlockFace.VALUES) {
            RequiredBlockFaceSupport[] var20 = var7.get(var19);
            if (var20 != null && var20.length != 0) {
               BlockFace[] var21 = var19.getConnectingFaces();
               Vector3ic[] var22 = var19.getConnectingFaceOffsets();

               for (int var23 = 0; var23 < var21.length; var23++) {
                  BlockFace var24 = var21[var23];
                  Vector3ic var25 = var22[var23];
                  int var26 = var1 + var25.x();
                  int var27 = var2 + var25.y();
                  int var28 = var3 + var25.z();
                  if (!var11.containsBlock(var12, var26, var27, var28)) {
                     if (!var0.isPositionAvailable(var26, var27, var28)) {
                        class="kw">return -3;
                     }

                     BlockPhysicsUtil.SupportBlock var29 = var0.getBlock(var26, var27, var28);
                     boolean var30 = var29 == null && var0.doesMissingNeighbourSatisfySupport(var25);
                     int var31 = 0;
                     int var32 = var5;
                     int var33 = 0;
                     int var34 = 0;
                     Fluid var35 = Fluid.getAssetMap().getAsset(0);
                     BlockType var36 = BlockType.getAssetMap().getAsset(0);
                     if (var29 != null) {
                        var31 = var29.blockId();
                        var32 = var29.rotation();
                        var33 = var29.filler();
                        var34 = var29.fluidId();
                        var35 = var29.fluid();
                        var36 = BlockType.getAssetMap().getAsset(var31);
                        if (var36 == null
                           || var35 == null
                           || var33 != 0
                              && var36 == var4
                              && var26 - FillerBlockUtil.unpackX(var33) == var12.x
                              && var27 - FillerBlockUtil.unpackY(var33) == var12.y
                              && var28 - FillerBlockUtil.unpackZ(var33) == var12.z) {
                           class="kw">continue;
                        }
                     }

                     var9.set(FillerBlockUtil.unpackX(var33), FillerBlockUtil.unpackY(var33), FillerBlockUtil.unpackZ(var33));
                     boolean var37 = false;
                     boolean var38 = false;

                     for (RequiredBlockFaceSupport var42 : var20) {
                        if (var42.isAppliedToFiller(var8)) {
                           boolean var43 = var30;
                           if (!var43 && var29 != null) {
                              var43 = doesSatisfyRequirements(var4, var8, var9, var19, var24, var31, var36, var32, var34, var35, var42);
                           }

                           if (var43 && var14 > 0 && var42.allowsSupportPropagation()) {
                              int var44 = var29 != null ? var0.getSupportValue(var26, var27, var28) : var0.getMissingNeighbourSupportValue(var26, var27, var28);
                              if (var44 == 15) {
                                 var15 = 1;
                              } else if (var44 < var15) {
                                 var15 = var44;
                              }
                           }

                           class="kw">switch (var42.getSupport()) {
                              case IGNORED:
                              class="kw">default:
                                 break;
                              case REQUIRED:
                                 if (var43) {
                                    var37 = true;
                                 }

                                 var13 = true;
                                 break;
                              case DISALLOWED:
                                 if (var43) {
                                    var38 = true;
                                 }

                                 var13 = true;
                           }
                        }
                     }

                     if (!var38 && var37) {
                        class="kw">return -2;
                     }
                  }
               }
            }
         }

         if (!var13) {
            class="kw">return -1;
         }

         if (var15 < Integer.MAX_VALUE && var15 >= 0) {
            int var45 = var15 + 1;
            if (var14 >= var45) {
               class="kw">return var45;
            }
         }

         class="kw">return 0;
      } else {
         class="kw">return -1;
      }
   }

   class="kw">public class="kw">static boolean doesSatisfyRequirements(
      @Nonnull BlockType var0,
      Vector3i var1,
      Vector3i var2,
      BlockFace var3,
      BlockFace var4,
      int var5,
      @Nonnull BlockType var6,
      int var7,
      int var8,
      @Nonnull Fluid var9,
      @Nonnull RequiredBlockFaceSupport var10
   ) {
      String var11 = var6.getId();
      boolean var12 = true;
      int var13 = var10.getBlockSetIndex();
      if (var13 >= 0 && !BlockSetModule.getInstance().blockInSet(var13, var5)) {
         var12 = false;
      }

      String var14 = var10.getBlockTypeId();
      if (var12 && var14 != null && !var14.equals(var11)) {
         var12 = false;
      }

      String var15 = var10.getFluidId();
      if (var12 && var15 != null && (var6.getMaterial() != BlockMaterial.Empty || var8 == 0 || !var15.equals(var9.getId()))) {
         var12 = false;
      }

      int var16 = var10.getTagIndex();
      if (var16 >= 0 && !BlockType.getAssetMap().getKeysForTag(var16).contains(var11)) {
         var12 = false;
      }

      if (var12 && var10.getFaceType() != null) {
         var12 = doesMatchFaceType(var2, var10.getFaceType(), var4, var6.getSupporting(var7));
      }

      if (var12 && var10.getSelfFaceType() != null) {
         var12 = doesMatchFaceType(var1, var10.getSelfFaceType(), var3, var0.getSupporting(var7));
      }
      class="kw">return class="kw">switch (var10.getMatchSelf()) {
         case REQUIRED -> {
            if (var12) {
               yield var0.getId().equals(var11);
            }
         }
         case DISALLOWED -> {
            if (var12) {
               yield !var0.getId().equals(var11);
            }
         }
      };
   }

   class="kw">public class="kw">static boolean doesMatchFaceType(Vector3i var0, @Nonnull String var1, BlockFace var2, @Nonnull Map<BlockFace, BlockFaceSupport[]> var3) {
      boolean var4 = false;
      BlockFaceSupport[] var5 = var3.get(var2);
      if (var5 != null) {
         for (BlockFaceSupport var9 : var5) {
            if (var9.providesSupportFromFiller(var0) && var1.equals(var9.getFaceType())) {
               var4 = true;
               break;
            }
         }
      }

      class="kw">return var4;
   }

   class="kw">public enum Result {
      INVALID,
      VALID,
      WAITING_CHUNK;

      Result() {
      }
   }

   class="kw">public record SupportBlock(int blockId, int rotation, int filler, int fluidId, @Nonnull Fluid fluid) {
      class="kw">public SupportBlock {
      }
   }

   class="kw">public class="kw">interface SupportReader {
      boolean isPositionAvailable(int var1, int var2, int var3);

      @Nullable
      BlockPhysicsUtil.SupportBlock getBlock(int var1, int var2, int var3);

      int getSupportValue(int var1, int var2, int var3);

      class="kw">default int getMissingNeighbourSupportValue(int var1, int var2, int var3) {
         class="kw">return 0;
      }

      class="kw">default boolean doesMissingNeighbourSatisfySupport(@Nonnull Vector3ic var1) {
         class="kw">return false;
      }

      class="kw">default int getProtrudingFillerRotation(int var1, int var2, int var3, int var4) {
         class="kw">return var4;
      }
   }

   class="kw">private class="kw">static class="kw">final class WorldSupportReader class="kw">implements BlockPhysicsUtil.SupportReader {
      @Nonnull
      class="kw">private class="kw">final BlockPhysicsSystems.CachedAccessor chunkAccessor;
      class="kw">private class="kw">final BlockSection blockSection;
      @Nullable
      class="kw">private class="kw">final BlockPhysics blockPhysics;
      @Nonnull
      class="kw">private class="kw">final FluidSection fluidSection;
      class="kw">private class="kw">final int originX;
      class="kw">private class="kw">final int originY;
      class="kw">private class="kw">final int originZ;

      class="kw">private WorldSupportReader(
         @Nonnull BlockPhysicsSystems.CachedAccessor var1,
         BlockSection var2,
         @Nullable BlockPhysics var3,
         @Nonnull FluidSection var4,
         int var5,
         int var6,
         int var7
      ) {
         this.chunkAccessor = var1;
         this.blockSection = var2;
         this.blockPhysics = var3;
         this.fluidSection = var4;
         this.originX = var5;
         this.originY = var6;
         this.originZ = var7;
      }

      @Override
      class="kw">public boolean isPositionAvailable(int var1, int var2, int var3) {
         class="kw">return this.getBlockSection(var1, var2, var3) != null && this.getFluidSection(var1, var2, var3) != null;
      }

      @Nullable
      @Override
      class="kw">public BlockPhysicsUtil.SupportBlock getBlock(int var1, int var2, int var3) {
         BlockSection var4 = this.getBlockSection(var1, var2, var3);
         FluidSection var5 = this.getFluidSection(var1, var2, var3);
         if (var4 != null && var5 != null) {
            int var6 = var5.getFluidId(var1, var2, var3);
            Fluid var7 = Fluid.getAssetMap().getAsset(var6);
            class="kw">return var7 == null
               ? null
               : new BlockPhysicsUtil.SupportBlock(
                  var4.get(var1, var2, var3), var4.getRotationIndex(var1, var2, var3), var4.getFiller(var1, var2, var3), var6, var7
               );
         } else {
            class="kw">return null;
         }
      }

      @Override
      class="kw">public int getSupportValue(int var1, int var2, int var3) {
         BlockPhysics var4 = this.getBlockPhysics(var1, var2, var3);
         class="kw">return var4 != null ? var4.get(var1, var2, var3) : 0;
      }

      @Override
      class="kw">public int getProtrudingFillerRotation(int var1, int var2, int var3, int var4) {
         BlockSection var5 = this.getBlockSection(var1, var2, var3);
         class="kw">return var5 != null ? var5.getRotationIndex(var1, var2, var3) : var4;
      }

      @Nullable
      class="kw">private BlockSection getBlockSection(int var1, int var2, int var3) {
         class="kw">return ChunkUtil.isSameChunkSection(this.originX, this.originY, this.originZ, var1, var2, var3)
            ? this.blockSection
            : this.chunkAccessor.getBlockSectionAtBlock(var1, var2, var3);
      }

      @Nullable
      class="kw">private FluidSection getFluidSection(int var1, int var2, int var3) {
         class="kw">return ChunkUtil.isSameChunkSection(this.originX, this.originY, this.originZ, var1, var2, var3)
            ? this.fluidSection
            : this.chunkAccessor.getFluidSectionAtBlock(var1, var2, var3);
      }

      @Nullable
      class="kw">private BlockPhysics getBlockPhysics(int var1, int var2, int var3) {
         class="kw">return ChunkUtil.isSameChunkSection(this.originX, this.originY, this.originZ, var1, var2, var3)
            ? this.blockPhysics
            : this.chunkAccessor.getBlockPhysicsAtBlock(var1, var2, var3);
      }
   }
}