    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 getRandomStackFromInventory()
    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    }