diff --git a/src/engine/mobileAI/MobAI.java b/src/engine/mobileAI/MobAI.java index fa9ee7c0..6b1a7291 100644 --- a/src/engine/mobileAI/MobAI.java +++ b/src/engine/mobileAI/MobAI.java @@ -110,7 +110,9 @@ public class MobAI { if (mob.behaviourType.callsForHelp) mobCallForHelp(mob); - if (!MovementUtilities.inRangeDropAggro(mob, target)) { + // siege engines drop targets on their own attack range in determineAction + + if (!mob.isSiege() && !MovementUtilities.inRangeDropAggro(mob, target)) { mob.setCombatTarget(null); return; } @@ -506,7 +508,16 @@ public class MobAI { boolean bypassLoadedPlayerCheck = false; if (mob.isPlayerGuard() || mob.isSiege()) { bypassLoadedPlayerCheck = true; - if (mob.combatTarget != null && mob.combatTarget.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) + + if (mob.isSiege()) { + + // siege engines hold a character target until it dies or leaves their attack range + + if (mob.combatTarget != null && AbstractCharacter.IsAbstractCharacter(mob.combatTarget)) + if (mob.combatTarget.loc.distanceSquared(mob.loc) > mob.getRange() * mob.getRange()) + mob.setCombatTarget(null); + + } else if (mob.combatTarget != null && mob.combatTarget.getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter)) if (mob.combatTarget.loc.distanceSquared(mob.loc) > 10000) mob.setCombatTarget(null); } @@ -532,7 +543,7 @@ public class MobAI { PlayerCharacter target = (PlayerCharacter) mob.getCombatTarget(); - if (!mob.playerAgroMap.containsKey(target.getObjectUUID())) { + if (!mob.isSiege() && !mob.playerAgroMap.containsKey(target.getObjectUUID())) { mob.setCombatTarget(null); return; } @@ -749,7 +760,7 @@ public class MobAI { if (mob.getCombatTarget() == null) return; - if (mob.getCombatTarget().getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) && !MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) && !mob.agentType.equals(mbEnums.AIAgentType.PET)) { + if (mob.getCombatTarget().getObjectType().equals(mbEnums.GameObjectType.PlayerCharacter) && !MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) && !mob.agentType.equals(mbEnums.AIAgentType.PET) && !mob.isSiege()) { mob.setCombatTarget(null); return;