TestBlockFunction interface

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

Файл: com/hypixel/hytale/server/core/universe/world/chunk/BlockOperations.java

Методы (1)

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

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.protocol.BlockParticleEvent;
class="kw">import com.hypixel.hytale.protocol.Opacity;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktick.BlockTickManager;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktick.config.TickProcedure;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.modules.blockanimation.BlockAnimationModule;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.WorldNotificationHandler;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockComponentSection;
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.ChunkSection;
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">public class BlockOperations {
   class="kw">public BlockOperations() {
   }

   class="kw">public class="kw">static boolean setBlock(
      ChunkStore var0,
      Ref<ChunkStore> var1,
      ChunkSection var2,
      BlockSection var3,
      BlockComponentSection var4,
      BlockChunk var5,
      int var6,
      int var7,
      int var8,
      int var9,
      @Nonnull BlockType var10,
      int var11,
      int var12,
      int var13
   ) {
      Ref var14 = var2.getChunkColumnReference();
      short var15 = var5.getHeight(var6, var8);
      int var16 = var3.getRotationIndex(var6, var7, var8);
      int var17 = var3.getFiller(var6, var7, var8);
      int var18 = var3.get(var6, var7, var8);
      boolean var19 = (var18 != var9 || var11 != var16) && var3.set(var6, var7, var8, var9, var11, var12);
      World var20 = var0.getWorld();
      if (var19 || (var13 & 64) != 0) {
         var2.markNeedsSaving();
         int var21 = (var2.getX() << 5) + (var6 & 31);
         int var22 = (var2.getY() << 5) + (var7 & 31);
         int var23 = (var2.getZ() << 5) + (var8 & 31);
         if ((var13 & 64) != 0) {
            var3.invalidateBlock(var6, var7, var8);
         }

         short var24 = var15;
         if ((var13 & 512) == 0) {
            var24 = updateBlockHeight(var5, var9, var10, var6, var7, var8, var15);
         }

         if ((var13 & 4) == 0) {
            spawnBlockParticles(var0, var18, var9, var21, var22, var23, (var13 & 32) != 0);
         }

         BlockAnimationModule.onBlockReplaced(var0.getStore(), var1, ChunkUtil.indexBlock(var6, var7, var8), var18, var9);
         if ((var13 & 2) == 0 && var4 != null) {
            Holder var25 = var10.getBlockEntity();
            Holder var26;
            if (var25 != null && var12 == 0) {
               var26 = var25.clone();
            } else {
               var26 = null;
            }

            BlockEntity.setBlockEntity(var20.getChunkStore().getStore(), var1, var4, var21, var22, var23, var10, var11, var26);
         }

         var20.getChunkLighting().invalidateLightAtBlock(var20.getChunkStore(), var6, var7, var8, var10, var15, var24);
         TickProcedure var28 = BlockTickManager.getBlockTickProvider().getTickProcedure(var9);
         var3.setTicking(var6, var7, var8, var28 != null);
         FillerBlockUtil.ChangeReason var29 = FillerBlockUtil.ChangeReason.NONE;
         if ((var13 & 4) == 0) {
            var29 = (var13 & 32) != 0 ? FillerBlockUtil.ChangeReason.BY_PHYSICS : FillerBlockUtil.ChangeReason.NORMAL;
         }

         if ((var13 & 16) == 0 && var4 != null) {
            FillerBlockUtil.removeFillerBlocksAt(var20.getChunkStore().getStore(), var3, var4, var21, var22, var23, var18, var17, var16, var29);
         }

         if ((var13 & 8) == 0 && var12 == 0 && var4 != null) {
            Store var27 = var0.getStore();
            FillerBlockUtil.setFillerBlocksAt(var27, var1, var3, var4, var21, var22, var23, var9, var12, var11, var29);
         }

         if ((var13 & 256) != 0) {
            updateBlockArea(var20.getChunkStore(), var3, var10, var11, var6, var7, var8);
         }

         if (var14 != null && var14.isValid()) {
            if (!var10.hasSupport()) {
               BlockPhysics.clear(var0.getStore(), var1, var6, var7, var8);
            } else {
               BlockPhysics.reset(var0.getStore(), var1, var6, var7, var8);
            }
         }
      }

      class="kw">return var19;
   }

   class="kw">public class="kw">static boolean setBlock(
      @Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4, int var5, @Nonnull BlockType var6, int var7, int var8, int var9
   ) {
      Store var10 = var0.getStore();
      ChunkSection var11 = var10.getComponent(var1, ChunkSection.getComponentType());
      if (var11 == null) {
         class="kw">return false;
      }

      BlockSection var12 = var10.getComponent(var1, BlockSection.getComponentType());
      Ref var13 = var11.getChunkColumnReference();
      BlockChunk var14 = var10.getComponent(var13, BlockChunk.getComponentType());
      BlockComponentSection var15 = var10.getComponent(var1, BlockComponentSection.getComponentType());
      class="kw">return setBlock(var0, var1, var11, var12, var15, var14, var2, var3, var4, var5, var6, var7, var8, var9);
   }

   class="kw">public class="kw">static boolean setBlockPreLoad(
      @Nonnull ChunkSection var0,
      @Nonnull BlockSection var1,
      @Nullable BlockChunk var2,
      int var3,
      int var4,
      int var5,
      int var6,
      @Nonnull BlockType var7,
      int var8,
      int var9
   ) {
      int var10 = var1.getRotationIndex(var3, var4, var5);
      int var11 = var1.get(var3, var4, var5);
      boolean var12 = (var11 != var6 || var8 != var10) && var1.set(var3, var4, var5, var6, var8, var9);
      if (var12) {
         var0.markNeedsSaving();
         if (var2 != null) {
            updateBlockHeight(var2, var6, var7, var3, var4, var5, var2.getHeight(var3, var5));
         }

         TickProcedure var13 = BlockTickManager.getBlockTickProvider().getTickProcedure(var6);
         var1.setTicking(var3, var4, var5, var13 != null);
      }

      class="kw">return var12;
   }

   class="kw">public class="kw">static boolean testPlaceBlock(ComponentAccessor<ChunkStore> var0, BlockSection var1, int var2, int var3, int var4, @Nonnull BlockType var5, int var6) {
      class="kw">return testPlaceBlock(var0, var1, var2, var3, var4, var5, var6, (var0x, var1x, var2x, var3x, var4x, var5x) -> false);
   }

   class="kw">public class="kw">static boolean testPlaceBlock(
      ComponentAccessor<ChunkStore> var0,
      BlockSection var1,
      int var2,
      int var3,
      int var4,
      @Nonnull BlockType var5,
      int var6,
      BlockOperations.TestBlockFunction var7
   ) {
      BlockBoundingBoxes var8 = BlockBoundingBoxes.getAssetMap().getAsset(var5.getHitboxType());
      class="kw">return var8 == null ? false : FillerBlockUtil.testFillerBlocks(var8.get(var6), (var6x, var7x, var8x) -> {
         int var12 = var2 + var6x;
         int var13 = var3 + var7x;
         int var14 = var4 + var8x;
         int var9;
         int var10;
         int var11;
         if (ChunkUtil.isSameChunkSection(var2, var3, var4, var12, var13, var14)) {
            var9 = var1.get(var12, var13, var14);
            var10 = var1.getRotationIndex(var12, var13, var14);
            var11 = var1.getFiller(var12, var13, var14);
         } else {
            Ref var15 = var0.getExternalData().getChunkSectionReferenceAtBlock(var12, var13, var14);
            if (var15 == null || !var15.isValid()) {
               class="kw">return false;
            }

            BlockSection var16 = var0.getComponent(var15, BlockSection.getComponentType());
            if (var16 == null) {
               class="kw">return false;
            }

            var9 = var16.get(var12, var13, var14);
            var10 = var16.getRotationIndex(var12, var13, var14);
            var11 = var16.getFiller(var12, var13, var14);
         }

         BlockType var17 = BlockType.getAssetMap().getAsset(var9);
         if (var17 == null) {
            class="kw">return false;
         } else if (var17 == BlockType.EMPTY) {
            class="kw">return true;
         } else if (var17.getMaterial() == BlockMaterial.Empty) {
            class="kw">return true;
         } else {
            class="kw">return var11 != 0 && var17.isUnknown() ? true : var7.test(var12, var13, var14, var17, var10, var11);
         }
      });
   }

   class="kw">public class="kw">static void updateBlockArea(ChunkStore var0, BlockSection var1, BlockType var2, int var3, int var4, int var5, int var6) {
      IndexedLookupTableAssetMap var7 = BlockBoundingBoxes.getAssetMap();
      BlockBoundingBoxes var8 = var7.getAsset(var2.getHitboxTypeIndex());
      if (var8 != null) {
         FillerBlockUtil.forEachFillerBlock(0.0F, 1, var8.get(var3), (var5x, var6x, var7x) -> {
            int var8 = var4 + var5x;
            int var9 = var5 + var6x;
            int var10 = var6 + var7x;
            if (ChunkUtil.isSameChunkSection(var8, var9, var10, var4, var5, var6)) {
               var1.setTicking(var8, var9, var10, true);
            } else {
               var0.getChunkSectionReferenceAtBlockAsync(var8, var9, var10, 3).thenAccept(var3x -> {
                  if (var3x != null && var3x.isValid()) {
                     BlockSection var4 = var3x.getStore().getComponent((Ref<ChunkStore>)var3x, BlockSection.getComponentType());
                     if (var4 != null) {
                        var4.setTicking(var8, var9, var10, true);
                     }
                  }
               });
            }
         });
      }
   }

   class="kw">public class="kw">static short updateBlockHeight(BlockChunk var0, int var1, BlockType var2, int var3, int var4, int var5, short var6) {
      if (var4 >= 0 && var4 < 320) {
         short var7 = var6;
         if (var6 <= var4) {
            if (var6 == var4 && var1 == 0) {
               var7 = var0.updateHeight(var3, var5, (short)var4);
            } else if (var6 < var4 && var1 != 0 && var2.getOpacity() != Opacity.Transparent) {
               var7 = (short)var4;
               var0.setHeight(var3, var5, var7);
            }
         }

         class="kw">return var7;
      } else {
         class="kw">return var6;
      }
   }

   class="kw">public class="kw">static void spawnBlockParticles(ChunkStore var0, int var1, int var2, int var3, int var4, int var5, boolean var6) {
      WorldNotificationHandler var7 = var0.getWorld().getNotificationHandler();
      if (var1 == 0 && var2 != 0) {
         var7.sendBlockParticle(var3 + 0.5, var4 + 0.5, var5 + 0.5, var2, BlockParticleEvent.Build);
      } else if (var1 != 0 && var2 == 0) {
         BlockParticleEvent var8 = var6 ? BlockParticleEvent.Physics : BlockParticleEvent.Break;
         var7.sendBlockParticle(var3 + 0.5, var4 + 0.5, var5 + 0.5, var1, var8);
      } else {
         var7.sendBlockParticle(var3 + 0.5, var4 + 0.5, var5 + 0.5, var1, BlockParticleEvent.Break);
         var7.sendBlockParticle(var3 + 0.5, var4 + 0.5, var5 + 0.5, var2, BlockParticleEvent.Build);
      }
   }

   class="kw">public class="kw">static void setBlockInteractionState(
      @Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4, @Nonnull BlockType var5, @Nonnull String var6, boolean var7
   ) {
      BlockSection var8 = var0.getStore().getComponent(var1, BlockSection.getComponentType());
      if (var8 != null) {
         if (var5.getData() != null) {
            String var9 = var5.getState() != null ? var5.getStateForBlock(var5) : null;
            if (var7 || var9 == null || !var9.equals(var6)) {
               BlockType var10 = var5.getBlockForState(var6);
               if (var10 != null) {
                  int var11 = 198;
                  int var12 = var8.getRotationIndex(var2, var3, var4);
                  setBlock(var0, var1, var2, var3, var4, BlockType.getAssetMap().getIndex(var10.getId()), var10, var12, 0, 198);
               }
            }
         }
      }
   }

   @FunctionalInterface
   class="kw">public class="kw">interface TestBlockFunction {
      boolean test(int var1, int var2, int var3, BlockType var4, int var5, int var6);
   }
}