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 /** Here comes out item you merged and/or renamed. */
011 private IInventory outputSlot = new InventoryCraftResult();
012
013 /**
014 * The 2slots where you put your items in that you want to merge and/or rename.
015 */
016 private IInventory inputSlots = new InventoryRepair(this, "Repair", 2);
017 private World theWorld;
018 private int field_82861_i;
019 private int field_82858_j;
020 private int field_82859_k;
021
022 /** The maximum cost of repairing/renaming in the anvil. */
023 public int maximumCost = 0;
024 private int field_82856_l = 0;
025 private String field_82857_m;
026
027 /** The player that has this container open. */
028 private final EntityPlayer thePlayer;
029
030 public ContainerRepair(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5, EntityPlayer par6EntityPlayer)
031 {
032 this.theWorld = par2World;
033 this.field_82861_i = par3;
034 this.field_82858_j = par4;
035 this.field_82859_k = par5;
036 this.thePlayer = par6EntityPlayer;
037 this.addSlotToContainer(new Slot(this.inputSlots, 0, 27, 47));
038 this.addSlotToContainer(new Slot(this.inputSlots, 1, 76, 47));
039 this.addSlotToContainer(new SlotRepair(this, this.outputSlot, 2, 134, 47, par2World, par3, par4, par5));
040 int var7;
041
042 for (var7 = 0; var7 < 3; ++var7)
043 {
044 for (int var8 = 0; var8 < 9; ++var8)
045 {
046 this.addSlotToContainer(new Slot(par1InventoryPlayer, var8 + var7 * 9 + 9, 8 + var8 * 18, 84 + var7 * 18));
047 }
048 }
049
050 for (var7 = 0; var7 < 9; ++var7)
051 {
052 this.addSlotToContainer(new Slot(par1InventoryPlayer, var7, 8 + var7 * 18, 142));
053 }
054 }
055
056 /**
057 * Callback for when the crafting matrix is changed.
058 */
059 public void onCraftMatrixChanged(IInventory par1IInventory)
060 {
061 super.onCraftMatrixChanged(par1IInventory);
062
063 if (par1IInventory == this.inputSlots)
064 {
065 this.func_82848_d();
066 }
067 }
068
069 public void func_82848_d()
070 {
071 ItemStack var1 = this.inputSlots.getStackInSlot(0);
072 this.maximumCost = 0;
073 int var2 = 0;
074 byte var3 = 0;
075 int var4 = 0;
076
077 if (var1 == null)
078 {
079 this.outputSlot.setInventorySlotContents(0, (ItemStack)null);
080 this.maximumCost = 0;
081 }
082 else
083 {
084 ItemStack var5 = var1.copy();
085 ItemStack var6 = this.inputSlots.getStackInSlot(1);
086 Map var7 = EnchantmentHelper.getEnchantments(var5);
087 int var18 = var3 + var1.getRepairCost() + (var6 == null ? 0 : var6.getRepairCost());
088 this.field_82856_l = 0;
089 int var8;
090 int var9;
091 int var10;
092 int var12;
093 Enchantment var21;
094 Iterator var20;
095
096 if (var6 != null)
097 {
098 if (var5.isItemStackDamageable() && Item.itemsList[var5.itemID].getIsRepairable(var1, var6))
099 {
100 var8 = Math.min(var5.getItemDamageForDisplay(), var5.getMaxDamage() / 4);
101
102 if (var8 <= 0)
103 {
104 this.outputSlot.setInventorySlotContents(0, (ItemStack)null);
105 this.maximumCost = 0;
106 return;
107 }
108
109 for (var9 = 0; var8 > 0 && var9 < var6.stackSize; ++var9)
110 {
111 var10 = var5.getItemDamageForDisplay() - var8;
112 var5.setItemDamage(var10);
113 var2 += Math.max(1, var8 / 100) + var7.size();
114 var8 = Math.min(var5.getItemDamageForDisplay(), var5.getMaxDamage() / 4);
115 }
116
117 this.field_82856_l = var9;
118 }
119 else
120 {
121 if (var5.itemID != var6.itemID || !var5.isItemStackDamageable())
122 {
123 this.outputSlot.setInventorySlotContents(0, (ItemStack)null);
124 this.maximumCost = 0;
125 return;
126 }
127
128 if (var5.isItemStackDamageable())
129 {
130 var8 = var1.getMaxDamage() - var1.getItemDamageForDisplay();
131 var9 = var6.getMaxDamage() - var6.getItemDamageForDisplay();
132 var10 = var9 + var5.getMaxDamage() * 12 / 100;
133 int var11 = var8 + var10;
134 var12 = var5.getMaxDamage() - var11;
135
136 if (var12 < 0)
137 {
138 var12 = 0;
139 }
140
141 if (var12 < var5.getItemDamage())
142 {
143 var5.setItemDamage(var12);
144 var2 += Math.max(1, var10 / 100);
145 }
146 }
147
148 Map var19 = EnchantmentHelper.getEnchantments(var6);
149 var20 = var19.keySet().iterator();
150
151 while (var20.hasNext())
152 {
153 var10 = ((Integer)var20.next()).intValue();
154 var21 = Enchantment.enchantmentsList[var10];
155 var12 = var7.containsKey(Integer.valueOf(var10)) ? ((Integer)var7.get(Integer.valueOf(var10))).intValue() : 0;
156 int var13 = ((Integer)var19.get(Integer.valueOf(var10))).intValue();
157 int var10000;
158
159 if (var12 == var13)
160 {
161 ++var13;
162 var10000 = var13;
163 }
164 else
165 {
166 var10000 = Math.max(var13, var12);
167 }
168
169 var13 = var10000;
170 int var14 = var13 - var12;
171 boolean var15 = true;
172 Iterator var16 = var7.keySet().iterator();
173
174 while (var16.hasNext())
175 {
176 int var17 = ((Integer)var16.next()).intValue();
177
178 if (var17 != var10 && !var21.canApplyTogether(Enchantment.enchantmentsList[var17]))
179 {
180 var15 = false;
181 var2 += var14;
182 }
183 }
184
185 if (var15)
186 {
187 if (var13 > var21.getMaxLevel())
188 {
189 var13 = var21.getMaxLevel();
190 }
191
192 var7.put(Integer.valueOf(var10), Integer.valueOf(var13));
193 byte var23 = 0;
194
195 switch (var21.getWeight())
196 {
197 case 1:
198 var23 = 8;
199 break;
200 case 2:
201 var23 = 4;
202 case 3:
203 case 4:
204 case 6:
205 case 7:
206 case 8:
207 case 9:
208 default:
209 break;
210 case 5:
211 var23 = 2;
212 break;
213 case 10:
214 var23 = 1;
215 }
216
217 var2 += var23 * var14;
218 }
219 }
220 }
221 }
222
223 if (this.field_82857_m != null && !this.field_82857_m.equalsIgnoreCase(var1.getDisplayName()) && this.field_82857_m.length() > 0)
224 {
225 var4 = var1.isItemStackDamageable() ? 7 : var1.stackSize * 5;
226 var2 += var4;
227
228 if (var1.hasDisplayName())
229 {
230 var18 += var4 / 2;
231 }
232
233 var5.setItemName(this.field_82857_m);
234 }
235
236 var8 = 0;
237 byte var22;
238
239 for (var20 = var7.keySet().iterator(); var20.hasNext(); var18 += var8 + var12 * var22)
240 {
241 var10 = ((Integer)var20.next()).intValue();
242 var21 = Enchantment.enchantmentsList[var10];
243 var12 = ((Integer)var7.get(Integer.valueOf(var10))).intValue();
244 var22 = 0;
245 ++var8;
246
247 switch (var21.getWeight())
248 {
249 case 1:
250 var22 = 8;
251 break;
252 case 2:
253 var22 = 4;
254 case 3:
255 case 4:
256 case 6:
257 case 7:
258 case 8:
259 case 9:
260 default:
261 break;
262 case 5:
263 var22 = 2;
264 break;
265 case 10:
266 var22 = 1;
267 }
268 }
269
270 this.maximumCost = var18 + var2;
271
272 if (var2 <= 0)
273 {
274 var5 = null;
275 }
276
277 if (var4 == var2 && var4 > 0 && this.maximumCost >= 40)
278 {
279 System.out.println("Naming an item only, cost too high; giving discount to cap cost to 39 levels");
280 this.maximumCost = 39;
281 }
282
283 if (this.maximumCost >= 40 && !this.thePlayer.capabilities.isCreativeMode)
284 {
285 var5 = null;
286 }
287
288 if (var5 != null)
289 {
290 var9 = var5.getRepairCost();
291
292 if (var6 != null && var9 < var6.getRepairCost())
293 {
294 var9 = var6.getRepairCost();
295 }
296
297 if (var5.hasDisplayName())
298 {
299 var9 -= 5;
300 }
301
302 if (var9 < 0)
303 {
304 var9 = 0;
305 }
306
307 var9 += 2;
308 var5.setRepairCost(var9);
309 EnchantmentHelper.setEnchantments(var7, var5);
310 }
311
312 this.outputSlot.setInventorySlotContents(0, var5);
313 this.updateCraftingResults();
314 }
315 }
316
317 public void addCraftingToCrafters(ICrafting par1ICrafting)
318 {
319 super.addCraftingToCrafters(par1ICrafting);
320 par1ICrafting.updateCraftingInventoryInfo(this, 0, this.maximumCost);
321 }
322
323 /**
324 * Callback for when the crafting gui is closed.
325 */
326 public void onCraftGuiClosed(EntityPlayer par1EntityPlayer)
327 {
328 super.onCraftGuiClosed(par1EntityPlayer);
329
330 if (!this.theWorld.isRemote)
331 {
332 for (int var2 = 0; var2 < this.inputSlots.getSizeInventory(); ++var2)
333 {
334 ItemStack var3 = this.inputSlots.getStackInSlotOnClosing(var2);
335
336 if (var3 != null)
337 {
338 par1EntityPlayer.dropPlayerItem(var3);
339 }
340 }
341 }
342 }
343
344 @SideOnly(Side.CLIENT)
345 public void updateProgressBar(int par1, int par2)
346 {
347 if (par1 == 0)
348 {
349 this.maximumCost = par2;
350 }
351 }
352
353 public boolean canInteractWith(EntityPlayer par1EntityPlayer)
354 {
355 return this.theWorld.getBlockId(this.field_82861_i, this.field_82858_j, this.field_82859_k) != Block.anvil.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;
356 }
357
358 /**
359 * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
360 */
361 public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
362 {
363 ItemStack var3 = null;
364 Slot var4 = (Slot)this.inventorySlots.get(par2);
365
366 if (var4 != null && var4.getHasStack())
367 {
368 ItemStack var5 = var4.getStack();
369 var3 = var5.copy();
370
371 if (par2 == 2)
372 {
373 if (!this.mergeItemStack(var5, 3, 39, true))
374 {
375 return null;
376 }
377
378 var4.onSlotChange(var5, var3);
379 }
380 else if (par2 != 0 && par2 != 1)
381 {
382 if (par2 >= 3 && par2 < 39 && !this.mergeItemStack(var5, 0, 2, false))
383 {
384 return null;
385 }
386 }
387 else if (!this.mergeItemStack(var5, 3, 39, false))
388 {
389 return null;
390 }
391
392 if (var5.stackSize == 0)
393 {
394 var4.putStack((ItemStack)null);
395 }
396 else
397 {
398 var4.onSlotChanged();
399 }
400
401 if (var5.stackSize == var3.stackSize)
402 {
403 return null;
404 }
405
406 var4.onPickupFromSlot(par1EntityPlayer, var5);
407 }
408
409 return var3;
410 }
411
412 public void func_82850_a(String par1Str)
413 {
414 this.field_82857_m = par1Str;
415
416 if (this.getSlot(2).getHasStack())
417 {
418 this.getSlot(2).getStack().setItemName(this.field_82857_m);
419 }
420
421 this.func_82848_d();
422 }
423
424 static IInventory func_82851_a(ContainerRepair par0ContainerRepair)
425 {
426 return par0ContainerRepair.inputSlots;
427 }
428
429 static int func_82849_b(ContainerRepair par0ContainerRepair)
430 {
431 return par0ContainerRepair.field_82856_l;
432 }
433 }