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    }