summaryrefslogtreecommitdiffstats
path: root/src/main/java/org
diff options
context:
space:
mode:
authorErik Broes <erikbroes@grum.nl>2011-01-09 18:27:46 +0100
committerErik Broes <erikbroes@grum.nl>2011-01-09 18:28:46 +0100
commite8a565e6cfd2bc326a1207e17165916f7a830497 (patch)
tree561bfaf2b3e83ed0c43b632816de64cf5f5415fb /src/main/java/org
parentb72dad0a61d11c01c498a7e58b3e4a7389533488 (diff)
downloadcraftbukkit-e8a565e6cfd2bc326a1207e17165916f7a830497.tar
craftbukkit-e8a565e6cfd2bc326a1207e17165916f7a830497.tar.gz
craftbukkit-e8a565e6cfd2bc326a1207e17165916f7a830497.tar.lz
craftbukkit-e8a565e6cfd2bc326a1207e17165916f7a830497.tar.xz
craftbukkit-e8a565e6cfd2bc326a1207e17165916f7a830497.zip
Added getContents() to IInventory and implemented it.
Implemented Inventory and PlayerInventory and updated StorageMinecart and Slot. Added getMaxStackSize to CraftItemStack.
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftHumanEntity.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftInventory.java195
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftInventoryPlayer.java67
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftItemStack.java6
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftSlot.java25
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftStorageMinecart.java33
6 files changed, 309 insertions, 35 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/CraftHumanEntity.java
index b03f0967..91437f4f 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftHumanEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftHumanEntity.java
@@ -2,22 +2,18 @@
package org.bukkit.craftbukkit;
import net.minecraft.server.EntityPlayer;
-import net.minecraft.server.InventoryPlayer;
import org.bukkit.HumanEntity;
import org.bukkit.ItemStack;
+import org.bukkit.PlayerInventory;
public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
private EntityPlayer entity;
+ private CraftInventoryPlayer inventory;
public CraftHumanEntity(final CraftServer server, final EntityPlayer entity) {
super(server, entity);
this.entity = entity;
- }
-
- public ItemStack getSelectedItem() {
- // TODO: Implement inventories
- final InventoryPlayer inventory = entity.an;
- return new ItemStack(inventory.e().c, inventory.e().a);
+ this.inventory = new CraftInventoryPlayer( entity.an );
}
public String getName() {
@@ -34,6 +30,14 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
this.entity = entity;
}
+ public PlayerInventory getInventory() {
+ return inventory;
+ }
+
+ public ItemStack getItemInHand() {
+ return getInventory().getItemInHand();
+ }
+
@Override
public String toString() {
return "CraftHumanEntity{" + "id=" + getEntityID() + "name=" + getName() + '}';
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/CraftInventory.java
new file mode 100644
index 00000000..c74ecea3
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/CraftInventory.java
@@ -0,0 +1,195 @@
+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().a();
+ }
+
+ public String getName() {
+ return getInventory().b();
+ }
+
+ public ItemStack getItem(int index) {
+ return new CraftItemStack(getInventory().a(index));
+ }
+
+ public ItemStack[] getContents() {
+ ItemStack[] items = new ItemStack[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()));
+ }
+
+ 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<Integer, ItemStack> all(int materialId) {
+ HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
+
+ 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<Integer, ItemStack> all(Material material) {
+ return all(material.getID());
+ }
+
+ public HashMap<Integer, ItemStack> all(ItemStack item) {
+ HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
+
+ 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++) {
+ if (inventory[i].getAmount() <= inventory[i].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<Integer,ItemStack> addItem(ItemStack... items) {
+ HashMap<Integer,ItemStack> leftover = new HashMap<Integer,ItemStack>();
+
+ /* 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);
+ } else {
+ // Just store it
+ setItem( firstFree, item );
+ }
+ break;
+ }
+
+ // 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;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftInventoryPlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftInventoryPlayer.java
new file mode 100644
index 00000000..3ee882fc
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/CraftInventoryPlayer.java
@@ -0,0 +1,67 @@
+package org.bukkit.craftbukkit;
+
+import java.util.ArrayList;
+
+import net.minecraft.server.InventoryPlayer;
+
+import org.bukkit.ItemStack;
+import org.bukkit.PlayerInventory;
+
+public class CraftInventoryPlayer extends CraftInventory implements PlayerInventory {
+ public CraftInventoryPlayer(net.minecraft.server.InventoryPlayer inventory) {
+ super(inventory);
+ }
+
+ public InventoryPlayer getInventory() {
+ return (InventoryPlayer) inventory;
+ }
+
+ public ArrayList<ItemStack> getArmorContents() {
+ ArrayList<ItemStack> items = new ArrayList<ItemStack>();
+ for (net.minecraft.server.ItemStack item : getInventory().getArmorContents()) {
+ ItemStack i = null;
+ if (item != null) {
+ i = new CraftItemStack(item);
+ }
+ items.add(i);
+ }
+
+ return items;
+ }
+
+ public ItemStack getItemInHand() {
+ return new CraftItemStack( getInventory().e() );
+ }
+
+ public ItemStack getHelmet() {
+ return getItem( getSize() - 4 );
+ }
+
+ public ItemStack getChestplate() {
+ return getItem( getSize() - 3 );
+ }
+
+ public ItemStack getLeggings() {
+ return getItem( getSize() - 2 );
+ }
+
+ public ItemStack getBoots() {
+ return getItem( getSize() - 1 );
+ }
+
+ public void setHelmet(ItemStack helmet) {
+ setItem( getSize() - 4, helmet );
+ }
+
+ public void setChestplate(ItemStack chestplate) {
+ setItem( getSize() - 3, chestplate );
+ }
+
+ public void setLeggings(ItemStack leggings) {
+ setItem( getSize() - 2, leggings );
+ }
+
+ public void setBoots(ItemStack boots) {
+ setItem( getSize() - 1, boots );
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/CraftItemStack.java
index 3527721b..d1571ac4 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftItemStack.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftItemStack.java
@@ -12,7 +12,7 @@ public class CraftItemStack extends ItemStack {
}
/*
- * Unsure if we have to syn before each of these calls the values in 'item'
+ * Unsure if we have to sync before each of these calls the values in 'item'
* are all public.
*/
@@ -82,4 +82,8 @@ public class CraftItemStack extends ItemStack {
}
}
+ @Override
+ public int getMaxStackSize() {
+ return item.a().b();
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftSlot.java b/src/main/java/org/bukkit/craftbukkit/CraftSlot.java
new file mode 100644
index 00000000..32b12b7a
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/CraftSlot.java
@@ -0,0 +1,25 @@
+package org.bukkit.craftbukkit;
+
+import org.bukkit.Inventory;
+import org.bukkit.ItemStack;
+import net.minecraft.server.Slot;
+
+public class CraftSlot implements org.bukkit.Slot {
+ private final Slot slot;
+
+ public CraftSlot(Slot slot) {
+ this.slot = slot;
+ }
+
+ public Inventory getInventory() {
+ return new CraftInventory( slot.b );
+ }
+
+ public int getIndex() {
+ return slot.a;
+ }
+
+ public ItemStack getItem() {
+ return new CraftItemStack( slot.c() );
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftStorageMinecart.java b/src/main/java/org/bukkit/craftbukkit/CraftStorageMinecart.java
index 7567529e..3063482d 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftStorageMinecart.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftStorageMinecart.java
@@ -1,11 +1,8 @@
package org.bukkit.craftbukkit;
-import java.util.ArrayList;
-import java.util.List;
-
import net.minecraft.server.EntityMinecart;
-import org.bukkit.ItemStack;
+import org.bukkit.Inventory;
import org.bukkit.StorageMinecart;
/**
@@ -14,32 +11,14 @@ import org.bukkit.StorageMinecart;
* @author sk89q
*/
public class CraftStorageMinecart extends CraftMinecart implements StorageMinecart {
+ private CraftInventory inventory;
+
public CraftStorageMinecart(CraftServer server, EntityMinecart entity) {
super(server, entity);
+ inventory = new CraftInventory( entity );
}
- public int getSize() {
- return minecart.c();
- }
-
- public String getName() {
- return minecart.b();
- }
-
- public ItemStack getItem(int index) {
- return new CraftItemStack(minecart.a(index));
- }
-
- public List<ItemStack> getContents() {
- ArrayList<ItemStack> items = new ArrayList<ItemStack>();
- for (net.minecraft.server.ItemStack item: minecart.getContents()) {
- ItemStack i = null;
- if (item != null) {
- i = new CraftItemStack( item );
- }
- items.add(i);
- }
-
- return items;
+ public Inventory getInventory() {
+ return inventory;
}
}