From e8a565e6cfd2bc326a1207e17165916f7a830497 Mon Sep 17 00:00:00 2001 From: Erik Broes Date: Sun, 9 Jan 2011 18:27:46 +0100 Subject: [PATCH] Added getContents() to IInventory and implemented it. Implemented Inventory and PlayerInventory and updated StorageMinecart and Slot. Added getMaxStackSize to CraftItemStack. --- .../net/minecraft/server/EntityPlayerMP.java | 291 +++++++++++++++ .../java/net/minecraft/server/IInventory.java | 24 ++ .../server/InventoryCraftResult.java | 54 +++ .../minecraft/server/InventoryCrafting.java | 69 ++++ .../minecraft/server/InventoryLargeChest.java | 71 ++++ .../net/minecraft/server/InventoryPlayer.java | 345 ++++++++++++++++++ src/main/java/net/minecraft/server/Slot.java | 51 +++ .../net/minecraft/server/TileEntityChest.java | 103 ++++++ .../minecraft/server/TileEntityFurnace.java | 240 ++++++++++++ .../bukkit/craftbukkit/CraftHumanEntity.java | 18 +- .../bukkit/craftbukkit/CraftInventory.java | 195 ++++++++++ .../craftbukkit/CraftInventoryPlayer.java | 67 ++++ .../bukkit/craftbukkit/CraftItemStack.java | 6 +- .../org/bukkit/craftbukkit/CraftSlot.java | 25 ++ .../craftbukkit/CraftStorageMinecart.java | 33 +- 15 files changed, 1557 insertions(+), 35 deletions(-) create mode 100644 src/main/java/net/minecraft/server/EntityPlayerMP.java create mode 100644 src/main/java/net/minecraft/server/IInventory.java create mode 100644 src/main/java/net/minecraft/server/InventoryCraftResult.java create mode 100644 src/main/java/net/minecraft/server/InventoryCrafting.java create mode 100644 src/main/java/net/minecraft/server/InventoryLargeChest.java create mode 100644 src/main/java/net/minecraft/server/InventoryPlayer.java create mode 100644 src/main/java/net/minecraft/server/Slot.java create mode 100644 src/main/java/net/minecraft/server/TileEntityChest.java create mode 100644 src/main/java/net/minecraft/server/TileEntityFurnace.java create mode 100644 src/main/java/org/bukkit/craftbukkit/CraftInventory.java create mode 100644 src/main/java/org/bukkit/craftbukkit/CraftInventoryPlayer.java create mode 100644 src/main/java/org/bukkit/craftbukkit/CraftSlot.java diff --git a/src/main/java/net/minecraft/server/EntityPlayerMP.java b/src/main/java/net/minecraft/server/EntityPlayerMP.java new file mode 100644 index 0000000000..751081c23a --- /dev/null +++ b/src/main/java/net/minecraft/server/EntityPlayerMP.java @@ -0,0 +1,291 @@ +package net.minecraft.server; + + +import java.util.*; + + +public class EntityPlayerMP extends EntityPlayer + implements ICrafting { + + public NetServerHandler a; + public MinecraftServer b; + public ItemInWorldManager c; + public double d; + public double e; + public List f; + public Set aj; + public double ak; + public boolean al; + private int bE; + private int bF; + private int bG[] = { + -1, -1, -1, -1, -1 + }; + private int bH; + public boolean am; + + public EntityPlayerMP(MinecraftServer minecraftserver, World world, String s1, ItemInWorldManager iteminworldmanager) { + super(world); + f = new LinkedList(); + aj = new HashSet(); + al = false; + bE = 0xfa0a1f01; + bF = 60; + bH = 0; + int i = world.m; + int j = world.o; + int l = world.n; + + if (!world.q.e) { + i += W.nextInt(20) - 10; + l = world.e(i, j); + j += W.nextInt(20) - 10; + } + c((double) i + 0.5D, l, (double) j + 0.5D, 0.0F, 0.0F); + b = minecraftserver; + S = 0.0F; + iteminworldmanager.a = this; + aw = s1; + c = iteminworldmanager; + H = 0.0F; + } + + public void k() { + // CraftBukkit: Downcast to make it work. + ap.a((ICrafting)this); + } + + public int[] E() { + return bG; + } + + public void b_() { + bF--; + ap.a(); + for (int i = 0; i < 5; i++) { + int j = a(i); + + if (j != bG[i]) { + b.k.a(this, new Packet5PlayerInventory(g, i, j)); + bG[i] = j; + } + } + + } + + public int a(int i) { + if (i == 0) { + return c(an.e()); + } else { + return c(an.b[i - 1]); + } + } + + private int c(ItemStack itemstack) { + if (itemstack == null) { + return -1; + } else { + return itemstack.c; + } + } + + public void f(Entity entity) { + an.h(); + } + + public boolean a(Entity entity, int i) { + if (bF > 0) { + return false; + } + if (!b.n) { + if (entity instanceof EntityPlayer) { + return false; + } + if (entity instanceof EntityArrow) { + EntityArrow entityarrow = (EntityArrow) entity; + + if (entityarrow.b instanceof EntityPlayer) { + return false; + } + } + } + return super.a(entity, i); + } + + public void c(int i) { + super.c(i); + } + + public void F() { + super.b_(); + ChunkCoordIntPair chunkcoordintpair = null; + double d1 = 0.0D; + + for (int i = 0; i < f.size(); i++) { + ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) f.get(i); + double d2 = chunkcoordintpair1.a(this); + + if (i == 0 || d2 < d1) { + chunkcoordintpair = chunkcoordintpair1; + d1 = chunkcoordintpair1.a(this); + } + } + + if (chunkcoordintpair != null) { + boolean flag = false; + + if (d1 < 1024D) { + flag = true; + } + if (a.b() < 2) { + flag = true; + } + if (flag) { + f.remove(chunkcoordintpair); + a.b(new Packet51MapChunk(chunkcoordintpair.a * 16, 0, chunkcoordintpair.b * 16, 16, 128, 16, b.e)); + List list = b.e.d(chunkcoordintpair.a * 16, 0, chunkcoordintpair.b * 16, chunkcoordintpair.a * 16 + 16, 128, chunkcoordintpair.b * 16 + 16); + + for (int j = 0; j < list.size(); j++) { + a((TileEntity) list.get(j)); + } + + } + } + if (ba != bE) { + a.b(new Packet8(ba)); + bE = ba; + } + } + + private void a(TileEntity tileentity) { + if (tileentity != null) { + Packet packet = tileentity.f(); + + if (packet != null) { + a.b(packet); + } + } + } + + public void G() { + s = t = u = 0.0D; + bB = false; + super.G(); + } + + public void c(Entity entity, int i) { + if (!entity.G) { + if (entity instanceof EntityItem) { + b.k.a(entity, new Packet22Collect(entity.g, g)); + } + if (entity instanceof EntityArrow) { + b.k.a(entity, new Packet22Collect(entity.g, g)); + } + } + super.c(entity, i); + ap.a(); + } + + public void H() { + if (!au) { + av = -1; + au = true; + b.k.a(this, new Packet18ArmAnimation(this, 1)); + } + } + + public float s() { + return 1.62F; + } + + public void e(Entity entity) { + super.e(entity); + a.b(new Packet39(this, k)); + a.a(p, q, r, v, w); + } + + protected void a(double d1, boolean flag) {} + + public void b(double d1, boolean flag) { + super.a(d1, flag); + } + + public boolean p() { + return al; + } + + private void R() { + bH = bH % 100 + 1; + } + + public void a(int i, int j, int l) { + R(); + a.b(new Packet100(bH, 1, "Crafting", 9)); + ap = new CraftingInventoryWorkbenchCB(an, this.l, i, j, l); + ap.f = bH; + // CraftBukkit: Downcast to make it work. + ap.a((ICrafting)this); + } + + public void a(IInventory iinventory) { + R(); + a.b(new Packet100(bH, 0, iinventory.b(), iinventory.a())); + ap = new CraftingInventoryChestCB(an, iinventory); + ap.f = bH; + // CraftBukkit: Downcast to make it work. + ap.a((ICrafting)this); + } + + public void a(TileEntityFurnace tileentityfurnace) { + R(); + a.b(new Packet100(bH, 2, tileentityfurnace.b(), tileentityfurnace.a())); + ap = new CraftingInventoryFurnaceCB(an, tileentityfurnace); + ap.f = bH; + // CraftBukkit: Downcast to make it work. + ap.a((ICrafting)this); + } + + public void a(CraftingInventoryCB craftinginventorycb, int i, ItemStack itemstack) { + if (craftinginventorycb.a(i) instanceof SlotCrafting) { + return; + } + if (am) { + return; + } else { + a.b(new Packet103(craftinginventorycb.f, i, itemstack)); + return; + } + } + + public void a(CraftingInventoryCB craftinginventorycb, List list) { + a.b(new Packet104(craftinginventorycb.f, list)); + a.b(new Packet103(-1, -1, an.i())); + } + + public void a(CraftingInventoryCB craftinginventorycb, int i, int j) { + a.b(new Packet105(craftinginventorycb.f, i, j)); + } + + public void a(ItemStack itemstack) {} + + public void I() { + a.b(new Packet101(ap.f)); + K(); + } + + public void J() { + if (am) { + return; + } else { + a.b(new Packet103(-1, -1, an.i())); + return; + } + } + + public void K() { + // CraftBukkit: Downcast to make it work. + ap.a((ICrafting)this); + ap = ao; + } +} + diff --git a/src/main/java/net/minecraft/server/IInventory.java b/src/main/java/net/minecraft/server/IInventory.java new file mode 100644 index 0000000000..c573e81924 --- /dev/null +++ b/src/main/java/net/minecraft/server/IInventory.java @@ -0,0 +1,24 @@ +package net.minecraft.server; + + +public interface IInventory { + + public abstract int a(); + + public abstract ItemStack a(int i); + + public abstract ItemStack a(int i, int j); + + public abstract void a(int i, ItemStack itemstack); + + public abstract String b(); + + public abstract int c(); + + public abstract void d(); + + public abstract boolean a_(EntityPlayer entityplayer); + + public abstract ItemStack[] getContents(); // CraftBukkit +} + diff --git a/src/main/java/net/minecraft/server/InventoryCraftResult.java b/src/main/java/net/minecraft/server/InventoryCraftResult.java new file mode 100644 index 0000000000..8d7f8d6dbd --- /dev/null +++ b/src/main/java/net/minecraft/server/InventoryCraftResult.java @@ -0,0 +1,54 @@ +package net.minecraft.server; + + +public class InventoryCraftResult + implements IInventory { + + private ItemStack a[]; + + // CraftBukkit + public ItemStack[] getContents() { + return a; + } + + public InventoryCraftResult() { + a = new ItemStack[1]; + } + + public int a() { + return 1; + } + + public ItemStack a(int i) { + return a[i]; + } + + public String b() { + return "Result"; + } + + public ItemStack a(int i, int j) { + if (a[i] != null) { + ItemStack itemstack = a[i]; + + a[i] = null; + return itemstack; + } else { + return null; + } + } + + public void a(int i, ItemStack itemstack) { + a[i] = itemstack; + } + + public int c() { + return 64; + } + + public void d() {} + + public boolean a_(EntityPlayer entityplayer) { + return true; + } +} diff --git a/src/main/java/net/minecraft/server/InventoryCrafting.java b/src/main/java/net/minecraft/server/InventoryCrafting.java new file mode 100644 index 0000000000..90502d4704 --- /dev/null +++ b/src/main/java/net/minecraft/server/InventoryCrafting.java @@ -0,0 +1,69 @@ +package net.minecraft.server; + + +public class InventoryCrafting + implements IInventory { + + private ItemStack a[]; + private int b; + private CraftingInventoryCB c; + + //CraftBukkit + public ItemStack[] getContents() { + return a; + } + + public InventoryCrafting(CraftingInventoryCB craftinginventorycb, int i, int j) { + b = i * j; + a = new ItemStack[b]; + c = craftinginventorycb; + } + + public int a() { + return b; + } + + public ItemStack a(int i) { + return a[i]; + } + + public String b() { + return "Crafting"; + } + + public ItemStack a(int i, int j) { + if (a[i] != null) { + if (a[i].a <= j) { + ItemStack itemstack = a[i]; + + a[i] = null; + c.a(this); + return itemstack; + } + ItemStack itemstack1 = a[i].a(j); + + if (a[i].a == 0) { + a[i] = null; + } + c.a(this); + return itemstack1; + } else { + return null; + } + } + + public void a(int i, ItemStack itemstack) { + a[i] = itemstack; + c.a(this); + } + + public int c() { + return 64; + } + + public void d() {} + + public boolean a_(EntityPlayer entityplayer) { + return true; + } +} diff --git a/src/main/java/net/minecraft/server/InventoryLargeChest.java b/src/main/java/net/minecraft/server/InventoryLargeChest.java new file mode 100644 index 0000000000..e79d74b58f --- /dev/null +++ b/src/main/java/net/minecraft/server/InventoryLargeChest.java @@ -0,0 +1,71 @@ +package net.minecraft.server; + + +public class InventoryLargeChest + implements IInventory { + + private String a; + private IInventory b; + private IInventory c; + + // CraftBukkit start + public ItemStack[] getContents() { + ItemStack[] result = new ItemStack[a()]; + for (int i = 0; i < result.length; i++) { + result[i] = a(i); + } + return result; + } + // CraftBukkit end + + public InventoryLargeChest(String s, IInventory iinventory, IInventory iinventory1) { + a = s; + b = iinventory; + c = iinventory1; + } + + public int a() { + return b.a() + c.a(); + } + + public String b() { + return a; + } + + public ItemStack a(int i) { + if (i >= b.a()) { + return c.a(i - b.a()); + } else { + return b.a(i); + } + } + + public ItemStack a(int i, int j) { + if (i >= b.a()) { + return c.a(i - b.a(), j); + } else { + return b.a(i, j); + } + } + + public void a(int i, ItemStack itemstack) { + if (i >= b.a()) { + c.a(i - b.a(), itemstack); + } else { + b.a(i, itemstack); + } + } + + public int c() { + return b.c(); + } + + public void d() { + b.d(); + c.d(); + } + + public boolean a_(EntityPlayer entityplayer) { + return b.a_(entityplayer) && c.a_(entityplayer); + } +} diff --git a/src/main/java/net/minecraft/server/InventoryPlayer.java b/src/main/java/net/minecraft/server/InventoryPlayer.java new file mode 100644 index 0000000000..186fa6e9f4 --- /dev/null +++ b/src/main/java/net/minecraft/server/InventoryPlayer.java @@ -0,0 +1,345 @@ +package net.minecraft.server; + + +public class InventoryPlayer + implements IInventory { + + public ItemStack a[]; + public ItemStack b[]; + public int c; + private EntityPlayer e; + private ItemStack f; + public boolean d; + + // CraftBukket start + public ItemStack[] getContents() { + return a; + } + + public ItemStack[] getArmorContents() { + return b; + } + // CraftBukket end + + public InventoryPlayer(EntityPlayer entityplayer) { + a = new ItemStack[36]; + b = new ItemStack[4]; + c = 0; + d = false; + e = entityplayer; + } + + public ItemStack e() { + return a[c]; + } + + private int d(int k) { + for (int l = 0; l < a.length; l++) { + if (a[l] != null && a[l].c == k) { + return l; + } + } + + return -1; + } + + private int e(int k) { + for (int l = 0; l < a.length; l++) { + if (a[l] != null && a[l].c == k && a[l].a < a[l].b() && a[l].a < c()) { + return l; + } + } + + return -1; + } + + private int j() { + for (int k = 0; k < a.length; k++) { + if (a[k] == null) { + return k; + } + } + + return -1; + } + + private int b(int k, int l) { + int i1 = e(k); + + if (i1 < 0) { + i1 = j(); + } + if (i1 < 0) { + return l; + } + if (a[i1] == null) { + a[i1] = new ItemStack(k, 0); + } + int j1 = l; + + if (j1 > a[i1].b() - a[i1].a) { + j1 = a[i1].b() - a[i1].a; + } + if (j1 > c() - a[i1].a) { + j1 = c() - a[i1].a; + } + if (j1 == 0) { + return l; + } else { + l -= j1; + a[i1].a += j1; + a[i1].b = 5; + return l; + } + } + + public void f() { + for (int k = 0; k < a.length; k++) { + if (a[k] != null && a[k].b > 0) { + a[k].b--; + } + } + + } + + public boolean b(int k) { + int l = d(k); + + if (l < 0) { + return false; + } + if (--a[l].a <= 0) { + a[l] = null; + } + return true; + } + + public boolean a(ItemStack itemstack) { + if (itemstack.d == 0) { + itemstack.a = b(itemstack.c, itemstack.a); + if (itemstack.a == 0) { + return true; + } + } + int k = j(); + + if (k >= 0) { + a[k] = itemstack; + a[k].b = 5; + return true; + } else { + return false; + } + } + + public ItemStack a(int k, int l) { + ItemStack aitemstack[] = a; + + if (k >= a.length) { + aitemstack = b; + k -= a.length; + } + if (aitemstack[k] != null) { + if (aitemstack[k].a <= l) { + ItemStack itemstack = aitemstack[k]; + + aitemstack[k] = null; + return itemstack; + } + ItemStack itemstack1 = aitemstack[k].a(l); + + if (aitemstack[k].a == 0) { + aitemstack[k] = null; + } + return itemstack1; + } else { + return null; + } + } + + public void a(int k, ItemStack itemstack) { + ItemStack aitemstack[] = a; + + if (k >= aitemstack.length) { + k -= aitemstack.length; + aitemstack = b; + } + aitemstack[k] = itemstack; + } + + public float a(Block block) { + float f1 = 1.0F; + + if (a[c] != null) { + f1 *= a[c].a(block); + } + return f1; + } + + public NBTTagList a(NBTTagList nbttaglist) { + for (int k = 0; k < a.length; k++) { + if (a[k] != null) { + NBTTagCompound nbttagcompound = new NBTTagCompound(); + + nbttagcompound.a("Slot", (byte) k); + a[k].a(nbttagcompound); + nbttaglist.a(nbttagcompound); + } + } + + for (int l = 0; l < b.length; l++) { + if (b[l] != null) { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + + nbttagcompound1.a("Slot", (byte) (l + 100)); + b[l].a(nbttagcompound1); + nbttaglist.a(nbttagcompound1); + } + } + + return nbttaglist; + } + + public void b(NBTTagList nbttaglist) { + a = new ItemStack[36]; + b = new ItemStack[4]; + for (int k = 0; k < nbttaglist.b(); k++) { + NBTTagCompound nbttagcompound = (NBTTagCompound) nbttaglist.a(k); + int l = nbttagcompound.b("Slot") & 0xff; + ItemStack itemstack = new ItemStack(nbttagcompound); + + if (itemstack.a() == null) { + continue; + } + if (l >= 0 && l < a.length) { + a[l] = itemstack; + } + if (l >= 100 && l < b.length + 100) { + b[l - 100] = itemstack; + } + } + + } + + public int a() { + return a.length + 4; + } + + public ItemStack a(int k) { + ItemStack aitemstack[] = a; + + if (k >= aitemstack.length) { + k -= aitemstack.length; + aitemstack = b; + } + return aitemstack[k]; + } + + public String b() { + return "Inventory"; + } + + public int c() { + return 64; + } + + public int a(Entity entity) { + ItemStack itemstack = a(c); + + if (itemstack != null) { + return itemstack.a(entity); + } else { + return 1; + } + } + + public boolean b(Block block) { + if (block.bs != Material.d && block.bs != Material.e && block.bs != Material.t && block.bs != Material.s) { + return true; + } + ItemStack itemstack = a(c); + + if (itemstack != null) { + return itemstack.b(block); + } else { + return false; + } + } + + public int g() { + int k = 0; + int l = 0; + int i1 = 0; + + for (int j1 = 0; j1 < b.length; j1++) { + if (b[j1] != null && (b[j1].a() instanceof ItemArmor)) { + int k1 = b[j1].c(); + int l1 = b[j1].d; + int i2 = k1 - l1; + + l += i2; + i1 += k1; + int j2 = ((ItemArmor) b[j1].a()).bc; + + k += j2; + } + } + + if (i1 == 0) { + return 0; + } else { + return ((k - 1) * l) / i1 + 1; + } + } + + public void c(int k) { + for (int l = 0; l < b.length; l++) { + if (b[l] == null || !(b[l].a() instanceof ItemArmor)) { + continue; + } + b[l].b(k); + if (b[l].a == 0) { + b[l].a(e); + b[l] = null; + } + } + + } + + public void h() { + for (int k = 0; k < a.length; k++) { + if (a[k] != null) { + e.a(a[k], true); + a[k] = null; + } + } + + for (int l = 0; l < b.length; l++) { + if (b[l] != null) { + e.a(b[l], true); + b[l] = null; + } + } + + } + + public void d() { + d = true; + } + + public void b(ItemStack itemstack) { + f = itemstack; + e.a(itemstack); + } + + public ItemStack i() { + return f; + } + + public boolean a_(EntityPlayer entityplayer) { + if (e.G) { + return false; + } + return entityplayer.b((Entity)e) <= 64D; // CraftBukkit: downcast to Entity + } +} diff --git a/src/main/java/net/minecraft/server/Slot.java b/src/main/java/net/minecraft/server/Slot.java new file mode 100644 index 0000000000..63234dd4af --- /dev/null +++ b/src/main/java/net/minecraft/server/Slot.java @@ -0,0 +1,51 @@ +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.a(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 new file mode 100644 index 0000000000..cc5e7f81b8 --- /dev/null +++ b/src/main/java/net/minecraft/server/TileEntityChest.java @@ -0,0 +1,103 @@ +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 a() { + return 27; + } + + public ItemStack a(int i) { + return e[i]; + } + + public ItemStack a(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[a()]; + 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(nbttagcompound1); + } + } + + nbttagcompound.a("Items", nbttaglist); + } + + public int c() { + return 64; + } + + public boolean a_(EntityPlayer entityplayer) { + if (a.l(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 new file mode 100644 index 0000000000..ff266f7cf0 --- /dev/null +++ b/src/main/java/net/minecraft/server/TileEntityFurnace.java @@ -0,0 +1,240 @@ +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 a() { + return h.length; + } + + public ItemStack a(int j) { + return h[j]; + } + + public ItemStack a(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[a()]; + 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 = nbttagcompound.c("BurnTime"); + g = 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(nbttagcompound1); + } + } + + nbttagcompound.a("Items", nbttaglist); + } + + public int c() { + return 64; + } + + public boolean g() { + return e > 0; + } + + public void e() { + 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 (g() && 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; + } + int j = b(h[0].a().aW); + + if (j < 0) { + return false; + } + if (h[2] == null) { + return true; + } + if (h[2].c != j) { + return false; + } + if (h[2].a < c() && h[2].a < h[2].b()) { + return true; + } + return h[2].a < Item.c[j].b(); + } + + public void h() { + if (!i()) { + return; + } + int j = b(h[0].a().aW); + + if (h[2] == null) { + h[2] = new ItemStack(j, 1); + } else if (h[2].c == j) { + h[2].a++; + } + h[0].a--; + if (h[0].a <= 0) { + h[0] = null; + } + } + + private int b(int j) { + if (j == Block.H.bh) { + return Item.m.aW; + } + if (j == Block.G.bh) { + return Item.n.aW; + } + if (j == Block.aw.bh) { + return Item.l.aW; + } + if (j == Block.E.bh) { + return Block.M.bh; + } + if (j == Item.ao.aW) { + return Item.ap.aW; + } + if (j == Item.aS.aW) { + return Item.aT.aW; + } + if (j == Block.w.bh) { + return Block.t.bh; + } + if (j == Item.aG.aW) { + return Item.aF.aW; + } else { + return -1; + } + } + + private int a(ItemStack itemstack) { + if (itemstack == null) { + return 0; + } + int j = itemstack.a().aW; + + if (j < 256 && Block.m[j].bs == Material.c) { + return 300; + } + if (j == Item.B.aW) { + return 100; + } + if (j == Item.k.aW) { + return 1600; + } + return j != Item.aw.aW ? 0 : 20000; + } + + public boolean a_(EntityPlayer entityplayer) { + if (a.l(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/org/bukkit/craftbukkit/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/CraftHumanEntity.java index b03f096725..91437f4f8c 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 0000000000..c74ecea373 --- /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 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++) { + 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 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); + } 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 0000000000..3ee882fc60 --- /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 getArmorContents() { + ArrayList items = new ArrayList(); + 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 3527721b05..d1571ac46f 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 0000000000..32b12b7a0f --- /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 7567529e31..3063482daa 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 getContents() { - ArrayList items = new ArrayList(); - 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; } }