package com.jaquadro.minecraft.storagedrawers.storage; import com.jaquadro.minecraft.storagedrawers.api.event.DrawerPopulatedEvent; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.*; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.MinecraftForge; public class DrawerData extends BaseDrawerData implements IVoidable, IShroudable, IQuantifiable, IItemLockable { private static final ItemStack nullStack = new ItemStack((Item)null); private IStorageProvider storageProvider; private int slot; private ItemStack protoStack; private boolean isUnlimited; private int stackCapacity; public DrawerData (IStorageProvider provider, int slot) { storageProvider = provider; protoStack = nullStack; this.slot = slot; updateAttributeCache(); postInit(); } @Override public ItemStack getStoredItemPrototype () { if (protoStack == nullStack) return null; return protoStack; } @Override public void setStoredItem (ItemStack itemPrototype, int amount) { setStoredItem(itemPrototype, amount, true); } @Override public IDrawer setStoredItemRedir (ItemStack itemPrototype, int amount) { setStoredItem(itemPrototype, amount, true); return this; } private void setStoredItem (ItemStack itemPrototype, int amount, boolean mark) { if (itemPrototype == null) { setStoredItemCount(0, false, true); protoStack = nullStack; DrawerPopulatedEvent event = new DrawerPopulatedEvent(this); MinecraftForge.EVENT_BUS.post(event); if (mark) storageProvider.markDirty(slot); return; } protoStack = itemPrototype.copy(); protoStack.stackSize = 0; refreshOreDictMatches(); setStoredItemCount(amount, mark, false); DrawerPopulatedEvent event = new DrawerPopulatedEvent(this); MinecraftForge.EVENT_BUS.post(event); if (mark) storageProvider.markDirty(slot); } @Override public int getStoredItemCount () { if (protoStack != nullStack && storageProvider.isVendingUnlimited(slot)) return Integer.MAX_VALUE; return protoStack.stackSize; } @Override public void setStoredItemCount (int amount) { setStoredItemCount(amount, true, true); } public void setStoredItemCount (int amount, boolean mark, boolean clearOnEmpty) { if (storageProvider.isVendingUnlimited(slot)) return; protoStack.stackSize = amount; if (protoStack.stackSize > getMaxCapacity()) protoStack.stackSize = getMaxCapacity(); if (amount == 0) { if (clearOnEmpty) { if (!storageProvider.isLocked(slot, LockAttribute.LOCK_POPULATED)) reset(); if (mark) storageProvider.markDirty(slot); } } else if (mark) storageProvider.markAmountDirty(slot); } @Override public int getMaxCapacity () { return getMaxCapacity(protoStack); } @Override public int getMaxCapacity (ItemStack itemPrototype) { if (itemPrototype == null || itemPrototype.getItem() == null) return 0; if (isUnlimited) return Integer.MAX_VALUE; return itemPrototype.getItem().getItemStackLimit(itemPrototype) * stackCapacity; } @Override public int getRemainingCapacity () { if (protoStack.getItem() == null) return 0; if (storageProvider.isVendingUnlimited(slot)) return Integer.MAX_VALUE; return getMaxCapacity() - getStoredItemCount(); } @Override public int getStoredItemStackSize () { if (protoStack.getItem() == null) return 0; return protoStack.getItem().getItemStackLimit(protoStack); } @Override protected int getItemCapacityForInventoryStack () { if (storageProvider.isVoid(slot)) return Integer.MAX_VALUE; else return getMaxCapacity(); } @Override public boolean canItemBeStored (ItemStack itemPrototype) { if (protoStack == nullStack && !isItemLocked(LockAttribute.LOCK_EMPTY)) return true; return areItemsEqual(itemPrototype); } @Override public boolean canItemBeExtracted (ItemStack itemPrototype) { if (protoStack == nullStack) return false; return areItemsEqual(itemPrototype); } @Override public boolean isEmpty () { return protoStack == nullStack; } @Override public void attributeChanged () { updateAttributeCache(); } private void updateAttributeCache () { isUnlimited = storageProvider.isStorageUnlimited(slot) || storageProvider.isVendingUnlimited(slot); stackCapacity = storageProvider.getSlotStackCapacity(slot); } public void writeToNBT (NBTTagCompound tag) { if (protoStack.getItem() != null) { tag.setShort("Item", (short) Item.getIdFromItem(protoStack.getItem())); tag.setShort("Meta", (short) protoStack.getItemDamage()); tag.setInteger("Count", protoStack.stackSize); if (protoStack.getTagCompound() != null) tag.setTag("Tags", protoStack.getTagCompound()); } } public void readFromNBT (NBTTagCompound tag) { if (tag.hasKey("Item") && tag.hasKey("Count")) { Item item = Item.getItemById(tag.getShort("Item")); if (item != null) { ItemStack stack = new ItemStack(item); stack.setItemDamage(tag.getShort("Meta")); if (tag.hasKey("Tags")) stack.setTagCompound(tag.getCompoundTag("Tags")); setStoredItem(stack, tag.getInteger("Count"), false); } else { reset(); } } else { reset(); } } @Override protected void reset () { protoStack = nullStack; super.reset(); DrawerPopulatedEvent event = new DrawerPopulatedEvent(this); MinecraftForge.EVENT_BUS.post(event); } @Override public boolean isVoid () { return storageProvider.isVoid(slot); } @Override public boolean isShrouded () { return storageProvider.isShrouded(slot); } @Override public boolean setIsShrouded (boolean state) { return storageProvider.setIsShrouded(slot, state); } @Override public boolean isShowingQuantity () { return storageProvider.isShowingQuantity(slot); } @Override public boolean setIsShowingQuantity (boolean state) { return storageProvider.setIsShowingQuantity(slot, state); } @Override public boolean isItemLocked (LockAttribute attr) { return storageProvider.isLocked(slot, attr); } @Override public boolean canItemLock (LockAttribute attr) { return false; } @Override public void setItemLocked (LockAttribute attr, boolean isLocked) { } }