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