001    package net.minecraft.src;
002    
003    import java.util.Random;
004    
005    public class TileEntityDispenser extends TileEntity implements IInventory
006    {
007        private ItemStack[] dispenserContents = new ItemStack[9];
008    
009        /**
010         * random number generator for instance. Used in random item stack selection.
011         */
012        private Random dispenserRandom = new Random();
013    
014        /**
015         * Returns the number of slots in the inventory.
016         */
017        public int getSizeInventory()
018        {
019            return 9;
020        }
021    
022        /**
023         * Returns the stack in slot i
024         */
025        public ItemStack getStackInSlot(int par1)
026        {
027            return this.dispenserContents[par1];
028        }
029    
030        /**
031         * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
032         * new stack.
033         */
034        public ItemStack decrStackSize(int par1, int par2)
035        {
036            if (this.dispenserContents[par1] != null)
037            {
038                ItemStack var3;
039    
040                if (this.dispenserContents[par1].stackSize <= par2)
041                {
042                    var3 = this.dispenserContents[par1];
043                    this.dispenserContents[par1] = null;
044                    this.onInventoryChanged();
045                    return var3;
046                }
047                else
048                {
049                    var3 = this.dispenserContents[par1].splitStack(par2);
050    
051                    if (this.dispenserContents[par1].stackSize == 0)
052                    {
053                        this.dispenserContents[par1] = null;
054                    }
055    
056                    this.onInventoryChanged();
057                    return var3;
058                }
059            }
060            else
061            {
062                return null;
063            }
064        }
065    
066        /**
067         * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
068         * like when you close a workbench GUI.
069         */
070        public ItemStack getStackInSlotOnClosing(int par1)
071        {
072            if (this.dispenserContents[par1] != null)
073            {
074                ItemStack var2 = this.dispenserContents[par1];
075                this.dispenserContents[par1] = null;
076                return var2;
077            }
078            else
079            {
080                return null;
081            }
082        }
083    
084        public int func_70361_i()
085        {
086            int var1 = -1;
087            int var2 = 1;
088    
089            for (int var3 = 0; var3 < this.dispenserContents.length; ++var3)
090            {
091                if (this.dispenserContents[var3] != null && this.dispenserRandom.nextInt(var2++) == 0)
092                {
093                    var1 = var3;
094                }
095            }
096    
097            return var1;
098        }
099    
100        /**
101         * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
102         */
103        public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
104        {
105            this.dispenserContents[par1] = par2ItemStack;
106    
107            if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit())
108            {
109                par2ItemStack.stackSize = this.getInventoryStackLimit();
110            }
111    
112            this.onInventoryChanged();
113        }
114    
115        public int func_70360_a(ItemStack par1ItemStack)
116        {
117            for (int var2 = 0; var2 < this.dispenserContents.length; ++var2)
118            {
119                if (this.dispenserContents[var2] == null || this.dispenserContents[var2].itemID == 0)
120                {
121                    this.dispenserContents[var2] = par1ItemStack;
122                    return var2;
123                }
124            }
125    
126            return -1;
127        }
128    
129        /**
130         * Returns the name of the inventory.
131         */
132        public String getInvName()
133        {
134            return "container.dispenser";
135        }
136    
137        /**
138         * Reads a tile entity from NBT.
139         */
140        public void readFromNBT(NBTTagCompound par1NBTTagCompound)
141        {
142            super.readFromNBT(par1NBTTagCompound);
143            NBTTagList var2 = par1NBTTagCompound.getTagList("Items");
144            this.dispenserContents = new ItemStack[this.getSizeInventory()];
145    
146            for (int var3 = 0; var3 < var2.tagCount(); ++var3)
147            {
148                NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
149                int var5 = var4.getByte("Slot") & 255;
150    
151                if (var5 >= 0 && var5 < this.dispenserContents.length)
152                {
153                    this.dispenserContents[var5] = ItemStack.loadItemStackFromNBT(var4);
154                }
155            }
156        }
157    
158        /**
159         * Writes a tile entity to NBT.
160         */
161        public void writeToNBT(NBTTagCompound par1NBTTagCompound)
162        {
163            super.writeToNBT(par1NBTTagCompound);
164            NBTTagList var2 = new NBTTagList();
165    
166            for (int var3 = 0; var3 < this.dispenserContents.length; ++var3)
167            {
168                if (this.dispenserContents[var3] != null)
169                {
170                    NBTTagCompound var4 = new NBTTagCompound();
171                    var4.setByte("Slot", (byte)var3);
172                    this.dispenserContents[var3].writeToNBT(var4);
173                    var2.appendTag(var4);
174                }
175            }
176    
177            par1NBTTagCompound.setTag("Items", var2);
178        }
179    
180        /**
181         * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
182         * this more of a set than a get?*
183         */
184        public int getInventoryStackLimit()
185        {
186            return 64;
187        }
188    
189        /**
190         * Do not make give this method the name canInteractWith because it clashes with Container
191         */
192        public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer)
193        {
194            return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : par1EntityPlayer.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
195        }
196    
197        public void openChest() {}
198    
199        public void closeChest() {}
200    }