    001package net.minecraft.entity.ai;
    002
    003import net.minecraft.entity.EntityLiving;
    004import net.minecraft.entity.monster.EntityCreeper;
    005
    006public class EntityAICreeperSwell extends EntityAIBase
    007{
    008    /** The creeper that is swelling. */
    009    EntityCreeper swellingCreeper;
    010
    011    /**
    012     * The creeper's attack target. This is used for the changing of the creeper's state.
    013     */
    014    EntityLiving creeperAttackTarget;
    015
    016    public EntityAICreeperSwell(EntityCreeper par1EntityCreeper)
    017    {
    018        this.swellingCreeper = par1EntityCreeper;
    019        this.setMutexBits(1);
    020    }
    021
    022    /**
    023     * Returns whether the EntityAIBase should begin execution.
    024     */
    025    public boolean shouldExecute()
    026    {
    027        EntityLiving entityliving = this.swellingCreeper.getAttackTarget();
    028        return this.swellingCreeper.getCreeperState() > 0 || entityliving != null && this.swellingCreeper.getDistanceSqToEntity(entityliving) < 9.0D;
    029    }
    030
    031    /**
    032     * Execute a one shot task or start executing a continuous task
    033     */
    034    public void startExecuting()
    035    {
    036        this.swellingCreeper.getNavigator().clearPathEntity();
    037        this.creeperAttackTarget = this.swellingCreeper.getAttackTarget();
    038    }
    039
    040    /**
    041     * Resets the task
    042     */
    043    public void resetTask()
    044    {
    045        this.creeperAttackTarget = null;
    046    }
    047
    048    /**
    049     * Updates the task
    050     */
    051    public void updateTask()
    052    {
    053        if (this.creeperAttackTarget == null)
    054        {
    055            this.swellingCreeper.setCreeperState(-1);
    056        }
    057        else if (this.swellingCreeper.getDistanceSqToEntity(this.creeperAttackTarget) > 49.0D)
    058        {
    059            this.swellingCreeper.setCreeperState(-1);
    060        }
    061        else if (!this.swellingCreeper.getEntitySenses().canSee(this.creeperAttackTarget))
    062        {
    063            this.swellingCreeper.setCreeperState(-1);
    064        }
    065        else
    066        {
    067            this.swellingCreeper.setCreeperState(1);
    068        }
    069    }
    070}