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