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    public boolean func_94042_c()
068    {
069        return false;
070    }
071
072    /**
073     * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
074     * like when you close a workbench GUI.
075     */
076    public ItemStack getStackInSlotOnClosing(int par1)
077    {
078        if (this.stackList[par1] != null)
079        {
080            ItemStack itemstack = this.stackList[par1];
081            this.stackList[par1] = null;
082            return itemstack;
083        }
084        else
085        {
086            return null;
087        }
088    }
089
090    /**
091     * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
092     * new stack.
093     */
094    public ItemStack decrStackSize(int par1, int par2)
095    {
096        if (this.stackList[par1] != null)
097        {
098            ItemStack itemstack;
099
100            if (this.stackList[par1].stackSize <= par2)
101            {
102                itemstack = this.stackList[par1];
103                this.stackList[par1] = null;
104                this.eventHandler.onCraftMatrixChanged(this);
105                return itemstack;
106            }
107            else
108            {
109                itemstack = this.stackList[par1].splitStack(par2);
110
111                if (this.stackList[par1].stackSize == 0)
112                {
113                    this.stackList[par1] = null;
114                }
115
116                this.eventHandler.onCraftMatrixChanged(this);
117                return itemstack;
118            }
119        }
120        else
121        {
122            return null;
123        }
124    }
125
126    /**
127     * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
128     */
129    public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
130    {
131        this.stackList[par1] = par2ItemStack;
132        this.eventHandler.onCraftMatrixChanged(this);
133    }
134
135    /**
136     * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
137     * this more of a set than a get?*
138     */
139    public int getInventoryStackLimit()
140    {
141        return 64;
142    }
143
144    /**
145     * Called when an the contents of an Inventory change, usually
146     */
147    public void onInventoryChanged() {}
148
149    /**
150     * Do not make give this method the name canInteractWith because it clashes with Container
151     */
152    public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer)
153    {
154        return true;
155    }
156
157    public void openChest() {}
158
159    public void closeChest() {}
160
161    public boolean func_94041_b(int par1, ItemStack par2ItemStack)
162    {
163        return true;
164    }
165}