Fix vanilla inventory wrappers not properly calling markDirty. Closes #3854 and #3810

Also updated IItemHandler javadocs to reflect returning EMPTY instead of NULL.
This commit is contained in:
LexManos committed 2017-04-25 11:55:31 -07:00
1 parent cec90d7f48
commit c0eea379a4
4 files changed
+50 -16

No files matched your search

@@ -62,7 +62,7 @@ public interface IItemHandler
* @param slot Slot to insert into.
* @param stack ItemStack to insert.
* @param simulate If true, the insertion is only simulated
* @return The remaining ItemStack that was not inserted (if the entire stack is accepted, then return null).
* @return The remaining ItemStack that was not inserted (if the entire stack is accepted, then return ItemStack.EMPTY).
* May be the same as the input ItemStack if unchanged, otherwise a new ItemStack.
**/
@Nonnull
@@ -76,7 +76,7 @@ public interface IItemHandler
* @param slot Slot to extract from.
* @param amount Amount to extract (may be greater than the current stacks max limit)
* @param simulate If true, the extraction is only simulated
* @return ItemStack extracted from the slot, must be null, if nothing can be extracted
* @return ItemStack extracted from the slot, must be ItemStack.EMPTY, if nothing can be extracted
**/
@Nonnull
ItemStack extractItem(int slot, int amount, boolean simulate);
@@ -131,6 +131,10 @@ public class VanillaDoubleChestItemHandler extends WeakReference<TileEntityChest
((IItemHandlerModifiable) singleHandler).setStackInSlot(targetSlot, stack);
}
}
chest = getChest(!accessingUpperChest);
if (chest != null)
chest.markDirty();
}
@Override
@@ -140,7 +144,19 @@ public class VanillaDoubleChestItemHandler extends WeakReference<TileEntityChest
boolean accessingUpperChest = slot < 27;
int targetSlot = accessingUpperChest ? slot : slot - 27;
TileEntityChest chest = getChest(accessingUpperChest);
return chest != null ? chest.getSingleChestHandler().insertItem(targetSlot, stack, simulate) : stack;
if (chest == null)
return stack;
int starting = stack.getCount();
ItemStack ret = chest.getSingleChestHandler().insertItem(targetSlot, stack, simulate);
if (ret.getCount() != starting && !simulate)
{
chest = getChest(!accessingUpperChest);
if (chest != null)
chest.markDirty();
}
return ret;
}
@Override
@@ -150,7 +166,18 @@ public class VanillaDoubleChestItemHandler extends WeakReference<TileEntityChest
boolean accessingUpperChest = slot < 27;
int targetSlot = accessingUpperChest ? slot : slot - 27;
TileEntityChest chest = getChest(accessingUpperChest);
return chest != null ? chest.getSingleChestHandler().extractItem(targetSlot, amount, simulate) : ItemStack.EMPTY;
if (chest == null)
return ItemStack.EMPTY;
ItemStack ret = chest.getSingleChestHandler().extractItem(targetSlot, amount, simulate);
if (!ret.isEmpty() && !simulate)
{
chest = getChest(!accessingUpperChest);
if (chest != null)
chest.markDirty();
}
return ret;
}
@Override
@@ -112,7 +112,7 @@ public class SidedInvWrapper implements IItemHandlerModifiable
{
ItemStack copy = stack.copy();
copy.grow(stackInSlot.getCount());
inv.setInventorySlotContents(slot1, copy);
setInventorySlotContents(slot1, copy);
}
return ItemStack.EMPTY;
@@ -125,7 +125,7 @@ public class SidedInvWrapper implements IItemHandlerModifiable
{
ItemStack copy = stack.splitStack(m);
copy.grow(stackInSlot.getCount());
inv.setInventorySlotContents(slot1, copy);
setInventorySlotContents(slot1, copy);
return stack;
}
else
@@ -147,7 +147,7 @@ public class SidedInvWrapper implements IItemHandlerModifiable
stack = stack.copy();
if (!simulate)
{
inv.setInventorySlotContents(slot1, stack.splitStack(m));
setInventorySlotContents(slot1, stack.splitStack(m));
return stack;
}
else
@@ -159,7 +159,7 @@ public class SidedInvWrapper implements IItemHandlerModifiable
else
{
if (!simulate)
inv.setInventorySlotContents(slot1, stack);
setInventorySlotContents(slot1, stack);
return ItemStack.EMPTY;
}
}
@@ -172,7 +172,12 @@ public class SidedInvWrapper implements IItemHandlerModifiable
int slot1 = getSlot(inv, slot, side);
if (slot1 != -1)
inv.setInventorySlotContents(slot1, stack);
setInventorySlotContents(slot1, stack);
}
private void setInventorySlotContents(int slot, ItemStack stack) {
inv.markDirty(); //Notify vanilla of updates, We change the handler to be responsible for this instead of the caller. So mimic vanilla behavior
inv.setInventorySlotContents(slot, stack);
}
@Override
@@ -211,7 +216,9 @@ public class SidedInvWrapper implements IItemHandlerModifiable
else
{
int m = Math.min(stackInSlot.getCount(), amount);
return inv.decrStackSize(slot1, m);
ItemStack ret = inv.decrStackSize(slot1, m);
inv.markDirty();
return ret;
}
}