    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005
    006    public class Slot
    007    {
    008        /** The index of the slot in the inventory. */
    009        private final int slotIndex;
    010
    011        /** The inventory we want to extract a slot from. */
    012        public final IInventory inventory;
    013
    014        /** the id of the slot(also the index in the inventory arraylist) */
    015        public int slotNumber;
    016
    017        /** display position of the inventory slot on the screen x axis */
    018        public int xDisplayPosition;
    019
    020        /** display position of the inventory slot on the screen y axis */
    021        public int yDisplayPosition;
    022
    023        public Slot(IInventory par1IInventory, int par2, int par3, int par4)
    024        {
    025            this.inventory = par1IInventory;
    026            this.slotIndex = par2;
    027            this.xDisplayPosition = par3;
    028            this.yDisplayPosition = par4;
    029        }
    030
    031        /**
    032         * if par2 has more items than par1, onCrafting(item,countIncrease) is called
    033         */
    034        public void onSlotChange(ItemStack par1ItemStack, ItemStack par2ItemStack)
    035        {
    036            if (par1ItemStack != null && par2ItemStack != null)
    037            {
    038                if (par1ItemStack.itemID == par2ItemStack.itemID)
    039                {
    040                    int var3 = par2ItemStack.stackSize - par1ItemStack.stackSize;
    041
    042                    if (var3 > 0)
    043                    {
    044                        this.onCrafting(par1ItemStack, var3);
    045                    }
    046                }
    047            }
    048        }
    049
    050        /**
    051         * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
    052         * internal count then calls onCrafting(item).
    053         */
    054        protected void onCrafting(ItemStack par1ItemStack, int par2) {}
    055
    056        /**
    057         * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
    058         */
    059        protected void onCrafting(ItemStack par1ItemStack) {}
    060
    061        public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack)
    062        {
    063            this.onSlotChanged();
    064        }
    065
    066        /**
    067         * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
    068         */
    069        public boolean isItemValid(ItemStack par1ItemStack)
    070        {
    071            return true;
    072        }
    073
    074        /**
    075         * Helper fnct to get the stack in the slot.
    076         */
    077        public ItemStack getStack()
    078        {
    079            return this.inventory.getStackInSlot(this.slotIndex);
    080        }
    081
    082        /**
    083         * Returns if this slot contains a stack.
    084         */
    085        public boolean getHasStack()
    086        {
    087            return this.getStack() != null;
    088        }
    089
    090        /**
    091         * Helper method to put a stack in the slot.
    092         */
    093        public void putStack(ItemStack par1ItemStack)
    094        {
    095            this.inventory.setInventorySlotContents(this.slotIndex, par1ItemStack);
    096            this.onSlotChanged();
    097        }
    098
    099        /**
    100         * Called when the stack in a Slot changes
    101         */
    102        public void onSlotChanged()
    103        {
    104            this.inventory.onInventoryChanged();
    105        }
    106
    107        /**
    108         * Returns the maximum stack size for a given slot (usually the same as getInventoryStackLimit(), but 1 in the case
    109         * of armor slots)
    110         */
    111        public int getSlotStackLimit()
    112        {
    113            return this.inventory.getInventoryStackLimit();
    114        }
    115
    116        /**
    117         * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
    118         * stack.
    119         */
    120        public ItemStack decrStackSize(int par1)
    121        {
    122            return this.inventory.decrStackSize(this.slotIndex, par1);
    123        }
    124
    125        /**
    126         * returns true if this slot is in par2 of par1
    127         */
    128        public boolean isSlotInInventory(IInventory par1IInventory, int par2)
    129        {
    130            return par1IInventory == this.inventory && par2 == this.slotIndex;
    131        }
    132
    133        /**
    134         * Return whether this slot's stack can be taken from this slot.
    135         */
    136        public boolean canTakeStack(EntityPlayer par1EntityPlayer)
    137        {
    138            return true;
    139        }
    140
    141        @SideOnly(Side.CLIENT)
    142
    143        /**
    144         * Returns the icon index on items.png that is used as background image of the slot.
    145         */
    146        public int getBackgroundIconIndex()
    147        {
    148            return -1;
    149        }
    150    }