    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        /** Position within background texture file, normally -1 which causes no background to be drawn. */
    024        protected int backgroundIconIndex = -1;
    025
    026        /** Background texture file assigned to this slot, if any. Vanilla "/gui/items.png" is used if this is null. */
    027        protected String texture = "/gui/items.png";
    028
    029        public Slot(IInventory par1IInventory, int par2, int par3, int par4)
    030        {
    031            this.inventory = par1IInventory;
    032            this.slotIndex = par2;
    033            this.xDisplayPosition = par3;
    034            this.yDisplayPosition = par4;
    035        }
    036
    037        /**
    038         * if par2 has more items than par1, onCrafting(item,countIncrease) is called
    039         */
    040        public void onSlotChange(ItemStack par1ItemStack, ItemStack par2ItemStack)
    041        {
    042            if (par1ItemStack != null && par2ItemStack != null)
    043            {
    044                if (par1ItemStack.itemID == par2ItemStack.itemID)
    045                {
    046                    int var3 = par2ItemStack.stackSize - par1ItemStack.stackSize;
    047
    048                    if (var3 > 0)
    049                    {
    050                        this.onCrafting(par1ItemStack, var3);
    051                    }
    052                }
    053            }
    054        }
    055
    056        /**
    057         * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
    058         * internal count then calls onCrafting(item).
    059         */
    060        protected void onCrafting(ItemStack par1ItemStack, int par2) {}
    061
    062        /**
    063         * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
    064         */
    065        protected void onCrafting(ItemStack par1ItemStack) {}
    066
    067        public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack)
    068        {
    069            this.onSlotChanged();
    070        }
    071
    072        /**
    073         * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
    074         */
    075        public boolean isItemValid(ItemStack par1ItemStack)
    076        {
    077            return true;
    078        }
    079
    080        /**
    081         * Helper fnct to get the stack in the slot.
    082         */
    083        public ItemStack getStack()
    084        {
    085            return this.inventory.getStackInSlot(this.slotIndex);
    086        }
    087
    088        /**
    089         * Returns if this slot contains a stack.
    090         */
    091        public boolean getHasStack()
    092        {
    093            return this.getStack() != null;
    094        }
    095
    096        /**
    097         * Helper method to put a stack in the slot.
    098         */
    099        public void putStack(ItemStack par1ItemStack)
    100        {
    101            this.inventory.setInventorySlotContents(this.slotIndex, par1ItemStack);
    102            this.onSlotChanged();
    103        }
    104
    105        /**
    106         * Called when the stack in a Slot changes
    107         */
    108        public void onSlotChanged()
    109        {
    110            this.inventory.onInventoryChanged();
    111        }
    112
    113        /**
    114         * Returns the maximum stack size for a given slot (usually the same as getInventoryStackLimit(), but 1 in the case
    115         * of armor slots)
    116         */
    117        public int getSlotStackLimit()
    118        {
    119            return this.inventory.getInventoryStackLimit();
    120        }
    121
    122        /**
    123         * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
    124         * stack.
    125         */
    126        public ItemStack decrStackSize(int par1)
    127        {
    128            return this.inventory.decrStackSize(this.slotIndex, par1);
    129        }
    130
    131        /**
    132         * returns true if this slot is in par2 of par1
    133         */
    134        public boolean isSlotInInventory(IInventory par1IInventory, int par2)
    135        {
    136            return par1IInventory == this.inventory && par2 == this.slotIndex;
    137        }
    138
    139        /**
    140         * Return whether this slot's stack can be taken from this slot.
    141         */
    142        public boolean canTakeStack(EntityPlayer par1EntityPlayer)
    143        {
    144            return true;
    145        }
    146
    147        @SideOnly(Side.CLIENT)
    148
    149        /**
    150         * Returns the icon index on items.png that is used as background image of the slot.
    151         */
    152        public int getBackgroundIconIndex()
    153        {
    154            return backgroundIconIndex;
    155        }
    156
    157        /**
    158         * Gets the path of the texture file to use for the background image of this slot when drawing the GUI.
    159         * @return String: The texture file that will be used in GuiContainer.drawSlotInventory for the slot background.
    160         */
    161        public String getBackgroundIconTexture()
    162        {
    163            return (texture == null ? "/gui/items.png" : texture);
    164        }
    165
    166        /**
    167         * Sets which icon index to use as the background image of the slot when it's empty.
    168         * @param iconIndex int: The index into the texture file, 0-255, or -1 for no background.
    169         */
    170        public void setBackgroundIconIndex(int iconIndex)
    171        {
    172            backgroundIconIndex = iconIndex;
    173        }
    174
    175        /**
    176         * Sets the texture file to use for the background image of the slot when it's empty.
    177         * @param textureFilename String: Path of texture file to use, or null to use "/gui/items.png"
    178         */
    179        public void setBackgroundIconTexture(String textureFilename)
    180        {
    181            texture = textureFilename;
    182        }
    183
    184        /**
    185         * Retrieves the index in the inventory for this slot, this value should typically not
    186         * be used, but can be useful for some occasions.
    187         *
    188         * @return Index in associated inventory for this slot.
    189         */
    190        public int getSlotIndex()
    191        {
    192            return slotIndex;
    193        }
    194    }