|
|
|
package engine.mobileAI.BehaviourFiles;
|
|
|
|
|
|
|
|
import engine.InterestManagement.WorldGrid;
|
|
|
|
import engine.gameManager.PowersManager;
|
|
|
|
import engine.mobileAI.enumMobState;
|
|
|
|
import engine.mobileAI.utilities.CombatUtilities;
|
|
|
|
import engine.mobileAI.utilities.MovementUtilities;
|
|
|
|
import engine.objects.AbstractWorldObject;
|
|
|
|
import engine.objects.ItemBase;
|
|
|
|
import engine.objects.Mob;
|
|
|
|
import engine.objects.PlayerCharacter;
|
|
|
|
import engine.powers.PowersBase;
|
|
|
|
import engine.server.MBServerStatics;
|
|
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
public class PlayerPet {
|
|
|
|
|
|
|
|
public static void process(Mob pet){
|
|
|
|
if(pet.getOwner() == null && !pet.isNecroPet()){
|
|
|
|
pet.killCharacter("no owner");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!WorldGrid.getObjectsInRangePartial(pet.loc, MBServerStatics.CHARACTER_LOAD_RANGE,1).contains(pet.getOwner())){
|
|
|
|
pet.teleport(pet.getOwner().loc);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(enumMobState.getState(pet)){
|
|
|
|
case dead:
|
|
|
|
pet.despawn();
|
|
|
|
return;
|
|
|
|
case patrolling:
|
|
|
|
if(pet.loc.distanceSquared(pet.getOwner().loc) > 90 && !pet.isMoving()){
|
|
|
|
MovementUtilities.aiMove(pet,pet.getOwner().loc,false);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
case attacking:
|
|
|
|
attack(pet);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void attack(Mob mob){
|
|
|
|
|
|
|
|
if (mob.combatTarget == null || !mob.combatTarget.isAlive()) {
|
|
|
|
mob.setCombatTarget(null);
|
|
|
|
aggro(mob);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!CombatUtilities.inRangeToAttack(mob,mob.combatTarget)){
|
|
|
|
if (!MovementUtilities.canMove(mob))
|
|
|
|
return;
|
|
|
|
MovementUtilities.aiMove(mob,mob.combatTarget.loc,false);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
mob.updateLocation();
|
|
|
|
|
|
|
|
ItemBase weapon = mob.getWeaponItemBase(true);
|
|
|
|
boolean mainHand = true;
|
|
|
|
if(weapon == null) {
|
|
|
|
weapon = mob.getWeaponItemBase(false);
|
|
|
|
mainHand = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (System.currentTimeMillis() > mob.getNextAttackTime()) {
|
|
|
|
CombatUtilities.combatCycle(mob, mob.combatTarget, mainHand, weapon);
|
|
|
|
mob.setNextAttackTime(System.currentTimeMillis() + 3000L);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public static void aggro(Mob mob){
|
|
|
|
|
|
|
|
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(mob.loc,30, MBServerStatics.MASK_MOB)) {
|
|
|
|
Mob potentialTarget = (Mob) awo;
|
|
|
|
if (!potentialTarget.isAlive())
|
|
|
|
continue;
|
|
|
|
if (MovementUtilities.inRangeToAggro(mob, potentialTarget)) {
|
|
|
|
mob.setCombatTarget(potentialTarget);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|