Files
benilla-octo/crates
gromandClaude Opus 5 94c571e3ea app: nampower's mount block at the buff cap — the first live press refusal
`NP_PreventMountingWhenBuffCapped` was the one gap in the nampower table
named as a gap rather than a shrug: upstream defaults it ON, so a real
install refuses a mount cast with all 32 positive aura slots taken instead
of sending one the server accepts and then drops on the floor. With the
slots full the mount aura has nowhere to land; vmangos runs the cooldown
and the global cooldown and applies nothing, so the player stands still
having spent a press, with no error to read because from the server's side
nothing failed.

The rule is `spell/np_press.rs`, a new module for nampower's press side —
the rules that decide what a keypress does when the client would refuse it.
It is separate from `queue.rs` because its inputs are not the queue's, and
it is where the press-interception half will land.

Three things worth naming:

**The aura number is measured, not quoted.** `SPELL_AURA_MOUNTED = 78` is
asserted against this realm's own `Spell.dbc` for Brown Horse, Summon
Warhorse and Summon Felsteed, plus the converse on Frostbolt. A wrong
constant here makes the refusal silently never fire, which no amount of
play distinguishes from the row being off.

**One deviation, and upstream names the bug itself.** Its settings label
reads "Preventing mounting due to buff cap (breaks dismount)" — in 1.12 you
dismount by casting the mount spell again, so a blanket block strands a
buff-capped player on their mount. A press while `UNIT_FIELD_MOUNTDISPLAYID`
is live is exempt here. One descriptor read, and it removes the only way
this rule can make things worse.

**Refused silently**, as upstream is: its own report is a line in its debug
log, and 1.12's `SpellCastResult` has no code for "too many auras", so the
only error line available would be a sentence about something else. What the
player gets instead is the GCD and the packet both unspent, which is the
whole point of refusing above the commit rather than below it.

The ladder-level test asserts the fixture really reaches the cap before it
asserts anything about the refusal — the id dwords alone leave every slot
reading empty without the `AURAFLAGS` liveness nibble, and a fixture that
never filled the slots would have passed for the wrong reason.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn
2026-10-24 22:45:57 -06:00
..