Simply put, my mob's attack AI is never called to execute (i.e. the shouldExecute method and, as a result, the startExecuting method, are never called).
Essentially, the mob starts executing its EntityAINearestAttackableTarget task, but then never reaches its EntityAIAttackMelee task. The shouldExecute method in the attack task is never called once the target-finding task is executed, but is called a few times before.
By removing the target-finding task, the mob does attempt to execute the attack task. However, without a target, the task naturally fails the shouldExecute check.
What is going wrong? I have copied the skeleton's AI tasks (as seen in the class below) to see if my implementation of the AI tasks was at fault, but it made no difference. I have thought of changing the priority of the attack task to precede the target-finding task, but vanilla mobs all have their attack tasks afterwards. Why is it different in this case?
Entity Class:
public class EntityTestMob extends EntityMob {
public EntityTestMob(World world) {
super(world);
this.setSize(0.6f, 1.99f);
}
@Override
protected void initEntityAI() {
this.tasks.addTask(1, new EntityAISwimming(this));
this.tasks.addTask(2, new EntityAIRestrictSun(this));
this.tasks.addTask(3, new EntityAIFleeSun(this, 1));
this.tasks.addTask(3, new EntityAIAvoidEntity(this, EntityWolf.class, 6f, 1, 1.2));
this.tasks.addTask(5, new EntityAIWanderAvoidWater(this, 1));
this.tasks.addTask(6, new EntityAIWatchClosest(this, EntityPig.class, 8f));
this.tasks.addTask(6, new EntityAILookIdle(this));
this.targetTasks.addTask(1, new EntityAIHurtByTarget(this, false, new Class[0]));
this.targetTasks.addTask(2, new EntityAINearestAttackableTarget(this, EntityPig.class, true));
this.targetTasks.addTask(3, new EntityAIAttackMelee(this, 1, false));
}
@Override
protected void applyEntityAttributes() {
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.FOLLOW_RANGE).setBaseValue(32);
this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.25);
this.getEntityAttribute(SharedMonsterAttributes.ATTACK_DAMAGE).setBaseValue(3);
}
}
Note: The AI targets pigs so I can test if it works while still in creative mode. Changing its target to the player makes no difference.