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

@ -363,11 +363,11 @@ consume the typed action seam when those surfaces land; until then the policy
refuses unsafe wire sends rather than bypassing their gates.
**Acceptance (2026-07-11):** Non-debug Release live-world gate passed for
ordinary item/container activation, equip/inventory synchronization, and grounded
world drop, with no observed UI regression. A healing kit was not available in
the test character's inventory, so the targeted-heal click was not exercised
live; the compatible/invalid/self target matrix remains pinned by Core and App
controller tests. Full suite green before launch: 4,575 passed, 5 skipped.
ordinary item/container activation, equip/inventory synchronization, grounded
world drop, and targeted healing. ACE command forwarding provisioned WCID 632
with `/ci 632`; `/harmself` then proved the main-pack and paperdoll self-target
paths plus authoritative health-bar drain/recovery. Full suite green at the final
gate: 4,583 passed, 5 skipped.
### 3.3 Add one item primary-click chokepoint
@ -393,6 +393,14 @@ results. The consumed target is retained for retail's 500 ms double-click window
so the second Click/DoubleClick pair cannot reactivate or equip the rejected
object after target mode clears. Issue #197 and AP-107 are retired.
**Acceptance (2026-07-11):** User-confirmed the non-debug Release fallback
matrix for inactive target mode across inventory, paperdoll, toolbar, radar,
and world clicks, then the active targeted-heal flow through both the main pack
and 3-D paperdoll. The production DAT resolves the authored doll hit mask
`0x100001D6` as a `UiButton`; binding the viewport beneath it cannot receive a
live click. The mask now owns self-target clicks and hides with the viewport in
slot view. Full suite green at the final gate: 4,583 passed, 5 skipped.
### 3.4 Complete retail cursor precedence and catalog
- [ ] Port every reachable branch of `ClientUISystem::UpdateCursorState`, not only