BlockPlaceUtils class

Пакет: com.hypixel.hytale.server.core.modules.interaction

Файл: com/hypixel/hytale/server/core/modules/interaction/BlockPlaceUtils.java

Поля (71)

МодификаторыТипИмя
return
return
var1
ItemStackSlotTransaction var10
Holder var10
Vector3i var10
int var10
ItemStackTransaction var11
Ref var11
String var11
var11
BlockSection var12
String var12
var12
SoftBlockDropType var13
int var14
Ref var15
var15
WorldConfig var15
Vector3i var16
Player var16
RotationTuple var17
var17
PlayerRef var17
BlockSection var18
var18
boolean var18
boolean var19
int var19
var2
BlockPlacementSettings var2
PlaceBlockEvent var20
Environment var20
boolean var21
int var21
boolean var22
BlockBoundingBoxes var22
boolean var23
int var23
ItemStackSlotTransaction var24
int var24
String var25
Ref var25
Ref var26
UUIDComponent var26
BlockChunk var27
PlacedByInteractionComponent var27
BlockComponentSection var28
BlockType var28
boolean var29
int var29
Store var3
PlayerRef var31
Player var32
BlockType var33
ChunkSection var34
PrefabListAsset var4
PrefabBuffer.PrefabBufferAccessor var4
Path var5
int var5
World var6
int var6
BsonDocument var7
PrefabBuffer var7
int var7
InventoryComponent.Hotbar var8
BsonValue var8
BlockType var8
ItemContainer var9
BsonDocument var9
BlockGathering var9

Методы (52)

МодификаторыВозвратСигнатура
static void breakAndDropReplacedBlockvoid breakAndDropReplacedBlock(@Nonnull Vector3i var0, @Nonnull BlockSection var1, @Nonnull Ref<ChunkStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull ComponentAccessor<ChunkStore> var4, @Nonnull ComponentAccessor<EntityStore> var5, boolean var6)
abstract breakAndDropReplacedBlock breakAndDropReplacedBlock(var10, var8, var7, var0, var10, var11, var14)
abstract breakAndDropReplacedBlock breakAndDropReplacedBlock(var10, var12, var11, var0, var10, var11, var14)
abstract breakAndDropReplacedBlock breakAndDropReplacedBlock(var2, var8, var7, var0, var10, var11, var14)
static boolean canPlaceBlockboolean canPlaceBlock(@Nonnull BlockType var0, @Nonnull String var1)
if if(var18 == null)
if if(var21)
if if(var21)
if if(var18 == null)
if if(var23)
if if(var31 != null)
if if(var2 == null && var1 != null)
if if(var33 != null)
if if(var34 == null)
if if(var26 == null)
if if(var27 == null)
if if(var28 == null)
if if(var29)
if if(var8 != null && var1 != null && var3)
if if(var1 != null)
if if(var7 != null)
if if(var8 != null)
if if(var10 != null)
if if(var0 == null)
if if(var1 != null)
if if(var1 != null)
if if(var1 != null)
if if(var4 == null)
if if(var2 != null)
if if(var5 == null)
if if(var2 != null)
if if(var2 != null)
if if(var18)
if if(var17 != null)
if if(var28 == null)
if if(var22 != null)
if if(var12 != null)
if if(!var14)
if if(var25 != null)
if if(var7 != 0)
if if(var8 != null)
if if(var9 != null)
if if(var13 != null)
if if(!var6)
static void onPlaceBlockFailurevoid onPlaceBlockFailure(@Nonnull Ref<EntityStore> var0, @Nullable ItemStack var1, byte var2, boolean var3, @Nullable PlayerRef var4, @Nonnull BlockSection var5, @Nonnull Vector3i var6, @Nonnull ComponentAccessor<EntityStore> var7)
abstract onPlaceBlockFailure onPlaceBlockFailure(var0, var1, var7, var23, var31, var18, var16, var11)
static void onPlaceBlockSuccessvoid onPlaceBlockSuccess(@Nonnull ComponentAccessor<ChunkStore> var0, @Nullable ItemStack var1, @Nonnull Ref<ChunkStore> var2, @Nonnull BlockComponentSection var3, @Nonnull Vector3i var4, BlockType var5, RotationTuple var6)
abstract onPlaceBlockSuccess onPlaceBlockSuccess(var10, var1, var15, var28, var16, var33, var17)
static boolean placeBlockboolean placeBlock(@Nonnull Ref<EntityStore> var0, @Nullable ItemStack var1, @Nullable String var2, @Nonnull ItemContainer var3, @Nonnull Vector3i var4, @Nonnull Vector3i var5, @Nonnull BlockRotation var6, byte var7, boolean var8, @Nonnull Ref<ChunkStore> var9, @Nonnull ComponentAccessor<ChunkStore> var10, @Nonnull ComponentAccessor<EntityStore> var11, boolean var12, boolean var13, boolean var14)
static boolean tryPlaceBlockboolean tryPlaceBlock(@Nonnull Ref<EntityStore> var0, @Nonnull Vector3i var1, @Nonnull Vector3i var2, @Nonnull String var3, @Nonnull RotationTuple var4, @Nonnull Ref<ChunkStore> var5, @Nonnull BlockChunk var6, @Nonnull Ref<ChunkStore> var7, @Nonnull BlockSection var8, @Nonnull BlockComponentSection var9, @Nonnull ComponentAccessor<ChunkStore> var10, @Nonnull ComponentAccessor<EntityStore> var11, boolean var12, boolean var13, boolean var14)
static boolean validateAndPlacePrefabboolean validateAndPlacePrefab(@Nonnull Vector3i var0, @Nonnull String var1, @Nullable PlayerRef var2, @Nonnull ComponentAccessor<EntityStore> var3)
static boolean validateBlockToPlaceboolean validateBlockToPlace(@Nullable String var0, @Nullable PlayerRef var1)

