    001    package net.minecraft.src;
    002
    003    public class EntityAIAttackOnCollide extends EntityAIBase
    004    {
    005        World worldObj;
    006        EntityLiving attacker;
    007        EntityLiving entityTarget;
    008
    009        /**
    010         * An amount of decrementing ticks that allows the entity to attack once the tick reaches 0.
    011         */
    012        int attackTick;
    013        float field_75440_e;
    014        boolean field_75437_f;
    015
    016        /** The PathEntity of our entity. */
    017        PathEntity entityPathEntity;
    018        Class classTarget;
    019        private int field_75445_i;
    020
    021        public EntityAIAttackOnCollide(EntityLiving par1EntityLiving, Class par2Class, float par3, boolean par4)
    022        {
    023            this(par1EntityLiving, par3, par4);
    024            this.classTarget = par2Class;
    025        }
    026
    027        public EntityAIAttackOnCollide(EntityLiving par1EntityLiving, float par2, boolean par3)
    028        {
    029            this.attackTick = 0;
    030            this.attacker = par1EntityLiving;
    031            this.worldObj = par1EntityLiving.worldObj;
    032            this.field_75440_e = par2;
    033            this.field_75437_f = par3;
    034            this.setMutexBits(3);
    035        }
    036
    037        /**
    038         * Returns whether the EntityAIBase should begin execution.
    039         */
    040        public boolean shouldExecute()
    041        {
    042            EntityLiving var1 = this.attacker.getAttackTarget();
    043
    044            if (var1 == null)
    045            {
    046                return false;
    047            }
    048            else if (this.classTarget != null && !this.classTarget.isAssignableFrom(var1.getClass()))
    049            {
    050                return false;
    051            }
    052            else
    053            {
    054                this.entityTarget = var1;
    055                this.entityPathEntity = this.attacker.getNavigator().getPathToEntityLiving(this.entityTarget);
    056                return this.entityPathEntity != null;
    057            }
    058        }
    059
    060        /**
    061         * Returns whether an in-progress EntityAIBase should continue executing
    062         */
    063        public boolean continueExecuting()
    064        {
    065            EntityLiving var1 = this.attacker.getAttackTarget();
    066            return var1 == null ? false : (!this.entityTarget.isEntityAlive() ? false : (!this.field_75437_f ? !this.attacker.getNavigator().noPath() : this.attacker.isWithinHomeDistance(MathHelper.floor_double(this.entityTarget.posX), MathHelper.floor_double(this.entityTarget.posY), MathHelper.floor_double(this.entityTarget.posZ))));
    067        }
    068
    069        /**
    070         * Execute a one shot task or start executing a continuous task
    071         */
    072        public void startExecuting()
    073        {
    074            this.attacker.getNavigator().setPath(this.entityPathEntity, this.field_75440_e);
    075            this.field_75445_i = 0;
    076        }
    077
    078        /**
    079         * Resets the task
    080         */
    081        public void resetTask()
    082        {
    083            this.entityTarget = null;
    084            this.attacker.getNavigator().clearPathEntity();
    085        }
    086
    087        /**
    088         * Updates the task
    089         */
    090        public void updateTask()
    091        {
    092            this.attacker.getLookHelper().setLookPositionWithEntity(this.entityTarget, 30.0F, 30.0F);
    093
    094            if ((this.field_75437_f || this.attacker.getEntitySenses().canSee(this.entityTarget)) && --this.field_75445_i <= 0)
    095            {
    096                this.field_75445_i = 4 + this.attacker.getRNG().nextInt(7);
    097                this.attacker.getNavigator().tryMoveToEntityLiving(this.entityTarget, this.field_75440_e);
    098            }
    099
    100            this.attackTick = Math.max(this.attackTick - 1, 0);
    101            double var1 = (double)(this.attacker.width * 2.0F * this.attacker.width * 2.0F);
    102
    103            if (this.attacker.getDistanceSq(this.entityTarget.posX, this.entityTarget.boundingBox.minY, this.entityTarget.posZ) <= var1)
    104            {
    105                if (this.attackTick <= 0)
    106                {
    107                    this.attackTick = 20;
    108
    109                    if (this.attacker.getHeldItem() != null)
    110                    {
    111                        this.attacker.swingItem();
    112                    }
    113
    114                    this.attacker.attackEntityAsMob(this.entityTarget);
    115                }
    116            }
    117        }
    118    }