From 6e1a7cf39dd1f336ef85d75a959da6bb4710728c Mon Sep 17 00:00:00 2001 From: StarWishsama Date: Thu, 8 Aug 2024 08:19:24 +0800 Subject: [PATCH] fix: actual fix #928 pick from Slimefun4#4062 --- .../listeners/BlockListener.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BlockListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BlockListener.java index 6a2efb809a..ec6baff0e1 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BlockListener.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BlockListener.java @@ -176,11 +176,11 @@ public void onBlockBreak(BlockBreakEvent e) { var heldItem = e.getPlayer().getInventory().getItemInMainHand(); var block = e.getBlock(); var blockData = StorageCacheUtils.getBlock(block.getLocation()); + var sfItem = SlimefunItem.getById(blockData.getSfId()); // If there is a Slimefun Block here, call our BreakEvent and, if cancelled, cancel this event // and return if (blockData != null) { - var sfItem = SlimefunItem.getById(blockData.getSfId()); SlimefunBlockBreakEvent breakEvent = new SlimefunBlockBreakEvent(e.getPlayer(), heldItem, e.getBlock(), sfItem); Bukkit.getPluginManager().callEvent(breakEvent); @@ -204,7 +204,7 @@ public void onBlockBreak(BlockBreakEvent e) { checkForSensitiveBlockAbove(e.getPlayer(), e.getBlock(), heldItem); if (blockData == null || blockData.isPendingRemove()) { - dropItems(e, drops); + dropItems(e, heldItem, block, sfItem, drops); return; } @@ -223,7 +223,7 @@ public void onBlockBreak(BlockBreakEvent e) { return; } e.setDropItems(true); - dropItems(e, drops); + dropItems(e, heldItem, block, sfItem, drops); }, true); return; @@ -233,7 +233,7 @@ public void onBlockBreak(BlockBreakEvent e) { if (e.isCancelled()) { blockData.setPendingRemove(false); } - dropItems(e, drops); + dropItems(e, heldItem, block, sfItem, drops); // Checks for vanilla sensitive blocks everywhere // checkForSensitiveBlocks(e.getBlock(), 0, e.isDropItems()); @@ -271,12 +271,13 @@ private void callBlockHandler(BlockBreakEvent e, ItemStack item, List } @ParametersAreNonnullByDefault - private void dropItems(BlockBreakEvent e, List drops) { + private void dropItems( + BlockBreakEvent e, ItemStack item, Block block, @Nullable SlimefunItem sfBlock, List drops) { if (!drops.isEmpty()) { // TODO: properly support loading inventories within unit tests if (!Slimefun.instance().isUnitTest()) { // Notify plugins like CoreProtect - Slimefun.getProtectionManager().logAction(e.getPlayer(), e.getBlock(), Interaction.BREAK_BLOCK); + Slimefun.getProtectionManager().logAction(e.getPlayer(), block, Interaction.BREAK_BLOCK); } // Fixes #2560 @@ -284,14 +285,18 @@ private void dropItems(BlockBreakEvent e, List drops) { // Disable normal block drops e.setDropItems(false); + // Fixes #4051 + if (sfBlock == null) { + block.breakNaturally(item); + } + + // The list only contains other drops, not those from the block itself, so we still need to handle those for (ItemStack drop : drops) { // Prevent null or air from being dropped if (drop != null && drop.getType() != Material.AIR) { if (e.getPlayer().getGameMode() != GameMode.CREATIVE || Slimefun.getCfg().getBoolean("options.drop-block-creative")) { - e.getBlock() - .getWorld() - .dropItemNaturally(e.getBlock().getLocation(), drop); + block.getWorld().dropItemNaturally(block.getLocation(), drop); } } } @@ -330,7 +335,7 @@ private void checkForSensitiveBlockAbove(Player player, Block block, ItemStack i sfItem.callItemHandler( BlockBreakHandler.class, handler -> handler.onPlayerBreak(dummyEvent, item, drops)); controller.removeBlock(loc); - dropItems(dummyEvent, drops); + dropItems(dummyEvent, item, block, sfItem, drops); } else { blockData.setPendingRemove(true); controller.loadBlockDataAsync(blockData, new IAsyncReadCallback<>() { @@ -344,7 +349,7 @@ public void onResult(SlimefunBlockData result) { sfItem.callItemHandler( BlockBreakHandler.class, handler -> handler.onPlayerBreak(dummyEvent, item, drops)); controller.removeBlock(loc); - dropItems(dummyEvent, drops); + dropItems(dummyEvent, item, block, sfItem, drops); } }); }