From 531a2d028b386d6c812db50a15a8b8bd16ed0841 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Thu, 15 Oct 2026 08:52:09 -0400 Subject: [PATCH] Drop siege engine targets only on death or attack range Siege engines dropped player targets at 100 units, at the 200 unit drop-aggro range, or when the player was missing from playerAgroMap, all well inside their 350 attack range. They now hold a character target until it dies, can't be seen, or leaves getRange(). Co-Authored-By: Claude Opus 5.5 --- src/engine/mobileAI/MobAI.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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;