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.List; 007 import java.util.Random; 008 009 public class ContainerEnchantment extends Container 010 { 011 /** SlotEnchantmentTable object with ItemStack to be enchanted */ 012 public IInventory tableInventory = new SlotEnchantmentTable(this, "Enchant", 1); 013 014 /** current world (for bookshelf counting) */ 015 private World worldPointer; 016 private int posX; 017 private int posY; 018 private int posZ; 019 private Random rand = new Random(); 020 021 /** used as seed for EnchantmentNameParts (see GuiEnchantment) */ 022 public long nameSeed; 023 024 /** 3-member array storing the enchantment levels of each slot */ 025 public int[] enchantLevels = new int[3]; 026 027 public ContainerEnchantment(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5) 028 { 029 this.worldPointer = par2World; 030 this.posX = par3; 031 this.posY = par4; 032 this.posZ = par5; 033 this.addSlotToContainer(new SlotEnchantment(this, this.tableInventory, 0, 25, 47)); 034 int var6; 035 036 for (var6 = 0; var6 < 3; ++var6) 037 { 038 for (int var7 = 0; var7 < 9; ++var7) 039 { 040 this.addSlotToContainer(new Slot(par1InventoryPlayer, var7 + var6 * 9 + 9, 8 + var7 * 18, 84 + var6 * 18)); 041 } 042 } 043 044 for (var6 = 0; var6 < 9; ++var6) 045 { 046 this.addSlotToContainer(new Slot(par1InventoryPlayer, var6, 8 + var6 * 18, 142)); 047 } 048 } 049 050 public void addCraftingToCrafters(ICrafting par1ICrafting) 051 { 052 super.addCraftingToCrafters(par1ICrafting); 053 par1ICrafting.sendProgressBarUpdate(this, 0, this.enchantLevels[0]); 054 par1ICrafting.sendProgressBarUpdate(this, 1, this.enchantLevels[1]); 055 par1ICrafting.sendProgressBarUpdate(this, 2, this.enchantLevels[2]); 056 } 057 058 /** 059 * Updates crafting matrix; called from onCraftMatrixChanged. Args: none 060 */ 061 public void updateCraftingResults() 062 { 063 super.updateCraftingResults(); 064 065 for (int var1 = 0; var1 < this.crafters.size(); ++var1) 066 { 067 ICrafting var2 = (ICrafting)this.crafters.get(var1); 068 var2.sendProgressBarUpdate(this, 0, this.enchantLevels[0]); 069 var2.sendProgressBarUpdate(this, 1, this.enchantLevels[1]); 070 var2.sendProgressBarUpdate(this, 2, this.enchantLevels[2]); 071 } 072 } 073 074 @SideOnly(Side.CLIENT) 075 public void updateProgressBar(int par1, int par2) 076 { 077 if (par1 >= 0 && par1 <= 2) 078 { 079 this.enchantLevels[par1] = par2; 080 } 081 else 082 { 083 super.updateProgressBar(par1, par2); 084 } 085 } 086 087 /** 088 * Callback for when the crafting matrix is changed. 089 */ 090 public void onCraftMatrixChanged(IInventory par1IInventory) 091 { 092 if (par1IInventory == this.tableInventory) 093 { 094 ItemStack var2 = par1IInventory.getStackInSlot(0); 095 int var3; 096 097 if (var2 != null && var2.isItemEnchantable()) 098 { 099 this.nameSeed = this.rand.nextLong(); 100 101 if (!this.worldPointer.isRemote) 102 { 103 var3 = 0; 104 int var4; 105 106 for (var4 = -1; var4 <= 1; ++var4) 107 { 108 for (int var5 = -1; var5 <= 1; ++var5) 109 { 110 if ((var4 != 0 || var5 != 0) && this.worldPointer.isAirBlock(this.posX + var5, this.posY, this.posZ + var4) && this.worldPointer.isAirBlock(this.posX + var5, this.posY + 1, this.posZ + var4)) 111 { 112 if (this.worldPointer.getBlockId(this.posX + var5 * 2, this.posY, this.posZ + var4 * 2) == Block.bookShelf.blockID) 113 { 114 ++var3; 115 } 116 117 if (this.worldPointer.getBlockId(this.posX + var5 * 2, this.posY + 1, this.posZ + var4 * 2) == Block.bookShelf.blockID) 118 { 119 ++var3; 120 } 121 122 if (var5 != 0 && var4 != 0) 123 { 124 if (this.worldPointer.getBlockId(this.posX + var5 * 2, this.posY, this.posZ + var4) == Block.bookShelf.blockID) 125 { 126 ++var3; 127 } 128 129 if (this.worldPointer.getBlockId(this.posX + var5 * 2, this.posY + 1, this.posZ + var4) == Block.bookShelf.blockID) 130 { 131 ++var3; 132 } 133 134 if (this.worldPointer.getBlockId(this.posX + var5, this.posY, this.posZ + var4 * 2) == Block.bookShelf.blockID) 135 { 136 ++var3; 137 } 138 139 if (this.worldPointer.getBlockId(this.posX + var5, this.posY + 1, this.posZ + var4 * 2) == Block.bookShelf.blockID) 140 { 141 ++var3; 142 } 143 } 144 } 145 } 146 } 147 148 for (var4 = 0; var4 < 3; ++var4) 149 { 150 this.enchantLevels[var4] = EnchantmentHelper.calcItemStackEnchantability(this.rand, var4, var3, var2); 151 } 152 153 this.updateCraftingResults(); 154 } 155 } 156 else 157 { 158 for (var3 = 0; var3 < 3; ++var3) 159 { 160 this.enchantLevels[var3] = 0; 161 } 162 } 163 } 164 } 165 166 /** 167 * enchants the item on the table using the specified slot; also deducts XP from player 168 */ 169 public boolean enchantItem(EntityPlayer par1EntityPlayer, int par2) 170 { 171 ItemStack var3 = this.tableInventory.getStackInSlot(0); 172 173 if (this.enchantLevels[par2] > 0 && var3 != null && (par1EntityPlayer.experienceLevel >= this.enchantLevels[par2] || par1EntityPlayer.capabilities.isCreativeMode)) 174 { 175 if (!this.worldPointer.isRemote) 176 { 177 List var4 = EnchantmentHelper.buildEnchantmentList(this.rand, var3, this.enchantLevels[par2]); 178 179 if (var4 != null) 180 { 181 par1EntityPlayer.addExperienceLevel(-this.enchantLevels[par2]); 182 Iterator var5 = var4.iterator(); 183 184 while (var5.hasNext()) 185 { 186 EnchantmentData var6 = (EnchantmentData)var5.next(); 187 var3.addEnchantment(var6.enchantmentobj, var6.enchantmentLevel); 188 } 189 190 this.onCraftMatrixChanged(this.tableInventory); 191 } 192 } 193 194 return true; 195 } 196 else 197 { 198 return false; 199 } 200 } 201 202 /** 203 * Callback for when the crafting gui is closed. 204 */ 205 public void onCraftGuiClosed(EntityPlayer par1EntityPlayer) 206 { 207 super.onCraftGuiClosed(par1EntityPlayer); 208 209 if (!this.worldPointer.isRemote) 210 { 211 ItemStack var2 = this.tableInventory.getStackInSlotOnClosing(0); 212 213 if (var2 != null) 214 { 215 par1EntityPlayer.dropPlayerItem(var2); 216 } 217 } 218 } 219 220 public boolean canInteractWith(EntityPlayer par1EntityPlayer) 221 { 222 return this.worldPointer.getBlockId(this.posX, this.posY, this.posZ) != Block.enchantmentTable.blockID ? false : par1EntityPlayer.getDistanceSq((double)this.posX + 0.5D, (double)this.posY + 0.5D, (double)this.posZ + 0.5D) <= 64.0D; 223 } 224 225 /** 226 * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that. 227 */ 228 public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) 229 { 230 ItemStack var3 = null; 231 Slot var4 = (Slot)this.inventorySlots.get(par2); 232 233 if (var4 != null && var4.getHasStack()) 234 { 235 ItemStack var5 = var4.getStack(); 236 var3 = var5.copy(); 237 238 if (par2 == 0) 239 { 240 if (!this.mergeItemStack(var5, 1, 37, true)) 241 { 242 return null; 243 } 244 } 245 else 246 { 247 if (((Slot)this.inventorySlots.get(0)).getHasStack() || !((Slot)this.inventorySlots.get(0)).isItemValid(var5)) 248 { 249 return null; 250 } 251 252 if (var5.hasTagCompound() && var5.stackSize == 1) 253 { 254 ((Slot)this.inventorySlots.get(0)).putStack(var5.copy()); 255 var5.stackSize = 0; 256 } 257 else if (var5.stackSize >= 1) 258 { 259 ((Slot)this.inventorySlots.get(0)).putStack(new ItemStack(var5.itemID, 1, var5.getItemDamage())); 260 --var5.stackSize; 261 } 262 } 263 264 if (var5.stackSize == 0) 265 { 266 var4.putStack((ItemStack)null); 267 } 268 else 269 { 270 var4.onSlotChanged(); 271 } 272 273 if (var5.stackSize == var3.stackSize) 274 { 275 return null; 276 } 277 278 var4.onPickupFromSlot(par1EntityPlayer, var5); 279 } 280 281 return var3; 282 } 283 }