fix(items): finish corpse pickup and combat switching

Port retail's first-slot ShowPendingInPlayer path for double-click loot and carry the current owned-container destination through deferred pickup. Retire the previous ground-container view as soon as a replacement is requested so its range close cannot cancel ACE's active MoveTo chain.

Preserve active-combat weapon intent across ACE's authoritative wand-to-missile stance tail while leaving peace-mode switches unchanged.

Release build succeeds and all 5,885 tests pass with five intentional skips.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-17 18:35:29 +02:00
parent d51a0fc825
commit 0392c6d721
17 changed files with 631 additions and 81 deletions

View file

@ -5,7 +5,7 @@ namespace AcDream.Core.Items;
public enum ExternalContainerTransitionKind
{
Opened,
Replaced,
ReplacementRequested,
Closed,
Reset,
}
@ -33,7 +33,24 @@ public sealed class ExternalContainerState
{
if (containerId == 0u || RequestedContainerId == containerId)
return false;
uint previous = CurrentContainerId;
RequestedContainerId = containerId;
// ClientUISystem::SetGroundObject @ 0x00564510 retires the old
// ground-object presentation synchronously when a different root is
// requested. ViewContents for the new root arrives later. Keeping the
// old root current during that interval lets its range watcher issue a
// close Use, which ACE interprets as cancellation of the new root's
// MoveTo chain.
if (previous != 0u && previous != containerId)
{
CurrentContainerId = 0u;
Changed?.Invoke(new ExternalContainerTransition(
ExternalContainerTransitionKind.ReplacementRequested,
previous,
containerId));
}
return true;
}
@ -49,9 +66,7 @@ public sealed class ExternalContainerState
return false;
Changed?.Invoke(new ExternalContainerTransition(
previous == 0u
? ExternalContainerTransitionKind.Opened
: ExternalContainerTransitionKind.Replaced,
ExternalContainerTransitionKind.Opened,
previous,
containerId));
return true;