6969import net .minecraft .world .level .BlockGetter ;
7070import net .minecraft .world .level .ClipContext ;
7171import net .minecraft .world .level .Level ;
72- import net .minecraft .world .level .block .Block ;
7372import net .minecraft .world .level .block .state .BlockState ;
7473import net .minecraft .world .level .material .FluidState ;
7574import net .minecraft .world .level .material .Fluids ;
7978import net .minecraft .world .phys .Vec3 ;
8079import net .neoforged .bus .api .EventPriority ;
8180import net .neoforged .neoforge .capabilities .Capabilities ;
82- import net .neoforged .neoforge .common .CommonHooks ;
8381import net .neoforged .neoforge .common .NeoForge ;
8482import net .neoforged .neoforge .event .entity .player .PlayerInteractEvent ;
8583import net .neoforged .neoforge .event .level .BlockDropsEvent ;
@@ -310,6 +308,8 @@ private static void trackClickedFace(PlayerInteractEvent.LeftClickBlock event) {
310308 private record ClickedBlock (BlockPos pos , Direction face ) {
311309 }
312310
311+ private static final ThreadLocal <Boolean > recursiveMineBlock = ThreadLocal .withInitial (() -> false );
312+
313313 @ Override
314314 public boolean mineBlock (ItemStack stack , Level world , BlockState state , BlockPos pos , LivingEntity miner ) {
315315 useFuel (stack , miner );
@@ -318,24 +318,26 @@ public boolean mineBlock(ItemStack stack, Level world, BlockState state, BlockPo
318318 return false ;
319319 }
320320
321+ if (recursiveMineBlock .get ()) {
322+ // Avoid endless recursion
323+ return false ;
324+ }
325+
321326 var area = getArea (world , p , stack , false );
322327 if (area == null ) {
323328 return false ;
324329 }
325330 lastClickedBlock .remove (p );
326331
327332 totalDrops = new ArrayList <>();
328- forEachMineableBlock (world , area , miner , (blockPos , tempState ) -> {
329- Block block = tempState .getBlock ();
330- var blockEntity = world .getBlockEntity (blockPos );
331- var breakEvent = CommonHooks .fireBlockBreak (world , p .gameMode .getGameModeForPlayer (), p ,
332- blockPos , tempState );
333- if (!breakEvent .isCanceled () && block .onDestroyedByPlayer (tempState , world , blockPos , (Player ) miner , true , tempState .getFluidState ())) {
334- block .destroy (world , blockPos , tempState );
335- // Thanks to our event above, the drops won't make it into the level, and will be added to `totalDrops` instead.
336- Block .dropResources (tempState , world , blockPos , blockEntity , miner , stack );
337- }
338- });
333+ recursiveMineBlock .set (true );
334+ try {
335+ forEachMineableBlock (world , area , miner , (blockPos , tempState ) -> {
336+ p .gameMode .destroyBlock (blockPos );
337+ });
338+ } finally {
339+ recursiveMineBlock .set (false );
340+ }
339341 totalDrops .forEach (itemStack -> {
340342 ItemHandlerHelper .giveItemToPlayer (p , itemStack );
341343 });
0 commit comments