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