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