From 202e44ab1a0b8365d4580183eef8fa0c336f5db1 Mon Sep 17 00:00:00 2001 From: Dinnerbone Date: Fri, 14 Jan 2011 19:44:11 +0000 Subject: [PATCH] Fixed blocks not keeping data on placement --- .../java/net/minecraft/server/ItemBlock.java | 4 +- src/main/java/net/minecraft/server/Slot.java | 100 ++--- .../net/minecraft/server/TileEntityChest.java | 200 ++++----- .../minecraft/server/TileEntityFurnace.java | 416 +++++++++--------- .../bukkit/craftbukkit/CraftInventory.java | 416 +++++++++--------- 5 files changed, 568 insertions(+), 568 deletions(-) diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java index 269ba3196e..042164f048 100644 --- a/src/main/java/net/minecraft/server/ItemBlock.java +++ b/src/main/java/net/minecraft/server/ItemBlock.java @@ -87,8 +87,8 @@ public class ItemBlock extends Item { if (this.a == 79) { world.a(i, j, k, 20); } - world.a(i, j, k, oldMaterial); - world.c(i, j, k, oldData); + world.b(i, j, k, oldMaterial); + world.d(i, j, k, oldData); } else { world.g(i, j, k); world.h(i, j, k, this.a); diff --git a/src/main/java/net/minecraft/server/Slot.java b/src/main/java/net/minecraft/server/Slot.java index 6827e9fd99..738402e6aa 100644 --- a/src/main/java/net/minecraft/server/Slot.java +++ b/src/main/java/net/minecraft/server/Slot.java @@ -1,50 +1,50 @@ -package net.minecraft.server; - -public class Slot { - - public final int a; // CraftBukkit: private -> public - public final IInventory b; // CraftBukkit: private -> public - public int c; - public int d; - public int e; - - public Slot(IInventory iinventory, int i, int j, int k) { - b = iinventory; - a = i; - d = j; - e = k; - } - - public void b() { - d(); - } - - public boolean a(ItemStack itemstack) { - return true; - } - - public ItemStack c() { - return b.a(a); - } - - public void b(ItemStack itemstack) { - b.a(a, itemstack); - d(); - } - - public void d() { - b.d(); - } - - public int a() { - return b.c(); - } - - public ItemStack a(int i) { - return b.b(a, i); - } - - public boolean a(IInventory iinventory, int i) { - return iinventory == b && i == a; - } -} +package net.minecraft.server; + +public class Slot { + + public final int a; // CraftBukkit: private -> public + public final IInventory b; // CraftBukkit: private -> public + public int c; + public int d; + public int e; + + public Slot(IInventory iinventory, int i, int j, int k) { + b = iinventory; + a = i; + d = j; + e = k; + } + + public void b() { + d(); + } + + public boolean a(ItemStack itemstack) { + return true; + } + + public ItemStack c() { + return b.a(a); + } + + public void b(ItemStack itemstack) { + b.a(a, itemstack); + d(); + } + + public void d() { + b.d(); + } + + public int a() { + return b.c(); + } + + public ItemStack a(int i) { + return b.b(a, i); + } + + public boolean a(IInventory iinventory, int i) { + return iinventory == b && i == a; + } +} diff --git a/src/main/java/net/minecraft/server/TileEntityChest.java b/src/main/java/net/minecraft/server/TileEntityChest.java index 6e057db903..098631e5ca 100644 --- a/src/main/java/net/minecraft/server/TileEntityChest.java +++ b/src/main/java/net/minecraft/server/TileEntityChest.java @@ -1,100 +1,100 @@ -package net.minecraft.server; - -public class TileEntityChest extends TileEntity implements IInventory { - - private ItemStack e[]; - - // CraftBukkit start - public ItemStack[] getContents() { - return e; - } - // CraftBukkit end - - public TileEntityChest() { - e = new ItemStack[36]; - } - - public int h_() { - return 27; - } - - public ItemStack a(int i) { - return e[i]; - } - - public ItemStack b(int i, int j) { - if (e[i] != null) { - if (e[i].a <= j) { - ItemStack itemstack = e[i]; - - e[i] = null; - d(); - return itemstack; - } - ItemStack itemstack1 = e[i].a(j); - - if (e[i].a == 0) { - e[i] = null; - } - d(); - return itemstack1; - } else { - return null; - } - } - - public void a(int i, ItemStack itemstack) { - e[i] = itemstack; - if (itemstack != null && itemstack.a > c()) { - itemstack.a = c(); - } - d(); - } - - public String b() { - return "Chest"; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.k("Items"); - - e = new ItemStack[h_()]; - for (int i = 0; i < nbttaglist.b(); i++) { - NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.a(i); - int j = nbttagcompound1.b("Slot") & 0xff; - - if (j >= 0 && j < e.length) { - e[j] = new ItemStack(nbttagcompound1); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < e.length; i++) { - if (e[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.a("Slot", (byte) i); - e[i].a(nbttagcompound1); - nbttaglist.a(((NBTBase) (nbttagcompound1))); - } - } - - nbttagcompound.a("Items", ((NBTBase) (nbttaglist))); - } - - public int c() { - return 64; - } - - public boolean a_(EntityPlayer entityplayer) { - if (a.m(b, c, d) != this) { - return false; - } - return entityplayer.d((double) b + 0.5D, (double) c + 0.5D, (double) d + 0.5D) <= 64D; - } -} +package net.minecraft.server; + +public class TileEntityChest extends TileEntity implements IInventory { + + private ItemStack e[]; + + // CraftBukkit start + public ItemStack[] getContents() { + return e; + } + // CraftBukkit end + + public TileEntityChest() { + e = new ItemStack[36]; + } + + public int h_() { + return 27; + } + + public ItemStack a(int i) { + return e[i]; + } + + public ItemStack b(int i, int j) { + if (e[i] != null) { + if (e[i].a <= j) { + ItemStack itemstack = e[i]; + + e[i] = null; + d(); + return itemstack; + } + ItemStack itemstack1 = e[i].a(j); + + if (e[i].a == 0) { + e[i] = null; + } + d(); + return itemstack1; + } else { + return null; + } + } + + public void a(int i, ItemStack itemstack) { + e[i] = itemstack; + if (itemstack != null && itemstack.a > c()) { + itemstack.a = c(); + } + d(); + } + + public String b() { + return "Chest"; + } + + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); + NBTTagList nbttaglist = nbttagcompound.k("Items"); + + e = new ItemStack[h_()]; + for (int i = 0; i < nbttaglist.b(); i++) { + NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.a(i); + int j = nbttagcompound1.b("Slot") & 0xff; + + if (j >= 0 && j < e.length) { + e[j] = new ItemStack(nbttagcompound1); + } + } + } + + public void b(NBTTagCompound nbttagcompound) { + super.b(nbttagcompound); + NBTTagList nbttaglist = new NBTTagList(); + + for (int i = 0; i < e.length; i++) { + if (e[i] != null) { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + + nbttagcompound1.a("Slot", (byte) i); + e[i].a(nbttagcompound1); + nbttaglist.a(((NBTBase) (nbttagcompound1))); + } + } + + nbttagcompound.a("Items", ((NBTBase) (nbttaglist))); + } + + public int c() { + return 64; + } + + public boolean a_(EntityPlayer entityplayer) { + if (a.m(b, c, d) != this) { + return false; + } + return entityplayer.d((double) b + 0.5D, (double) c + 0.5D, (double) d + 0.5D) <= 64D; + } +} diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java index e71227659e..62e51c13fe 100644 --- a/src/main/java/net/minecraft/server/TileEntityFurnace.java +++ b/src/main/java/net/minecraft/server/TileEntityFurnace.java @@ -1,209 +1,209 @@ -package net.minecraft.server; - -public class TileEntityFurnace extends TileEntity implements IInventory { - - private ItemStack h[]; - public int e; - public int f; - public int g; - - // CraftBukkit start - public ItemStack[] getContents() { - return h; - } - // CraftBukkit end - - public TileEntityFurnace() { - h = new ItemStack[3]; - e = 0; - f = 0; - g = 0; - } - - public int h_() { - return h.length; - } - - public ItemStack a(int j) { - return h[j]; - } - - public ItemStack b(int j, int k) { - if (h[j] != null) { - if (h[j].a <= k) { - ItemStack itemstack = h[j]; - - h[j] = null; - return itemstack; - } - ItemStack itemstack1 = h[j].a(k); - - if (h[j].a == 0) { - h[j] = null; - } - return itemstack1; - } else { - return null; - } - } - - public void a(int j, ItemStack itemstack) { - h[j] = itemstack; - if (itemstack != null && itemstack.a > c()) { - itemstack.a = c(); - } - } - - public String b() { - return "Furnace"; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.k("Items"); - - h = new ItemStack[h_()]; - for (int j = 0; j < nbttaglist.b(); j++) { - NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.a(j); - byte byte0 = nbttagcompound1.b("Slot"); - - if (byte0 >= 0 && byte0 < h.length) { - h[byte0] = new ItemStack(nbttagcompound1); - } - } - - e = ((int) (nbttagcompound.c("BurnTime"))); - g = ((int) (nbttagcompound.c("CookTime"))); - f = a(h[1]); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.a("BurnTime", (short) e); - nbttagcompound.a("CookTime", (short) g); - NBTTagList nbttaglist = new NBTTagList(); - - for (int j = 0; j < h.length; j++) { - if (h[j] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.a("Slot", (byte) j); - h[j].a(nbttagcompound1); - nbttaglist.a(((NBTBase) (nbttagcompound1))); - } - } - - nbttagcompound.a("Items", ((NBTBase) (nbttaglist))); - } - - public int c() { - return 64; - } - - public boolean e() { - return e > 0; - } - - public void f() { - boolean flag = e > 0; - boolean flag1 = false; - - if (e > 0) { - e--; - } - if (!a.z) { - if (e == 0 && i()) { - f = e = a(h[1]); - if (e > 0) { - flag1 = true; - if (h[1] != null) { - h[1].a--; - if (h[1].a == 0) { - h[1] = null; - } - } - } - } - if (e() && i()) { - g++; - if (g == 200) { - g = 0; - h(); - flag1 = true; - } - } else { - g = 0; - } - if (flag != (e > 0)) { - flag1 = true; - BlockFurnace.a(e > 0, a, b, c, d); - } - } - if (flag1) { - d(); - } - } - - private boolean i() { - if (h[0] == null) { - return false; - } - ItemStack itemstack = FurnaceRecipes.a().a(h[0].a().ba); - - if (itemstack == null) { - return false; - } - if (h[2] == null) { - return true; - } - if (!h[2].a(itemstack)) { - return false; - } - if (h[2].a < c() && h[2].a < h[2].b()) { - return true; - } - return h[2].a < itemstack.b(); - } - - public void h() { - if (!i()) { - return; - } - ItemStack itemstack = FurnaceRecipes.a().a(h[0].a().ba); - - if (h[2] == null) { - h[2] = itemstack.j(); - } else if (h[2].c == itemstack.c) { - h[2].a++; - } - h[0].a--; - if (h[0].a <= 0) { - h[0] = null; - } - } - - private int a(ItemStack itemstack) { - if (itemstack == null) { - return 0; - } - int j = itemstack.a().ba; - - if (j < 256 && Block.m[j].bt == Material.c) { - return 300; - } - if (j == Item.B.ba) { - return 100; - } - if (j == Item.k.ba) { - return 1600; - } - return j != Item.aw.ba ? 0 : 20000; - } - - public boolean a_(EntityPlayer entityplayer) { - if (a.m(b, c, d) != this) { - return false; - } - return entityplayer.d((double) b + 0.5D, (double) c + 0.5D, (double) d + 0.5D) <= 64D; - } +package net.minecraft.server; + +public class TileEntityFurnace extends TileEntity implements IInventory { + + private ItemStack h[]; + public int e; + public int f; + public int g; + + // CraftBukkit start + public ItemStack[] getContents() { + return h; + } + // CraftBukkit end + + public TileEntityFurnace() { + h = new ItemStack[3]; + e = 0; + f = 0; + g = 0; + } + + public int h_() { + return h.length; + } + + public ItemStack a(int j) { + return h[j]; + } + + public ItemStack b(int j, int k) { + if (h[j] != null) { + if (h[j].a <= k) { + ItemStack itemstack = h[j]; + + h[j] = null; + return itemstack; + } + ItemStack itemstack1 = h[j].a(k); + + if (h[j].a == 0) { + h[j] = null; + } + return itemstack1; + } else { + return null; + } + } + + public void a(int j, ItemStack itemstack) { + h[j] = itemstack; + if (itemstack != null && itemstack.a > c()) { + itemstack.a = c(); + } + } + + public String b() { + return "Furnace"; + } + + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); + NBTTagList nbttaglist = nbttagcompound.k("Items"); + + h = new ItemStack[h_()]; + for (int j = 0; j < nbttaglist.b(); j++) { + NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.a(j); + byte byte0 = nbttagcompound1.b("Slot"); + + if (byte0 >= 0 && byte0 < h.length) { + h[byte0] = new ItemStack(nbttagcompound1); + } + } + + e = ((int) (nbttagcompound.c("BurnTime"))); + g = ((int) (nbttagcompound.c("CookTime"))); + f = a(h[1]); + } + + public void b(NBTTagCompound nbttagcompound) { + super.b(nbttagcompound); + nbttagcompound.a("BurnTime", (short) e); + nbttagcompound.a("CookTime", (short) g); + NBTTagList nbttaglist = new NBTTagList(); + + for (int j = 0; j < h.length; j++) { + if (h[j] != null) { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + + nbttagcompound1.a("Slot", (byte) j); + h[j].a(nbttagcompound1); + nbttaglist.a(((NBTBase) (nbttagcompound1))); + } + } + + nbttagcompound.a("Items", ((NBTBase) (nbttaglist))); + } + + public int c() { + return 64; + } + + public boolean e() { + return e > 0; + } + + public void f() { + boolean flag = e > 0; + boolean flag1 = false; + + if (e > 0) { + e--; + } + if (!a.z) { + if (e == 0 && i()) { + f = e = a(h[1]); + if (e > 0) { + flag1 = true; + if (h[1] != null) { + h[1].a--; + if (h[1].a == 0) { + h[1] = null; + } + } + } + } + if (e() && i()) { + g++; + if (g == 200) { + g = 0; + h(); + flag1 = true; + } + } else { + g = 0; + } + if (flag != (e > 0)) { + flag1 = true; + BlockFurnace.a(e > 0, a, b, c, d); + } + } + if (flag1) { + d(); + } + } + + private boolean i() { + if (h[0] == null) { + return false; + } + ItemStack itemstack = FurnaceRecipes.a().a(h[0].a().ba); + + if (itemstack == null) { + return false; + } + if (h[2] == null) { + return true; + } + if (!h[2].a(itemstack)) { + return false; + } + if (h[2].a < c() && h[2].a < h[2].b()) { + return true; + } + return h[2].a < itemstack.b(); + } + + public void h() { + if (!i()) { + return; + } + ItemStack itemstack = FurnaceRecipes.a().a(h[0].a().ba); + + if (h[2] == null) { + h[2] = itemstack.j(); + } else if (h[2].c == itemstack.c) { + h[2].a++; + } + h[0].a--; + if (h[0].a <= 0) { + h[0] = null; + } + } + + private int a(ItemStack itemstack) { + if (itemstack == null) { + return 0; + } + int j = itemstack.a().ba; + + if (j < 256 && Block.m[j].bt == Material.c) { + return 300; + } + if (j == Item.B.ba) { + return 100; + } + if (j == Item.k.ba) { + return 1600; + } + return j != Item.aw.ba ? 0 : 20000; + } + + public boolean a_(EntityPlayer entityplayer) { + if (a.m(b, c, d) != this) { + return false; + } + return entityplayer.d((double) b + 0.5D, (double) c + 0.5D, (double) d + 0.5D) <= 64D; + } } \ No newline at end of file diff --git a/src/main/java/org/bukkit/craftbukkit/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/CraftInventory.java index b0461d8059..7f70f770ca 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftInventory.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftInventory.java @@ -1,208 +1,208 @@ -package org.bukkit.craftbukkit; - -import java.util.HashMap; - -import net.minecraft.server.IInventory; - -import org.bukkit.ItemStack; -import org.bukkit.Material; - -public class CraftInventory implements org.bukkit.Inventory { - protected IInventory inventory; - - public CraftInventory(IInventory inventory) { - this.inventory = inventory; - } - - public IInventory getInventory() { - return inventory; - } - - public int getSize() { - return getInventory().h_(); - } - - public String getName() { - return getInventory().b(); - } - - public CraftItemStack getItem(int index) { - return new CraftItemStack(getInventory().a(index)); - } - - public CraftItemStack[] getContents() { - CraftItemStack[] items = new CraftItemStack[getSize()]; - net.minecraft.server.ItemStack[] mcItems = getInventory().getContents(); - - for (int i = 0; i < mcItems.length; i++ ) { - items[i] = new CraftItemStack(mcItems[i]); - } - - return items; - } - - public void setItem(int index, ItemStack item) { - getInventory().a( index, new net.minecraft.server.ItemStack( item.getTypeID(), item.getAmount(), 0)); - } - - public boolean contains(int materialId) { - for (ItemStack item: getContents()) { - if (item.getTypeID() == materialId) { - return true; - } - } - return false; - } - - public boolean contains(Material material) { - return contains(material.getID()); - } - - public boolean contains(ItemStack item) { - for (ItemStack i: getContents()) { - if (item.equals(i)) { - return true; - } - } - return false; - } - - public HashMap all(int materialId) { - HashMap slots = new HashMap(); - - ItemStack[] inventory = getContents(); - for (int i = 0; i < inventory.length; i++) { - ItemStack item = inventory[i]; - if (item.getTypeID() == materialId) { - slots.put( i, item ); - } - } - return slots; - } - - public HashMap all(Material material) { - return all(material.getID()); - } - - public HashMap all(ItemStack item) { - HashMap slots = new HashMap(); - - ItemStack[] inventory = getContents(); - for (int i = 0; i < inventory.length; i++) { - if (item.equals(inventory[i])) { - slots.put( i, item ); - } - } - return slots; - } - - public int first(int materialId) { - ItemStack[] inventory = getContents(); - for (int i = 0; i < inventory.length; i++) { - if (inventory[i].getTypeID() == materialId) { - return i; - } - } - return -1; - } - - public int first(Material material) { - return first(material.getID()); - } - - public int first(ItemStack item) { - ItemStack[] inventory = getContents(); - for (int i = 0; i < inventory.length; i++) { - if (item.equals(inventory[i])) { - return i; - } - } - return -1; - } - - public int firstEmpty() { - return first(Material.AIR); - } - - public int firstPartial(int materialId) { - ItemStack[] inventory = getContents(); - for (int i = 0; i < inventory.length; i++) { - ItemStack item = inventory[i]; - if (item != null && item.getTypeID() == materialId && item.getAmount() < item.getMaxStackSize()) { - return i; - } - } - return -1; - } - - public int firstPartial(Material material) { - return firstPartial(material.getID()); - } - - public int firstPartial(ItemStack item) { - return firstPartial(item.getTypeID()); - } - - public HashMap addItem(ItemStack... items) { - HashMap leftover = new HashMap(); - - /* TODO: some optimization - * - Create a 'firstPartial' with a 'fromIndex' - * - Record the lastPartial per Material - * - Cache firstEmpty result - */ - - for (int i = 0; i < items.length; i++) { - ItemStack item = items[i]; - while (true) { - // Do we already have a stack of it? - int firstPartial = firstPartial( item.getTypeID() ); - - // Drat! no partial stack - if (firstPartial == -1) { - // Find a free spot! - int firstFree = firstEmpty(); - - if (firstFree == -1) { - // No space at all! - leftover.put(i, item); - break; - } else { - // More than a single stack! - if (item.getAmount() > getMaxItemStack()) { - setItem( firstFree, new ItemStack(item.getTypeID(), getMaxItemStack())); - item.setAmount(item.getAmount() - getMaxItemStack()); - } else { - // Just store it - setItem( firstFree, item ); - break; - } - } - } else { - // So, apparently it might only partially fit, well lets do just that - ItemStack partialItem = getItem(firstPartial); - - int amount = item.getAmount(); - int partialAmount = partialItem.getAmount(); - int maxAmount = partialItem.getMaxStackSize(); - - // Check if it fully fits - if (amount + partialAmount <= maxAmount) { - partialItem.setAmount( amount + partialAmount ); - break; - } - - // It fits partially - partialItem.setAmount( maxAmount ); - item.setAmount( amount + partialAmount - maxAmount ); - } - } - } - return leftover; - } - - private int getMaxItemStack() { - return getInventory().c(); - } - -} +package org.bukkit.craftbukkit; + +import java.util.HashMap; + +import net.minecraft.server.IInventory; + +import org.bukkit.ItemStack; +import org.bukkit.Material; + +public class CraftInventory implements org.bukkit.Inventory { + protected IInventory inventory; + + public CraftInventory(IInventory inventory) { + this.inventory = inventory; + } + + public IInventory getInventory() { + return inventory; + } + + public int getSize() { + return getInventory().h_(); + } + + public String getName() { + return getInventory().b(); + } + + public CraftItemStack getItem(int index) { + return new CraftItemStack(getInventory().a(index)); + } + + public CraftItemStack[] getContents() { + CraftItemStack[] items = new CraftItemStack[getSize()]; + net.minecraft.server.ItemStack[] mcItems = getInventory().getContents(); + + for (int i = 0; i < mcItems.length; i++ ) { + items[i] = new CraftItemStack(mcItems[i]); + } + + return items; + } + + public void setItem(int index, ItemStack item) { + getInventory().a( index, new net.minecraft.server.ItemStack( item.getTypeID(), item.getAmount(), 0)); + } + + public boolean contains(int materialId) { + for (ItemStack item: getContents()) { + if (item.getTypeID() == materialId) { + return true; + } + } + return false; + } + + public boolean contains(Material material) { + return contains(material.getID()); + } + + public boolean contains(ItemStack item) { + for (ItemStack i: getContents()) { + if (item.equals(i)) { + return true; + } + } + return false; + } + + public HashMap all(int materialId) { + HashMap slots = new HashMap(); + + ItemStack[] inventory = getContents(); + for (int i = 0; i < inventory.length; i++) { + ItemStack item = inventory[i]; + if (item.getTypeID() == materialId) { + slots.put( i, item ); + } + } + return slots; + } + + public HashMap all(Material material) { + return all(material.getID()); + } + + public HashMap all(ItemStack item) { + HashMap slots = new HashMap(); + + ItemStack[] inventory = getContents(); + for (int i = 0; i < inventory.length; i++) { + if (item.equals(inventory[i])) { + slots.put( i, item ); + } + } + return slots; + } + + public int first(int materialId) { + ItemStack[] inventory = getContents(); + for (int i = 0; i < inventory.length; i++) { + if (inventory[i].getTypeID() == materialId) { + return i; + } + } + return -1; + } + + public int first(Material material) { + return first(material.getID()); + } + + public int first(ItemStack item) { + ItemStack[] inventory = getContents(); + for (int i = 0; i < inventory.length; i++) { + if (item.equals(inventory[i])) { + return i; + } + } + return -1; + } + + public int firstEmpty() { + return first(Material.AIR); + } + + public int firstPartial(int materialId) { + ItemStack[] inventory = getContents(); + for (int i = 0; i < inventory.length; i++) { + ItemStack item = inventory[i]; + if (item != null && item.getTypeID() == materialId && item.getAmount() < item.getMaxStackSize()) { + return i; + } + } + return -1; + } + + public int firstPartial(Material material) { + return firstPartial(material.getID()); + } + + public int firstPartial(ItemStack item) { + return firstPartial(item.getTypeID()); + } + + public HashMap addItem(ItemStack... items) { + HashMap leftover = new HashMap(); + + /* TODO: some optimization + * - Create a 'firstPartial' with a 'fromIndex' + * - Record the lastPartial per Material + * - Cache firstEmpty result + */ + + for (int i = 0; i < items.length; i++) { + ItemStack item = items[i]; + while (true) { + // Do we already have a stack of it? + int firstPartial = firstPartial( item.getTypeID() ); + + // Drat! no partial stack + if (firstPartial == -1) { + // Find a free spot! + int firstFree = firstEmpty(); + + if (firstFree == -1) { + // No space at all! + leftover.put(i, item); + break; + } else { + // More than a single stack! + if (item.getAmount() > getMaxItemStack()) { + setItem( firstFree, new ItemStack(item.getTypeID(), getMaxItemStack())); + item.setAmount(item.getAmount() - getMaxItemStack()); + } else { + // Just store it + setItem( firstFree, item ); + break; + } + } + } else { + // So, apparently it might only partially fit, well lets do just that + ItemStack partialItem = getItem(firstPartial); + + int amount = item.getAmount(); + int partialAmount = partialItem.getAmount(); + int maxAmount = partialItem.getMaxStackSize(); + + // Check if it fully fits + if (amount + partialAmount <= maxAmount) { + partialItem.setAmount( amount + partialAmount ); + break; + } + + // It fits partially + partialItem.setAmount( maxAmount ); + item.setAmount( amount + partialAmount - maxAmount ); + } + } + } + return leftover; + } + + private int getMaxItemStack() { + return getInventory().c(); + } + +}