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 }