From 87f6fa7bc94c3647a6e1651369f2a4787fbd9dab Mon Sep 17 00:00:00 2001 From: ase34 Date: Sun, 1 Dec 2013 12:40:34 +0100 Subject: [PATCH] Fix cancelling PlayerDropItemEvent. Fixes BUKKIT-3313 Up until this commit the PlayerDropItemEvent, if cancelled, would return items to the first available slot in the inventory - which is clearly undesirable as a player and plugin author to deal with. This commit changes that by ensuring that the item is returned to where it came from in the player's inventory. This still supports modifying the drop from the player and will default to "first available slot" if the item has changed since the event was fired. Other remaining behaviour of the event is still in tact and has not been modified. --- .../java/net/minecraft/server/EntityHuman.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java index 03485fea91..331dbac199 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -514,6 +514,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } public EntityItem a(boolean flag) { + // Called only when dropped by Q or CTRL-Q return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, flag && this.inventory.getItemInHand() != null ? this.inventory.getItemInHand().count : 1), false, true); } @@ -565,7 +566,18 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen this.world.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { - player.getInventory().addItem(drop.getItemStack()); + org.bukkit.inventory.ItemStack cur = player.getInventory().getItemInHand(); + if (flag1 && (cur == null || cur.getAmount() == 0)) { + // The complete stack was dropped + player.getInventory().setItemInHand(drop.getItemStack()); + } else if (flag1 && cur.isSimilar(drop.getItemStack()) && drop.getItemStack().getAmount() == 1) { + // Only one item is dropped + cur.setAmount(cur.getAmount() + 1); + player.getInventory().setItemInHand(cur); + } else { + // Fallback + player.getInventory().addItem(drop.getItemStack()); + } return null; } // CraftBukkit end