001 package net.minecraft.inventory; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.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 boolean var8 = false; 096 int var19 = var3 + var1.getRepairCost() + (var6 == null ? 0 : var6.getRepairCost()); 097 this.field_82856_l = 0; 098 int var9; 099 int var10; 100 int var11; 101 int var13; 102 int var14; 103 Iterator var21; 104 Enchantment var22; 105 106 if (var6 != null) 107 { 108 var8 = var6.itemID == Item.field_92053_bW.shiftedIndex && Item.field_92053_bW.func_92056_g(var6).tagCount() > 0; 109 110 if (var5.isItemStackDamageable() && Item.itemsList[var5.itemID].getIsRepairable(var1, var6)) 111 { 112 var9 = Math.min(var5.getItemDamageForDisplay(), var5.getMaxDamage() / 4); 113 114 if (var9 <= 0) 115 { 116 this.outputSlot.setInventorySlotContents(0, (ItemStack)null); 117 this.maximumCost = 0; 118 return; 119 } 120 121 for (var10 = 0; var9 > 0 && var10 < var6.stackSize; ++var10) 122 { 123 var11 = var5.getItemDamageForDisplay() - var9; 124 var5.setItemDamage(var11); 125 var2 += Math.max(1, var9 / 100) + var7.size(); 126 var9 = Math.min(var5.getItemDamageForDisplay(), var5.getMaxDamage() / 4); 127 } 128 129 this.field_82856_l = var10; 130 } 131 else 132 { 133 if (!var8 && (var5.itemID != var6.itemID || !var5.isItemStackDamageable())) 134 { 135 this.outputSlot.setInventorySlotContents(0, (ItemStack)null); 136 this.maximumCost = 0; 137 return; 138 } 139 140 if (var5.isItemStackDamageable() && !var8) 141 { 142 var9 = var1.getMaxDamage() - var1.getItemDamageForDisplay(); 143 var10 = var6.getMaxDamage() - var6.getItemDamageForDisplay(); 144 var11 = var10 + var5.getMaxDamage() * 12 / 100; 145 int var12 = var9 + var11; 146 var13 = var5.getMaxDamage() - var12; 147 148 if (var13 < 0) 149 { 150 var13 = 0; 151 } 152 153 if (var13 < var5.getItemDamage()) 154 { 155 var5.setItemDamage(var13); 156 var2 += Math.max(1, var11 / 100); 157 } 158 } 159 160 Map var20 = EnchantmentHelper.getEnchantments(var6); 161 var21 = var20.keySet().iterator(); 162 163 while (var21.hasNext()) 164 { 165 var11 = ((Integer)var21.next()).intValue(); 166 var22 = Enchantment.enchantmentsList[var11]; 167 var13 = var7.containsKey(Integer.valueOf(var11)) ? ((Integer)var7.get(Integer.valueOf(var11))).intValue() : 0; 168 var14 = ((Integer)var20.get(Integer.valueOf(var11))).intValue(); 169 int var10000; 170 171 if (var13 == var14) 172 { 173 ++var14; 174 var10000 = var14; 175 } 176 else 177 { 178 var10000 = Math.max(var14, var13); 179 } 180 181 var14 = var10000; 182 int var15 = var14 - var13; 183 boolean var16 = var22.func_92037_a(var1); 184 185 if (this.thePlayer.capabilities.isCreativeMode) 186 { 187 var16 = true; 188 } 189 190 Iterator var17 = var7.keySet().iterator(); 191 192 while (var17.hasNext()) 193 { 194 int var18 = ((Integer)var17.next()).intValue(); 195 196 if (var18 != var11 && !var22.canApplyTogether(Enchantment.enchantmentsList[var18])) 197 { 198 var16 = false; 199 var2 += var15; 200 } 201 } 202 203 if (var16) 204 { 205 if (var14 > var22.getMaxLevel()) 206 { 207 var14 = var22.getMaxLevel(); 208 } 209 210 var7.put(Integer.valueOf(var11), Integer.valueOf(var14)); 211 int var23 = 0; 212 213 switch (var22.getWeight()) 214 { 215 case 1: 216 var23 = 8; 217 break; 218 case 2: 219 var23 = 4; 220 case 3: 221 case 4: 222 case 6: 223 case 7: 224 case 8: 225 case 9: 226 default: 227 break; 228 case 5: 229 var23 = 2; 230 break; 231 case 10: 232 var23 = 1; 233 } 234 235 if (var8) 236 { 237 var23 = Math.max(1, var23 / 2); 238 } 239 240 var2 += var23 * var15; 241 } 242 } 243 } 244 } 245 246 if (this.field_82857_m != null && !this.field_82857_m.equalsIgnoreCase(var1.getDisplayName()) && this.field_82857_m.length() > 0) 247 { 248 var4 = var1.isItemStackDamageable() ? 7 : var1.stackSize * 5; 249 var2 += var4; 250 251 if (var1.hasDisplayName()) 252 { 253 var19 += var4 / 2; 254 } 255 256 var5.setItemName(this.field_82857_m); 257 } 258 259 var9 = 0; 260 261 for (var21 = var7.keySet().iterator(); var21.hasNext(); var19 += var9 + var13 * var14) 262 { 263 var11 = ((Integer)var21.next()).intValue(); 264 var22 = Enchantment.enchantmentsList[var11]; 265 var13 = ((Integer)var7.get(Integer.valueOf(var11))).intValue(); 266 var14 = 0; 267 ++var9; 268 269 switch (var22.getWeight()) 270 { 271 case 1: 272 var14 = 8; 273 break; 274 case 2: 275 var14 = 4; 276 case 3: 277 case 4: 278 case 6: 279 case 7: 280 case 8: 281 case 9: 282 default: 283 break; 284 case 5: 285 var14 = 2; 286 break; 287 case 10: 288 var14 = 1; 289 } 290 291 if (var8) 292 { 293 var14 = Math.max(1, var14 / 2); 294 } 295 } 296 297 if (var8) 298 { 299 var19 = Math.max(1, var19 / 2); 300 } 301 302 this.maximumCost = var19 + var2; 303 304 if (var2 <= 0) 305 { 306 var5 = null; 307 } 308 309 if (var4 == var2 && var4 > 0 && this.maximumCost >= 40) 310 { 311 System.out.println("Naming an item only, cost too high; giving discount to cap cost to 39 levels"); 312 this.maximumCost = 39; 313 } 314 315 if (this.maximumCost >= 40 && !this.thePlayer.capabilities.isCreativeMode) 316 { 317 var5 = null; 318 } 319 320 if (var5 != null) 321 { 322 var10 = var5.getRepairCost(); 323 324 if (var6 != null && var10 < var6.getRepairCost()) 325 { 326 var10 = var6.getRepairCost(); 327 } 328 329 if (var5.hasDisplayName()) 330 { 331 var10 -= 9; 332 } 333 334 if (var10 < 0) 335 { 336 var10 = 0; 337 } 338 339 var10 += 2; 340 var5.setRepairCost(var10); 341 EnchantmentHelper.setEnchantments(var7, var5); 342 } 343 344 this.outputSlot.setInventorySlotContents(0, var5); 345 this.updateCraftingResults(); 346 } 347 } 348 349 public void addCraftingToCrafters(ICrafting par1ICrafting) 350 { 351 super.addCraftingToCrafters(par1ICrafting); 352 par1ICrafting.sendProgressBarUpdate(this, 0, this.maximumCost); 353 } 354 355 @SideOnly(Side.CLIENT) 356 public void updateProgressBar(int par1, int par2) 357 { 358 if (par1 == 0) 359 { 360 this.maximumCost = par2; 361 } 362 } 363 364 /** 365 * Callback for when the crafting gui is closed. 366 */ 367 public void onCraftGuiClosed(EntityPlayer par1EntityPlayer) 368 { 369 super.onCraftGuiClosed(par1EntityPlayer); 370 371 if (!this.theWorld.isRemote) 372 { 373 for (int var2 = 0; var2 < this.inputSlots.getSizeInventory(); ++var2) 374 { 375 ItemStack var3 = this.inputSlots.getStackInSlotOnClosing(var2); 376 377 if (var3 != null) 378 { 379 par1EntityPlayer.dropPlayerItem(var3); 380 } 381 } 382 } 383 } 384 385 public boolean canInteractWith(EntityPlayer par1EntityPlayer) 386 { 387 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; 388 } 389 390 /** 391 * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that. 392 */ 393 public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) 394 { 395 ItemStack var3 = null; 396 Slot var4 = (Slot)this.inventorySlots.get(par2); 397 398 if (var4 != null && var4.getHasStack()) 399 { 400 ItemStack var5 = var4.getStack(); 401 var3 = var5.copy(); 402 403 if (par2 == 2) 404 { 405 if (!this.mergeItemStack(var5, 3, 39, true)) 406 { 407 return null; 408 } 409 410 var4.onSlotChange(var5, var3); 411 } 412 else if (par2 != 0 && par2 != 1) 413 { 414 if (par2 >= 3 && par2 < 39 && !this.mergeItemStack(var5, 0, 2, false)) 415 { 416 return null; 417 } 418 } 419 else if (!this.mergeItemStack(var5, 3, 39, false)) 420 { 421 return null; 422 } 423 424 if (var5.stackSize == 0) 425 { 426 var4.putStack((ItemStack)null); 427 } 428 else 429 { 430 var4.onSlotChanged(); 431 } 432 433 if (var5.stackSize == var3.stackSize) 434 { 435 return null; 436 } 437 438 var4.onPickupFromSlot(par1EntityPlayer, var5); 439 } 440 441 return var3; 442 } 443 444 public void func_82850_a(String par1Str) 445 { 446 this.field_82857_m = par1Str; 447 448 if (this.getSlot(2).getHasStack()) 449 { 450 this.getSlot(2).getStack().setItemName(this.field_82857_m); 451 } 452 453 this.func_82848_d(); 454 } 455 456 static IInventory func_82851_a(ContainerRepair par0ContainerRepair) 457 { 458 return par0ContainerRepair.inputSlots; 459 } 460 461 static int func_82849_b(ContainerRepair par0ContainerRepair) 462 { 463 return par0ContainerRepair.field_82856_l; 464 } 465 }