f6d2d44df8
A possessed unit's spell and a pet spell with AttributesEx4 0x20 went out as CMSG_PET_ACTION. `CastSpellByName` never found pet spells and misparsed names. `SendChatMessage` sent `%t` and `%n` unexpanded and passed any `|` escape. `RandomRoll` sent any arguments. The reference: - `CastSpellByName` cuts the name and rank at the first `(` and `)` and falls back to the pet's book (0x4b3950). - A unit caster runs the cast ladder, picking its own target (0x6e4ef4) and ordering Attack after the send (0x6131a0). - `SendChatMessage` expands the tokens and raises on a bad escape inside its call (0x49f1e0). - `RandomRoll` checks its arguments first (0x48c7b0). What changed: - A `CMSG_PET_CAST_SPELL` writer with byte-exact goldens. - The unit caster's ladder covers its pick, autoSelfCast and the cursor's binds. - Both chat verbs now apply inside their calls. - The channel slots follow every step. Each fact is tested against its address. Fixes #639 Fixes #168 Fixes #406 Fixes #1331 Fixes #1332 Fixes #1531 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>