BlockHarvestUtils class

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

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

Поля (261)

МодификаторыТипИмя
final float INTERACTION_HOST_TTL_SECONDS
return
return
return
return
return
return
return
return
return
return
return
return
var0
var1
int var10
BlockGathering var10
BlockSection var10
var10
BlockSection var10
var10
var10
int var10
int var10
InteractionManager var10
InteractionContext var10
Ref var11
BlockSection var11
PhysicsDropType var11
Vector3i var11
var11
int var11
BlockBoundingBoxes var11
InteractionHost var11
BlockPosition var11
int var12
int var12
BlockBreakingDropType var12
int var12
int var12
ItemToolSpec var12
int[] var12
Ref var12
StandardPhysicsProvider var12
BlockHarvestUtils.ItemDamageContext var13
BlockType var13
int var13
SoftBlockDropType var13
int var13
int var13
BlockPosition var13
BlockHarvestUtils.ItemDamageContext var14
World var14
int var14
HarvestingDropType var14
int var14
String var14
InteractionChain var14
ChunkStore var15
Vector3i var15
var15
Ref var15
var15
String var15
Vector3i var15
World var15
boolean var16
int var16
BreakBlockEvent var16
Ref var16
HarvestingDropType var16
GameplayConfig var16
BlockType var17
int var17
BlockSection var17
BlockSoundSet var17
String var17
ChunkSection var17
int var18
int var18
int var18
Vector3d var18
String var18
int[] var18
Ref var18
int var19
BlockSection var19
int var19
BlockChunk var19
var2
BlockGathering var2
World var2
var2
Vector3i var20
BlockType var20
int var20
List var20
BlockSection var20
Ref var21
int var21
int var21
int var21
var21
BlockType var22
Vector3d var22
Vector3d var22
boolean var22
var22
var22
boolean var23
int var23
int var23
int var24
int var24
Environment var24
BlockSection var25
SpatialResource var25
int var26
BreakBlockEvent var26
BlockType var26
var26
var26
int var27
BlockGathering var27
var27
Vector3d var28
Vector3i var29
var29
BlockGathering var3
ItemTool var3
SpatialResource var3
Holder[] var3
String var3
Ref var30
var30
var30
BlockSection var31
var31
var31
Ref var32
var32
var32
int var33
int var34
int var35
int var36
ChunkSection var37
int var38
var38
String var39
var39
var39
var39
List var4
BlockBreakingDropType var4
ItemTool.DurabilityLossBlockTypes[] var4
TimeResource var4
var4
BlockSoundSet var4
BlockType var4
String var40
var40
var40
var40
BlockBreakingDropType var41
boolean var42
float var43
DamageBlockEvent var44
ChunkSection var45
BlockGathering.BlockToolData var46
boolean var47
String var48
BlockType var49
ItemModule var5
String var5
String var5
boolean var5
InventoryComponent.Hotbar var5
int var5
int var5
boolean var50
List var51
Vector3d var52
Item var57
ItemToolSpec var58
float var59
World var6
int var6
int var6
double var6
World var6
long var6
boolean var60
String var61
BrokenPenalties var62
float var63
var63
var63
var63
SoftBlockDropType var66
BlockPhysics var67
TimeResource var68
GatheringEffectsConfig var69
ChunkStore var7
int var7
var7
var7
List var7
ItemToolSpec[] var7
BlockSetModule var7
var7
ChunkSection var7
String var7
World var7
BlockHealthChunk var70
var70
String var71
int var72
List var73
int var74
BlockHealth var75
int var76
var76
var76
GatheringEffectsConfig var77
String var78
int var79
int var8
int var8
String var8
var8
var8
var8
var8
Vector3i var8
var8
var8
Item var8
ComponentType var8
WorldChunk var8
InteractionManager var8
Vector3d var8
Store var8
List var80
List var81
Vector3d var82
int var9
String var9
var9
var9
var9
var9
Ref var9
var9
var9
BlockHealthChunk var9
int var9
Ref var9
Vector3i var9
Ref var9
RootInteraction var9

