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    }