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