001 package net.minecraft.src; 002 003 public class TileEntityEnderChest extends TileEntity 004 { 005 /** The current angle of the chest lid (between 0 and 1) */ 006 public float lidAngle; 007 008 /** The angle of the chest lid last tick */ 009 public float prevLidAngle; 010 011 /** The number of players currently using this ender chest. */ 012 public int numUsingPlayers; 013 014 /** Server sync counter (once per 20 ticks) */ 015 private int ticksSinceSync; 016 017 /** 018 * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count 019 * ticks and creates a new spawn inside its implementation. 020 */ 021 public void updateEntity() 022 { 023 super.updateEntity(); 024 025 if (++this.ticksSinceSync % 20 * 4 == 0) 026 { 027 this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, Block.enderChest.blockID, 1, this.numUsingPlayers); 028 } 029 030 this.prevLidAngle = this.lidAngle; 031 float var1 = 0.1F; 032 double var4; 033 034 if (this.numUsingPlayers > 0 && this.lidAngle == 0.0F) 035 { 036 double var2 = (double)this.xCoord + 0.5D; 037 var4 = (double)this.zCoord + 0.5D; 038 this.worldObj.playSoundEffect(var2, (double)this.yCoord + 0.5D, var4, "random.chestopen", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); 039 } 040 041 if (this.numUsingPlayers == 0 && this.lidAngle > 0.0F || this.numUsingPlayers > 0 && this.lidAngle < 1.0F) 042 { 043 float var8 = this.lidAngle; 044 045 if (this.numUsingPlayers > 0) 046 { 047 this.lidAngle += var1; 048 } 049 else 050 { 051 this.lidAngle -= var1; 052 } 053 054 if (this.lidAngle > 1.0F) 055 { 056 this.lidAngle = 1.0F; 057 } 058 059 float var3 = 0.5F; 060 061 if (this.lidAngle < var3 && var8 >= var3) 062 { 063 var4 = (double)this.xCoord + 0.5D; 064 double var6 = (double)this.zCoord + 0.5D; 065 this.worldObj.playSoundEffect(var4, (double)this.yCoord + 0.5D, var6, "random.chestclosed", 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F); 066 } 067 068 if (this.lidAngle < 0.0F) 069 { 070 this.lidAngle = 0.0F; 071 } 072 } 073 } 074 075 /** 076 * Called when a client event is received with the event number and argument, see World.sendClientEvent 077 */ 078 public void receiveClientEvent(int par1, int par2) 079 { 080 if (par1 == 1) 081 { 082 this.numUsingPlayers = par2; 083 } 084 } 085 086 /** 087 * invalidates a tile entity 088 */ 089 public void invalidate() 090 { 091 this.updateContainingBlockInfo(); 092 super.invalidate(); 093 } 094 095 public void openChest() 096 { 097 ++this.numUsingPlayers; 098 this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, Block.enderChest.blockID, 1, this.numUsingPlayers); 099 } 100 101 public void closeChest() 102 { 103 --this.numUsingPlayers; 104 this.worldObj.addBlockEvent(this.xCoord, this.yCoord, this.zCoord, Block.enderChest.blockID, 1, this.numUsingPlayers); 105 } 106 107 public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) 108 { 109 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; 110 } 111 }