From ca33c5a14c6444ba3909c23887baaf1ccc89dbd4 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Thu, 15 Oct 2026 08:51:38 -0400 Subject: [PATCH] Keep siege engines alive and targeting when released Owner death, logout or invisibility dismissed a commanded siege engine by clearing its target and marking it dead. Released engines now revert to MOBILE in place, stay alive and keep their current target so any nation member can re-command them with a Rod of Command. Commanding an engine no longer clears the target of the old or new engine. Co-Authored-By: Claude Opus 5.5 --- .../objects/AbstractIntelligenceAgent.java | 18 ++++++++++++++++-- src/engine/objects/PlayerCharacter.java | 4 ++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/engine/objects/AbstractIntelligenceAgent.java b/src/engine/objects/AbstractIntelligenceAgent.java index b2253b4f..053fd833 100644 --- a/src/engine/objects/AbstractIntelligenceAgent.java +++ b/src/engine/objects/AbstractIntelligenceAgent.java @@ -148,9 +148,20 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter { public void dismiss() { + boolean isSiegeEngine; + + isSiegeEngine = this.getObjectType() == GameObjectType.Mob && ((Mob) this).isSiege(); + if (this.isPet()) { - if ((this.agentType.equals(mbEnums.AIAgentType.PET))) { //delete summoned pet + if (isSiegeEngine) { + + // Released siege engines stay in place, alive, and keep firing at + // their current target until a Rod of Command takes them again. + + this.agentType = mbEnums.AIAgentType.MOBILE; + + } else if ((this.agentType.equals(mbEnums.AIAgentType.PET))) { //delete summoned pet WorldGrid.RemoveWorldObject(this); @@ -167,7 +178,8 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter { // clear owner and set not alive - this.isAlive.set(false); + if (!isSiegeEngine) + this.isAlive.set(false); PlayerCharacter owner = (PlayerCharacter) this.guardCaptain; @@ -188,6 +200,8 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter { this.guardCaptain = null; } + if (isSiegeEngine && this.isAlive()) + WorldGrid.updateObject(this); } } diff --git a/src/engine/objects/PlayerCharacter.java b/src/engine/objects/PlayerCharacter.java index 19c45026..18da2e2c 100644 --- a/src/engine/objects/PlayerCharacter.java +++ b/src/engine/objects/PlayerCharacter.java @@ -4184,8 +4184,9 @@ public class PlayerCharacter extends AbstractCharacter { } else if (currentPet.isSiege()) { currentPet.agentType = AIAgentType.MOBILE; + // released siege engine keeps its current target + currentPet.guardCaptain = null; - currentPet.setCombatTarget(null); if (currentPet.isAlive()) WorldGrid.updateObject(currentPet); } @@ -4193,7 +4194,6 @@ public class PlayerCharacter extends AbstractCharacter { toCommand.setPet(this, false); this.setPet(toCommand); - toCommand.setCombatTarget(null); PetMsg petMsg = new PetMsg(6, toCommand); Dispatch dispatch = Dispatch.borrow(this, petMsg); DispatchManager.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY);