From 8bb6cd8268d50de0f8be96dca9636a77b4c27a50 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Sun, 25 Oct 2026 07:31:03 -0400 Subject: [PATCH] Send the Wall Guard rune to wall archers Wall archers are now sent 252622 Wall Guard in place of 252623 Standing Guard (serialize and getClientRuneIDs). The rune roots its holder (ROOT2, ROOTFSMID=Power), which matches wall archers never moving (canRoam false). No server value change: 252622 and 252623 add the same +100 to all five attributes with the same max, the only fields the server reads from the sent runes. Wall archers don't cast, so the 252623 power rank steps don't apply to them. The rune's effects and its MOB-SNARE grant are not applied by the server, as with the other guard runes. Client side: 252623 is the only rune that sets the client's is-guard flag (0x67AB1B), so the CloseToGuard hint no longer fires near wall archers. Co-Authored-By: Claude Opus 5.5 --- src/engine/objects/Mob.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java index 7f82672e..9491b71a 100644 --- a/src/engine/objects/Mob.java +++ b/src/engine/objects/Mob.java @@ -184,7 +184,7 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed { } else if (mob.contract != null || mob.isPlayerGuard()) { writer.putInt(3); serializeRune(mob, writer, 3, GameObjectType.NPCClassRuneTwo.ordinal(), 2518); //warrior class - serializeRune(mob, writer, 5, GameObjectType.NPCClassRuneThree.ordinal(), 252623); //standing guard rune; the client fires its CloseToGuard hint only for 252623 (0x67AB1B) + serializeRune(mob, writer, 5, GameObjectType.NPCClassRuneThree.ordinal(), mob.getGuardRuneID()); } else writer.putInt(1); @@ -736,13 +736,22 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed { runeIDs.add(2522); else if (this.contract != null || this.isPlayerGuard()) { runeIDs.add(2518); - runeIDs.add(252623); + runeIDs.add(this.getGuardRuneID()); } runeIDs.add((this.mobBase != null) ? this.mobBase.getObjectUUID() : this.loadID); return runeIDs; } + // Wall archers get 252622 Wall Guard; the rest get 252623 Standing Guard, the only rune that fires the client's CloseToGuard hint (0x67AB1B) + public int getGuardRuneID() { + + if (this.agentType == AIAgentType.GUARDWALLARCHER) + return 252622; + + return 252623; + } + // Client ArcCharacter_RecalcMaxAttributes 0x470440 + RecalcAttributes 0x470610 with no spent points public int getRuneAttribute(AttributeType attributeType) {