    001package net.minecraft.entity.item;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import net.minecraft.block.Block;
    006import net.minecraft.entity.Entity;
    007import net.minecraft.nbt.NBTTagCompound;
    008import net.minecraft.util.DamageSource;
    009import net.minecraft.util.MathHelper;
    010import net.minecraft.world.World;
    011
    012public 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 i = MathHelper.floor_double(this.posX);
    061        int j = MathHelper.floor_double(this.posY);
    062        int k = MathHelper.floor_double(this.posZ);
    063
    064        if (this.worldObj.getBlockId(i, j, k) != Block.fire.blockID)
    065        {
    066            this.worldObj.setBlock(i, j, k, 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}