feat(items): port retail external-container looting
Add the ClientUISystem ground-object lifecycle, authoritative root and nested ViewContents projections, replacement and close semantics, and the DAT-authored gmExternalContainerUI strip for chests and corpses. Route double-click loot and full or partial drag transfers through the shared retail item policy without optimistic external ownership. Remove the incorrect NoLongerViewingContents behavior from owned side packs and retire AP-106/#196. Release build succeeds and all 5,875 tests pass with five intentional skips. Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
parent
48a118db91
commit
20ce67b625
27 changed files with 1750 additions and 45 deletions
|
|
@ -114,6 +114,14 @@ radar, inventory, paperdoll, toolbar, use/examine consumers, and plugins;
|
|||
Temporary pointer modes are separate App orchestration in `InteractionState` and
|
||||
must never become a competing selection owner.
|
||||
|
||||
External-container state follows the same ownership rule. Core
|
||||
`ExternalContainerState` owns the expected/current `ClientUISystem::groundObject`
|
||||
identity, Core.Net applies authoritative `ViewContents` and
|
||||
`CloseGroundContainer` events, and App `ExternalContainerLifecycleController`
|
||||
owns the replacement-only `NoLongerViewingContents` side effect. The retained
|
||||
`ExternalContainerController` is a projection over that state; mounting or
|
||||
disabling the gameplay UI cannot change the session lifetime.
|
||||
|
||||
Every retained gameplay window has a typed `RetailWindowHandle` and at most one
|
||||
`IRetainedPanelController` lifecycle owner. Multi-controller windows use
|
||||
`RetainedPanelControllerGroup`; the manager disposes controllers exactly once in
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue