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