001    package net.minecraft.inventory;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.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    }