From 1a17146e64bf991633a33c57cade96da7f788839 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Tue, 25 Aug 2026 09:12:21 -0700 Subject: [PATCH] docs: note the spam-safety invariant on AITimer.Prod A prodded think grants reaction, not action: steps are gated by the NextMove budget, swings/casts/abilities/detect-hidden by their own timers, and each command yields at most one think with no compounding. Verified against RunUO, which granted zero extra thinks (change-guarded CurrentSpeed -> random 0-1s timer restart) but also no action-rate advantage, for the same reason. Co-Authored-By: Claude Fable 5 --- Projects/UOContent/Mobiles/AI/BaseAI/AITimer.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Projects/UOContent/Mobiles/AI/BaseAI/AITimer.cs b/Projects/UOContent/Mobiles/AI/BaseAI/AITimer.cs index e86f63044..2b970296e 100644 --- a/Projects/UOContent/Mobiles/AI/BaseAI/AITimer.cs +++ b/Projects/UOContent/Mobiles/AI/BaseAI/AITimer.cs @@ -54,6 +54,9 @@ public sealed class AITimer : Timer // A fresh command must not wait out the previous cadence: think now. Pets are exempt // from sector deactivation, so dropping the stagger Delay here cannot bunch sector wakes. + // Spam-safe: at most one think per command and no compounding, and a think grants no + // action — steps (NextMove budget), swings, casts, abilities and detect-hidden are all + // gated by their own budgets/timers that this never touches. public void Prod() { _nextThink = Core.TickCount;