001 package net.minecraft.src;
002
003 import cpw.mods.fml.common.Side;
004 import cpw.mods.fml.common.asm.SideOnly;
005 import java.util.Iterator;
006 import java.util.Map;
007
008 public class ContainerRepair extends Container
009 {
010 private IInventory field_82852_f = new InventoryCraftResult();
011 private IInventory field_82853_g = new InventoryRepair(this, "Repair", 2);
012 private World field_82860_h;
013 private int field_82861_i;
014 private int field_82858_j;
015 private int field_82859_k;
016 public int field_82854_e = 0;
017 private int field_82856_l = 0;
018 private String field_82857_m;
019 private final EntityPlayer field_82855_n;
020
021 public ContainerRepair(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5, EntityPlayer par6EntityPlayer)
022 {
023 this.field_82860_h = par2World;
024 this.field_82861_i = par3;
025 this.field_82858_j = par4;
026 this.field_82859_k = par5;
027 this.field_82855_n = par6EntityPlayer;
028 this.addSlotToContainer(new Slot(this.field_82853_g, 0, 27, 47));
029 this.addSlotToContainer(new Slot(this.field_82853_g, 1, 76, 47));
030 this.addSlotToContainer(new SlotRepair(this, this.field_82852_f, 2, 134, 47, par2World, par3, par4, par5));
031 int var7;
032
033 for (var7 = 0; var7 < 3; ++var7)
034 {
035 for (int var8 = 0; var8 < 9; ++var8)
036 {
037 this.addSlotToContainer(new Slot(par1InventoryPlayer, var8 + var7 * 9 + 9, 8 + var8 * 18, 84 + var7 * 18));
038 }
039 }
040
041 for (var7 = 0; var7 < 9; ++var7)
042 {
043 this.addSlotToContainer(new Slot(par1InventoryPlayer, var7, 8 + var7 * 18, 142));
044 }
045 }
046
047 /**
048 * Callback for when the crafting matrix is changed.
049 */
050 public void onCraftMatrixChanged(IInventory par1IInventory)
051 {
052 super.onCraftMatrixChanged(par1IInventory);
053
054 if (par1IInventory == this.field_82853_g)
055 {
056 this.func_82848_d();
057 }
058 }
059
060 public void func_82848_d()
061 {
062 ItemStack var1 = this.field_82853_g.getStackInSlot(0);
063 this.field_82854_e = 0;
064 int var2 = 0;
065 byte var3 = 0;
066
067 if (var1 == null)
068 {
069 this.field_82852_f.setInventorySlotContents(0, (ItemStack)null);
070 this.field_82854_e = 0;
071 }
072 else
073 {
074 ItemStack var4 = var1.copy();
075 ItemStack var5 = this.field_82853_g.getStackInSlot(1);
076 Map var6 = EnchantmentHelper.func_82781_a(var4);
077 int var17 = var3 + var1.func_82838_A() + (var5 == null ? 0 : var5.func_82838_A());
078 this.field_82856_l = 0;
079 int var7;
080 int var8;
081 int var9;
082 int var11;
083 Iterator var19;
084 Enchantment var20;
085
086 if (var5 != null)
087 {
088 if (var4.isItemStackDamageable() && Item.itemsList[var4.itemID].func_82789_a(var1, var5))
089 {
090 var7 = Math.min(var4.getItemDamageForDisplay(), var4.getMaxDamage() / 4);
091
092 if (var7 <= 0)
093 {
094 this.field_82852_f.setInventorySlotContents(0, (ItemStack)null);
095 this.field_82854_e = 0;
096 return;
097 }
098
099 for (var8 = 0; var7 > 0 && var8 < var5.stackSize; ++var8)
100 {
101 var9 = var4.getItemDamageForDisplay() - var7;
102 var4.setItemDamage(var9);
103 var2 += Math.max(1, var7 / 100) + var6.size();
104 var7 = Math.min(var4.getItemDamageForDisplay(), var4.getMaxDamage() / 4);
105 }
106
107 this.field_82856_l = var8;
108 }
109 else
110 {
111 if (var4.itemID != var5.itemID || !var4.isItemStackDamageable())
112 {
113 this.field_82852_f.setInventorySlotContents(0, (ItemStack)null);
114 this.field_82854_e = 0;
115 return;
116 }
117
118 if (var4.isItemStackDamageable())
119 {
120 var7 = var1.getMaxDamage() - var1.getItemDamageForDisplay();
121 var8 = var5.getMaxDamage() - var5.getItemDamageForDisplay();
122 var9 = var8 + var4.getMaxDamage() * 12 / 100;
123 int var10 = var7 + var9;
124 var11 = var4.getMaxDamage() - var10;
125
126 if (var11 < 0)
127 {
128 var11 = 0;
129 }
130
131 if (var11 < var4.getItemDamage())
132 {
133 var4.setItemDamage(var11);
134 var2 += Math.max(1, var9 / 100);
135 }
136 }
137
138 Map var18 = EnchantmentHelper.func_82781_a(var5);
139 var19 = var18.keySet().iterator();
140
141 while (var19.hasNext())
142 {
143 var9 = ((Integer)var19.next()).intValue();
144 var20 = Enchantment.enchantmentsList[var9];
145 var11 = var6.containsKey(Integer.valueOf(var9)) ? ((Integer)var6.get(Integer.valueOf(var9))).intValue() : 0;
146 int var12 = ((Integer)var18.get(Integer.valueOf(var9))).intValue();
147 int var10000;
148
149 if (var11 == var12)
150 {
151 ++var12;
152 var10000 = var12;
153 }
154 else
155 {
156 var10000 = Math.max(var12, var11);
157 }
158
159 var12 = var10000;
160 int var13 = var12 - var11;
161 boolean var14 = true;
162 Iterator var15 = var6.keySet().iterator();
163
164 while (var15.hasNext())
165 {
166 int var16 = ((Integer)var15.next()).intValue();
167
168 if (var16 != var9 && !var20.canApplyTogether(Enchantment.enchantmentsList[var16]))
169 {
170 var14 = false;
171 var2 += var13;
172 }
173 }
174
175 if (var14)
176 {
177 if (var12 > var20.getMaxLevel())
178 {
179 var12 = var20.getMaxLevel();
180 }
181
182 var6.put(Integer.valueOf(var9), Integer.valueOf(var12));
183 byte var22 = 0;
184
185 switch (var20.getWeight())
186 {
187 case 1:
188 var22 = 8;
189 break;
190 case 2:
191 var22 = 4;
192 case 3:
193 case 4:
194 case 6:
195 case 7:
196 case 8:
197 case 9:
198 default:
199 break;
200 case 5:
201 var22 = 2;
202 break;
203 case 10:
204 var22 = 1;
205 }
206
207 var2 += var22 * var13;
208 }
209 }
210 }
211 }
212
213 if (this.field_82857_m != null && !this.field_82857_m.equalsIgnoreCase(var1.func_82833_r()) && this.field_82857_m.length() > 0)
214 {
215 var7 = var1.isItemStackDamageable() ? 7 : var1.stackSize * 5;
216 var2 += var7;
217
218 if (var1.func_82837_s())
219 {
220 var17 += var7 / 2;
221 }
222
223 var4.func_82834_c(this.field_82857_m);
224 }
225
226 var7 = 0;
227 byte var21;
228
229 for (var19 = var6.keySet().iterator(); var19.hasNext(); var17 += var7 + var11 * var21)
230 {
231 var9 = ((Integer)var19.next()).intValue();
232 var20 = Enchantment.enchantmentsList[var9];
233 var11 = ((Integer)var6.get(Integer.valueOf(var9))).intValue();
234 var21 = 0;
235 ++var7;
236
237 switch (var20.getWeight())
238 {
239 case 1:
240 var21 = 8;
241 break;
242 case 2:
243 var21 = 4;
244 case 3:
245 case 4:
246 case 6:
247 case 7:
248 case 8:
249 case 9:
250 default:
251 break;
252 case 5:
253 var21 = 2;
254 break;
255 case 10:
256 var21 = 1;
257 }
258 }
259
260 this.field_82854_e = var17 + var2;
261
262 if (var2 <= 0)
263 {
264 var4 = null;
265 }
266
267 if (this.field_82854_e >= 40 && !this.field_82855_n.capabilities.isCreativeMode)
268 {
269 var4 = null;
270 }
271
272 if (var4 != null)
273 {
274 var8 = var4.func_82838_A();
275
276 if (var5 != null && var8 < var5.func_82838_A())
277 {
278 var8 = var5.func_82838_A();
279 }
280
281 var8 += 2;
282 var4.func_82841_c(var8);
283 EnchantmentHelper.func_82782_a(var6, var4);
284 }
285
286 this.field_82852_f.setInventorySlotContents(0, var4);
287 this.updateCraftingResults();
288 }
289 }
290
291 public void addCraftingToCrafters(ICrafting par1ICrafting)
292 {
293 super.addCraftingToCrafters(par1ICrafting);
294 par1ICrafting.updateCraftingInventoryInfo(this, 0, this.field_82854_e);
295 }
296
297 /**
298 * Callback for when the crafting gui is closed.
299 */
300 public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
301 {
302 super.onCraftGuiClosed(par1EntityPlayer);
303
304 if (!this.field_82860_h.isRemote)
305 {
306 for (int var2 = 0; var2 < this.field_82853_g.getSizeInventory(); ++var2)
307 {
308 ItemStack var3 = this.field_82853_g.getStackInSlotOnClosing(var2);
309
310 if (var3 != null)
311 {
312 par1EntityPlayer.dropPlayerItem(var3);
313 }
314 }
315 }
316 }
317
318 @SideOnly(Side.CLIENT)
319 public void updateProgressBar(int par1, int par2)
320 {
321 if (par1 == 0)
322 {
323 this.field_82854_e = par2;
324 }
325 }
326
327 public boolean canInteractWith(EntityPlayer par1EntityPlayer)
328 {
329 return this.field_82860_h.getBlockId(this.field_82861_i, this.field_82858_j, this.field_82859_k) != Block.field_82510_ck.blockID ? false : par1EntityPlayer.getDistanceSq((double)this.field_82861_i + 0.5D, (double)this.field_82858_j + 0.5D, (double)this.field_82859_k + 0.5D) <= 64.0D;
330 }
331
332 public ItemStack func_82846_b(EntityPlayer par1EntityPlayer, int par2)
333 {
334 ItemStack var3 = null;
335 Slot var4 = (Slot)this.inventorySlots.get(par2);
336
337 if (var4 != null && var4.getHasStack())
338 {
339 ItemStack var5 = var4.getStack();
340 var3 = var5.copy();
341
342 if (par2 == 2)
343 {
344 if (!this.mergeItemStack(var5, 3, 39, true))
345 {
346 return null;
347 }
348
349 var4.onSlotChange(var5, var3);
350 }
351 else if (par2 != 0 && par2 != 1)
352 {
353 if (par2 >= 3 && par2 < 39 && !this.mergeItemStack(var5, 0, 2, false))
354 {
355 return null;
356 }
357 }
358 else if (!this.mergeItemStack(var5, 3, 39, false))
359 {
360 return null;
361 }
362
363 if (var5.stackSize == 0)
364 {
365 var4.putStack((ItemStack)null);
366 }
367 else
368 {
369 var4.onSlotChanged();
370 }
371
372 if (var5.stackSize == var3.stackSize)
373 {
374 return null;
375 }
376
377 var4.func_82870_a(par1EntityPlayer, var5);
378 }
379
380 return var3;
381 }
382
383 public void func_82850_a(String par1Str)
384 {
385 this.field_82857_m = par1Str;
386
387 if (this.getSlot(2).getHasStack())
388 {
389 this.getSlot(2).getStack().func_82834_c(this.field_82857_m);
390 }
391
392 this.func_82848_d();
393 }
394
395 static IInventory func_82851_a(ContainerRepair par0ContainerRepair)
396 {
397 return par0ContainerRepair.field_82853_g;
398 }
399
400 static int func_82849_b(ContainerRepair par0ContainerRepair)
401 {
402 return par0ContainerRepair.field_82856_l;
403 }
404 }