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 }