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 }