From 8774937931745ed26b400d87d314fde24d3135d6 Mon Sep 17 00:00:00 2001 From: Robotia Date: Mon, 1 Feb 2016 17:27:44 -0500 Subject: [PATCH] Fix #60 KC Official (https://gitlab.prok.pw/KCauldron/KCauldron/commit/6c2be10dc97f3d8234c38525dfe710cc0294e2ca) --- .../tileentity/TileEntityHopper.java.patch | 17 +- .../java/kcauldron/CraftInventoryWrapper.java | 145 ++++++++++++++++++ 2 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 src/main/java/kcauldron/CraftInventoryWrapper.java diff --git a/patches/net/minecraft/tileentity/TileEntityHopper.java.patch b/patches/net/minecraft/tileentity/TileEntityHopper.java.patch index 8186774..37fbb2c 100644 --- a/patches/net/minecraft/tileentity/TileEntityHopper.java.patch +++ b/patches/net/minecraft/tileentity/TileEntityHopper.java.patch @@ -149,15 +149,15 @@ return false; } } -@@ -427,11 +526,70 @@ +@@ -427,11 +526,71 @@ if (itemstack != null && func_145890_b(p_145892_1_, itemstack, p_145892_2_, p_145892_3_)) { ItemStack itemstack1 = itemstack.copy(); - ItemStack itemstack2 = func_145889_a(p_145892_0_, p_145892_1_.decrStackSize(p_145892_2_, 1), -1); + // CraftBukkit start - Call event on collection of items from inventories into the hopper + CraftItemStack oitemstack = CraftItemStack.asCraftMirror(p_145892_1_.decrStackSize(p_145892_2_, 1)); -+ Inventory sourceInventory; - ++ Inventory sourceInventory = null; ++ + // Have to special case large chests as they work oddly + if (p_145892_1_ instanceof InventoryLargeChest) + { @@ -182,6 +182,7 @@ + { + sourceInventory = null; + } ++ finally { if (sourceInventory == null) { sourceInventory = new kcauldron.CraftInventoryWrapper(p_145892_1_); } } + // Cauldron end + } + @@ -205,7 +206,7 @@ + } + + ItemStack itemstack2 = func_145889_a(p_145892_0_, CraftItemStack.asNMSCopy(event.getItem()), -1); -+ + if (itemstack2 == null || itemstack2.stackSize == 0) { - p_145892_1_.markDirty(); @@ -222,7 +223,7 @@ return true; } -@@ -451,6 +609,20 @@ +@@ -451,6 +610,20 @@ } else { @@ -243,3 +244,9 @@ ItemStack itemstack = p_145898_1_.getEntityItem().copy(); ItemStack itemstack1 = func_145889_a(p_145898_0_, itemstack, -1); +@@ -641,4 +814,4 @@ + { + return this.field_145901_j > 0; + } +-} ++} diff --git a/src/main/java/kcauldron/CraftInventoryWrapper.java b/src/main/java/kcauldron/CraftInventoryWrapper.java new file mode 100644 index 0000000..985764f --- /dev/null +++ b/src/main/java/kcauldron/CraftInventoryWrapper.java @@ -0,0 +1,145 @@ +package kcauldron; + +import java.util.Collections; +import java.util.List; + +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.inventory.CraftInventory; +import org.bukkit.entity.HumanEntity; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class CraftInventoryWrapper extends CraftInventory { + public CraftInventoryWrapper(IInventory inventory) { + super(new Inv(inventory)); + ((Inv) super.inventory).wrapper = this; + } + + private static final class Inv implements IInventory, InventoryHolder { + CraftInventoryWrapper wrapper; + IInventory inventory; + + Inv(IInventory inventory) { + this.inventory = inventory; + } + + @Override + public Inventory getInventory() { + return wrapper; + } + + @Override + public int getSizeInventory() { + return inventory.getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int p_70301_1_) { + return inventory.getStackInSlot(p_70301_1_); + } + + @Override + public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) { + return inventory.decrStackSize(p_70298_1_, p_70298_2_); + } + + @Override + public ItemStack getStackInSlotOnClosing(int p_70304_1_) { + return inventory.getStackInSlotOnClosing(p_70304_1_); + } + + @Override + public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) { + inventory.setInventorySlotContents(p_70299_1_, p_70299_2_); + } + + @Override + public String getInventoryName() { + return inventory.getInventoryName(); + } + + @Override + public boolean hasCustomInventoryName() { + return inventory.hasCustomInventoryName(); + } + + @Override + public int getInventoryStackLimit() { + return inventory.getInventoryStackLimit(); + } + + @Override + public void markDirty() { + inventory.markDirty(); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer p_70300_1_) { + return inventory.isUseableByPlayer(p_70300_1_); + } + + @Override + public void openInventory() { + inventory.openInventory(); + } + + @Override + public void closeInventory() { + inventory.closeInventory(); + + } + + @Override + public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { + return inventory.isItemValidForSlot(p_94041_1_, p_94041_2_); + } + + @Override + public ItemStack[] getContents() { + return inventory.getContents(); + } + + @Override + public void onOpen(CraftHumanEntity who) { + try { + inventory.onOpen(who); + } catch (AbstractMethodError ignored) { + } + } + + @Override + public void onClose(CraftHumanEntity who) { + try { + inventory.onClose(who); + } catch (AbstractMethodError ignored) { + } + } + + @Override + public List getViewers() { + try { + return inventory.getViewers(); + } catch (AbstractMethodError ignored) { + return Collections.emptyList(); + } + } + + @Override + public InventoryHolder getOwner() { + return this; + } + + @Override + public void setMaxStackSize(int size) { + try { + inventory.setMaxStackSize(size); + } catch (AbstractMethodError ignored) { + } + } + } +} +