Исходный код

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

class="kw">import com.hypixel.hytale.codec.EmptyExtraInfo;
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.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.protocol.BlockRotation;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockGathering;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockPlacementSettings;
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.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.SoftBlockDropType;
class="kw">import com.hypixel.hytale.server.core.asset.type.buildertool.config.PrefabListAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.event.events.ecs.PlaceBlockEvent;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
class="kw">import com.hypixel.hytale.server.core.inventory.transaction.ItemStackSlotTransaction;
class="kw">import com.hypixel.hytale.server.core.inventory.transaction.ItemStackTransaction;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.components.PlacedByInteractionComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferUtil;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
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.connectedblocks.ConnectedBlocksUtil;
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 com.hypixel.hytale.server.core.util.PrefabUtil;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonValue;
class="kw">import org.joml.Vector3i;

class="kw">public class BlockPlaceUtils {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_ADD_BACK_AFTER_FAILED_PLACE = Message.translation(
      "server.modules.interaction.failedAddBackAfterFailedPlace"
   );
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_CHECK_BLOCK = Message.translation("server.modules.interaction.failedCheckBlock");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_CHECK_EMPTY = Message.translation("server.modules.interaction.failedCheckEmpty");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_CHECK_UNKNOWN = Message.translation("server.modules.interaction.failedCheckUnknown");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_FAILED_CHECK = Message.translation("server.modules.interaction.failedCheck");
   @Nonnull
   class="kw">private class="kw">static class="kw">final Message MESSAGE_MODULES_INTERACTION_BUILD_FORBIDDEN = Message.translation("server.modules.interaction.buildForbidden");

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

   class="kw">public class="kw">static boolean placeBlock(
      @Nonnull Ref<EntityStore> var0,
      @Nullable ItemStack var1,
      @Nullable String var2,
      @Nonnull ItemContainer var3,
      @Nonnull Vector3i var4,
      @Nonnull Vector3i var5,
      @Nonnull BlockRotation var6,
      byte var7,
      boolean var8,
      @Nonnull Ref<ChunkStore> var9,
      @Nonnull ComponentAccessor<ChunkStore> var10,
      @Nonnull ComponentAccessor<EntityStore> var11,
      boolean var12,
      boolean var13,
      boolean var14
   ) {
      Ref var15 = var9;
      RotationTuple var17 = RotationTuple.of(Rotation.valueOf(var6.rotationYaw), Rotation.valueOf(var6.rotationPitch), Rotation.valueOf(var6.rotationRoll));
      BlockSection var18 = var10.getComponent(var9, BlockSection.getComponentType());
      if (var18 == null) {
         class="kw">return false;
      }

      PlaceBlockEvent var20 = new PlaceBlockEvent(var1, var5, var17);
      var11.invoke(var0, var20);
      if (var20.isCancelled()) {
         var18.invalidateBlock(var5.x(), var5.y(), var5.z());
         class="kw">return false;
      }

      boolean var19 = var20.isConsumeItem();
      Vector3i var16 = var20.getTargetBlock();
      var17 = var20.getRotation();
      boolean var21 = !ChunkUtil.isSameChunkSection(var16.x, var16.y, var16.z, var5.x, var5.y, var5.z);
      if (var21) {
         var15 = var10.getExternalData().getChunkSectionReferenceAtBlock(var16.x, var16.y, var16.z);
         if (var15 == null || !var15.isValid()) {
            class="kw">return false;
         }
      }

      if (var21) {
         var18.invalidateBlock(var5.x(), var5.y(), var5.z());
      }

      if (!var15.equals(var9)) {
         var18 = var10.getComponent(var15, BlockSection.getComponentType());
         if (var18 == null) {
            class="kw">return false;
         }
      }

      PlayerRef var31 = var11.getComponent(var0, PlayerRef.getComponentType());
      Player var32 = var11.getComponent(var0, Player.getComponentType());
      boolean var22 = var32 == null || var32.getGameMode() == GameMode.Adventure;
      boolean var23 = var22 && var8 && var19;
      if (var23) {
         ItemStackSlotTransaction var24 = var3.removeItemStackFromSlot(var7, var1, 1);
         if (!var24.succeeded()) {
            if (var31 != null) {
               var31.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_CHECK);
            }

            class="kw">return false;
         }

         var1 = var24.getOutput();
      }

