package aroma1997.betterchests.container; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import aroma1997.core.container.ContainerBase; import aroma1997.core.container.slot.SlotInventoryPart; import aroma1997.core.inventory.InvUtil; import aroma1997.core.inventory.inventorypart.InventoryPartBase; import aroma1997.core.util.ItemUtil; import aroma1997.betterchests.inventories.IBetterBarrelInternal; import aroma1997.betterchests.inventories.InventoryPartBarrel; public class ContainerBarrel extends ContainerBase<IBetterBarrelInternal> { public ContainerBarrel(IBetterBarrelInternal inventory, EntityPlayer player) { super(inventory, player); addSlotToContainer(new SlotDrain(inventory.getChestPart(), 0, 72, 21)); addSlotToContainer(new SlotFill(inventory.getChestPart(), 1, 90, 21)); layoutPlayerInventory(9, 58, player); } private class SlotDrain extends SlotInventoryPart { public SlotDrain(InventoryPartBase part, int index, int xPosition, int yPosition) { super(part, index, xPosition, yPosition); } public InventoryPartBarrel getBarrel() { return (InventoryPartBarrel) part; } @Override public ItemStack decrStackSize(int amount) { ItemStack ret = getBarrel().getDummy().copy(); amount = Math.min(amount, ret.getMaxStackSize()); int gotten = 0; for (int i : getBarrel().getSlotsForFace(null)) { if (ItemUtil.areItemsSameMatchingIdDamageNbt(ret, getBarrel().getStackInSlot(i))) { gotten += getBarrel().decrStackSize(i, amount - gotten).getCount(); if (gotten >= amount) { break; } } } ret.setCount(gotten); onSlotChanged(); return ret; } @Override public int getSlotStackLimit() { return 64; } @Override public ItemStack getStack() { ItemStack ret = getBarrel().getDummy().copy(); ret.setCount(Math.min(ret.getMaxStackSize(), getBarrel().getTotalAmountOfItems())); return ret; } @Override public boolean isHere(IInventory inv, int slot) { return inv == inventory && slot == slotNumber; } @Override public boolean isItemValid(ItemStack stack) { return false; } @Override public void putStack(ItemStack stack) { decrStackSize(getStack().getCount() - stack.getCount()); } @Override public void onSlotChanged() { part.markDirty(); } } private class SlotFill extends SlotInventoryPart { public SlotFill(InventoryPartBase part, int index, int xPosition, int yPosition) { super(part, index, xPosition, yPosition); } public InventoryPartBarrel getBarrel() { return (InventoryPartBarrel) part; } @Override public ItemStack decrStackSize(int amount) { return ItemStack.EMPTY; } @Override public int getSlotStackLimit() { if (getBarrel().isItemSet()) { return getBarrel().getActualSize() * getBarrel().getDummy().getMaxStackSize() - getBarrel().getTotalAmountOfItems(); } else { return 64; } } @Override public ItemStack getStack() { return ItemStack.EMPTY; } @Override public boolean isHere(IInventory inv, int slot) { return inv == inventory && slot == slotNumber; } @Override public boolean isItemValid(ItemStack stack) { return getBarrel().isItemValidForSlot(0, stack); } @Override public void putStack(ItemStack stack) { InvUtil.putStackInInventoryInternal(stack, getBarrel(), false); onSlotChanged(); } @Override public void onSlotChanged() { part.markDirty(); } } }