package cofh.lib.inventory; import cofh.lib.util.helpers.ItemHelper; import java.util.HashMap; import java.util.Map; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; public class InventoryManagerStandard implements IInventoryManager { private final IInventory _inv; protected ForgeDirection _targetSide; protected int _cachedSize; protected int[] _cachedSlots = new int[] {}; public InventoryManagerStandard(IInventory inventory, ForgeDirection targetSide) { _inv = inventory; _targetSide = targetSide; } @Override public boolean canAddItem(ItemStack stack, int slot) { return _inv.isItemValidForSlot(slot, stack); } @Override public boolean canRemoveItem(ItemStack stack, int slot) { return true; } @Override public ItemStack addItem(ItemStack stack) { if (stack == null) { return null; } int quantitytoadd = stack.stackSize; ItemStack remaining = stack.copy(); int[] slots = getSlots(); if (slots == null) { return remaining; } for (int i : slots) { int maxStackSize = Math.min(_inv.getInventoryStackLimit(), stack.getMaxStackSize()); ItemStack s = getSlotContents(i); if (s == null) { ItemStack add = stack.copy(); add.stackSize = Math.min(quantitytoadd, maxStackSize); if (canAddItem(add, i)) { quantitytoadd -= add.stackSize; _inv.setInventorySlotContents(i, add); _inv.markDirty(); } } else if (ItemHelper.itemsEqualWithMetadata(s, stack)) { ItemStack add = stack.copy(); add.stackSize = Math.min(quantitytoadd, maxStackSize - s.stackSize); if (add.stackSize > 0 && canAddItem(add, i)) { s.stackSize += add.stackSize; quantitytoadd -= add.stackSize; _inv.setInventorySlotContents(i, s); _inv.markDirty(); } } if (quantitytoadd == 0) { break; } } remaining.stackSize = quantitytoadd; if (remaining.stackSize == 0) { return null; } else { return remaining; } } @Override public ItemStack removeItem(int maxRemove) { if (maxRemove <= 0) { return null; } int[] slots = getSlots(); if (slots == null) { return null; } for (int i : slots) { ItemStack s = getSlotContents(i); if (s != null && canRemoveItem(s, i)) { int toRemove = Math.min(s.stackSize, maxRemove); s.stackSize -= toRemove; ItemStack removed = s.copy(); removed.stackSize = toRemove; if (s.stackSize > 0) { _inv.setInventorySlotContents(i, s); } else { _inv.setInventorySlotContents(i, null); } _inv.markDirty(); return removed; } } return null; } @Override public ItemStack removeItem(int maxRemove, ItemStack type) { if (maxRemove <= 0) { return null; } int[] slots = getSlots(); if (slots == null) { return null; } for (int i : slots) { ItemStack s = getSlotContents(i); if (ItemHelper.itemsEqualWithMetadata(s, type) && canRemoveItem(s, i)) { int toRemove = Math.min(s.stackSize, maxRemove); s.stackSize -= toRemove; ItemStack removed = s.copy(); removed.stackSize = toRemove; if (s.stackSize > 0) { _inv.setInventorySlotContents(i, s); } else { _inv.setInventorySlotContents(i, null); } return removed; } } return null; } @Override public ItemStack getSlotContents(int slot) { return _inv.getStackInSlot(slot); } @Override public int hasItem(ItemStack type) { int quantity = 0; for (ItemStack s : getContents().values()) { if (ItemHelper.itemsEqualWithMetadata(s, type)) { quantity += s.stackSize; } } return quantity; } @Override public int findItem(ItemStack type) { int[] slots = getSlots(); if (slots == null) { return -1; } for (int i : slots) { ItemStack s = _inv.getStackInSlot(i); if (ItemHelper.itemsEqualWithMetadata(s, type)) { return i; } } return -1; } @Override public int[] getSlots() { if (_inv.getSizeInventory() != _cachedSize) { _cachedSize = _inv.getSizeInventory(); _cachedSlots = new int[_cachedSize]; for (int i = 0; i < _cachedSize; i++) { _cachedSlots[i] = i; } } return _cachedSlots; } @Override public Map<Integer, ItemStack> getContents() { Map<Integer, ItemStack> contents = new HashMap<Integer, ItemStack>(); for (int i : getSlots()) { contents.put(i, _inv.getStackInSlot(i)); } return contents; } }