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