feat(ui): preserve exact retail shortcut records

Carry signed index, object id, and raw spell word losslessly through PlayerDescription, session storage, drag mutation, and AddShortcut wire serialization while keeping gmToolbarUI object-only. Retire AP-103 and record the live ACE relog persistence gate.

Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-11 09:17:33 +02:00
parent e65119f0c6
commit b5b230c860
21 changed files with 271 additions and 181 deletions

View file

@ -450,16 +450,25 @@ skipped.
### 4.2 Preserve the exact shortcut model; keep the toolbar object-only
- [ ] Model the 18 raw `ShortCutData` entries exactly as signed `index_`, unsigned
- [x] Model the 18 raw `ShortCutData` entries exactly as signed `index_`, unsigned
`objectID_`, and unsigned `spellID_`; verify packing against the retail packer and
protocol captures before changing the existing builder.
- [ ] Preserve all three fields through parse, session storage, mutation, and wire
- [x] Preserve all three fields through parse, session storage, mutation, and wire
serialization even though `gmToolbarUI::UpdateFromPlayerDesc @ 0x004BF810`
restores only entries with a nonzero `objectID_`.
- [ ] Keep the main toolbar item/object-only. Feed `PlayerModule::favorite_spells_[8]`
- [x] Keep the main toolbar item/object-only. Feed `PlayerModule::favorite_spells_[8]`
and the already parsed `HotbarSpells` into the separate spell-bar subsystem in
Wave 10.
**Wave 4.2 implementation (2026-07-11):** Core-owned `ShortcutEntry` now models
the exact signed index, object id, and raw 32-bit spell word. PlayerDescription
parsing, the 18-slot nullable store, retained-cell drag snapshots, displaced-item
reindexing, runtime delegates, WorldSession, and AddShortcut serialization carry
the same lossless value. The visible toolbar continues to bind only entries with
nonzero object ids. AP-103 is retired; automated conformance is green and the
live relog/persistence gate passed: ACE restored the mutated shortcut in the
same slot after a clean reconnect.
### 4.3 Port every drag/drop branch
- [ ] Add a pure `ShortcutDropPlanner` keyed by source kind: toolbar reorder,