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