001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    
006    public class EntityEnderCrystal extends Entity
007    {
008        /** Used to create the rotation animation when rendering the crystal. */
009        public int innerRotation;
010        public int health;
011    
012        public EntityEnderCrystal(World par1World)
013        {
014            super(par1World);
015            this.innerRotation = 0;
016            this.preventEntitySpawning = true;
017            this.setSize(2.0F, 2.0F);
018            this.yOffset = this.height / 2.0F;
019            this.health = 5;
020            this.innerRotation = this.rand.nextInt(100000);
021        }
022    
023        @SideOnly(Side.CLIENT)
024        public EntityEnderCrystal(World par1World, double par2, double par4, double par6)
025        {
026            this(par1World);
027            this.setPosition(par2, par4, par6);
028        }
029    
030        /**
031         * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to
032         * prevent them from trampling crops
033         */
034        protected boolean canTriggerWalking()
035        {
036            return false;
037        }
038    
039        protected void entityInit()
040        {
041            this.dataWatcher.addObject(8, Integer.valueOf(this.health));
042        }
043    
044        /**
045         * Called to update the entity's position/logic.
046         */
047        public void onUpdate()
048        {
049            this.prevPosX = this.posX;
050            this.prevPosY = this.posY;
051            this.prevPosZ = this.posZ;
052            ++this.innerRotation;
053            this.dataWatcher.updateObject(8, Integer.valueOf(this.health));
054            int var1 = MathHelper.floor_double(this.posX);
055            int var2 = MathHelper.floor_double(this.posY);
056            int var3 = MathHelper.floor_double(this.posZ);
057    
058            if (this.worldObj.getBlockId(var1, var2, var3) != Block.fire.blockID)
059            {
060                this.worldObj.setBlockWithNotify(var1, var2, var3, Block.fire.blockID);
061            }
062        }
063    
064        /**
065         * (abstract) Protected helper method to write subclass entity data to NBT.
066         */
067        protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) {}
068    
069        /**
070         * (abstract) Protected helper method to read subclass entity data from NBT.
071         */
072        protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) {}
073    
074        @SideOnly(Side.CLIENT)
075        public float getShadowSize()
076        {
077            return 0.0F;
078        }
079    
080        /**
081         * Returns true if other Entities should be prevented from moving through this Entity.
082         */
083        public boolean canBeCollidedWith()
084        {
085            return true;
086        }
087    
088        /**
089         * Called when the entity is attacked.
090         */
091        public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
092        {
093            if (!this.isDead && !this.worldObj.isRemote)
094            {
095                this.health = 0;
096    
097                if (this.health <= 0)
098                {
099                    this.setDead();
100    
101                    if (!this.worldObj.isRemote)
102                    {
103                        this.worldObj.createExplosion((Entity)null, this.posX, this.posY, this.posZ, 6.0F, true);
104                    }
105                }
106            }
107    
108            return true;
109        }
110    }