diff --git a/src/main/java/net/minecraftforge/items/IItemHandler.java b/src/main/java/net/minecraftforge/items/IItemHandler.java index 2f66d460d5..c59b15afd0 100644 --- a/src/main/java/net/minecraftforge/items/IItemHandler.java +++ b/src/main/java/net/minecraftforge/items/IItemHandler.java @@ -19,7 +19,10 @@ package net.minecraftforge.items; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; import javax.annotation.Nonnull; @@ -35,16 +38,18 @@ public interface IItemHandler /** * Returns the ItemStack in a given slot. * - * The result's stack size may be greater than the itemstacks max size. + * The result's stack size may be greater than the itemstack's max size. * * If the result is empty, then the slot is empty. * - *

- * IMPORTANT: This ItemStack MUST NOT be modified. This method is not for - * altering an inventories contents. Any implementers who are able to detect + *

+ * IMPORTANT: This ItemStack MUST NOT be modified. This method is not for + * altering an inventory's contents. Any implementers who are able to detect * modification through this method should throw an exception. - *

- * SERIOUSLY: DO NOT MODIFY THE RETURNED ITEMSTACK + *

+ *

+ * SERIOUSLY: DO NOT MODIFY THE RETURNED ITEMSTACK + *

* * @param slot Slot to query * @return ItemStack in given slot. Empty Itemstack if the slot is empty. @@ -53,9 +58,11 @@ public interface IItemHandler ItemStack getStackInSlot(int slot); /** + *

* Inserts an ItemStack into the given slot and return the remainder. - * The ItemStack should not be modified in this function! - * Note: This behaviour is subtly different from IFluidHandlers.fill() + * The ItemStack should not be modified in this function! + *

+ * Note: This behaviour is subtly different from {@link IFluidHandler#fill(FluidStack, boolean)} * * @param slot Slot to insert into. * @param stack ItemStack to insert. This must not be modified by the item handler. @@ -69,11 +76,13 @@ public interface IItemHandler /** * Extracts an ItemStack from the given slot. + *

* The returned value must be empty if nothing is extracted, - * otherwise it's stack size must less than than amount and {@link ItemStack#getMaxStackSize()}. + * otherwise its stack size must be less than or equal to {@code amount} and {@link ItemStack#getMaxStackSize()}. + *

* * @param slot Slot to extract from. - * @param amount Amount to extract (may be greater than the current stacks max limit) + * @param amount Amount to extract (may be greater than the current stack's max limit) * @param simulate If true, the extraction is only simulated * @return ItemStack extracted from the slot, must be empty if nothing can be extracted. * The returned ItemStack can be safely modified after, so item handlers should return a new or copied stack. @@ -88,4 +97,26 @@ public interface IItemHandler * @return The maximum stack size allowed in the slot. */ int getSlotLimit(int slot); + + /** + *

+ * This function re-implements the vanilla function {@link IInventory#isItemValidForSlot(int, ItemStack)}. + * It should be used instead of simulated insertions in cases where the contents and state of the inventory are + * irrelevant, mainly for the purpose of automation and logic (for instance, testing if a minecart can wait + * to deposit its items into a full inventory, or if the items in the minecart can never be placed into the + * inventory and should move on). + *

+ * + * @param slot Slot to query for validity + * @param stack Stack to test with for validity + * + * @return true if the slot can insert the ItemStack, not considering the current state of the inventory. + * false if the slot can never insert the ItemStack in any situation. + */ + //todo Make non-default and/or replace in 1.13 + default boolean isItemValid(int slot, @Nonnull ItemStack stack) { return true; } } diff --git a/src/main/java/net/minecraftforge/items/ItemStackHandler.java b/src/main/java/net/minecraftforge/items/ItemStackHandler.java index 1858e88189..307f959078 100644 --- a/src/main/java/net/minecraftforge/items/ItemStackHandler.java +++ b/src/main/java/net/minecraftforge/items/ItemStackHandler.java @@ -164,6 +164,12 @@ public class ItemStackHandler implements IItemHandler, IItemHandlerModifiable, I return Math.min(getSlotLimit(slot), stack.getMaxStackSize()); } + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) + { + return true; + } + @Override public NBTTagCompound serializeNBT() { diff --git a/src/main/java/net/minecraftforge/items/SlotItemHandler.java b/src/main/java/net/minecraftforge/items/SlotItemHandler.java index 495c2c0b80..81b7f03c48 100644 --- a/src/main/java/net/minecraftforge/items/SlotItemHandler.java +++ b/src/main/java/net/minecraftforge/items/SlotItemHandler.java @@ -46,24 +46,7 @@ public class SlotItemHandler extends Slot if (stack.isEmpty()) return false; - IItemHandler handler = this.getItemHandler(); - ItemStack remainder; - if (handler instanceof IItemHandlerModifiable) - { - IItemHandlerModifiable handlerModifiable = (IItemHandlerModifiable) handler; - ItemStack currentStack = handlerModifiable.getStackInSlot(index); - - handlerModifiable.setStackInSlot(index, ItemStack.EMPTY); - - remainder = handlerModifiable.insertItem(index, stack, true); - - handlerModifiable.setStackInSlot(index, currentStack); - } - else - { - remainder = handler.insertItem(index, stack, true); - } - return remainder.isEmpty() || remainder.getCount() < stack.getCount(); + return itemHandler.isItemValid(index, stack); } @Override diff --git a/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java b/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java index 956f0fa78a..72d129ee74 100644 --- a/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java +++ b/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java @@ -187,6 +187,19 @@ public class VanillaDoubleChestItemHandler extends WeakReference= slots.size()) diff --git a/src/main/java/net/minecraftforge/items/wrapper/InvWrapper.java b/src/main/java/net/minecraftforge/items/wrapper/InvWrapper.java index 2378b58adc..89b3e69ad0 100644 --- a/src/main/java/net/minecraftforge/items/wrapper/InvWrapper.java +++ b/src/main/java/net/minecraftforge/items/wrapper/InvWrapper.java @@ -204,6 +204,12 @@ public class InvWrapper implements IItemHandlerModifiable return getInv().getInventoryStackLimit(); } + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) + { + return getInv().isItemValidForSlot(slot, stack); + } + public IInventory getInv() { return inv; diff --git a/src/main/java/net/minecraftforge/items/wrapper/RangedWrapper.java b/src/main/java/net/minecraftforge/items/wrapper/RangedWrapper.java index f8a2cd68c6..84a9155884 100644 --- a/src/main/java/net/minecraftforge/items/wrapper/RangedWrapper.java +++ b/src/main/java/net/minecraftforge/items/wrapper/RangedWrapper.java @@ -105,6 +105,17 @@ public class RangedWrapper implements IItemHandlerModifiable { return 0; } + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) + { + if (checkSlot(slot)) + { + return compose.isItemValid(slot + minSlot, stack); + } + + return false; + } + private boolean checkSlot(int localSlot) { return localSlot + minSlot < maxSlot; diff --git a/src/main/java/net/minecraftforge/items/wrapper/SidedInvWrapper.java b/src/main/java/net/minecraftforge/items/wrapper/SidedInvWrapper.java index 2c3aa3e7d4..2ab90cb2f5 100644 --- a/src/main/java/net/minecraftforge/items/wrapper/SidedInvWrapper.java +++ b/src/main/java/net/minecraftforge/items/wrapper/SidedInvWrapper.java @@ -230,4 +230,10 @@ public class SidedInvWrapper implements IItemHandlerModifiable { return inv.getInventoryStackLimit(); } + + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) + { + return inv.isItemValidForSlot(slot, stack); + } }