Методы (133)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown key! " + var5)
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Null block type fetched for " + var11 + " during block break")
private record ItemDamageContextrecord ItemDamageContext(@Nonnull World world, @Nonnull SpatialResource<Ref<EntityStore>, EntityStore> playerSpatialResource, @Nonnull TimeResource timeResource, boolean canApplyItemStackPenalties)
static void applyItemDurabilityLossvoid applyItemDurabilityLoss(@Nonnull Ref<EntityStore> var0, @Nullable ItemStack var1, @Nullable Item var2, @Nullable BlockType var3, @Nonnull ComponentAccessor<EntityStore> var4)
abstract applyItemDurabilityLoss applyItemDurabilityLoss(var0, var3, var57, var26, var13)
static double calculateDurabilityUsedouble calculateDurabilityUse(@Nonnull Item var0, @Nullable BlockType var1)
static boolean damageSingleBlockboolean damageSingleBlock(@Nullable Ref<EntityStore> var0, @Nullable Ref<EntityStore> var1, @Nonnull Vector3i var2, @Nullable ItemStack var3, @Nullable ItemTool var4, @Nullable String var5, boolean var6, float var7, int var8, boolean var9, boolean var10, @Nonnull BlockHarvestUtils.ItemDamageContext var11, @Nonnull Ref<ChunkStore> var12, @Nonnull ComponentAccessor<EntityStore> var13, @Nonnull ComponentAccessor<ChunkStore> var14)
abstract return damageSingleBlockreturn damageSingleBlock(var0, var1, var2, var3, var4, var5, var6, var7, var8, var9, true, var13, var10, var11, var12)
static void fireOnBreakInteractionvoid fireOnBreakInteraction(@Nullable Ref<EntityStore> var0, @Nullable Ref<EntityStore> var1, @Nonnull BlockType var2, @Nonnull Vector3i var3, int var4, int var5, @Nonnull ComponentAccessor<EntityStore> var6)
abstract fireOnBreakInteraction fireOnBreakInteraction(var7, var8, var22, var0, var24, var6, var10)
abstract fireOnBreakInteraction fireOnBreakInteraction(var0, var0, var2, var8, var23, var24, var6)
for for(Vector3i var10 : var2)
for for(int var6 = 0; var6 < var1; var6++)
for for(ItemToolSpec var11 : var7)
for for(ItemTool.DurabilityLossBlockTypes var11 : var4)
for for(int var16 : var12)
for for(int var17 : var18)
abstract for for(int var19 = 0; var19 < var2.size()
static boolean handleExplosionReactionStateboolean handleExplosionReactionState(@Nonnull World var0, @Nonnull BlockType var1, @Nonnull Vector3i var2)
if if(var16)
if if(var12 != 0)
if if(var13 != null)
if if(var17 != 0 || var18 != 0 || var19 != 0)
if if(var1 != BlockType.EMPTY)
if if(var7 != null)
if if(var17 != null)
if if(var0.x != var12 || var0.y != var13 || var0.z != var14)
if if(var25 != null)
if if(var19 != null)
if if(!var23)
if if(var10 != null)
if if(var11 != null)
if if(var1 != null)
if if(var12 != 0 || var13 != 0 || var14 != 0)
if if(var1 == null)
if if(var17 != null)
if if(var19 != 0)
if if(var11 != 0 || var12 != 0 || var13 != 0)
if if(var2 == null)
if if(var3 == null && var2 == null)
if if(var3 != null)
if if(var2 != null)
if if(var1 == null)
if if(var3 == null)
if if(var4 == null)
if if(var5 == null)
if if(var2 == null)
if if(var7 != null)
if if(var1 == null)
if if(var4 == null)
if if(var6 == Integer.MIN_VALUE)
if if(var12 != null)
if if(var16 == var6)
if if(var18 != null)
if if(var17 == null)
if if(var19 == null)
if if(var20 == null)
if if(var26 == null)
if if(var27 == null)
if if(var34 != 0 || var35 != 0 || var36 != 0)
if if(var26 == null)
if if(var27 == null)
if if(var4 == null && var57 != null)
if if(var59 != 0.0F)
if if(var0 != null)
if if(var71 != null)
if if(var72 != 0)
if if(var74 != 0)
if if(var42)
if if(var0 != null)
if if(!var47)
if if(var50)
if if(var0 != null)
if if(var58 != null)
if if(var76 != 0)
if if(var77 != null)
if if(var78 != null)
if if(var79 != 0)
if if(var10 && var0 != null)
if if(var11 != null)
if if(var4 != null)
if if(var5 != 0)
if if(var3 == null)
if if(var4 == null)
if if(var5 == Integer.MIN_VALUE)
if if(var6 instanceof CommandBuffer var7)
if if(var7 != null)
if if(var8 == null)
if if(var8 != null)
if if(var9 == null)
if if(var10 == null || var11 == null)
static void logBlockInteractionFailurevoid logBlockInteractionFailure(@Nonnull Throwable var0, @Nonnull InteractionType var1, @Nonnull String var2, @Nonnull BlockType var3, @Nonnull Vector3i var4)
abstract logBlockInteractionFailure logBlockInteractionFailure(var10, var2, var7, var3, var4)
abstract logBlockInteractionFailure logBlockInteractionFailure(var13, var1, var2, var3, var9)
static void naturallyRemoveBlockvoid naturallyRemoveBlock(@Nonnull Vector3i var0, @Nullable BlockType var1, int var2, int var3, String var4, String var5, int var6, @Nonnull Ref<ChunkStore> var7, @Nonnull ComponentAccessor<EntityStore> var8, @Nonnull ComponentAccessor<ChunkStore> var9)
abstract naturallyRemoveBlock naturallyRemoveBlock(var0, var22, var20, var3, var4, var5, var6, var15, var10, var11)
abstract naturallyRemoveBlock naturallyRemoveBlock(var0, var1, var2, var7, var8, var9, var3, var4, var5, var6)
static void performBlockBreakvoid performBlockBreak(@Nullable Ref<EntityStore> var0, @Nullable ItemStack var1, @Nonnull Vector3i var2, @Nonnull Ref<ChunkStore> var3, @Nonnull ComponentAccessor<EntityStore> var4, @Nonnull ComponentAccessor<ChunkStore> var5)
static int performBlockBreakint performBlockBreak(@Nullable Ref<EntityStore> var0, @Nullable ItemStack var1, @Nonnull List<Vector3i> var2, int var3, @Nonnull ComponentAccessor<EntityStore> var4, @Nonnull ComponentAccessor<ChunkStore> var5)
static void performBlockBreakvoid performBlockBreak(@Nullable Ref<EntityStore> var0, @Nullable ItemStack var1, @Nonnull Vector3i var2, int var3, @Nonnull Ref<ChunkStore> var4, @Nonnull ComponentAccessor<EntityStore> var5, @Nonnull ComponentAccessor<ChunkStore> var6)
static void performBlockBreakvoid performBlockBreak(@Nullable Ref<EntityStore> var0, @Nullable Ref<EntityStore> var1, @Nullable ItemStack var2, @Nonnull Vector3i var3, int var4, @Nonnull Ref<ChunkStore> var5, @Nonnull ComponentAccessor<EntityStore> var6, @Nonnull ComponentAccessor<ChunkStore> var7)
static void performBlockBreakvoid performBlockBreak(@Nonnull Vector3i var0, @Nonnull BlockType var1, @Nullable ItemStack var2, int var3, @Nullable String var4, @Nullable String var5, int var6, @Nullable Ref<EntityStore> var7, @Nonnull Ref<ChunkStore> var8, @Nonnull ComponentAccessor<EntityStore> var9, @Nonnull ComponentAccessor<ChunkStore> var10)
static void performBlockBreakvoid performBlockBreak(@Nonnull Vector3i var0, @Nonnull BlockType var1, @Nullable ItemStack var2, int var3, @Nullable String var4, @Nullable String var5, int var6, @Nullable Ref<EntityStore> var7, @Nullable Ref<EntityStore> var8, @Nonnull Ref<ChunkStore> var9, @Nonnull ComponentAccessor<EntityStore> var10, @Nonnull ComponentAccessor<ChunkStore> var11)
abstract performBlockBreak performBlockBreak(var0, var1, var2, 0, var3, var4, var5)
abstract performBlockBreak performBlockBreak(var0, var0, var1, var2, var3, var4, var5, var6)
abstract performBlockBreak performBlockBreak(var15, var13, var2, 0, null, null, var4, var0, var1, var5, var6, var7)
abstract performBlockBreak performBlockBreak(var0, var1, var2, var3, var4, var5, var6, var7, var7, var8, var9, var10)
abstract performBlockBreak performBlockBreak(var2, var26, var3, var38, var39, var40, var8, var0, var1, var30, var13, var14)
abstract performBlockBreak performBlockBreak(var2, var26, var3, var38, var39, var40, var8 | 2048, var0, var1, var30, var13, var14)
static boolean performBlockDamageboolean performBlockDamage(@Nonnull Vector3i var0, @Nullable ItemStack var1, @Nullable ItemTool var2, float var3, int var4, boolean var5, @Nonnull Ref<ChunkStore> var6, @Nonnull ComponentAccessor<EntityStore> var7, @Nonnull ComponentAccessor<ChunkStore> var8)
static boolean performBlockDamageboolean performBlockDamage(@Nullable Ref<EntityStore> var0, @Nullable Ref<EntityStore> var1, @Nonnull Vector3i var2, @Nullable ItemStack var3, @Nullable ItemTool var4, @Nullable String var5, boolean var6, float var7, int var8, boolean var9, @Nonnull Ref<ChunkStore> var10, @Nonnull ComponentAccessor<EntityStore> var11, @Nonnull ComponentAccessor<ChunkStore> var12)
static int performBlockDamageint performBlockDamage(@Nullable Ref<EntityStore> var0, @Nullable Ref<EntityStore> var1, @Nonnull List<Vector3i> var2, @Nonnull Vector3i var3, @Nullable ItemStack var4, @Nullable ItemTool var5, @Nullable String var6, boolean var7, float var8, int var9, boolean var10, boolean var11, @Nonnull ComponentAccessor<EntityStore> var12, @Nonnull ComponentAccessor<ChunkStore> var13)
abstract return performBlockDamagereturn performBlockDamage(null, null, var0, var1, var2, null, false, var3, var4, var5, var6, var7, var8)
static void performPickupByInteractionvoid performPickupByInteraction(@Nonnull Ref<EntityStore> var0, @Nonnull Vector3i var1, @Nonnull BlockType var2, int var3, @Nonnull Ref<ChunkStore> var4, @Nonnull BlockSection var5, @Nonnull ComponentAccessor<EntityStore> var6, @Nonnull ComponentAccessor<ChunkStore> var7)
static void playBlockSoundvoid playBlockSound(@Nonnull BlockType var0, @Nonnull BlockSoundEvent var1, @Nonnull Vector3d var2, @Nonnull ComponentAccessor<EntityStore> var3)
abstract playBlockSound playBlockSound(var2, BlockSoundEvent.Harvest, var22, var6)
abstract playBlockSound playBlockSound(var26, BlockSoundEvent.Break, var28, var13)
abstract playBlockSound playBlockSound(var26, BlockSoundEvent.Hit, var28, var13)
static void queueBlockInteractionvoid queueBlockInteraction(@Nonnull Ref<EntityStore> var0, @Nonnull Ref<EntityStore> var1, @Nonnull InteractionType var2, @Nonnull BlockType var3, @Nonnull Vector3i var4, int var5, @Nonnull CommandBuffer<EntityStore> var6)
abstract queueBlockInteraction queueBlockInteraction(var0, var1 != null ? var1 : var0, InteractionType.OnBreak, var2, var3, var4, var7)
abstract queueBlockInteraction queueBlockInteraction(var0, var0, InteractionType.OnBreakImpact, var1, var2, var3, var4)
abstract queueBlockInteractionChain queueBlockInteractionChain(var8, var0, var9, var2, var7, var3, var4, var5, var6)
static void queueBlockInteractionOnHostvoid queueBlockInteractionOnHost(@Nonnull Ref<EntityStore> var0, @Nonnull InteractionType var1, @Nonnull String var2, @Nonnull BlockType var3, @Nonnull Vector3i var4, int var5, @Nonnull CommandBuffer<EntityStore> var6)
abstract queueBlockInteractionOnHost queueBlockInteractionOnHost(var0, var2, var7, var3, var4, var5, var6)
static void queueOnBreakImpactInteractionvoid queueOnBreakImpactInteraction(@Nonnull Ref<EntityStore> var0, @Nonnull BlockType var1, @Nonnull Vector3i var2, int var3, @Nonnull CommandBuffer<EntityStore> var4)
static void removeBlockvoid removeBlock(@Nonnull Vector3i var0, @Nonnull BlockType var1, int var2, @Nonnull Ref<ChunkStore> var3, @Nonnull BlockSection var4, @Nonnull ComponentAccessor<ChunkStore> var5)
abstract removeBlock removeBlock(var11, var1, var6, var7, var10, var9)
abstract removeBlock removeBlock(var8, var2, var24, var9, var10, var7)
static boolean shouldPickupByInteractionboolean shouldPickupByInteraction(@Nullable BlockType var0)
static void spawnDropsvoid spawnDrops(@Nonnull ComponentAccessor<EntityStore> var0, @Nonnull List<ItemStack> var1, @Nonnull Vector3d var2)
abstract spawnDrops spawnDrops(var8, var20, var18)
abstract spawnDrops spawnDrops(var13, var51, var52)
abstract spawnDrops spawnDrops(var13, var81, var82)

Исходный код

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

class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
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.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.protocol.BlockPosition;
class="kw">import com.hypixel.hytale.protocol.BlockSoundEvent;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.protocol.SoundCategory;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocksound.config.BlockSoundSet;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockBreakingDropType;
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.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.HarvestingDropType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.PhysicsDropType;
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.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.BrokenPenalties;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.GameplayConfig;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.GatheringEffectsConfig;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemTool;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemToolSpec;
class="kw">import com.hypixel.hytale.server.core.blocktype.component.BlockPhysics;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionChain;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionContext;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionManager;
class="kw">import com.hypixel.hytale.server.core.entity.ItemUtils;
class="kw">import com.hypixel.hytale.server.core.event.events.ecs.BreakBlockEvent;
class="kw">import com.hypixel.hytale.server.core.event.events.ecs.DamageBlockEvent;
class="kw">import com.hypixel.hytale.server.core.event.events.ecs.EnvironmentBreakBlockEvent;
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.modules.blockhealth.BlockHealth;
class="kw">import com.hypixel.hytale.server.core.modules.blockhealth.BlockHealthChunk;
class="kw">import com.hypixel.hytale.server.core.modules.blockhealth.BlockHealthModule;
class="kw">import com.hypixel.hytale.server.core.modules.blockset.BlockSetModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.item.ItemComponent;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.host.InteractionHost;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
class="kw">import com.hypixel.hytale.server.core.modules.item.ItemModule;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.StandardPhysicsProvider;
class="kw">import com.hypixel.hytale.server.core.modules.time.TimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.world.ParticleUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.SoundUtil;
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.WorldChunk;
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 it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectLists;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class BlockHarvestUtils {
   class="kw">private class="kw">static class="kw">final float INTERACTION_HOST_TTL_SECONDS = 30.0F;
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();

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

   class="kw">public class="kw">static boolean performBlockDamage(
      @Nonnull Vector3i var0,
      @Nullable ItemStack var1,
      @Nullable ItemTool var2,
      float var3,
      int var4,
      boolean var5,
      @Nonnull Ref<ChunkStore> var6,
      @Nonnull ComponentAccessor<EntityStore> var7,
      @Nonnull ComponentAccessor<ChunkStore> var8
   ) {
      class="kw">return performBlockDamage(null, null, var0, var1, var2, null, false, var3, var4, var5, var6, var7, var8);
   }

   class="kw">public class="kw">static boolean performBlockDamage(
      @Nullable Ref<EntityStore> var0,
      @Nullable Ref<EntityStore> var1,
      @Nonnull Vector3i var2,
      @Nullable ItemStack var3,
      @Nullable ItemTool var4,
      @Nullable String var5,
      boolean var6,
      float var7,
      int var8,
      boolean var9,
      @Nonnull Ref<ChunkStore> var10,
      @Nonnull ComponentAccessor<EntityStore> var11,
      @Nonnull ComponentAccessor<ChunkStore> var12
   ) {
      BlockHarvestUtils.ItemDamageContext var13 = createItemDamageContext(var0, var11);
      class="kw">return damageSingleBlock(var0, var1, var2, var3, var4, var5, var6, var7, var8, var9, true, var13, var10, var11, var12);
   }

   class="kw">public class="kw">static int performBlockDamage(
      @Nullable Ref<EntityStore> var0,
      @Nullable Ref<EntityStore> var1,
      @Nonnull List<Vector3i> var2,
      @Nonnull Vector3i var3,
      @Nullable ItemStack var4,
      @Nullable ItemTool var5,
      @Nullable String var6,
      boolean var7,
      float var8,
      int var9,
      boolean var10,
      boolean var11,
      @Nonnull ComponentAccessor<EntityStore> var12,
      @Nonnull ComponentAccessor<ChunkStore> var13
   ) {
      if (var2.isEmpty()) {
         class="kw">return 0;
      }

      BlockHarvestUtils.ItemDamageContext var14 = createItemDamageContext(var0, var12);
      ChunkStore var15 = var14.world().getChunkStore();
      boolean var16 = !var11 && var0 != null && var4 != null;
      BlockType var17 = var16 ? var14.world().getBlockType(var3.x(), var3.y(), var3.z()) : null;
      int var18 = 0;

      for (int var19 = 0; var19 < var2.size(); var19++) {
         Vector3i var20 = var2.get(var19);
         if (var20.y() >= 0 && var20.y() < 320) {
            Ref var21 = var15.getChunkSectionReferenceAtBlock(var20.x, var20.y, var20.z);
            if (var21 != null && var21.isValid()) {
               try {
                  if (damageSingleBlock(var0, var1, new Vector3i(var20), var4, var5, var6, var7, var8, var9, var10, var11, var14, var21, var12, var13)) {
                     var18++;
                  }
               } catch (Exception var23) {
                  ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(5, TimeUnit.MINUTES)).withCause(var23))
                     .log("Failed to damage block at [%d, %d, %d]", var20.x(), var20.y(), var20.z());
               }
            }
         }
      }

      if (var16) {
         applyItemDurabilityLoss(var0, var4, var4.getItem(), var17, var12);
      }

      class="kw">return var18;
   }

   class="kw">public class="kw">static void performBlockBreak(
      @Nullable Ref<EntityStore> var0,
      @Nullable ItemStack var1,
      @Nonnull Vector3i var2,
      @Nonnull Ref<ChunkStore> var3,
      @Nonnull ComponentAccessor<EntityStore> var4,
      @Nonnull ComponentAccessor<ChunkStore> var5
   ) {
      performBlockBreak(var0, var1, var2, 0, var3, var4, var5);
   }

   class="kw">public class="kw">static int performBlockBreak(
      @Nullable Ref<EntityStore> var0,
      @Nullable ItemStack var1,
      @Nonnull List<Vector3i> var2,
      int var3,
      @Nonnull ComponentAccessor<EntityStore> var4,
      @Nonnull ComponentAccessor<ChunkStore> var5
   ) {
      if (var2.isEmpty()) {
         class="kw">return 0;
      }

      World var6 = var4.getExternalData().getWorld();
      ChunkStore var7 = var6.getChunkStore();
      int var8 = 0;

      for (Vector3i var10 : var2) {
         if (var10.y() >= 0 && var10.y() < 320) {
            Ref var11 = var7.getChunkSectionReferenceAtBlock(var10.x, var10.y, var10.z);
            if (var11 != null && var11.isValid()) {
               try {
                  performBlockBreak(var0, var1, new Vector3i(var10), var3, var11, var4, var5);
                  var8++;
               } catch (Exception var13) {
                  ((HytaleLogger.Api)((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(5, TimeUnit.MINUTES)).withCause(var13))
                     .log("Failed to break block at [%d, %d, %d]", var10.x(), var10.y(), var10.z());
               }
            }
         }
      }

      class="kw">return var8;
   }

   class="kw">public class="kw">static void performBlockBreak(
      @Nullable Ref<EntityStore> var0,
      @Nullable ItemStack var1,
      @Nonnull Vector3i var2,
      int var3,
      @Nonnull Ref<ChunkStore> var4,
      @Nonnull ComponentAccessor<EntityStore> var5,
      @Nonnull ComponentAccessor<ChunkStore> var6
   ) {
      performBlockBreak(var0, var0, var1, var2, var3, var4, var5, var6);
   }

   class="kw">public class="kw">static void performBlockBreak(
      @Nullable Ref<EntityStore> var0,
      @Nullable Ref<EntityStore> var1,
      @Nullable ItemStack var2,
      @Nonnull Vector3i var3,
      int var4,
      @Nonnull Ref<ChunkStore> var5,
      @Nonnull ComponentAccessor<EntityStore> var6,
      @Nonnull ComponentAccessor<ChunkStore> var7
   ) {
      int var8 = var3.x();
      int var9 = var3.y();
      int var10 = var3.z();
      BlockSection var11 = var7.getComponent(var5, BlockSection.getComponentType());
      assert var11 != null;
      int var12 = var11.get(var8, var9, var10);
      if (var12 != 0) {
         BlockType var13 = BlockType.getAssetMap().getAsset(var12);
         if (var13 != null) {
            World var14 = var7.getExternalData().getWorld();
            Vector3i var15 = var3;
            if (!var13.isUnknown()) {
               int var16 = var11.getFiller(var8, var9, var10);
               int var17 = FillerBlockUtil.unpackX(var16);
               int var18 = FillerBlockUtil.unpackY(var16);
               int var19 = FillerBlockUtil.unpackZ(var16);
               if (var17 != 0 || var18 != 0 || var19 != 0) {
                  var15 = new Vector3i(var15).sub(var17, var18, var19);
                  BlockType var20 = var14.getBlockType(var15);
                  if (var20 != null && !var13.getId().equals(var20.getId())) {
                     var14.breakBlock(var8, var9, var10, var4);
                     class="kw">return;
                  }
               }
            }

            performBlockBreak(var15, var13, var2, 0, null, null, var4, var0, var1, var5, var6, var7);
         }
      }
   }

   class="kw">public class="kw">static void performBlockBreak(
      @Nonnull Vector3i var0,
      @Nonnull BlockType var1,
      @Nullable ItemStack var2,
      int var3,
      @Nullable String var4,
      @Nullable String var5,
      int var6,
      @Nullable Ref<EntityStore> var7,
      @Nonnull Ref<ChunkStore> var8,
      @Nonnull ComponentAccessor<EntityStore> var9,
      @Nonnull ComponentAccessor<ChunkStore> var10
   ) {
      performBlockBreak(var0, var1, var2, var3, var4, var5, var6, var7, var7, var8, var9, var10);
   }

   class="kw">public class="kw">static void performBlockBreak(
      @Nonnull Vector3i var0,
      @Nonnull BlockType var1,
      @Nullable ItemStack var2,
      int var3,
      @Nullable String var4,
      @Nullable String var5,
      int var6,
      @Nullable Ref<EntityStore> var7,
      @Nullable Ref<EntityStore> var8,
      @Nonnull Ref<ChunkStore> var9,
      @Nonnull ComponentAccessor<EntityStore> var10,
      @Nonnull ComponentAccessor<ChunkStore> var11
   ) {
      if (var1 != BlockType.EMPTY) {
         int var12 = var0.x();
         int var13 = var0.y();
         int var14 = var0.z();
         Ref var15 = var9;
         if (var7 != null) {
            BreakBlockEvent var16 = new BreakBlockEvent(var2, var0, var1);
            var10.invoke(var7, var16);
            if (var16.isCancelled()) {
               BlockSection var17 = var11.getComponent(var9, BlockSection.getComponentType());
               if (var17 != null) {
                  var17.invalidateBlock(var12, var13, var14);
               }

               class="kw">return;
            }

            var0 = var16.getTargetBlock();
         } else {
            var10.invoke(new EnvironmentBreakBlockEvent(var0, var1));
         }

         if (var0.x != var12 || var0.y != var13 || var0.z != var14) {
            BlockSection var25 = var11.getComponent(var9, BlockSection.getComponentType());
            if (var25 != null) {
               var25.invalidateBlock(var12, var13, var14);
            }
         }

         if (!ChunkUtil.isSameChunkSection(var12, var13, var14, var0.x, var0.y, var0.z)) {
            var15 = var11.getExternalData().getChunkSectionReferenceAtBlock(var0.x, var0.y, var0.z);
            if (var15 == null || !var15.isValid()) {
               class="kw">return;
            }
         }

         int var26 = var0.x();
         int var27 = var0.y();
         int var18 = var0.z();
         BlockSection var19 = var11.getComponent(var15, BlockSection.getComponentType());
         if (var19 != null) {
            int var20 = var19.getFiller(var26, var27, var18);
            int var21 = var19.get(var26, var27, var18);
            BlockType var22 = BlockType.getAssetMap().getAsset(var21);
            boolean var23 = BlockInteractionUtils.isNaturalAction(var7, var10);
            if (!var23) {
               var6 |= 2048;
            }

            if (!BlockInteractionUtils.isNoPhysics(var7, var10)) {
               var6 |= 256;
            }

            int var24 = var19.getRotationIndex(var26, var27, var18);
            naturallyRemoveBlock(var0, var22, var20, var3, var4, var5, var6, var15, var10, var11);
            fireOnBreakInteraction(var7, var8, var22, var0, var24, var6, var10);
         }
      }
   }

   @Deprecated
   class="kw">public class="kw">static void naturallyRemoveBlockByPhysics(
      @Nonnull Vector3i var0,
      @Nonnull BlockType var1,
      int var2,
      int var3,
      @Nonnull Ref<ChunkStore> var4,
      @Nonnull ComponentAccessor<EntityStore> var5,
      @Nonnull ComponentAccessor<ChunkStore> var6
   ) {
      int var7 = 1;
      String var8 = null;
      String var9 = null;
      BlockGathering var10 = var1.getGathering();
      if (var10 != null) {
         PhysicsDropType var11 = var10.getPhysics();
         BlockBreakingDropType var12 = var10.getBreaking();
         SoftBlockDropType var13 = var10.getSoft();
         HarvestingDropType var14 = var10.getHarvest();
         if (var11 != null) {
            var8 = var11.getItemId();
            var9 = var11.getDropListId();
         } else if (var12 != null) {
            var7 = var12.getQuantity();
            var8 = var12.getItemId();
            var9 = var12.getDropListId();
         } else if (var13 != null) {
            var8 = var13.getItemId();
            var9 = var13.getDropListId();
         } else if (var14 != null) {
            var8 = var14.getItemId();
            var9 = var14.getDropListId();
         }
      }

      var3 |= 32;
      naturallyRemoveBlock(var0, var1, var2, var7, var8, var9, var3, var4, var5, var6);
   }

   class="kw">public class="kw">static void naturallyRemoveBlock(
      @Nonnull Vector3i var0,
      @Nullable BlockType var1,
      int var2,
      int var3,
      String var4,
      String var5,
      int var6,
      @Nonnull Ref<ChunkStore> var7,
      @Nonnull ComponentAccessor<EntityStore> var8,
      @Nonnull ComponentAccessor<ChunkStore> var9
   ) {
      if (var1 != null) {
         BlockSection var10 = var9.getComponent(var7, BlockSection.getComponentType());
         assert var10 != null;
         Vector3i var11 = var0;
         if (!var1.isUnknown()) {
            int var12 = FillerBlockUtil.unpackX(var2);
            int var13 = FillerBlockUtil.unpackY(var2);
            int var14 = FillerBlockUtil.unpackZ(var2);
            if (var12 != 0 || var13 != 0 || var14 != 0) {
               var11 = new Vector3i(var11).sub(var12, var13, var14);
               String var15 = var1.getId();
               Ref var16 = var7;
               if (!ChunkUtil.isSameChunkSection(var11.x, var11.y, var11.z, var0.x, var0.y, var0.z)) {
                  var7 = var9.getExternalData().getChunkSectionReferenceAtBlock(var11.x, var11.y, var11.z);
                  if (var7 == null || !var7.isValid()) {
                     class="kw">return;
                  }

                  var10 = var9.getComponent(var7, BlockSection.getComponentType());
                  assert var10 != null;
               }

               var1 = BlockType.getAssetMap().getAsset(var10.get(var11.x(), var11.y(), var11.z()));
               if (var1 == null) {
                  throw new IllegalStateException("Null block type fetched for " + var11 + " during block break");
               }

               if (!var15.equals(var1.getId())) {
                  BlockOperations.setBlock(var9.getExternalData(), var16, var0.x(), var0.y(), var0.z(), 0, BlockType.EMPTY, 0, 0, var6);
                  class="kw">return;
               }
            }
         }

         if ((var6 & 1024) == 0) {
            BlockSoundSet var17 = BlockSoundSet.getAssetMap().getAsset(var1.getBlockSoundSetIndex());
            if (var17 != null) {
               int var19 = var17.getSoundEventIndices().getOrDefault(BlockSoundEvent.Break, 0);
               if (var19 != 0) {
                  int var21 = var10.getRotationIndex(var11.x(), var11.y(), var11.z());
                  Vector3d var22 = new Vector3d();
                  var1.getBlockCenter(var21, var22);
                  var22.add(var11.x(), var11.y(), var11.z());
                  SoundUtil.playSoundEvent3d(var19, SoundCategory.SFX, var22, var8);
               }
            }
         }

         removeBlock(var11, var1, var6, var7, var10, var9);
         if ((var6 & 2048) == 0 && var3 > 0) {
            Vector3d var18 = Vector3iUtil.toVector3d(var0).add(0.5, 0.0, 0.5);
            List var20 = getDrops(var1, var3, var4, var5);
            spawnDrops(var8, var20, var18);
         }
      }
   }

   class="kw">public class="kw">static boolean shouldPickupByInteraction(@Nullable BlockType var0) {
      class="kw">return var0 != null && var0.getGathering() != null && var0.getGathering().isHarvestable();
   }

   class="kw">public class="kw">static void performPickupByInteraction(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull Vector3i var1,
      @Nonnull BlockType var2,
      int var3,
      @Nonnull Ref<ChunkStore> var4,
      @Nonnull BlockSection var5,
      @Nonnull ComponentAccessor<EntityStore> var6,
      @Nonnull ComponentAccessor<ChunkStore> var7
   ) {
      Vector3i var8 = var1;
      Ref var9 = var4;
      BlockSection var10 = var5;
      if (!var2.isUnknown()) {
         int var11 = FillerBlockUtil.unpackX(var3);
         int var12 = FillerBlockUtil.unpackY(var3);
         int var13 = FillerBlockUtil.unpackZ(var3);
         if (var11 != 0 || var12 != 0 || var13 != 0) {
            var8 = new Vector3i(var8).sub(var11, var12, var13);
            if (!ChunkUtil.isSameChunkSection(var8.x, var8.y, var8.z, var1.x, var1.y, var1.z)) {
               var9 = var7.getExternalData().getChunkSectionReferenceAtBlock(var8.x, var8.y, var8.z);
               if (var9 == null || !var9.isValid()) {
                  class="kw">return;
               }

               var10 = var7.getComponent(var9, BlockSection.getComponentType());
               assert var10 != null;
            }

            String var14 = var2.getId();
            var2 = BlockType.getAssetMap().getAsset(var10.get(var8.x(), var8.y(), var8.z()));
            if (var2 == null) {
               class="kw">return;
            }

            if (!var14.equals(var2.getId())) {
               BlockOperations.setBlock(var7.getExternalData(), var4, var1.x(), var1.y(), var1.z(), 0, BlockType.EMPTY, 0, 0, 0);
               class="kw">return;
            }
         }
      }

      Vector3d var22 = new Vector3d();
      int var23 = var5.getRotationIndex(var1.x(), var1.y(), var1.z());
      var2.getBlockCenter(var23, var22);
      var22.add(var1.x(), var1.y(), var1.z());
      int var24 = 0;
      var24 |= 256;
      BreakBlockEvent var26 = new BreakBlockEvent(null, var8, var2);
      var6.invoke(var0, var26);
      if (var26.isCancelled()) {
         var5.invalidateBlock(var1.x(), var1.y(), var1.z());
      } else {
         Vector3i var15 = var26.getTargetBlock();
         if (!ChunkUtil.isSameChunkSection(var15.x, var15.y, var15.z, var8.x, var8.y, var8.z)) {
            var9 = var7.getExternalData().getChunkSectionReferenceAtBlock(var15.x, var15.y, var15.z);
            if (var9 == null || !var9.isValid()) {
               class="kw">return;
            }

            var10 = var7.getComponent(var9, BlockSection.getComponentType());
            assert var10 != null;
         }

         var8 = var15;
         if (!BlockInteractionUtils.isNaturalAction(var0, var6)) {
            var24 |= 2048;
         }

         removeBlock(var8, var2, var24, var9, var10, var7);
         fireOnBreakInteraction(var0, var0, var2, var8, var23, var24, var6);
         HarvestingDropType var16 = var2.getGathering().getHarvest();
         String var17 = var16.getItemId();
         String var18 = var16.getDropListId();

         for (ItemStack var20 : getDrops(var2, 1, var17, var18)) {
            ItemUtils.interactivelyPickupItem(var0, var20, var22, var6);
         }

         if ((var24 & 1024) == 0) {
            playBlockSound(var2, BlockSoundEvent.Harvest, var22, var6);
         }
      }
   }

   @Nonnull
   class="kw">public class="kw">static List<ItemStack> getDrops(@Nonnull BlockType var0, int var1, @Nullable String var2, @Nullable String var3) {
      if (var3 == null && var2 == null) {
         Item var8 = var0.getItem();
         class="kw">return var8 == null ? ObjectLists.emptyList() : ObjectLists.singleton(new ItemStack(var8.getId(), var1));
      }

      List var4 = new ObjectArrayList();
      if (var3 != null) {
         ItemModule var5 = ItemModule.get();
         if (var5.isEnabled()) {
            for (int var6 = 0; var6 < var1; var6++) {
               List var7 = var5.getRandomItemDrops(var3);
               var4.addAll(var7);
            }
         }
      }

      if (var2 != null) {
         var4.add(new ItemStack(var2, var1));
      }

      class="kw">return var4;
   }

   @Nullable
   class="kw">private class="kw">static ItemToolSpec getSpecPowerDamageBlock(@Nullable Item var0, @Nullable BlockType var1, @Nullable ItemTool var2) {
      if (var1 == null) {
         class="kw">return null;
      }

      BlockGathering var3 = var1.getGathering();
      if (var3 == null) {
         class="kw">return null;
      }

      BlockBreakingDropType var4 = var3.getBreaking();
      if (var4 == null) {
         class="kw">return null;
      }

      String var5 = var4.getGatherType();
      if (var5 == null) {
         class="kw">return null;
      }

      if (var0 == null || var0.getWeapon() == null && var0.getBuilderTool() == null) {
         int var6 = var4.getQuality();
         if (var2 == null) {
            ItemToolSpec var12 = ItemToolSpec.getAssetMap().getAsset(var5);
            class="kw">return var12 != null && var12.getQuality() < var6 ? null : var12;
         }

         ItemToolSpec[] var7 = var2.getSpecs();
         if (var7 != null) {
            for (ItemToolSpec var11 : var7) {
               if (Objects.equals(var11.getGatherType(), var5)) {
                  if (var11.getQuality() < var6) {
                     class="kw">return null;
                  }

                  class="kw">return var11;
               }
            }
         }

         class="kw">return null;
      } else {
         class="kw">return null;
      }
   }

   class="kw">private class="kw">static double calculateDurabilityUse(@Nonnull Item var0, @Nullable BlockType var1) {
      if (var1 == null) {
         class="kw">return 0.0;
      }

      BlockGathering var2 = var1.getGathering();
      if (var2 != null && !var2.isSoft()) {
         if (var0.getTool() == null) {
            class="kw">return 0.0;
         }

         ItemTool var3 = var0.getTool();
         ItemTool.DurabilityLossBlockTypes[] var4 = var3.getDurabilityLossBlockTypes();
         if (var4 == null) {
            class="kw">return var0.getDurabilityLossOnHit();
         }

         String var5 = var1.getId();
         int var6 = BlockType.getAssetMap().getIndex(var5);
         if (var6 == Integer.MIN_VALUE) {
            throw new IllegalArgumentException("Unknown key! " + var5);
         }

         BlockSetModule var7 = BlockSetModule.getInstance();

         for (ItemTool.DurabilityLossBlockTypes var11 : var4) {
            int[] var12 = var11.getBlockTypeIndexes();
            if (var12 != null) {
               for (int var16 : var12) {
                  if (var16 == var6) {
                     class="kw">return var11.getDurabilityLossOnHit();
                  }
               }
            }

            int[] var18 = var11.getBlockSetIndexes();
            if (var18 != null) {
               for (int var17 : var18) {
                  if (var7.blockInSet(var17, var5)) {
                     class="kw">return var11.getDurabilityLossOnHit();
                  }
               }
            }
         }

         class="kw">return var0.getDurabilityLossOnHit();
      } else {
         class="kw">return 0.0;
      }
   }

   @Nonnull
   class="kw">private class="kw">static BlockHarvestUtils.ItemDamageContext createItemDamageContext(@Nullable Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
      World var2 = var1.getExternalData().getWorld();
      SpatialResource var3 = var1.getResource(EntityModule.get().getPlayerSpatialResourceType());
      TimeResource var4 = var1.getResource(TimeResource.getResourceType());
      boolean var5 = var0 != null && ItemUtils.canApplyItemStackPenalties(var0, var1);
      class="kw">return new BlockHarvestUtils.ItemDamageContext(var2, var3, var4, var5);
   }

   class="kw">private class="kw">static boolean damageSingleBlock(
      @Nullable Ref<EntityStore> var0,
      @Nullable Ref<EntityStore> var1,
      @Nonnull Vector3i var2,
      @Nullable ItemStack var3,
      @Nullable ItemTool var4,
      @Nullable String var5,
      boolean var6,
      float var7,
      int var8,
      boolean var9,
      boolean var10,
      @Nonnull BlockHarvestUtils.ItemDamageContext var11,
      @Nonnull Ref<ChunkStore> var12,
      @Nonnull ComponentAccessor<EntityStore> var13,
      @Nonnull ComponentAccessor<ChunkStore> var14
   ) {
      World var15 = var11.world();
      GameplayConfig var16 = var15.getGameplayConfig();
      ChunkSection var17 = var14.getComponent(var12, ChunkSection.getComponentType());
      if (var17 == null) {
         class="kw">return false;
      }

      Ref var18 = var17.getChunkColumnReference();
      BlockChunk var19 = var14.getComponent(var18, BlockChunk.getComponentType());
      if (var19 == null) {
         class="kw">return false;
      }

      BlockSection var20 = var14.getComponent(var12, BlockSection.getComponentType());
      if (var20 == null) {
         class="kw">return false;
      }

      int var21 = var20.getRotationIndex(var2.x, var2.y, var2.z);
      boolean var22 = false;
      int var23 = var19.getEnvironment(var2.x, var2.y, var2.z);
      Environment var24 = Environment.getAssetMap().getAsset(var23);
      SpatialResource var25 = var11.playerSpatialResource();
      if (var24 != null && !var24.isBlockModificationAllowed()) {
         var20.invalidateBlock(var2.x, var2.y, var2.z);
         class="kw">return false;
      }

      BlockType var26 = BlockType.getAssetMap().getAsset(var20.get(var2.x, var2.y, var2.z));
      if (var26 == null) {
         class="kw">return false;
      }

      BlockGathering var27 = var26.getGathering();
      if (var27 == null) {
         class="kw">return false;
      }

      if (var6 && !var27.getToolData().containsKey(var5)) {
         class="kw">return false;
      }

      Vector3d var28 = new Vector3d();
      var26.getBlockCenter(var21, var28);
      var28.add(var2.x, var2.y, var2.z);
      Vector3i var29 = new Vector3i(var2.x, var2.y, var2.z);
      Ref var30 = var12;
      BlockSection var31 = var20;
      Ref var32 = var18;
      if (!var26.isUnknown()) {
         int var33 = var20.getFiller(var2.x, var2.y, var2.z);
         int var34 = FillerBlockUtil.unpackX(var33);
         int var35 = FillerBlockUtil.unpackY(var33);
         int var36 = FillerBlockUtil.unpackZ(var33);
         if (var34 != 0 || var35 != 0 || var36 != 0) {
            var29 = new Vector3i(var29).sub(var34, var35, var36);
            if (!ChunkUtil.isSameChunkSection(var29.x, var29.y, var29.z, var2.x, var2.y, var2.z)) {
               var30 = var14.getExternalData().getChunkSectionReferenceAtBlock(var29.x, var29.y, var29.z);
               if (var30 == null || !var30.isValid()) {
                  class="kw">return false;
               }

               var31 = var14.getComponent(var30, BlockSection.getComponentType());
               assert var31 != null;
               ChunkSection var37 = var14.getComponent(var30, ChunkSection.getComponentType());
               assert var37 != null;
               var32 = var37.getChunkColumnReference();
            }

            String var61 = var26.getId();
            var26 = var15.getBlockType(var29.x(), var29.y(), var29.z());
            if (var26 == null) {
               class="kw">return false;
            }

            if (!var61.equals(var26.getId())) {
               BlockOperations.setBlock(var14.getExternalData(), var12, var2.x, var2.y, var2.z, 0, BlockType.EMPTY, 0, 0, 0);
               class="kw">return true;
            }

            var27 = var26.getGathering();
            if (var27 == null) {
               class="kw">return false;
            }
         }
      }

      if (var9 && handleExplosionReactionState(var15, var26, var2)) {
         class="kw">return true;
      }

      Item var57 = var3 != null ? var3.getItem() : null;
      if (var4 == null && var57 != null) {
         var4 = var57.getTool();
      }

      ItemToolSpec var58 = getSpecPowerDamageBlock(var57, var26, var4);
      float var59 = var58 != null ? var58.getPower() : 0.0F;
      boolean var60 = var11.canApplyItemStackPenalties();
      if (var59 != 0.0F && var57 != null && var57.getTool() != null && var3.isBroken() && var60) {
         BrokenPenalties var62 = var16.getItemDurabilityConfig().getBrokenPenalties();
         var59 *= 1.0F - (float)var62.getTool(0.0);
      }

      int var38 = 1;
      String var39;
      String var40;
      float var63;
      if (var59 != 0.0F) {
         BlockBreakingDropType var41 = var27.getBreaking();
         var63 = var59;
         var38 = var41.getQuantity();
         var39 = var41.getItemId();
         var40 = var41.getDropListId();
      } else {
         if (!var27.isSoft()) {
            if (var57 != null && var57.getWeapon() == null) {
               if (var0 != null) {
                  GatheringEffectsConfig var69 = var16.getGatheringConfig().getUnbreakableBlockConfig();
                  if ((var8 & 4) == 0) {
                     String var71 = var69.getParticleSystemId();
                     if (var71 != null) {
                        List var73 = SpatialResource.getThreadLocalReferenceList();
                        var25.getSpatialStructure().collect(var28, 75.0, var73);
                        ParticleUtil.spawnParticleEffect(var71, var28, var73, var13);
                     }
                  }

                  if ((var8 & 1024) == 0) {
                     int var72 = var69.getSoundEventIndex();
                     if (var72 != 0) {
                        SoundUtil.playSoundEvent3d(var0, var72, var28, var13);
                     }

                     if (var57.getTool() != null) {
                        int var74 = var57.getTool().getIncorrectMaterialSoundLayerIndex();
                        if (var74 != 0) {
                           SoundUtil.playSoundEvent3d(var0, var74, var28, var13);
                        }
                     }
                  }
               }

               class="kw">return false;
            }

            class="kw">return false;
         }

         SoftBlockDropType var66 = var27.getSoft();
         if (!var66.isWeaponBreakable() && var57 != null && var57.getWeapon() != null) {
            class="kw">return false;
         }

         var63 = 1.0F;
         var39 = var66.getItemId();
         var40 = var66.getDropListId();
         var7 = 1.0F;
      }

      var63 *= var7;
      if (var26.getGathering().shouldUseDefaultDropWhenPlaced()) {
         BlockPhysics var67 = var14.getComponent(var12, BlockPhysics.getComponentType());
         boolean var42 = var67 != null && var67.isDeco(var2.x, var2.y, var2.z);
         if (var42) {
            var39 = null;
            var40 = null;
         }
      }

      TimeResource var68 = var11.timeResource();
      BlockHealthChunk var70 = var14.getComponent(var32, BlockHealthModule.get().getBlockHealthChunkComponentType());
      assert var70 != null;
      float var43 = var70.getBlockHealth(var29);
      DamageBlockEvent var44 = new DamageBlockEvent(var3, var29, var26, var43, var63);
      if (var0 != null) {
         var13.invoke(var0, var44);
      } else {
         var13.invoke(var44);
      }

      if (var44.isCancelled()) {
         var20.invalidateBlock(var2.x, var2.y, var2.z);
         class="kw">return false;
      }

      var63 = var44.getDamage();
      var26 = var44.getBlockType();
      var2 = var44.getTargetBlock();
      if (!ChunkUtil.isSameChunkSection(var2.x, var2.y, var2.z, var29.x, var29.y, var29.z)) {
         var30 = var14.getExternalData().getChunkSectionReferenceAtBlock(var2.x, var2.y, var2.z);
         if (var30 == null || !var30.isValid()) {
            class="kw">return false;
         }

         var31 = var14.getComponent(var30, BlockSection.getComponentType());
         assert var31 != null;
         ChunkSection var45 = var14.getComponent(var30, ChunkSection.getComponentType());
         assert var45 != null;
         var32 = var45.getChunkColumnReference();
         var70 = var14.getComponent(var32, BlockHealthModule.get().getBlockHealthChunkComponentType());
         assert var70 != null;
      }

      var21 = var31.getRotationIndex(var2.x, var2.y, var2.z);
      var26.getBlockCenter(var21, var28);
      var28.add(var2.x, var2.y, var2.z);
      BlockHealth var75 = var70.damageBlock(var68.getNow(), var15, var2, var63);
      if (var70.isBlockFragile(var2) || var75.isDestroyed()) {
         BlockGathering.BlockToolData var46 = var27.getToolData().get(var5);
         boolean var47 = var46 != null;
         if (!var47) {
            performBlockBreak(var2, var26, var3, var38, var39, var40, var8, var0, var1, var30, var13, var14);
            var22 = true;
         } else {
            String var48 = var46.getStateId();
            BlockType var49 = var48 != null ? var26.getBlockForState(var48) : null;
            boolean var50 = var49 != null && !var26.getId().equals(var49.getId());
            if (var50) {
               var75.setHealth(1.0F);
               BlockOperations.setBlock(var14.getExternalData(), var30, var2.x, var2.y, var2.z, BlockType.getAssetMap().getIndex(var49.getId()), var49, 0, 0, 0);
               if ((var8 & 1024) == 0) {
                  playBlockSound(var26, BlockSoundEvent.Break, var28, var13);
               }

               if ((var8 & 2048) == 0) {
                  List var51 = getDrops(var26, 1, var46.getItemId(), var46.getDropListId());
                  Vector3d var52 = new Vector3d(var2.x + 0.5, var2.y, var2.z + 0.5);
                  spawnDrops(var13, var51, var52);
               }
            } else {
               performBlockBreak(var2, var26, var3, var38, var39, var40, var8 | 2048, var0, var1, var30, var13, var14);
               var22 = true;
               if ((var8 & 2048) == 0) {
                  List var81 = getDrops(var26, 1, var46.getItemId(), var46.getDropListId());
                  if (!var81.isEmpty()) {
                     Vector3d var82 = new Vector3d(var2.x + 0.5, var2.y, var2.z + 0.5);
                     spawnDrops(var13, var81, var82);
                  }
               }
            }
         }
      } else if ((var8 & 1024) == 0) {
         playBlockSound(var26, BlockSoundEvent.Hit, var28, var13);
      }

      if (var0 != null) {
         if ((var8 & 1024) == 0 && !var28.equals(Vector3dUtil.MAX)) {
            int var76 = 0;
            if (var58 != null) {
               var76 = var58.getHitSoundLayerIndex();
            }

            if (var76 == 0 && var57 != null && var57.getTool() != null) {
               var76 = var57.getTool().getHitSoundLayerIndex();
            }

            if (var76 != 0) {
               SoundUtil.playSoundEvent3d(var0, var76, var28.x(), var28.y(), var28.z(), var13);
            }
         }

         if (var58 != null && var58.isIncorrect()) {
            GatheringEffectsConfig var77 = var16.getGatheringConfig().getIncorrectToolConfig();
            if (var77 != null) {
               if ((var8 & 4) == 0) {
                  String var78 = var77.getParticleSystemId();
                  if (var78 != null) {
                     List var80 = SpatialResource.getThreadLocalReferenceList();
                     var25.getSpatialStructure().collect(var28, 75.0, var80);
                     ParticleUtil.spawnParticleEffect(var78, var28, var80, var13);
                  }
               }

               if ((var8 & 1024) == 0) {
                  int var79 = var77.getSoundEventIndex();
                  if (var79 != 0) {
                     SoundUtil.playSoundEvent3d(var0, var79, var28, var13);
                  }
               }
            }
         }
      }

      if (var10 && var0 != null) {
         applyItemDurabilityLoss(var0, var3, var57, var26, var13);
      }

      class="kw">return var22;
   }

   class="kw">private class="kw">static void applyItemDurabilityLoss(
      @Nonnull Ref<EntityStore> var0, @Nullable ItemStack var1, @Nullable Item var2, @Nullable BlockType var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (var1 != null && var2 != null && !var1.isUnbreakable()) {
         if (ItemUtils.canDecreaseItemStackDurability(var0, var4)) {
            InventoryComponent.Hotbar var5 = var4.getComponent(var0, InventoryComponent.Hotbar.getComponentType());
            if (var5 != null && var5.getActiveSlot() != -1) {
               double var6 = calculateDurabilityUse(var2, var3);
               ItemUtils.updateItemStackDurability(var0, var1, var5.getInventory(), var5.getActiveSlot(), -var6, var4);
            }
         }
      }
   }

   class="kw">private class="kw">static void removeBlock(
      @Nonnull Vector3i var0,
      @Nonnull BlockType var1,
      int var2,
      @Nonnull Ref<ChunkStore> var3,
      @Nonnull BlockSection var4,
      @Nonnull ComponentAccessor<ChunkStore> var5
   ) {
      World var6 = var5.getExternalData().getWorld();
      ChunkSection var7 = var5.getComponent(var3, ChunkSection.getComponentType());
      assert var7 != null;
      ComponentType var8 = BlockHealthModule.get().getBlockHealthChunkComponentType();
      BlockHealthChunk var9 = var5.getComponent(var7.getChunkColumnReference(), var8);
      assert var9 != null;
      var9.removeBlock(var6, var0);
      BlockOperations.setBlock(var5.getExternalData(), var3, var0.x(), var0.y(), var0.z(), 0, BlockType.EMPTY, 0, 0, var2);
      if ((var2 & 256) != 0) {
         int var10 = var4.getRotationIndex(var0.x, var0.y, var0.z);
         BlockBoundingBoxes var11 = BlockBoundingBoxes.getAssetMap().getAsset(var1.getHitboxTypeIndex());
         if (var11 != null) {
            FillerBlockUtil.forEachFillerBlock(
               var11.get(var10), (var2x, var3x, var4x) -> var6.performBlockUpdate(var0.x() + var2x, var0.y() + var3x, var0.z() + var4x, false)
            );
         }
      }

      ConnectedBlocksUtil.setConnectedBlockAndNotifyNeighbors(
         var5.getExternalData(), BlockType.getAssetMap().getIndex("Empty"), RotationTuple.NONE, Vector3iUtil.ZERO, var0, var3, var4
      );
   }

   class="kw">private class="kw">static void playBlockSound(
      @Nonnull BlockType var0, @Nonnull BlockSoundEvent var1, @Nonnull Vector3d var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      BlockSoundSet var4 = BlockSoundSet.getAssetMap().getAsset(var0.getBlockSoundSetIndex());
      if (var4 != null) {
         int var5 = var4.getSoundEventIndices().getOrDefault(var1, 0);
         if (var5 != 0) {
            SoundUtil.playSoundEvent3d(var5, SoundCategory.SFX, var2, var3);
         }
      }
   }

   class="kw">private class="kw">static void spawnDrops(@Nonnull ComponentAccessor<EntityStore> var0, @Nonnull List<ItemStack> var1, @Nonnull Vector3d var2) {
      Holder[] var3 = ItemComponent.generateItemDrops(var0, var1, var2, Rotation3f.IDENTITY);
      var0.addEntities(var3, AddReason.SPAWN);
   }

   class="kw">private class="kw">static boolean handleExplosionReactionState(@Nonnull World var0, @Nonnull BlockType var1, @Nonnull Vector3i var2) {
      String var3 = var1.getExplosionReactionState();
      if (var3 == null) {
         class="kw">return false;
      }

      BlockType var4 = var1.getBlockForState(var3);
      if (var4 == null) {
         class="kw">return false;
      }

      int var5 = BlockType.getAssetMap().getIndex(var4.getId());
      if (var5 == Integer.MIN_VALUE) {
         class="kw">return false;
      }

      long var6 = ChunkUtil.indexChunkFromBlock(var2.x, var2.z);
      WorldChunk var8 = var0.getChunkIfInMemory(var6);
      int var9 = 260;
      int var10 = var8.getRotationIndex(var2.x, var2.y, var2.z);
      var8.setBlock(var2.x(), var2.y(), var2.z(), var5, var4, var10, 0, 260);
      class="kw">return true;
   }

   class="kw">public class="kw">static void fireOnBreakInteraction(
      @Nullable Ref<EntityStore> var0,
      @Nullable Ref<EntityStore> var1,
      @Nonnull BlockType var2,
      @Nonnull Vector3i var3,
      int var4,
      int var5,
      @Nonnull ComponentAccessor<EntityStore> var6
   ) {
      if (var0 != null && (var5 & 4096) == 0) {
         if (var6 class="kw">instanceof CommandBuffer var7) {
            queueBlockInteraction(var0, var1 != null ? var1 : var0, InteractionType.OnBreak, var2, var3, var4, var7);
         }
      }
   }

   class="kw">public class="kw">static void queueOnBreakImpactInteraction(
      @Nonnull Ref<EntityStore> var0, @Nonnull BlockType var1, @Nonnull Vector3i var2, int var3, @Nonnull CommandBuffer<EntityStore> var4
   ) {
      queueBlockInteraction(var0, var0, InteractionType.OnBreakImpact, var1, var2, var3, var4);
   }

   class="kw">private class="kw">static void queueBlockInteraction(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull Ref<EntityStore> var1,
      @Nonnull InteractionType var2,
      @Nonnull BlockType var3,
      @Nonnull Vector3i var4,
      int var5,
      @Nonnull CommandBuffer<EntityStore> var6
   ) {
      String var7 = var3.getInteractions().get(var2);
      if (var7 != null) {
         try {
            InteractionManager var8 = var0.isValid() ? var6.getComponent(var0, InteractionModule.get().getInteractionManagerComponent()) : null;
            if (var8 == null) {
               queueBlockInteractionOnHost(var0, var2, var7, var3, var4, var5, var6);
               class="kw">return;
            }

            Ref var9 = var1.isValid() ? var1 : var0;
            queueBlockInteractionChain(var8, var0, var9, var2, var7, var3, var4, var5, var6);
         } catch (Throwable var10) {
            logBlockInteractionFailure(var10, var2, var7, var3, var4);
         }
      }
   }

   class="kw">private class="kw">static void queueBlockInteractionOnHost(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull InteractionType var1,
      @Nonnull String var2,
      @Nonnull BlockType var3,
      @Nonnull Vector3i var4,
      int var5,
      @Nonnull CommandBuffer<EntityStore> var6
   ) {
      World var7 = var6.getExternalData().getWorld();
      Vector3d var8 = new Vector3d(var4.x + 0.5, var4.y + 0.5, var4.z + 0.5);
      Vector3i var9 = new Vector3i(var4);
      var7.execute(() -> {
         Store var8 = var7.getEntityStore().getStore();
         if (var8 != null) {
            try {
               Ref var9 = InteractionHost.spawnHost(var8, var8, new Rotation3f(), 30.0F, new InteractionSimulationHandler());
               if (var9 == null) {
                  class="kw">return;
               }

               InteractionManager var10 = var8.getComponent(var9, InteractionModule.get().getInteractionManagerComponent());
               InteractionHost var11 = var8.getComponent(var9, InteractionHost.getComponentType());
               if (var10 == null || var11 == null) {
                  class="kw">return;
               }

               Ref var12 = var0.isValid() ? var0 : var9;
               var11.setChain(queueBlockInteractionChain(var10, var12, var9, var1, var2, var3, var9, var5, var8));
            } catch (Throwable var13) {
               logBlockInteractionFailure(var13, var1, var2, var3, var9);
            }
         }
      });
   }

   class="kw">private class="kw">static void logBlockInteractionFailure(
      @Nonnull Throwable var0, @Nonnull InteractionType var1, @Nonnull String var2, @Nonnull BlockType var3, @Nonnull Vector3i var4
   ) {
      ((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var0))
         .log("Failed to run %s interaction '%s' for block '%s' at %s", var1, var2, var3.getId(), var4);
   }

   @Nonnull
   class="kw">private class="kw">static InteractionChain queueBlockInteractionChain(
      @Nonnull InteractionManager var0,
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Ref<EntityStore> var2,
      @Nonnull InteractionType var3,
      @Nonnull String var4,
      @Nonnull BlockType var5,
      @Nonnull Vector3i var6,
      int var7,
      @Nonnull ComponentAccessor<EntityStore> var8
   ) {
      RootInteraction var9 = RootInteraction.getRootInteractionOrUnknown(var4);
      InteractionContext var10 = var1.equals(var2)
         ? InteractionContext.forInteraction(var0, var1, var3, var8)
         : InteractionContext.forProxyEntity(var0, var1, var2, var8);
      BlockPosition var11 = new BlockPosition(var6.x, var6.y, var6.z);
      StandardPhysicsProvider var12 = var8.getComponent(var2, StandardPhysicsProvider.getComponentType());
      BlockPosition var13 = var12 != null ? var12.getContactBlock() : null;
      var10.getMetaStore().putMetaObject(Interaction.TARGET_BLOCK_RAW, var13 != null ? var13 : var11);
      var10.getMetaStore().putMetaObject(Interaction.TARGET_BLOCK, var11);
      var10.getMetaStore().putMetaObject(Interaction.TARGET_BLOCK_TYPE, var5);
      var10.getMetaStore().putMetaObject(Interaction.TARGET_BLOCK_ROTATION_INDEX, var7);
      InteractionChain var14 = var0.initChain(var3, var10, var9, -1, var11, false);
      var0.queueExecuteChain(var14);
      class="kw">return var14;
   }

   class="kw">private record ItemDamageContext(
      @Nonnull World world,
      @Nonnull SpatialResource<Ref<EntityStore>, EntityStore> playerSpatialResource,
      @Nonnull TimeResource timeResource,
      boolean canApplyItemStackPenalties
   ) {
      class="kw">private ItemDamageContext {
      }
   }
}