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; } } } }