Result enum

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

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

Поля (1)

МодификаторыТипИмя
INVALID, VALID, WAITING_CHUNK

Исходный код

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