--- a/net/minecraft/server/PlayerInventory.java +++ b/net/minecraft/server/PlayerInventory.java @@ -5,6 +5,15 @@ import java.util.List; import javax.annotation.Nullable; +// CraftBukkit start +import java.util.ArrayList; +import java.util.List; +import org.bukkit.Location; + +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.entity.HumanEntity; +// CraftBukkit end + public class PlayerInventory implements IInventory { public final NonNullList items; @@ -16,6 +25,49 @@ private ItemStack carried; private int h; + // CraftBukkit start - add fields and methods + public List transaction = new java.util.ArrayList(); + private int maxStack = MAX_STACK; + + public List getContents() { + List combined = new ArrayList(items.size() + armor.size() + extraSlots.size()); + for (List sub : this.f) { + combined.addAll(sub); + } + + return combined; + } + + public List getArmorContents() { + return this.armor; + } + + public void onOpen(CraftHumanEntity who) { + transaction.add(who); + } + + public void onClose(CraftHumanEntity who) { + transaction.remove(who); + } + + public List getViewers() { + return transaction; + } + + public org.bukkit.inventory.InventoryHolder getOwner() { + return this.player.getBukkitEntity(); + } + + public void setMaxStackSize(int size) { + maxStack = size; + } + + @Override + public Location getLocation() { + return player.getBukkitEntity().getLocation(); + } + // CraftBukkit end + public PlayerInventory(EntityHuman entityhuman) { this.items = NonNullList.a(36, ItemStack.a); this.armor = NonNullList.a(4, ItemStack.a); @@ -41,6 +93,23 @@ return itemstack.getItem() == itemstack1.getItem() && (!itemstack.usesData() || itemstack.getData() == itemstack1.getData()) && ItemStack.equals(itemstack, itemstack1); } + // CraftBukkit start - Watch method above! :D + public int canHold(ItemStack itemstack) { + int remains = itemstack.getCount(); + for (int i = 0; i < this.items.size(); ++i) { + ItemStack itemstack1 = this.getItem(i); + if (itemstack1.isEmpty()) return itemstack.getCount(); + + // Taken from firstPartial(ItemStack) + if (!itemstack1.isEmpty() && itemstack1.getItem() == itemstack.getItem() && itemstack1.isStackable() && itemstack1.getCount() < itemstack1.getMaxStackSize() && itemstack1.getCount() < this.getMaxStackSize() && (!itemstack1.usesData() || itemstack1.getData() == itemstack.getData()) && ItemStack.equals(itemstack1, itemstack)) { + remains -= (itemstack1.getMaxStackSize() < this.getMaxStackSize() ? itemstack1.getMaxStackSize() : this.getMaxStackSize()) - itemstack1.getCount(); + } + if (remains <= 0) return itemstack.getCount(); + } + return itemstack.getCount() - remains; + } + // CraftBukkit end + public int getFirstEmptySlotIndex() { for (int i = 0; i < this.items.size(); ++i) { if (((ItemStack) this.items.get(i)).isEmpty()) { @@ -512,7 +581,7 @@ } public int getMaxStackSize() { - return 64; + return maxStack; // CraftBukkit } public boolean b(IBlockData iblockdata) { @@ -568,6 +637,11 @@ } public ItemStack getCarried() { + // CraftBukkit start + if (this.carried.isEmpty()) { + this.setCarried(ItemStack.a); + } + // CraftBukkit end return this.carried; }