    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    }