001 package net.minecraft.src;
002
003 public class EntityAIArrowAttack extends EntityAIBase
004 {
005 /** The entity the AI instance has been applied to */
006 private final EntityLiving entityHost;
007 private final IRangedAttackMob field_82641_b;
008 private EntityLiving attackTarget;
009
010 /**
011 * A decrementing tick that spawns a ranged attack once this value reaches 0. It is then set back to the
012 * maxRangedAttackTime.
013 */
014 private int rangedAttackTime = 0;
015 private float entityMoveSpeed;
016 private int field_75318_f = 0;
017
018 /**
019 * The maximum time the AI has to wait before peforming another ranged attack.
020 */
021 private int maxRangedAttackTime;
022 private float field_82642_h;
023
024 public EntityAIArrowAttack(IRangedAttackMob par1IRangedAttackMob, float par2, int par3, float par4)
025 {
026 if (!(par1IRangedAttackMob instanceof EntityLiving))
027 {
028 throw new IllegalArgumentException("ArrowAttackGoal requires Mob implements RangedAttackMob");
029 }
030 else
031 {
032 this.field_82641_b = par1IRangedAttackMob;
033 this.entityHost = (EntityLiving)par1IRangedAttackMob;
034 this.entityMoveSpeed = par2;
035 this.maxRangedAttackTime = par3;
036 this.field_82642_h = par4 * par4;
037 this.setMutexBits(3);
038 }
039 }
040
041 /**
042 * Returns whether the EntityAIBase should begin execution.
043 */
044 public boolean shouldExecute()
045 {
046 EntityLiving var1 = this.entityHost.getAttackTarget();
047
048 if (var1 == null)
049 {
050 return false;
051 }
052 else
053 {
054 this.attackTarget = var1;
055 return true;
056 }
057 }
058
059 /**
060 * Returns whether an in-progress EntityAIBase should continue executing
061 */
062 public boolean continueExecuting()
063 {
064 return this.shouldExecute() || !this.entityHost.getNavigator().noPath();
065 }
066
067 /**
068 * Resets the task
069 */
070 public void resetTask()
071 {
072 this.attackTarget = null;
073 this.field_75318_f = 0;
074 }
075
076 /**
077 * Updates the task
078 */
079 public void updateTask()
080 {
081 double var1 = this.entityHost.getDistanceSq(this.attackTarget.posX, this.attackTarget.boundingBox.minY, this.attackTarget.posZ);
082 boolean var3 = this.entityHost.getEntitySenses().canSee(this.attackTarget);
083
084 if (var3)
085 {
086 ++this.field_75318_f;
087 }
088 else
089 {
090 this.field_75318_f = 0;
091 }
092
093 if (var1 <= (double)this.field_82642_h && this.field_75318_f >= 20)
094 {
095 this.entityHost.getNavigator().clearPathEntity();
096 }
097 else
098 {
099 this.entityHost.getNavigator().tryMoveToEntityLiving(this.attackTarget, this.entityMoveSpeed);
100 }
101
102 this.entityHost.getLookHelper().setLookPositionWithEntity(this.attackTarget, 30.0F, 30.0F);
103 this.rangedAttackTime = Math.max(this.rangedAttackTime - 1, 0);
104
105 if (this.rangedAttackTime <= 0)
106 {
107 if (var1 <= (double)this.field_82642_h && var3)
108 {
109 this.field_82641_b.func_82196_d(this.attackTarget);
110 this.rangedAttackTime = this.maxRangedAttackTime;
111 }
112 }
113 }
114 }