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