      if (var2 == null && var1 != null) {
         var2 = var1.getBlockKey();
      }

      if (!var12 && !validateBlockToPlace(var2, var31)) {
         class="kw">return false;
      }

      assert var2 != null;
      BlockType var33 = BlockType.getAssetMap().getAsset(var2);
      if (var33 != null) {
         String var25 = var33.getPrefabListAssetId();
         if (var25 != null && !validateAndPlacePrefab(var5, var25, var31, var11)) {
            class="kw">return false;
         }
      }

      ChunkSection var34 = var10.getComponent(var15, ChunkSection.getComponentType());
      if (var34 == null) {
         class="kw">return false;
      }

      Ref var26 = var34.getChunkColumnReference();
      if (var26 == null) {
         class="kw">return false;
      }

      BlockChunk var27 = var10.getComponent(var26, BlockChunk.getComponentType());
      if (var27 == null) {
         class="kw">return false;
      }

      BlockComponentSection var28 = var10.getComponent(var15, BlockComponentSection.getComponentType());
      if (var28 == null) {
         class="kw">return false;
      }

      boolean var29 = tryPlaceBlock(var0, var4, var16, var2, var17, var26, var27, var15, var18, var28, var10, var11, var12, var13, var14);
      if (var29) {
         onPlaceBlockSuccess(var10, var1, var15, var28, var16, var33, var17);
      } else {
         onPlaceBlockFailure(var0, var1, var7, var23, var31, var18, var16, var11);
      }

