001 package net.minecraft.inventory;
002
003 import net.minecraft.entity.player.EntityPlayer;
004 import net.minecraft.item.ItemStack;
005
006 public class InventoryLargeChest implements IInventory
007 {
008 /** Name of the chest. */
009 private String name;
010
011 /** Inventory object corresponding to double chest upper part */
012 private IInventory upperChest;
013
014 /** Inventory object corresponding to double chest lower part */
015 private IInventory lowerChest;
016
017 public InventoryLargeChest(String par1Str, IInventory par2IInventory, IInventory par3IInventory)
018 {
019 this.name = par1Str;
020
021 if (par2IInventory == null)
022 {
023 par2IInventory = par3IInventory;
024 }
025
026 if (par3IInventory == null)
027 {
028 par3IInventory = par2IInventory;
029 }
030
031 this.upperChest = par2IInventory;
032 this.lowerChest = par3IInventory;
033 }
034
035 /**
036 * Returns the number of slots in the inventory.
037 */
038 public int getSizeInventory()
039 {
040 return this.upperChest.getSizeInventory() + this.lowerChest.getSizeInventory();
041 }
042
043 /**
044 * Return whether the given inventory is part of this large chest.
045 */
046 public boolean isPartOfLargeChest(IInventory par1IInventory)
047 {
048 return this.upperChest == par1IInventory || this.lowerChest == par1IInventory;
049 }
050
051 /**
052 * Returns the name of the inventory.
053 */
054 public String getInvName()
055 {
056 return this.name;
057 }
058
059 /**
060 * Returns the stack in slot i
061 */
062 public ItemStack getStackInSlot(int par1)
063 {
064 return par1 >= this.upperChest.getSizeInventory() ? this.lowerChest.getStackInSlot(par1 - this.upperChest.getSizeInventory()) : this.upperChest.getStackInSlot(par1);
065 }
066
067 /**
068 * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
069 * new stack.
070 */
071 public ItemStack decrStackSize(int par1, int par2)
072 {
073 return par1 >= this.upperChest.getSizeInventory() ? this.lowerChest.decrStackSize(par1 - this.upperChest.getSizeInventory(), par2) : this.upperChest.decrStackSize(par1, par2);
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 return par1 >= this.upperChest.getSizeInventory() ? this.lowerChest.getStackInSlotOnClosing(par1 - this.upperChest.getSizeInventory()) : this.upperChest.getStackInSlotOnClosing(par1);
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 if (par1 >= this.upperChest.getSizeInventory())
091 {
092 this.lowerChest.setInventorySlotContents(par1 - this.upperChest.getSizeInventory(), par2ItemStack);
093 }
094 else
095 {
096 this.upperChest.setInventorySlotContents(par1, par2ItemStack);
097 }
098 }
099
100 /**
101 * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
102 * this more of a set than a get?*
103 */
104 public int getInventoryStackLimit()
105 {
106 return this.upperChest.getInventoryStackLimit();
107 }
108
109 /**
110 * Called when an the contents of an Inventory change, usually
111 */
112 public void onInventoryChanged()
113 {
114 this.upperChest.onInventoryChanged();
115 this.lowerChest.onInventoryChanged();
116 }
117
118 /**
119 * Do not make give this method the name canInteractWith because it clashes with Container
120 */
121 public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer)
122 {
123 return this.upperChest.isUseableByPlayer(par1EntityPlayer) && this.lowerChest.isUseableByPlayer(par1EntityPlayer);
124 }
125
126 public void openChest()
127 {
128 this.upperChest.openChest();
129 this.lowerChest.openChest();
130 }
131
132 public void closeChest()
133 {
134 this.upperChest.closeChest();
135 this.lowerChest.closeChest();
136 }
137 }