diff --git a/src/main/java/net/minecraftforge/items/IItemHandler.java b/src/main/java/net/minecraftforge/items/IItemHandler.java index c577351fe..2e2aaf58d 100644 --- a/src/main/java/net/minecraftforge/items/IItemHandler.java +++ b/src/main/java/net/minecraftforge/items/IItemHandler.java @@ -80,4 +80,12 @@ public interface IItemHandler **/ @Nonnull ItemStack extractItem(int slot, int amount, boolean simulate); + + /** + * Retrieves the maximum stack size allowed to exist in the given slot. + * + * @param slot Slot to query. + * @return The maximum stack size allowed in the slot. + */ + int getSlotLimit(int slot); } diff --git a/src/main/java/net/minecraftforge/items/ItemHandlerHelper.java b/src/main/java/net/minecraftforge/items/ItemHandlerHelper.java index 40e92db83..8bdf29792 100644 --- a/src/main/java/net/minecraftforge/items/ItemHandlerHelper.java +++ b/src/main/java/net/minecraftforge/items/ItemHandlerHelper.java @@ -25,10 +25,12 @@ import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.SoundCategory; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.items.wrapper.PlayerMainInvWrapper; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public class ItemHandlerHelper { @@ -195,4 +197,37 @@ public class ItemHandlerHelper world.spawnEntityInWorld(entityitem); } } + + /** + * This method uses the standard vanilla algorithm to calculate a comparator output for how "full" the inventory is. + * This method is an adaptation of Container#calcRedstoneFromInventory(IInventory). + * @param inv The inventory handler to test. + * @return A redstone value in the range [0,15] representing how "full" this inventory is. + */ + public static int calcRedstoneFromInventory(@Nullable IItemHandler inv) + { + if (inv == null) + { + return 0; + } + else + { + int itemsFound = 0; + float proportion = 0.0F; + + for (int j = 0; j < inv.getSlots(); ++j) + { + ItemStack itemstack = inv.getStackInSlot(j); + + if (!itemstack.func_190926_b()) + { + proportion += (float)itemstack.func_190916_E() / (float)Math.min(inv.getSlotLimit(j), itemstack.getMaxStackSize()); + ++itemsFound; + } + } + + proportion = proportion / (float)inv.getSlots(); + return MathHelper.floor_float(proportion * 14.0F) + (itemsFound > 0 ? 1 : 0); + } + } } diff --git a/src/main/java/net/minecraftforge/items/ItemStackHandler.java b/src/main/java/net/minecraftforge/items/ItemStackHandler.java index 291eb969f..7355eb176 100644 --- a/src/main/java/net/minecraftforge/items/ItemStackHandler.java +++ b/src/main/java/net/minecraftforge/items/ItemStackHandler.java @@ -154,9 +154,15 @@ public class ItemStackHandler implements IItemHandler, IItemHandlerModifiable, I } } + @Override + public int getSlotLimit(int slot) + { + return 64; + } + protected int getStackLimit(int slot, @Nonnull ItemStack stack) { - return stack.getMaxStackSize(); + return Math.min(getSlotLimit(slot), stack.getMaxStackSize()); } @Override diff --git a/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java b/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java index ce10fd841..fb634951b 100644 --- a/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java +++ b/src/main/java/net/minecraftforge/items/VanillaDoubleChestItemHandler.java @@ -149,6 +149,13 @@ public class VanillaDoubleChestItemHandler extends WeakReference