feat(chat): port retail client command families

Expand the typed client-command boundary across travel, character queries, local UI and layout controls, AFK and consent, emotes, friends, squelch and filters, and fill-components. Preserve retail packet layouts and queue ownership, import the confirmation dialog, and keep authoritative social state in Core.

Co-Authored-By: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-13 14:50:15 +02:00
parent 5a45a7ac7f
commit 9ea579bdd0
47 changed files with 6659 additions and 99 deletions

View file

@ -48,7 +48,7 @@ Copy this block when adding a new issue:
## #213 — Retail client commands were sent to ACE as chat text
**Status:** IN-PROGRESS — implementation complete 2026-07-13, pending live gate
**Status:** IN-PROGRESS — full named-retail command-family port complete 2026-07-13, pending live gate
**Severity:** MEDIUM
**Component:** retained UI / chat commands / net
@ -63,23 +63,29 @@ as Talk text.
**Resolution:** Added an immutable named-retail client-command catalog and
three explicit routes: typed retail client action, ACE server command, and
ordinary chat. `/lifestone`, `/lif`, and `/ls` now publish
`ExecuteClientCommandCmd`; the App-layer `ClientCommandController` invokes
`WorldSession.SendTeleportToLifestone`, which sends retail game action `0x0063`.
Unknown `/` commands publish `SendServerCommandCmd` in canonical `@` form, so
commands such as `/ci` continue to reach ACE. Both chat backends use the same
router.
ordinary chat. The catalog now owns recall/house/PK travel, age/birth,
framerate/lock/version/location/corpse/die, clear and named/automatic UI
layouts, AFK/consent, emotes, friends, squelch/filter/message types, and
fill-components. `ClientCommandController` keeps the panel layer independent
of App/network services; `WorldSession` sends the exact game-action or control
message for server-backed families. Friends and squelch databases are parsed
into authoritative Core state, confirmation requests use the imported retail
dialog, and unknown `/` commands still publish `SendServerCommandCmd` in
canonical `@` form so ACE administrator commands continue to work. Both chat
backends use the same router.
**Research:**
`docs/research/2026-07-13-retail-client-command-routing-pseudocode.md`;
`docs/research/2026-07-13-retail-client-command-families-pseudocode.md`;
`ClientCommunicationSystem::OnChatCommand @ 0x00581320`;
`ClientCommunicationSystem::DoLifestone @ 0x0056FC70`;
`CM_Character::Event_TeleToLifestone @ 0x006A1B90`.
**Acceptance:** In the connected Release client, `/ls`, `/lif`, and
`/lifestone` begin recall to the bound lifestone without appearing as speech or
an ACE unknown-command error. `/ls now` shows local usage and sends nothing.
An ACE command such as `/ci 629 1` still works.
**Acceptance:** In the connected Release client, representative local and
server-backed commands execute without appearing as speech: `/loc`,
`/framerate`, `/saveui test`, `/loadui test`, `/age`, `/friends`, `/afk on`,
and `/marketplace`. `/ls now` shows local usage and sends nothing. An ACE
command such as `/ci 629 1` still works.
---
@ -5132,18 +5138,20 @@ rendering.
---
## #L.6 — UI layout save/load (saveui / loadui / lockui)
## #L.6 — [DONE 2026-07-13] UI layout save/load (saveui / loadui / lockui)
**Status:** OPEN
**Status:** DONE
**Severity:** LOW
**Filed:** 2026-04-26 (deferred from Phase K)
**Component:** ui
**Description:** Retail had `@saveui <name>`, `@loadui <name>`,
`@lockui` commands for persisting ImGui-style window layouts. ImGui
has built-in `LoadIniSettingsFromMemory` /
`SaveIniSettingsToMemory` — wire these to per-named-layout files,
plus chat-command parsing for the `@` prefixes.
**Resolution:** The retained production UI now implements `@saveui [name]`,
`@loadui [name]`, `@saveautoui`, `@loadautoui`, and `@lockui`. Named profiles
persist all mounted retail windows independently of character/resolution;
automatic profiles continue to use the existing character-and-resolution
layout store. Both `/` and `@` prefixes route through the shared typed retail
command catalog. The JSON storage remains the documented IA-15 modern
adaptation of retail's `UIElement_Position` serialization.
---