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 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}