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

@ -0,0 +1,14 @@
namespace AcDream.Core.Items;
/// <summary>
/// Lossless retail <c>ShortCutData</c> value: signed slot index, object id,
/// and raw 32-bit spell word. The C++ object is 16 bytes including its vtable;
/// the packed value is exactly 12 bytes. Retail anchors:
/// <c>ShortCutData::ShortCutData @ 0x005D55E0</c>,
/// <c>ShortCutManager::AddShortCut @ 0x005D5790</c>, and
/// <c>acclient.h:36484</c>.
/// </summary>
public readonly record struct ShortcutEntry(int Index, uint ObjectId, uint SpellId)
{
public ShortcutEntry WithIndex(int index) => this with { Index = index };
}