    001package net.minecraft.entity.ai;
    002
    003import net.minecraft.entity.Entity;
    004import net.minecraft.entity.EntityLiving;
    005import net.minecraft.entity.player.EntityPlayer;
    006
    007public class EntityAIWatchClosest extends EntityAIBase
    008{
    009    private EntityLiving theWatcher;
    010
    011    /** The closest entity which is being watched by this one. */
    012    protected Entity closestEntity;
    013    private float field_75333_c;
    014    private int lookTime;
    015    private float field_75331_e;
    016    private Class watchedClass;
    017
    018    public EntityAIWatchClosest(EntityLiving par1EntityLiving, Class par2Class, float par3)
    019    {
    020        this.theWatcher = par1EntityLiving;
    021        this.watchedClass = par2Class;
    022        this.field_75333_c = par3;
    023        this.field_75331_e = 0.02F;
    024        this.setMutexBits(2);
    025    }
    026
    027    public EntityAIWatchClosest(EntityLiving par1EntityLiving, Class par2Class, float par3, float par4)
    028    {
    029        this.theWatcher = par1EntityLiving;
    030        this.watchedClass = par2Class;
    031        this.field_75333_c = par3;
    032        this.field_75331_e = par4;
    033        this.setMutexBits(2);
    034    }
    035
    036    /**
    037     * Returns whether the EntityAIBase should begin execution.
    038     */
    039    public boolean shouldExecute()
    040    {
    041        if (this.theWatcher.getRNG().nextFloat() >= this.field_75331_e)
    042        {
    043            return false;
    044        }
    045        else
    046        {
    047            if (this.watchedClass == EntityPlayer.class)
    048            {
    049                this.closestEntity = this.theWatcher.worldObj.getClosestPlayerToEntity(this.theWatcher, (double)this.field_75333_c);
    050            }
    051            else
    052            {
    053                this.closestEntity = this.theWatcher.worldObj.findNearestEntityWithinAABB(this.watchedClass, this.theWatcher.boundingBox.expand((double)this.field_75333_c, 3.0D, (double)this.field_75333_c), this.theWatcher);
    054            }
    055
    056            return this.closestEntity != null;
    057        }
    058    }
    059
    060    /**
    061     * Returns whether an in-progress EntityAIBase should continue executing
    062     */
    063    public boolean continueExecuting()
    064    {
    065        return !this.closestEntity.isEntityAlive() ? false : (this.theWatcher.getDistanceSqToEntity(this.closestEntity) > (double)(this.field_75333_c * this.field_75333_c) ? false : this.lookTime > 0);
    066    }
    067
    068    /**
    069     * Execute a one shot task or start executing a continuous task
    070     */
    071    public void startExecuting()
    072    {
    073        this.lookTime = 40 + this.theWatcher.getRNG().nextInt(40);
    074    }
    075
    076    /**
    077     * Resets the task
    078     */
    079    public void resetTask()
    080    {
    081        this.closestEntity = null;
    082    }
    083
    084    /**
    085     * Updates the task
    086     */
    087    public void updateTask()
    088    {
    089        this.theWatcher.getLookHelper().setLookPosition(this.closestEntity.posX, this.closestEntity.posY + (double)this.closestEntity.getEyeHeight(), this.closestEntity.posZ, 10.0F, (float)this.theWatcher.getVerticalFaceSpeed());
    090        --this.lookTime;
    091    }
    092}