package openmods.inventory; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import openmods.api.IInventoryCallback; import openmods.utils.ItemUtils; public class GenericInventory implements IInventory { public static final String TAG_SLOT = "Slot"; public static final String TAG_ITEMS = "Items"; public static final String TAG_SIZE = "size"; protected List<IInventoryCallback> callbacks; protected String inventoryTitle; protected int slotsCount; protected ItemStack[] inventoryContents; protected boolean isInvNameLocalized; public GenericInventory(String name, boolean isInvNameLocalized, int size) { callbacks = new ArrayList<IInventoryCallback>(); this.isInvNameLocalized = isInvNameLocalized; this.slotsCount = size; this.inventoryTitle = name; this.inventoryContents = new ItemStack[size]; } public GenericInventory addCallback(IInventoryCallback callback) { callbacks.add(callback); return this; } @Override public ItemStack decrStackSize(int par1, int par2) { if (this.inventoryContents[par1] != null) { ItemStack itemstack; if (this.inventoryContents[par1].stackSize <= par2) { itemstack = this.inventoryContents[par1]; this.inventoryContents[par1] = null; onInventoryChanged(par1); return itemstack; } itemstack = this.inventoryContents[par1].splitStack(par2); if (this.inventoryContents[par1].stackSize == 0) { this.inventoryContents[par1] = null; } onInventoryChanged(par1); return itemstack; } return null; } @Override public int getInventoryStackLimit() { return 64; } @Override public int getSizeInventory() { return slotsCount; } @Override public ItemStack getStackInSlot(int i) { return this.inventoryContents[i]; } public ItemStack getStackInSlot(Enum<?> i) { return getStackInSlot(i.ordinal()); } @Override public ItemStack getStackInSlotOnClosing(int i) { if (i >= this.inventoryContents.length) { return null; } if (this.inventoryContents[i] != null) { ItemStack itemstack = this.inventoryContents[i]; this.inventoryContents[i] = null; return itemstack; } return null; } public boolean isItem(int slot, Item item) { return inventoryContents[slot] != null && inventoryContents[slot].getItem() == item; } @Override public boolean isItemValidForSlot(int i, ItemStack itemstack) { return true; } @Override public boolean isUseableByPlayer(EntityPlayer entityplayer) { return true; } public void onInventoryChanged(int slotNumber) { for (IInventoryCallback callback : callbacks) callback.onInventoryChanged(this, slotNumber); } public void clearAndSetSlotCount(int amount) { this.slotsCount = amount; inventoryContents = new ItemStack[amount]; onInventoryChanged(0); } public void readFromNBT(NBTTagCompound tag) { if (tag.hasKey(TAG_SIZE)) { this.slotsCount = tag.getInteger(TAG_SIZE); } NBTTagList nbttaglist = tag.getTagList(TAG_ITEMS, 10); inventoryContents = new ItemStack[slotsCount]; for (int i = 0; i < nbttaglist.tagCount(); i++) { NBTTagCompound stacktag = nbttaglist.getCompoundTagAt(i); int j = stacktag.getByte(TAG_SLOT); if (j >= 0 && j < inventoryContents.length) { inventoryContents[j] = ItemUtils.readStack(stacktag); } } } @Override public void setInventorySlotContents(int i, ItemStack itemstack) { this.inventoryContents[i] = itemstack; if (itemstack != null && itemstack.stackSize > getInventoryStackLimit()) { itemstack.stackSize = getInventoryStackLimit(); } onInventoryChanged(i); } public void writeToNBT(NBTTagCompound tag) { tag.setInteger(TAG_SIZE, getSizeInventory()); NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < inventoryContents.length; i++) { if (inventoryContents[i] != null) { NBTTagCompound stacktag = ItemUtils.writeStack(inventoryContents[i]); stacktag.setByte(TAG_SLOT, (byte)i); nbttaglist.appendTag(stacktag); } } tag.setTag(TAG_ITEMS, nbttaglist); } /** * This bastard never even gets called, so don't rely on it. */ @Override public void markDirty() { onInventoryChanged(0); } public void copyFrom(IInventory inventory) { for (int i = 0; i < inventory.getSizeInventory(); i++) { if (i < getSizeInventory()) { ItemStack stack = inventory.getStackInSlot(i); if (stack != null) { setInventorySlotContents(i, stack.copy()); } else { setInventorySlotContents(i, null); } } } } public List<ItemStack> contents() { return Arrays.asList(inventoryContents); } @Override public String getInventoryName() { return this.inventoryTitle; } @Override public boolean hasCustomInventoryName() { return this.isInvNameLocalized; } @Override public void openInventory() {} @Override public void closeInventory() {} }