001    package net.minecraft.inventory;
002    
003    import net.minecraft.entity.player.EntityPlayer;
004    import net.minecraft.item.ItemStack;
005    
006    public class InventoryLargeChest implements IInventory
007    {
008        /** Name of the chest. */
009        private String name;
010    
011        /** Inventory object corresponding to double chest upper part */
012        private IInventory upperChest;
013    
014        /** Inventory object corresponding to double chest lower part */
015        private IInventory lowerChest;
016    
017        public InventoryLargeChest(String par1Str, IInventory par2IInventory, IInventory par3IInventory)
018        {
019            this.name = par1Str;
020    
021            if (par2IInventory == null)
022            {
023                par2IInventory = par3IInventory;
024            }
025    
026            if (par3IInventory == null)
027            {
028                par3IInventory = par2IInventory;
029            }
030    
031            this.upperChest = par2IInventory;
032            this.lowerChest = par3IInventory;
033        }
034    
035        /**
036         * Returns the number of slots in the inventory.
037         */
038        public int getSizeInventory()
039        {
040            return this.upperChest.getSizeInventory() + this.lowerChest.getSizeInventory();
041        }
042    
043        /**
044         * Return whether the given inventory is part of this large chest.
045         */
046        public boolean isPartOfLargeChest(IInventory par1IInventory)
047        {
048            return this.upperChest == par1IInventory || this.lowerChest == par1IInventory;
049        }
050    
051        /**
052         * Returns the name of the inventory.
053         */
054        public String getInvName()
055        {
056            return this.name;
057        }
058    
059        /**
060         * Returns the stack in slot i
061         */
062        public ItemStack getStackInSlot(int par1)
063        {
064            return par1 >= this.upperChest.getSizeInventory() ? this.lowerChest.getStackInSlot(par1 - this.upperChest.getSizeInventory()) : this.upperChest.getStackInSlot(par1);
065        }
066    
067        /**
068         * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
069         * new stack.
070         */
071        public ItemStack decrStackSize(int par1, int par2)
072        {
073            return par1 >= this.upperChest.getSizeInventory() ? this.lowerChest.decrStackSize(par1 - this.upperChest.getSizeInventory(), par2) : this.upperChest.decrStackSize(par1, par2);
074        }
075    
076        /**
077         * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
078         * like when you close a workbench GUI.
079         */
080        public ItemStack getStackInSlotOnClosing(int par1)
081        {
082            return par1 >= this.upperChest.getSizeInventory() ? this.lowerChest.getStackInSlotOnClosing(par1 - this.upperChest.getSizeInventory()) : this.upperChest.getStackInSlotOnClosing(par1);
083        }
084    
085        /**
086         * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
087         */
088        public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
089        {
090            if (par1 >= this.upperChest.getSizeInventory())
091            {
092                this.lowerChest.setInventorySlotContents(par1 - this.upperChest.getSizeInventory(), par2ItemStack);
093            }
094            else
095            {
096                this.upperChest.setInventorySlotContents(par1, par2ItemStack);
097            }
098        }
099    
100        /**
101         * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
102         * this more of a set than a get?*
103         */
104        public int getInventoryStackLimit()
105        {
106            return this.upperChest.getInventoryStackLimit();
107        }
108    
109        /**
110         * Called when an the contents of an Inventory change, usually
111         */
112        public void onInventoryChanged()
113        {
114            this.upperChest.onInventoryChanged();
115            this.lowerChest.onInventoryChanged();
116        }
117    
118        /**
119         * Do not make give this method the name canInteractWith because it clashes with Container
120         */
121        public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer)
122        {
123            return this.upperChest.isUseableByPlayer(par1EntityPlayer) && this.lowerChest.isUseableByPlayer(par1EntityPlayer);
124        }
125    
126        public void openChest()
127        {
128            this.upperChest.openChest();
129            this.lowerChest.openChest();
130        }
131    
132        public void closeChest()
133        {
134            this.upperChest.closeChest();
135            this.lowerChest.closeChest();
136        }
137    }