001package net.minecraft.inventory;
002
003import net.minecraft.entity.player.EntityPlayer;
004import net.minecraft.item.ItemStack;
005
006public class InventoryCrafting implements IInventory
007{
008    /** List of the stacks in the crafting matrix. */
009    private ItemStack[] stackList;
010
011    /** the width of the crafting inventory */
012    private int inventoryWidth;
013
014    /**
015     * Class containing the callbacks for the events on_GUIClosed and on_CraftMaxtrixChanged.
016     */
017    private Container eventHandler;
018
019    public InventoryCrafting(Container par1Container, int par2, int par3)
020    {
021        int k = par2 * par3;
022        this.stackList = new ItemStack[k];
023        this.eventHandler = par1Container;
024        this.inventoryWidth = par2;
025    }
026
027    /**
028     * Returns the number of slots in the inventory.
029     */
030    public int getSizeInventory()
031    {
032        return this.stackList.length;
033    }
034
035    /**
036     * Returns the stack in slot i
037     */
038    public ItemStack getStackInSlot(int par1)
039    {
040        return par1 >= this.getSizeInventory() ? null : this.stackList[par1];
041    }
042
043    /**
044     * Returns the itemstack in the slot specified (Top left is 0, 0). Args: row, column
045     */
046    public ItemStack getStackInRowAndColumn(int par1, int par2)
047    {
048        if (par1 >= 0 && par1 < this.inventoryWidth)
049        {
050            int k = par1 + par2 * this.inventoryWidth;
051            return this.getStackInSlot(k);
052        }
053        else
054        {
055            return null;
056        }
057    }
058
059    /**
060     * Returns the name of the inventory.
061     */
062    public String getInvName()
063    {
064        return "container.crafting";
065    }
066
067    /**
068     * If this returns false, the inventory name will be used as an unlocalized name, and translated into the player's
069     * language. Otherwise it will be used directly.
070     */
071    public boolean isInvNameLocalized()
072    {
073        return false;
074    }
075
076    /**
077     * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
078     * like when you close a workbench GUI.
079     */
080    public ItemStack getStackInSlotOnClosing(int par1)
081    {
082        if (this.stackList[par1] != null)
083        {
084            ItemStack itemstack = this.stackList[par1];
085            this.stackList[par1] = null;
086            return itemstack;
087        }
088        else
089        {
090            return null;
091        }
092    }
093
094    /**
095     * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
096     * new stack.
097     */
098    public ItemStack decrStackSize(int par1, int par2)
099    {
100        if (this.stackList[par1] != null)
101        {
102            ItemStack itemstack;
103
104            if (this.stackList[par1].stackSize <= par2)
105            {
106                itemstack = this.stackList[par1];
107                this.stackList[par1] = null;
108                this.eventHandler.onCraftMatrixChanged(this);
109                return itemstack;
110            }
111            else
112            {
113                itemstack = this.stackList[par1].splitStack(par2);
114
115                if (this.stackList[par1].stackSize == 0)
116                {
117                    this.stackList[par1] = null;
118                }
119
120                this.eventHandler.onCraftMatrixChanged(this);
121                return itemstack;
122            }
123        }
124        else
125        {
126            return null;
127        }
128    }
129
130    /**
131     * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
132     */
133    public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
134    {
135        this.stackList[par1] = par2ItemStack;
136        this.eventHandler.onCraftMatrixChanged(this);
137    }
138
139    /**
140     * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
141     * this more of a set than a get?*
142     */
143    public int getInventoryStackLimit()
144    {
145        return 64;
146    }
147
148    /**
149     * Called when an the contents of an Inventory change, usually
150     */
151    public void onInventoryChanged() {}
152
153    /**
154     * Do not make give this method the name canInteractWith because it clashes with Container
155     */
156    public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer)
157    {
158        return true;
159    }
160
161    public void openChest() {}
162
163    public void closeChest() {}
164
165    /**
166     * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot.
167     */
168    public boolean isStackValidForSlot(int par1, ItemStack par2ItemStack)
169    {
170        return true;
171    }
172}