package net.minecraft.entity.ai; import java.util.Collections; import java.util.Iterator; import java.util.List; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; public class EntityAINearestAttackableTarget extends EntityAITarget { EntityLiving targetEntity; Class targetClass; int targetChance; private final IEntitySelector field_82643_g; /** Instance of EntityAINearestAttackableTargetSorter. */ private EntityAINearestAttackableTargetSorter theNearestAttackableTargetSorter; public EntityAINearestAttackableTarget(EntityLiving par1EntityLiving, Class par2Class, float par3, int par4, boolean par5) { this(par1EntityLiving, par2Class, par3, par4, par5, false); } public EntityAINearestAttackableTarget(EntityLiving par1EntityLiving, Class par2Class, float par3, int par4, boolean par5, boolean par6) { this(par1EntityLiving, par2Class, par3, par4, par5, par6, (IEntitySelector)null); } public EntityAINearestAttackableTarget(EntityLiving par1, Class par2, float par3, int par4, boolean par5, boolean par6, IEntitySelector par7IEntitySelector) { super(par1, par3, par5, par6); this.targetClass = par2; this.targetDistance = par3; this.targetChance = par4; this.theNearestAttackableTargetSorter = new EntityAINearestAttackableTargetSorter(this, par1); this.field_82643_g = par7IEntitySelector; this.setMutexBits(1); } /** * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute() { if (this.targetChance > 0 && this.taskOwner.getRNG().nextInt(this.targetChance) != 0) { return false; } else { if (this.targetClass == EntityPlayer.class) { EntityPlayer var1 = this.taskOwner.worldObj.getClosestVulnerablePlayerToEntity(this.taskOwner, (double)this.targetDistance); if (this.isSuitableTarget(var1, false)) { this.targetEntity = var1; return true; } } else { List var5 = this.taskOwner.worldObj.selectEntitiesWithinAABB(this.targetClass, this.taskOwner.boundingBox.expand((double)this.targetDistance, 4.0D, (double)this.targetDistance), this.field_82643_g); Collections.sort(var5, this.theNearestAttackableTargetSorter); Iterator var2 = var5.iterator(); while (var2.hasNext()) { Entity var3 = (Entity)var2.next(); EntityLiving var4 = (EntityLiving)var3; if (this.isSuitableTarget(var4, false)) { this.targetEntity = var4; return true; } } } return false; } } /** * Execute a one shot task or start executing a continuous task */ public void startExecuting() { this.taskOwner.setAttackTarget(this.targetEntity); super.startExecuting(); } }