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 008 public class TileEntityBeacon extends TileEntity implements IInventory 009 { 010 public static final Potion[][] field_82139_a = new Potion[][] {{Potion.moveSpeed, Potion.digSpeed}, {Potion.resistance, Potion.jump}, {Potion.damageBoost}, {Potion.regeneration}}; 011 @SideOnly(Side.CLIENT) 012 private long field_82137_b; 013 @SideOnly(Side.CLIENT) 014 private float field_82138_c; 015 private boolean field_82135_d; 016 private int field_82136_e = -1; 017 private int field_82133_f; 018 private int field_82134_g; 019 private ItemStack field_82140_h; 020 021 /** 022 * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count 023 * ticks and creates a new spawn inside its implementation. 024 */ 025 public void updateEntity() 026 { 027 if (this.worldObj.func_82737_E() % 80L == 0L) 028 { 029 this.func_82131_u(); 030 this.func_82124_t(); 031 } 032 } 033 034 private void func_82124_t() 035 { 036 if (this.field_82135_d && this.field_82136_e > 0 && !this.worldObj.isRemote && this.field_82133_f > 0) 037 { 038 double var1 = (double)(this.field_82136_e * 8 + 8); 039 byte var3 = 0; 040 041 if (this.field_82136_e >= 4 && this.field_82133_f == this.field_82134_g) 042 { 043 var3 = 1; 044 } 045 046 AxisAlignedBB var4 = AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 1), (double)(this.zCoord + 1)).expand(var1, var1, var1); 047 List var5 = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, var4); 048 Iterator var6 = var5.iterator(); 049 EntityPlayer var7; 050 051 while (var6.hasNext()) 052 { 053 var7 = (EntityPlayer)var6.next(); 054 var7.addPotionEffect(new PotionEffect(this.field_82133_f, 180, var3, true)); 055 } 056 057 if (this.field_82136_e >= 4 && this.field_82133_f != this.field_82134_g && this.field_82134_g > 0) 058 { 059 var6 = var5.iterator(); 060 061 while (var6.hasNext()) 062 { 063 var7 = (EntityPlayer)var6.next(); 064 var7.addPotionEffect(new PotionEffect(this.field_82134_g, 180, 0, true)); 065 } 066 } 067 } 068 } 069 070 private void func_82131_u() 071 { 072 if (!this.worldObj.canBlockSeeTheSky(this.xCoord, this.yCoord + 1, this.zCoord)) 073 { 074 this.field_82135_d = false; 075 this.field_82136_e = 0; 076 } 077 else 078 { 079 this.field_82135_d = true; 080 this.field_82136_e = 0; 081 082 for (int var1 = 1; var1 <= 4; this.field_82136_e = var1++) 083 { 084 int var2 = this.yCoord - var1; 085 086 if (var2 < 1) 087 { 088 break; 089 } 090 091 boolean var3 = true; 092 093 for (int var4 = this.xCoord - var1; var4 <= this.xCoord + var1 && var3; ++var4) 094 { 095 for (int var5 = this.zCoord - var1; var5 <= this.zCoord + var1; ++var5) 096 { 097 int var6 = this.worldObj.getBlockId(var4, var2, var5); 098 099 if (var6 != Block.blockEmerald.blockID && var6 != Block.blockGold.blockID && var6 != Block.blockDiamond.blockID && var6 != Block.blockSteel.blockID) 100 { 101 var3 = false; 102 break; 103 } 104 } 105 } 106 107 if (!var3) 108 { 109 break; 110 } 111 } 112 113 if (this.field_82136_e == 0) 114 { 115 this.field_82135_d = false; 116 } 117 } 118 } 119 120 @SideOnly(Side.CLIENT) 121 public float func_82125_v_() 122 { 123 if (!this.field_82135_d) 124 { 125 return 0.0F; 126 } 127 else 128 { 129 int var1 = (int)(this.worldObj.func_82737_E() - this.field_82137_b); 130 this.field_82137_b = this.worldObj.func_82737_E(); 131 132 if (var1 > 1) 133 { 134 this.field_82138_c -= (float)var1 / 40.0F; 135 136 if (this.field_82138_c < 0.0F) 137 { 138 this.field_82138_c = 0.0F; 139 } 140 } 141 142 this.field_82138_c += 0.025F; 143 144 if (this.field_82138_c > 1.0F) 145 { 146 this.field_82138_c = 1.0F; 147 } 148 149 return this.field_82138_c; 150 } 151 } 152 153 public int func_82126_i() 154 { 155 return this.field_82133_f; 156 } 157 158 public int func_82132_j() 159 { 160 return this.field_82134_g; 161 } 162 163 public int func_82130_k() 164 { 165 return this.field_82136_e; 166 } 167 168 @SideOnly(Side.CLIENT) 169 public void func_82129_c(int par1) 170 { 171 this.field_82136_e = par1; 172 } 173 174 public void func_82128_d(int par1) 175 { 176 this.field_82133_f = 0; 177 178 for (int var2 = 0; var2 < this.field_82136_e && var2 < 3; ++var2) 179 { 180 Potion[] var3 = field_82139_a[var2]; 181 int var4 = var3.length; 182 183 for (int var5 = 0; var5 < var4; ++var5) 184 { 185 Potion var6 = var3[var5]; 186 187 if (var6.id == par1) 188 { 189 this.field_82133_f = par1; 190 return; 191 } 192 } 193 } 194 } 195 196 public void func_82127_e(int par1) 197 { 198 this.field_82134_g = 0; 199 200 if (this.field_82136_e >= 4) 201 { 202 for (int var2 = 0; var2 < 4; ++var2) 203 { 204 Potion[] var3 = field_82139_a[var2]; 205 int var4 = var3.length; 206 207 for (int var5 = 0; var5 < var4; ++var5) 208 { 209 Potion var6 = var3[var5]; 210 211 if (var6.id == par1) 212 { 213 this.field_82134_g = par1; 214 return; 215 } 216 } 217 } 218 } 219 } 220 221 /** 222 * Overriden in a sign to provide the text. 223 */ 224 public Packet getDescriptionPacket() 225 { 226 NBTTagCompound var1 = new NBTTagCompound(); 227 this.writeToNBT(var1); 228 return new Packet132TileEntityData(this.xCoord, this.yCoord, this.zCoord, 3, var1); 229 } 230 231 @SideOnly(Side.CLIENT) 232 public double func_82115_m() 233 { 234 return 65536.0D; 235 } 236 237 /** 238 * Reads a tile entity from NBT. 239 */ 240 public void readFromNBT(NBTTagCompound par1NBTTagCompound) 241 { 242 super.readFromNBT(par1NBTTagCompound); 243 this.field_82133_f = par1NBTTagCompound.getInteger("Primary"); 244 this.field_82134_g = par1NBTTagCompound.getInteger("Secondary"); 245 this.field_82136_e = par1NBTTagCompound.getInteger("Levels"); 246 } 247 248 /** 249 * Writes a tile entity to NBT. 250 */ 251 public void writeToNBT(NBTTagCompound par1NBTTagCompound) 252 { 253 super.writeToNBT(par1NBTTagCompound); 254 par1NBTTagCompound.setInteger("Primary", this.field_82133_f); 255 par1NBTTagCompound.setInteger("Secondary", this.field_82134_g); 256 par1NBTTagCompound.setInteger("Levels", this.field_82136_e); 257 } 258 259 /** 260 * Returns the number of slots in the inventory. 261 */ 262 public int getSizeInventory() 263 { 264 return 1; 265 } 266 267 /** 268 * Returns the stack in slot i 269 */ 270 public ItemStack getStackInSlot(int par1) 271 { 272 return par1 == 0 ? this.field_82140_h : null; 273 } 274 275 /** 276 * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a 277 * new stack. 278 */ 279 public ItemStack decrStackSize(int par1, int par2) 280 { 281 if (par1 == 0 && this.field_82140_h != null) 282 { 283 if (par2 >= this.field_82140_h.stackSize) 284 { 285 ItemStack var3 = this.field_82140_h; 286 this.field_82140_h = null; 287 return var3; 288 } 289 else 290 { 291 this.field_82140_h.stackSize -= par2; 292 return new ItemStack(this.field_82140_h.itemID, par2, this.field_82140_h.getItemDamage()); 293 } 294 } 295 else 296 { 297 return null; 298 } 299 } 300 301 /** 302 * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem - 303 * like when you close a workbench GUI. 304 */ 305 public ItemStack getStackInSlotOnClosing(int par1) 306 { 307 if (par1 == 0 && this.field_82140_h != null) 308 { 309 ItemStack var2 = this.field_82140_h; 310 this.field_82140_h = null; 311 return var2; 312 } 313 else 314 { 315 return null; 316 } 317 } 318 319 /** 320 * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). 321 */ 322 public void setInventorySlotContents(int par1, ItemStack par2ItemStack) 323 { 324 if (par1 == 0) 325 { 326 this.field_82140_h = par2ItemStack; 327 } 328 } 329 330 /** 331 * Returns the name of the inventory. 332 */ 333 public String getInvName() 334 { 335 return "container.beacon"; 336 } 337 338 /** 339 * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't 340 * this more of a set than a get?* 341 */ 342 public int getInventoryStackLimit() 343 { 344 return 1; 345 } 346 347 /** 348 * Do not make give this method the name canInteractWith because it clashes with Container 349 */ 350 public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) 351 { 352 return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : par1EntityPlayer.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D; 353 } 354 355 public void openChest() {} 356 357 public void closeChest() {} 358 }