--- a/net/minecraft/world/entity/player/PlayerInventory.java +++ b/net/minecraft/world/entity/player/PlayerInventory.java @@ -25,6 +25,14 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +// 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, INamableTileEntity { public static final int POP_TIME_DURATION = 5; @@ -39,6 +47,65 @@ private final EntityEquipment equipment; private int timesChanged; + // CraftBukkit start - add fields and methods + public List transaction = new java.util.ArrayList<>(); + private int maxStack = MAX_STACK; + + @Override + public List getContents() { + List combined = new ArrayList<>(getContainerSize()); + for (net.minecraft.world.item.ItemStack sub : this) { + combined.add(sub); + } + + return combined; + } + + public List getArmorContents() { + List combined = new ArrayList<>(SLOT_OFFHAND - INVENTORY_SIZE); + for (int i = INVENTORY_SIZE; i < SLOT_OFFHAND; i++) { + combined.add(getItem(i)); + } + + return combined; + } + + @Override + public void onOpen(CraftHumanEntity who) { + transaction.add(who); + } + + @Override + public void onClose(CraftHumanEntity who) { + transaction.remove(who); + } + + @Override + public List getViewers() { + return transaction; + } + + @Override + public org.bukkit.inventory.InventoryHolder getOwner() { + return this.player.getBukkitEntity(); + } + + @Override + public int getMaxStackSize() { + return maxStack; + } + + @Override + public void setMaxStackSize(int size) { + maxStack = size; + } + + @Override + public Location getLocation() { + return player.getBukkitEntity().getLocation(); + } + // CraftBukkit end + public PlayerInventory(EntityHuman entityhuman, EntityEquipment entityequipment) { this.items = NonNullList.withSize(36, ItemStack.EMPTY); this.player = entityhuman; @@ -77,6 +144,28 @@ return !itemstack.isEmpty() && ItemStack.isSameItemSameComponents(itemstack, itemstack1) && itemstack.isStackable() && itemstack.getCount() < this.getMaxStackSize(itemstack); } + // 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(); + + if (this.hasRemainingSpaceForItem(itemstack1, itemstack)) { + remains -= (itemstack1.getMaxStackSize() < this.getMaxStackSize() ? itemstack1.getMaxStackSize() : this.getMaxStackSize()) - itemstack1.getCount(); + } + if (remains <= 0) return itemstack.getCount(); + } + ItemStack offhandItemStack = this.equipment.get(EnumItemSlot.OFFHAND); + if (this.hasRemainingSpaceForItem(offhandItemStack, itemstack)) { + remains -= (offhandItemStack.getMaxStackSize() < this.getMaxStackSize() ? offhandItemStack.getMaxStackSize() : this.getMaxStackSize()) - offhandItemStack.getCount(); + } + if (remains <= 0) return itemstack.getCount(); + + return itemstack.getCount() - remains; + } + // CraftBukkit end + public int getFreeSlot() { for (int i = 0; i < this.items.size(); ++i) { if (((ItemStack) this.items.get(i)).isEmpty()) {