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.selectEntitiesWithinAABB(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 }