001 package net.minecraft.src;
002
003 public class ContainerPlayer extends Container
004 {
005 /** The crafting matrix inventory. */
006 public InventoryCrafting craftMatrix = new InventoryCrafting(this, 2, 2);
007 public IInventory craftResult = new InventoryCraftResult();
008
009 /** Determines if inventory manipulation should be handled. */
010 public boolean isLocalWorld = false;
011 private final EntityPlayer thePlayer;
012
013 public ContainerPlayer(InventoryPlayer par1InventoryPlayer, boolean par2, EntityPlayer par3EntityPlayer)
014 {
015 this.isLocalWorld = par2;
016 this.thePlayer = par3EntityPlayer;
017 this.addSlotToContainer(new SlotCrafting(par1InventoryPlayer.player, this.craftMatrix, this.craftResult, 0, 144, 36));
018 int var4;
019 int var5;
020
021 for (var4 = 0; var4 < 2; ++var4)
022 {
023 for (var5 = 0; var5 < 2; ++var5)
024 {
025 this.addSlotToContainer(new Slot(this.craftMatrix, var5 + var4 * 2, 88 + var5 * 18, 26 + var4 * 18));
026 }
027 }
028
029 for (var4 = 0; var4 < 4; ++var4)
030 {
031 this.addSlotToContainer(new SlotArmor(this, par1InventoryPlayer, par1InventoryPlayer.getSizeInventory() - 1 - var4, 8, 8 + var4 * 18, var4));
032 }
033
034 for (var4 = 0; var4 < 3; ++var4)
035 {
036 for (var5 = 0; var5 < 9; ++var5)
037 {
038 this.addSlotToContainer(new Slot(par1InventoryPlayer, var5 + (var4 + 1) * 9, 8 + var5 * 18, 84 + var4 * 18));
039 }
040 }
041
042 for (var4 = 0; var4 < 9; ++var4)
043 {
044 this.addSlotToContainer(new Slot(par1InventoryPlayer, var4, 8 + var4 * 18, 142));
045 }
046
047 this.onCraftMatrixChanged(this.craftMatrix);
048 }
049
050 /**
051 * Callback for when the crafting matrix is changed.
052 */
053 public void onCraftMatrixChanged(IInventory par1IInventory)
054 {
055 this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.craftMatrix, this.thePlayer.worldObj));
056 }
057
058 /**
059 * Callback for when the crafting gui is closed.
060 */
061 public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
062 {
063 super.onCraftGuiClosed(par1EntityPlayer);
064
065 for (int var2 = 0; var2 < 4; ++var2)
066 {
067 ItemStack var3 = this.craftMatrix.getStackInSlotOnClosing(var2);
068
069 if (var3 != null)
070 {
071 par1EntityPlayer.dropPlayerItem(var3);
072 }
073 }
074
075 this.craftResult.setInventorySlotContents(0, (ItemStack)null);
076 }
077
078 public boolean canInteractWith(EntityPlayer par1EntityPlayer)
079 {
080 return true;
081 }
082
083 /**
084 * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
085 */
086 public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
087 {
088 ItemStack var3 = null;
089 Slot var4 = (Slot)this.inventorySlots.get(par2);
090
091 if (var4 != null && var4.getHasStack())
092 {
093 ItemStack var5 = var4.getStack();
094 var3 = var5.copy();
095
096 if (par2 == 0)
097 {
098 if (!this.mergeItemStack(var5, 9, 45, true))
099 {
100 return null;
101 }
102
103 var4.onSlotChange(var5, var3);
104 }
105 else if (par2 >= 1 && par2 < 5)
106 {
107 if (!this.mergeItemStack(var5, 9, 45, false))
108 {
109 return null;
110 }
111 }
112 else if (par2 >= 5 && par2 < 9)
113 {
114 if (!this.mergeItemStack(var5, 9, 45, false))
115 {
116 return null;
117 }
118 }
119 else if (var3.getItem() instanceof ItemArmor && !((Slot)this.inventorySlots.get(5 + ((ItemArmor)var3.getItem()).armorType)).getHasStack())
120 {
121 int var6 = 5 + ((ItemArmor)var3.getItem()).armorType;
122
123 if (!this.mergeItemStack(var5, var6, var6 + 1, false))
124 {
125 return null;
126 }
127 }
128 else if (par2 >= 9 && par2 < 36)
129 {
130 if (!this.mergeItemStack(var5, 36, 45, false))
131 {
132 return null;
133 }
134 }
135 else if (par2 >= 36 && par2 < 45)
136 {
137 if (!this.mergeItemStack(var5, 9, 36, false))
138 {
139 return null;
140 }
141 }
142 else if (!this.mergeItemStack(var5, 9, 45, false))
143 {
144 return null;
145 }
146
147 if (var5.stackSize == 0)
148 {
149 var4.putStack((ItemStack)null);
150 }
151 else
152 {
153 var4.onSlotChanged();
154 }
155
156 if (var5.stackSize == var3.stackSize)
157 {
158 return null;
159 }
160
161 var4.onPickupFromSlot(par1EntityPlayer, var5);
162 }
163
164 return var3;
165 }
166 }