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