From 8c1c67731b3c9c896720bdfc0e9a37e06652d975 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 1 Mar 2021 09:31:59 +0100 Subject: [PATCH] Fixes #2852 --- CHANGELOG.md | 1 + .../items/blocks/BlockPlacer.java | 31 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cf913b17..6f7da02fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ * Fixed #2839 * Fixed #2849 * Fixed #2851 +* Fixed #2852 ## Release Candidate 20 (30 Jan 2021) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/BlockPlacer.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/BlockPlacer.java index ea384e019..445a96bc1 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/BlockPlacer.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/blocks/BlockPlacer.java @@ -13,8 +13,10 @@ import org.bukkit.Material; import org.bukkit.Nameable; import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; +import org.bukkit.block.BlockState; import org.bukkit.block.Dispenser; import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -25,6 +27,7 @@ import io.github.thebusybiscuit.slimefun4.api.events.BlockPlacerPlaceEvent; import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting; import io.github.thebusybiscuit.slimefun4.api.items.settings.MaterialTagSetting; import io.github.thebusybiscuit.slimefun4.core.attributes.NotPlaceable; +import io.github.thebusybiscuit.slimefun4.core.handlers.BlockBreakHandler; import io.github.thebusybiscuit.slimefun4.core.handlers.BlockDispenseHandler; import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; @@ -57,7 +60,7 @@ public class BlockPlacer extends SlimefunItem { super(category, item, recipeType, recipe); addItemSetting(unplaceableBlocks); - addItemHandler(onPlace(), onBlockDispense()); + addItemHandler(onPlace(), onBlockBreak(), onBlockDispense()); } @Nonnull @@ -74,6 +77,32 @@ public class BlockPlacer extends SlimefunItem { }; } + @Nonnull + private BlockBreakHandler onBlockBreak() { + /* + * Explosions don't need explicit handling here. + * The default of "destroy the dispenser and drop the contents" is + * fine for our purposes already. + */ + return new BlockBreakHandler(false, true) { + + @Override + public void onPlayerBreak(BlockBreakEvent e, ItemStack item, List drops) { + // Fixes #2852 - Manually drop inventory contents + Block b = e.getBlock(); + BlockState state = PaperLib.getBlockState(b, false).getState(); + + if (state instanceof Dispenser) { + for (ItemStack stack : ((Dispenser) state).getInventory()) { + if (stack != null && !stack.getType().isAir()) { + drops.add(stack); + } + } + } + } + }; + } + @Nonnull private BlockDispenseHandler onBlockDispense() { return (e, dispenser, facedBlock, machine) -> {