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