    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    }