From f0402d9d6c683a95f40ebb4e7634e3d814bbdf21 Mon Sep 17 00:00:00 2001 From: Erik Broes Date: Sun, 26 Jun 2011 10:53:45 +0200 Subject: [PATCH] Fixed cancelling the PlayerPickup event, getAmount(), item duping issue. --- .../java/net/minecraft/server/EntityItem.java | 14 +++++++++----- .../net/minecraft/server/InventoryPlayer.java | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java index 529dd3270b..f956cd4ce7 100644 --- a/src/main/java/net/minecraft/server/EntityItem.java +++ b/src/main/java/net/minecraft/server/EntityItem.java @@ -127,16 +127,20 @@ public class EntityItem extends Entity { int i = this.itemStack.count; // CraftBukkit start - if (this.pickupDelay <= 0 && entityhuman.inventory.canHold(this.itemStack)) { // <-- == to <= - Player player = (Player) entityhuman.getBukkitEntity(); - PlayerPickupItemEvent event = new PlayerPickupItemEvent(player, (org.bukkit.entity.Item) this.getBukkitEntity()); - world.getServer().getPluginManager().callEvent(event); + if (this.pickupDelay <= 0 && entityhuman.inventory.canPickup(this.itemStack) > 0) { + PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity()); + this.world.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return; } - // CraftBukkit end + // Possibly < 0; fix here so we do not have to modify code below + this.pickupDelay = 0; + } + // CraftBukkit end + + if (this.pickupDelay == 0 && entityhuman.inventory.canHold(this.itemStack)) { if (this.itemStack.id == Block.LOG.id) { entityhuman.a((Statistic) AchievementList.g); } diff --git a/src/main/java/net/minecraft/server/InventoryPlayer.java b/src/main/java/net/minecraft/server/InventoryPlayer.java index eb30c3aa91..d6199001ad 100644 --- a/src/main/java/net/minecraft/server/InventoryPlayer.java +++ b/src/main/java/net/minecraft/server/InventoryPlayer.java @@ -51,6 +51,22 @@ public class InventoryPlayer implements IInventory { return -1; } + // CraftBukkit start - watch method above! :D + public int canPickup(ItemStack itemstack) { + int remains = itemstack.count; + for (int i = 0; i < this.items.length; ++i) { + if (this.items[i] == null) return itemstack.count; + + // Taken from d(ItemStack)I + if (this.items[i] != null && this.items[i].id == itemstack.id && this.items[i].c() && this.items[i].count < this.items[i].b() && this.items[i].count < this.getMaxStackSize() && (!this.items[i].e() || this.items[i].getData() == itemstack.getData())) { + remains -= (this.items[i].b() < this.getMaxStackSize() ? this.items[i].b() : this.getMaxStackSize()) - this.items[i].count; + } + if (remains <= 0) return itemstack.count; + } + return itemstack.count - remains; + } + // CraftBukkit end + private int k() { for (int i = 0; i < this.items.length; ++i) { if (this.items[i] == null) {