package net.minecraft.entity.ai; import java.util.Collections; import java.util.Comparator; import java.util.List; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.EntityLivingBase; public class EntityAINearestAttackableTarget extends EntityAITarget { private final Class targetClass; private final int targetChance; /** Instance of EntityAINearestAttackableTargetSorter. */ private final EntityAINearestAttackableTarget.Sorter theNearestAttackableTargetSorter; /** * This filter is applied to the Entity search. Only matching entities will be targetted. (null -> no * restrictions) */ private final IEntitySelector targetEntitySelector; private EntityLivingBase targetEntity; private static final String __OBFID = "CL_00001620"; public EntityAINearestAttackableTarget(EntityCreature p_i1663_1_, Class p_i1663_2_, int p_i1663_3_, boolean p_i1663_4_) { this(p_i1663_1_, p_i1663_2_, p_i1663_3_, p_i1663_4_, false); } public EntityAINearestAttackableTarget(EntityCreature p_i1664_1_, Class p_i1664_2_, int p_i1664_3_, boolean p_i1664_4_, boolean p_i1664_5_) { this(p_i1664_1_, p_i1664_2_, p_i1664_3_, p_i1664_4_, p_i1664_5_, (IEntitySelector)null); } public EntityAINearestAttackableTarget(EntityCreature p_i1665_1_, Class p_i1665_2_, int p_i1665_3_, boolean p_i1665_4_, boolean p_i1665_5_, final IEntitySelector p_i1665_6_) { super(p_i1665_1_, p_i1665_4_, p_i1665_5_); this.targetClass = p_i1665_2_; this.targetChance = p_i1665_3_; this.theNearestAttackableTargetSorter = new EntityAINearestAttackableTarget.Sorter(p_i1665_1_); this.setMutexBits(1); this.targetEntitySelector = new IEntitySelector() { private static final String __OBFID = "CL_00001621"; /** * Return whether the specified entity is applicable to this filter. */ public boolean isEntityApplicable(Entity p_82704_1_) { return !(p_82704_1_ instanceof EntityLivingBase) ? false : (p_i1665_6_ != null && !p_i1665_6_.isEntityApplicable(p_82704_1_) ? false : EntityAINearestAttackableTarget.this.isSuitableTarget((EntityLivingBase)p_82704_1_, false)); } }; } /** * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute() { if (this.targetChance > 0 && this.taskOwner.getRNG().nextInt(this.targetChance) != 0) { return false; } else { double d0 = this.getTargetDistance(); List list = this.taskOwner.worldObj.selectEntitiesWithinAABB(this.targetClass, this.taskOwner.boundingBox.expand(d0, 4.0D, d0), this.targetEntitySelector); Collections.sort(list, this.theNearestAttackableTargetSorter); if (list.isEmpty()) { return false; } else { this.targetEntity = (EntityLivingBase)list.get(0); return true; } } } /** * Execute a one shot task or start executing a continuous task */ public void startExecuting() { this.taskOwner.setAttackTarget(this.targetEntity); super.startExecuting(); } public static class Sorter implements Comparator { private final Entity theEntity; private static final String __OBFID = "CL_00001622"; public Sorter(Entity p_i1662_1_) { this.theEntity = p_i1662_1_; } public int compare(Entity p_compare_1_, Entity p_compare_2_) { double d0 = this.theEntity.getDistanceSqToEntity(p_compare_1_); double d1 = this.theEntity.getDistanceSqToEntity(p_compare_2_); return d0 < d1 ? -1 : (d0 > d1 ? 1 : 0); } public int compare(Object p_compare_1_, Object p_compare_2_) { return this.compare((Entity)p_compare_1_, (Entity)p_compare_2_); } } }