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 }