      class="kw">return var29;
   }

   class="kw">private class="kw">static void onPlaceBlockFailure(
      @Nonnull Ref<EntityStore> var0,
      @Nullable ItemStack var1,
      byte var2,
      boolean var3,
      @Nullable PlayerRef var4,
      @Nonnull BlockSection var5,
      @Nonnull Vector3i var6,
      @Nonnull ComponentAccessor<EntityStore> var7
   ) {
      InventoryComponent.Hotbar var8 = var7.getComponent(var0, InventoryComponent.Hotbar.getComponentType());
      if (var8 != null && var1 != null && var3) {
         ItemContainer var9 = var8.getInventory();
         ItemStackSlotTransaction var10 = var9.addItemStackToSlot(var2, var1);
         if (!var10.succeeded()) {
            ItemStackTransaction var11 = var9.addItemStack(var1);
            if (!var11.succeeded() && var4 != null) {
               var4.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_ADD_BACK_AFTER_FAILED_PLACE);
            }

            class="kw">return;
         }
      }

      var5.invalidateBlock(var6.x(), var6.y(), var6.z());
   }

   class="kw">private class="kw">static void onPlaceBlockSuccess(
      @Nonnull ComponentAccessor<ChunkStore> var0,
      @Nullable ItemStack var1,
      @Nonnull Ref<ChunkStore> var2,
      @Nonnull BlockComponentSection var3,
      @Nonnull Vector3i var4,
      BlockType var5,
      RotationTuple var6
   ) {
      if (var1 != null) {
         BsonDocument var7 = var1.getMetadata();
         if (var7 != null) {
            BsonValue var8 = var7.get("BlockHolder");
            if (var8 != null) {
               try {
                  BsonDocument var9 = var8.asDocument();
                  Holder var10 = ChunkStore.REGISTRY.getEntityCodec().decode(var9, EmptyExtraInfo.EMPTY);
                  if (var10 != null) {
                     BlockEntity.setBlockEntity(var0, var2, var3, var4.x, var4.y, var4.z, var5, var6.index(), var10);
                  } else {
                     LOGGER.at(Level.WARNING).log("Failed to set Block Entity from item metadata: %s, %s", var1.getItemId(), var9);
                  }
               } catch (Exception var11) {
                  throw SneakyThrow.sneakyThrow(var11);
               }
            }
         }
      }
   }

   class="kw">private class="kw">static boolean validateBlockToPlace(@Nullable String var0, @Nullable PlayerRef var1) {
      if (var0 == null) {
         if (var1 != null) {
            var1.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_CHECK_BLOCK);
         }

         class="kw">return false;
      } else if (var0.equals("Empty")) {
         if (var1 != null) {
            var1.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_CHECK_EMPTY);
         }

         class="kw">return false;
      } else if (var0.equals("Unknown")) {
         if (var1 != null) {
            var1.sendMessage(MESSAGE_MODULES_INTERACTION_FAILED_CHECK_UNKNOWN);
         }

         class="kw">return false;
      } else {
         class="kw">return true;
      }
   }

   class="kw">private class="kw">static boolean validateAndPlacePrefab(
      @Nonnull Vector3i var0, @Nonnull String var1, @Nullable PlayerRef var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      PrefabListAsset var4 = PrefabListAsset.getAssetMap().getAsset(var1);
      if (var4 == null) {
         if (var2 != null) {
            var2.sendMessage(Message.translation("server.modules.interaction.placeBlock.prefabListNotFound").param("name", var1));
         }

         class="kw">return false;
      } else {
         Path var5 = var4.getRandomPrefab();
         if (var5 == null) {
            if (var2 != null) {
               var2.sendMessage(Message.translation("server.modules.interaction.placeBlock.prefabListEmpty").param("name", var1));
            }

            class="kw">return false;
         } else if (!Files.exists(var5)) {
            if (var2 != null) {
               var2.sendMessage(Message.translation("server.commands.editprefab.prefabNotFound").param("name", var5.toString()));
            }

            class="kw">return false;
         } else {
            World var6 = var3.getExternalData().getWorld();
            PrefabBuffer var7 = PrefabBufferUtil.loadBuffer(var5);
            var6.execute(() -> {
               Store var3 = var6.getEntityStore().getStore();
               PrefabBuffer.PrefabBufferAccessor var4 = var7.newAccess();
               int var5 = 9;
               int var6 = 0;
               PrefabUtil.paste(var4, var6, var0, Rotation.None, new FastRandom(), 9, 0, var3);
            });
            class="kw">return true;
         }
      }
   }

   class="kw">private class="kw">static boolean tryPlaceBlock(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull Vector3i var1,
      @Nonnull Vector3i var2,
      @Nonnull String var3,
      @Nonnull RotationTuple var4,
      @Nonnull Ref<ChunkStore> var5,
      @Nonnull BlockChunk var6,
      @Nonnull Ref<ChunkStore> var7,
      @Nonnull BlockSection var8,
      @Nonnull BlockComponentSection var9,
      @Nonnull ComponentAccessor<ChunkStore> var10,
      @Nonnull ComponentAccessor<EntityStore> var11,
      boolean var12,
      boolean var13,
      boolean var14
   ) {
      WorldConfig var15 = var11.getExternalData().getWorld().getGameplayConfig().getWorldConfig();
      if (!var15.isBlockPlacementAllowed()) {
         class="kw">return false;
      }

      Player var16 = var11.getComponent(var0, Player.getComponentType());
      PlayerRef var17 = var11.getComponent(var0, PlayerRef.getComponentType());
      boolean var18 = var16 == null || var16.getGameMode() == GameMode.Adventure;
      if (var18) {
         int var19 = var6.getEnvironment(var2);
         Environment var20 = Environment.getAssetMap().getAsset(var19);
         if (var20 != null && !var20.isBlockModificationAllowed()) {
            if (var17 != null) {
               var17.sendMessage(MESSAGE_MODULES_INTERACTION_BUILD_FORBIDDEN);
            }

            class="kw">return false;
         }
      }

      BlockType var28 = BlockType.getAssetMap().getAsset(var3);
      int var29 = var4.index();
      if (var28 == null) {
         class="kw">return false;
      }

      int var21 = BlockType.getAssetMap().getIndex(var3);
      if (!var12 && !var13 && !var14 && !BlockOperations.testPlaceBlock(var10, var8, var2.x(), var2.y(), var2.z(), var28, var29)) {
         class="kw">return false;
      }

      BlockBoundingBoxes var22 = BlockBoundingBoxes.getAssetMap().getAsset(var28.getHitboxTypeIndex());
      if (var22 != null) {
         FillerBlockUtil.forEachFillerBlock(var22.get(var29), (var7x, var8x, var9x) -> {
            Vector3i var10 = new Vector3i(var2).add(var7x, var8x, var9x);
            if (ChunkUtil.isSameChunkSection(var2.x, var2.y, var2.z, var10.x, var10.y, var10.z)) {
               breakAndDropReplacedBlock(var10, var8, var7, var0, var10, var11, var14);
            } else {
               Ref var11 = var10.getExternalData().getChunkSectionReferenceAtBlock(var10.x, var10.y, var10.z);
               if (var11 != null && var11.isValid()) {
                  BlockSection var12 = var10.getComponent(var11, BlockSection.getComponentType());
                  if (var12 != null) {
                     breakAndDropReplacedBlock(var10, var12, var11, var0, var10, var11, var14);
                  }
               }
            }
         });
      } else {
         breakAndDropReplacedBlock(var2, var8, var7, var0, var10, var11, var14);
      }

      int var23 = 0;
      if (!var14) {
         var23 |= 256;
      }

      if (!BlockOperations.setBlock(var10.getExternalData(), var7, var2.x(), var2.y(), var2.z(), var21, var28, var29, 0, var23)) {
         class="kw">return false;
      }

      if (var16 != null && (var14 || !var16.isOverrideBlockPlacementRestrictions() && var28.canBePlacedAsDeco())) {
         BlockPhysics.markDeco(var10, var7, var2.x, var2.y, var2.z);
      }

      int var24 = ChunkUtil.indexBlock(var2.x, var2.y, var2.z);
      Ref var25 = var9.getBlockReference(var24);
      if (var25 != null) {
         UUIDComponent var26 = var11.getComponent(var0, UUIDComponent.getComponentType());
         assert var26 != null;
         PlacedByInteractionComponent var27 = new PlacedByInteractionComponent(var26.getUuid());
         var10.putComponent(var25, PlacedByInteractionComponent.getComponentType(), var27);
      }

      ConnectedBlocksUtil.setConnectedBlockAndNotifyNeighbors(var10.getExternalData(), BlockType.getAssetMap().getIndex(var3), var4, var1, var2, var7, var8);
      class="kw">return true;
   }

   class="kw">private class="kw">static void breakAndDropReplacedBlock(
      @Nonnull Vector3i var0,
      @Nonnull BlockSection var1,
      @Nonnull Ref<ChunkStore> var2,
      @Nonnull Ref<EntityStore> var3,
      @Nonnull ComponentAccessor<ChunkStore> var4,
      @Nonnull ComponentAccessor<EntityStore> var5,
      boolean var6
   ) {
      int var7 = var1.get(var0.x, var0.y, var0.z);
      if (var7 != 0) {
         BlockType var8 = BlockType.getAssetMap().getAsset(var7);
         if (var8 != null) {
            if (var8.getMaterial() != BlockMaterial.Empty) {
               class="kw">return;
            }

            BlockGathering var9 = var8.getGathering();
            int var10 = 1;
            String var11 = null;
            String var12 = null;
            if (var9 != null) {
               SoftBlockDropType var13 = var9.getSoft();
               if (var13 != null) {
                  var11 = var13.getItemId();
                  var12 = var13.getDropListId();
               }
            }

            int var14 = 32;
            if (!var6) {
               var14 |= 256;
            }

            BlockHarvestUtils.performBlockBreak(var0, var8, null, var10, var11, var12, var14, var3, var2, var5, var4);
         }
      }
   }

   class="kw">public class="kw">static boolean canPlaceBlock(@Nonnull BlockType var0, @Nonnull String var1) {
      if (var0.getId().equals(var1)) {
         class="kw">return true;
      }

      BlockPlacementSettings var2 = var0.getPlacementSettings();
      class="kw">return var2 == null
         ? false
         : var1.equals(var2.getWallPlacementOverrideBlockId())
            || var1.equals(var2.getFloorPlacementOverrideBlockId())
            || var1.equals(var2.getCeilingPlacementOverrideBlockId());
   }
}