fix(ui): complete live targeted healing flow

Route ACE server commands through the existing chat path, bind the retail paperdoll hit mask instead of its obscured viewport, and prefer authoritative private health vitals. Record the user-confirmed live gate and pin the production DAT widget type in tests.
This commit is contained in:
Erik 2026-07-11 07:58:59 +02:00
parent eb6229394a
commit 05f6222865
11 changed files with 181 additions and 24 deletions

View file

@ -160,9 +160,9 @@ and preserve placement's action list separately from its boolean return (vendor
sale and secure-trade attempts act while returning false).
The 2026-07-11 non-debug Release gate passed ordinary use/container activation,
equip synchronization, and grounded world drop. No healing kit was available,
so targeted healing was not live-tested; retain the automated compatible,
invalid, and self-target coverage as the acceptance evidence for that branch.
equip synchronization, grounded world drop, and targeted healing. ACE `/ci 632`
provisioned a peerless kit and `/harmself` created a real health deficit; main-pack
and paperdoll self-targets both healed successfully.
## 2026-07-11 primary-click ownership
@ -176,3 +176,32 @@ to expose callbacks without importing controllers. The router retains a consumed
target through the toolkit's 500 ms double-click window; otherwise UiRoot's
second Click plus DoubleClick could run ordinary activation after the first click
cleared target mode.
The 2026-07-11 non-debug Release fallback gate passed for inventory,
paperdoll, toolbar, radar, and world primary clicks with target mode inactive,
and the active healing-kit target flow passed through the main pack and 3-D doll.
The production DAT resolves `0x100001D6`, the full-height paperdoll hit/drag mask,
as a `UiButton` over `UiViewport 0x100001D5`. Bind target behavior to the mask,
not only the obscured viewport, and hide/show both together with the Slots toggle.
For local vitals, `PrivateUpdateVital`/`PrivateUpdateVitalCurrent` in
`LocalPlayerState` are authoritative. `VitalsVM.HealthPercent` must prefer that
private health snapshot over the world-facing `CombatState` percentage, using
the latter only before private state arrives. ACE `/harmself` exposed the stale
owner because it sends private vital deltas without changing that combat cache.
## ACE command forwarding
`ChatCommandRouter` is the single submit path for retained and developer chat.
Known client/chat verbs resolve locally; unknown letter verbs are server
commands. They are always published as `ChatChannelKind.Say`, regardless of the
selected channel, because commands must ride `GameAction Talk (0x0015)`.
`ChatInputParser` preserves `@verb` and canonicalizes `/verb` to `@verb` on the
wire: ACE's `GameActionTalk` checks only the at-sign form before invoking its
`CommandManager`. Do not add a parallel admin-command transport.
For live test-item provisioning, ACE `@ci` accepts a weenie class id/classname
plus optional stack size, palette, and shade. Healing kit WCIDs are 628 crude,
629 plain, 630 good, 631 excellent, and 632 peerless. The `+Acdream` developer
character can therefore create the best kit with either `/ci 632` or `@ci 632`;
both forms must produce canonical `@ci 632` Talk text.