diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java index 0567775e2..eaf47a559 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListener.java @@ -1,8 +1,10 @@ package world.bentobox.bentobox.listeners.flags.worldsettings; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.Sound; @@ -30,7 +32,7 @@ public class ObsidianScoopingListener extends FlagListener { * @param e event * @return false if obsidian not scooped, true if scooped */ - @EventHandler(priority = EventPriority.NORMAL) + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public boolean onPlayerInteract(final PlayerInteractEvent e) { if (!getIWM().inWorld(e.getPlayer().getLocation()) || !Flags.OBSIDIAN_SCOOPING.isSetForWorld(e.getPlayer().getWorld()) @@ -50,14 +52,16 @@ public class ObsidianScoopingListener extends FlagListener { } user.sendMessage("protection.flags.OBSIDIAN_SCOOPING.scooping"); - e.setCancelled(true); if (e.getItem().getAmount() == 1) { // Needs some special handling when there is only 1 bucket in the stack - e.getItem().setType(Material.LAVA_BUCKET); + Bukkit.getScheduler().runTask(getPlugin(), () -> e.getItem().setType(Material.LAVA_BUCKET)); } else { // Remove one empty bucket and add a lava bucket to the player's inventory e.getItem().setAmount(e.getItem().getAmount() - 1); - e.getPlayer().getInventory().addItem(new ItemStack(Material.LAVA_BUCKET)); + HashMap map = e.getPlayer().getInventory().addItem(new ItemStack(Material.LAVA_BUCKET)); + if (!map.isEmpty()) { + map.values().forEach(i -> e.getPlayer().getWorld().dropItem(e.getPlayer().getLocation(), i)); + } } e.getPlayer().getWorld().playSound(e.getPlayer().getLocation(), Sound.ITEM_BUCKET_FILL_LAVA, 1F, 1F); diff --git a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java index 4521e483d..7abe47bb2 100644 --- a/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java +++ b/src/test/java/world/bentobox/bentobox/listeners/flags/worldsettings/ObsidianScoopingListenerTest.java @@ -1,6 +1,5 @@ package world.bentobox.bentobox.listeners.flags.worldsettings; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -21,7 +20,6 @@ import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; -import org.bukkit.event.Event.Result; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -83,7 +81,7 @@ public class ObsidianScoopingListenerTest { when(server.getWorld("world")).thenReturn(world); when(server.getVersion()).thenReturn("BSB_Mocking"); - PowerMockito.mockStatic(Bukkit.class); + PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); PluginManager pluginManager = mock(PluginManager.class); when(Bukkit.getPluginManager()).thenReturn(pluginManager); @@ -280,7 +278,6 @@ public class ObsidianScoopingListenerTest { // Test where the area is free of obby when(world.getBlockAt(Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(airBlock); assertTrue(listener.onPlayerInteract(event)); - assertEquals(Result.DENY, event.useInteractedBlock()); } } }