001 package net.minecraft.src;
002
003 public class ContainerWorkbench extends Container
004 {
005 /** The crafting matrix inventory (3x3). */
006 public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
007 public IInventory craftResult = new InventoryCraftResult();
008 private World worldObj;
009 private int posX;
010 private int posY;
011 private int posZ;
012
013 public ContainerWorkbench(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5)
014 {
015 this.worldObj = par2World;
016 this.posX = par3;
017 this.posY = par4;
018 this.posZ = par5;
019 this.addSlotToContainer(new SlotCrafting(par1InventoryPlayer.player, this.craftMatrix, this.craftResult, 0, 124, 35));
020 int var6;
021 int var7;
022
023 for (var6 = 0; var6 < 3; ++var6)
024 {
025 for (var7 = 0; var7 < 3; ++var7)
026 {
027 this.addSlotToContainer(new Slot(this.craftMatrix, var7 + var6 * 3, 30 + var7 * 18, 17 + var6 * 18));
028 }
029 }
030
031 for (var6 = 0; var6 < 3; ++var6)
032 {
033 for (var7 = 0; var7 < 9; ++var7)
034 {
035 this.addSlotToContainer(new Slot(par1InventoryPlayer, var7 + var6 * 9 + 9, 8 + var7 * 18, 84 + var6 * 18));
036 }
037 }
038
039 for (var6 = 0; var6 < 9; ++var6)
040 {
041 this.addSlotToContainer(new Slot(par1InventoryPlayer, var6, 8 + var6 * 18, 142));
042 }
043
044 this.onCraftMatrixChanged(this.craftMatrix);
045 }
046
047 /**
048 * Callback for when the crafting matrix is changed.
049 */
050 public void onCraftMatrixChanged(IInventory par1IInventory)
051 {
052 this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.craftMatrix));
053 }
054
055 /**
056 * Callback for when the crafting gui is closed.
057 */
058 public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
059 {
060 super.onCraftGuiClosed(par1EntityPlayer);
061
062 if (!this.worldObj.isRemote)
063 {
064 for (int var2 = 0; var2 < 9; ++var2)
065 {
066 ItemStack var3 = this.craftMatrix.getStackInSlotOnClosing(var2);
067
068 if (var3 != null)
069 {
070 par1EntityPlayer.dropPlayerItem(var3);
071 }
072 }
073 }
074 }
075
076 public boolean canInteractWith(EntityPlayer par1EntityPlayer)
077 {
078 return this.worldObj.getBlockId(this.posX, this.posY, this.posZ) != Block.workbench.blockID ? false : par1EntityPlayer.getDistanceSq((double)this.posX + 0.5D, (double)this.posY + 0.5D, (double)this.posZ + 0.5D) <= 64.0D;
079 }
080
081 /**
082 * Called to transfer a stack from one inventory to the other eg. when shift clicking.
083 */
084 public ItemStack transferStackInSlot(int par1)
085 {
086 ItemStack var2 = null;
087 Slot var3 = (Slot)this.inventorySlots.get(par1);
088
089 if (var3 != null && var3.getHasStack())
090 {
091 ItemStack var4 = var3.getStack();
092 var2 = var4.copy();
093
094 if (par1 == 0)
095 {
096 if (!this.mergeItemStack(var4, 10, 46, true))
097 {
098 return null;
099 }
100
101 var3.onSlotChange(var4, var2);
102 }
103 else if (par1 >= 10 && par1 < 37)
104 {
105 if (!this.mergeItemStack(var4, 37, 46, false))
106 {
107 return null;
108 }
109 }
110 else if (par1 >= 37 && par1 < 46)
111 {
112 if (!this.mergeItemStack(var4, 10, 37, false))
113 {
114 return null;
115 }
116 }
117 else if (!this.mergeItemStack(var4, 10, 46, false))
118 {
119 return null;
120 }
121
122 if (var4.stackSize == 0)
123 {
124 var3.putStack((ItemStack)null);
125 }
126 else
127 {
128 var3.onSlotChanged();
129 }
130
131 if (var4.stackSize == var2.stackSize)
132 {
133 return null;
134 }
135
136 var3.onPickupFromSlot(var4);
137 }
138
139 return var2;
140 }
141 }