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