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).
+ *
+ *
+ * - isItemValid is false when insertion of the item is never valid.
+ * - When isItemValid is true, no assumptions can be made and insertion must be simulated case-by-case.
+ * - The actual items in the inventory, its fullness, or any other state are not considered by isItemValid.
+ *
+ * @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);
+ }
}