diff options
Diffstat (limited to 'src/main/java/net/minecraft/server/TileEntityHopper.java')
-rw-r--r-- | src/main/java/net/minecraft/server/TileEntityHopper.java | 175 |
1 files changed, 136 insertions, 39 deletions
diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java index 730eb78c..563d9c80 100644 --- a/src/main/java/net/minecraft/server/TileEntityHopper.java +++ b/src/main/java/net/minecraft/server/TileEntityHopper.java @@ -17,7 +17,7 @@ public class TileEntityHopper extends TileEntity implements IHopper { private String i; private int j = -1; - // CraftBukkit start + // CraftBukkit start - add fields and methods public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); private int maxStack = MAX_STACK; @@ -178,9 +178,16 @@ public class TileEntityHopper extends TileEntity implements IHopper { public boolean i() { if (this.world != null && !this.world.isStatic) { if (!this.j() && BlockHopper.c(this.p())) { - boolean flag = this.k(); + boolean flag = false; + + if (!this.k()) { + flag = this.x(); + } + + if (!this.l()) { + flag = suckInItems(this) || flag; + } - flag = suckInItems(this) || flag; if (flag) { this.c(8); this.update(); @@ -195,50 +202,136 @@ public class TileEntityHopper extends TileEntity implements IHopper { } private boolean k() { - IInventory iinventory = this.l(); + ItemStack[] aitemstack = this.a; + int i = aitemstack.length; + + for (int j = 0; j < i; ++j) { + ItemStack itemstack = aitemstack[j]; + + if (itemstack != null) { + return false; + } + } + + return true; + } + + private boolean l() { + ItemStack[] aitemstack = this.a; + int i = aitemstack.length; + + for (int j = 0; j < i; ++j) { + ItemStack itemstack = aitemstack[j]; + + if (itemstack == null || itemstack.count != itemstack.getMaxStackSize()) { + return false; + } + } + + return true; + } + + private boolean x() { + IInventory iinventory = this.y(); if (iinventory == null) { return false; } else { - for (int i = 0; i < this.getSize(); ++i) { - if (this.getItem(i) != null) { - ItemStack itemstack = this.getItem(i).cloneItemStack(); - // CraftBukkit start - Call event when pushing items into other inventories - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(this.splitStack(i, 1)); - - Inventory destinationInventory; - // Have to special case large chests as they work oddly - if (iinventory instanceof InventoryLargeChest) { - destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); - } else { - destinationInventory = iinventory.getOwner().getInventory(); - } + int i = Facing.OPPOSITE_FACING[BlockHopper.b(this.p())]; - InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); - this.getWorld().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.setItem(i, itemstack); - this.c(8); // Delay hopper checks - return false; - } - ItemStack itemstack1 = addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), Facing.OPPOSITE_FACING[BlockHopper.b(this.p())]); - - if (itemstack1 == null || itemstack1.count == 0) { - if (event.getItem().equals(oitemstack)) { - iinventory.update(); + if (this.a(iinventory, i)) { + return false; + } else { + for (int j = 0; j < this.getSize(); ++j) { + if (this.getItem(j) != null) { + ItemStack itemstack = this.getItem(j).cloneItemStack(); + // CraftBukkit start - Call event when pushing items into other inventories + CraftItemStack oitemstack = CraftItemStack.asCraftMirror(this.splitStack(j, 1)); + + Inventory destinationInventory; + // Have to special case large chests as they work oddly + if (iinventory instanceof InventoryLargeChest) { + destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); } else { + destinationInventory = iinventory.getOwner().getInventory(); + } + + InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); + this.getWorld().getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { this.setItem(i, itemstack); + this.c(8); // Delay hopper checks + return false; } - // CraftBukkit end - return true; + ItemStack itemstack1 = addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), i); + + if (itemstack1 == null || itemstack1.count == 0) { + if (event.getItem().equals(oitemstack)) { + iinventory.update(); + } else { + this.setItem(j, itemstack); + } + // CraftBukkit end + return true; + } + + this.setItem(j, itemstack); } + } + + return false; + } + } + } - this.setItem(i, itemstack); + private boolean a(IInventory iinventory, int i) { + if (iinventory instanceof IWorldInventory && i > -1) { + IWorldInventory iworldinventory = (IWorldInventory) iinventory; + int[] aint = iworldinventory.getSlotsForFace(i); + + for (int j = 0; j < aint.length; ++j) { + ItemStack itemstack = iworldinventory.getItem(aint[j]); + + if (itemstack == null || itemstack.count != itemstack.getMaxStackSize()) { + return false; } } + } else { + int k = iinventory.getSize(); - return false; + for (int l = 0; l < k; ++l) { + ItemStack itemstack1 = iinventory.getItem(l); + + if (itemstack1 == null || itemstack1.count != itemstack1.getMaxStackSize()) { + return false; + } + } } + + return true; + } + + private static boolean b(IInventory iinventory, int i) { + if (iinventory instanceof IWorldInventory && i > -1) { + IWorldInventory iworldinventory = (IWorldInventory) iinventory; + int[] aint = iworldinventory.getSlotsForFace(i); + + for (int j = 0; j < aint.length; ++j) { + if (iworldinventory.getItem(aint[j]) != null) { + return false; + } + } + } else { + int k = iinventory.getSize(); + + for (int l = 0; l < k; ++l) { + if (iinventory.getItem(l) != null) { + return false; + } + } + } + + return true; } public static boolean suckInItems(IHopper ihopper) { @@ -247,6 +340,10 @@ public class TileEntityHopper extends TileEntity implements IHopper { if (iinventory != null) { byte b0 = 0; + if (b(iinventory, b0)) { + return false; + } + if (iinventory instanceof IWorldInventory && b0 > -1) { IWorldInventory iworldinventory = (IWorldInventory) iinventory; int[] aint = iworldinventory.getSlotsForFace(b0); @@ -266,7 +363,7 @@ public class TileEntityHopper extends TileEntity implements IHopper { } } } else { - EntityItem entityitem = getEntityItemAt(ihopper.getWorld(), ihopper.x(), ihopper.aD() + 1.0D, ihopper.aE()); + EntityItem entityitem = getEntityItemAt(ihopper.getWorld(), ihopper.aC(), ihopper.aD() + 1.0D, ihopper.aE()); if (entityitem != null) { return addEntityItem(ihopper, entityitem); @@ -416,18 +513,18 @@ public class TileEntityHopper extends TileEntity implements IHopper { return itemstack; } - private IInventory l() { + private IInventory y() { int i = BlockHopper.b(this.p()); return getInventoryAt(this.getWorld(), (double) (this.x + Facing.b[i]), (double) (this.y + Facing.c[i]), (double) (this.z + Facing.d[i])); } public static IInventory getSourceInventory(IHopper ihopper) { - return getInventoryAt(ihopper.getWorld(), ihopper.x(), ihopper.aD() + 1.0D, ihopper.aE()); + return getInventoryAt(ihopper.getWorld(), ihopper.aC(), ihopper.aD() + 1.0D, ihopper.aE()); } public static EntityItem getEntityItemAt(World world, double d0, double d1, double d2) { - List list = world.a(EntityItem.class, AxisAlignedBB.a().a(d0, d1, d2, d0 + 1.0D, d1 + 1.0D, d2 + 1.0D), IEntitySelector.a); + List list = world.a(EntityItem.class, AxisAlignedBB.a(d0, d1, d2, d0 + 1.0D, d1 + 1.0D, d2 + 1.0D), IEntitySelector.a); return list.size() > 0 ? (EntityItem) list.get(0) : null; } @@ -451,7 +548,7 @@ public class TileEntityHopper extends TileEntity implements IHopper { } if (iinventory == null) { - List list = world.getEntities((Entity) null, AxisAlignedBB.a().a(d0, d1, d2, d0 + 1.0D, d1 + 1.0D, d2 + 1.0D), IEntitySelector.b); + List list = world.getEntities((Entity) null, AxisAlignedBB.a(d0, d1, d2, d0 + 1.0D, d1 + 1.0D, d2 + 1.0D), IEntitySelector.c); if (list != null && list.size() > 0) { iinventory = (IInventory) list.get(world.random.nextInt(list.size())); @@ -465,7 +562,7 @@ public class TileEntityHopper extends TileEntity implements IHopper { return itemstack.getItem() != itemstack1.getItem() ? false : (itemstack.getData() != itemstack1.getData() ? false : (itemstack.count > itemstack.getMaxStackSize() ? false : ItemStack.equals(itemstack, itemstack1))); } - public double x() { + public double aC() { return (double) this.x; } |