    001    package net.minecraft.entity.ai;
    002
    003    import java.util.Collections;
    004    import java.util.Iterator;
    005    import java.util.List;
    006    import net.minecraft.command.IEntitySelector;
    007    import net.minecraft.entity.Entity;
    008    import net.minecraft.entity.EntityLiving;
    009    import net.minecraft.entity.player.EntityPlayer;
    010
    011    public class EntityAINearestAttackableTarget extends EntityAITarget
    012    {
    013        EntityLiving targetEntity;
    014        Class targetClass;
    015        int targetChance;
    016        private final IEntitySelector field_82643_g;
    017
    018        /** Instance of EntityAINearestAttackableTargetSorter. */
    019        private EntityAINearestAttackableTargetSorter theNearestAttackableTargetSorter;
    020
    021        public EntityAINearestAttackableTarget(EntityLiving par1EntityLiving, Class par2Class, float par3, int par4, boolean par5)
    022        {
    023            this(par1EntityLiving, par2Class, par3, par4, par5, false);
    024        }
    025
    026        public EntityAINearestAttackableTarget(EntityLiving par1EntityLiving, Class par2Class, float par3, int par4, boolean par5, boolean par6)
    027        {
    028            this(par1EntityLiving, par2Class, par3, par4, par5, par6, (IEntitySelector)null);
    029        }
    030
    031        public EntityAINearestAttackableTarget(EntityLiving par1, Class par2, float par3, int par4, boolean par5, boolean par6, IEntitySelector par7IEntitySelector)
    032        {
    033            super(par1, par3, par5, par6);
    034            this.targetClass = par2;
    035            this.targetDistance = par3;
    036            this.targetChance = par4;
    037            this.theNearestAttackableTargetSorter = new EntityAINearestAttackableTargetSorter(this, par1);
    038            this.field_82643_g = par7IEntitySelector;
    039            this.setMutexBits(1);
    040        }
    041
    042        /**
    043         * Returns whether the EntityAIBase should begin execution.
    044         */
    045        public boolean shouldExecute()
    046        {
    047            if (this.targetChance > 0 && this.taskOwner.getRNG().nextInt(this.targetChance) != 0)
    048            {
    049                return false;
    050            }
    051            else
    052            {
    053                if (this.targetClass == EntityPlayer.class)
    054                {
    055                    EntityPlayer var1 = this.taskOwner.worldObj.getClosestVulnerablePlayerToEntity(this.taskOwner, (double)this.targetDistance);
    056
    057                    if (this.isSuitableTarget(var1, false))
    058                    {
    059                        this.targetEntity = var1;
    060                        return true;
    061                    }
    062                }
    063                else
    064                {
    065                    List var5 = this.taskOwner.worldObj.selectEntitiesWithinAABB(this.targetClass, this.taskOwner.boundingBox.expand((double)this.targetDistance, 4.0D, (double)this.targetDistance), this.field_82643_g);
    066                    Collections.sort(var5, this.theNearestAttackableTargetSorter);
    067                    Iterator var2 = var5.iterator();
    068
    069                    while (var2.hasNext())
    070                    {
    071                        Entity var3 = (Entity)var2.next();
    072                        EntityLiving var4 = (EntityLiving)var3;
    073
    074                        if (this.isSuitableTarget(var4, false))
    075                        {
    076                            this.targetEntity = var4;
    077                            return true;
    078                        }
    079                    }
    080                }
    081
    082                return false;
    083            }
    084        }
    085
    086        /**
    087         * Execute a one shot task or start executing a continuous task
    088         */
    089        public void startExecuting()
    090        {
    091            this.taskOwner.setAttackTarget(this.targetEntity);
    092            super.startExecuting();
    093        }
    094    }