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 <noreply@anthropic.com>
This commit is contained in:
MagicBotandClaude Opus 5.5 committed 2026-10-25 07:31:03 -04:00
1 parent b4a15ebf60
commit 8bb6cd8268
1 file changed
+11 -2
+11 -2
View File
@@ -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) {