fix(interaction): restore retail loot placement and world-drop projection

This commit is contained in:
Erik 2026-07-27 00:03:15 +02:00
parent 4d095be286
commit 921712f412
24 changed files with 1581 additions and 34 deletions

View file

@ -103,6 +103,63 @@ Copy this block when adding a new issue:
---
## #247 — Loot ordering and local dropped-item projection regressed
**Status:** DONE — 2026-07-26; connected loot/drop/selection gate passed
**Severity:** HIGH
**Filed:** 2026-07-26
**Component:** inventory / live-entity projection
**Description:** Double-click loot transferred successfully but settled at an
unrelated backpack position. Locally dropped items were authoritative and
visible to retail observers, yet remained invisible in acdream.
**Root cause / status:** The compact container projection sorted a completed
server move by stale slot state instead of performing retail's separate
remove-then-`IDList::AddAtNum` insertion. Whole-object drops then exposed two
projection errors. Inventory-only objects retained canonical CreateObject and
timestamp state without an App projection sidecar; the Position authority gate
committed their server position and then rejected the presentation tail
because it required a pre-existing `LiveEntityRecord`. Accepted Position now
returns the exact canonical incarnation, and the network presenter crosses
the normal spatial-hydration boundary before continuing. Objects which already
retain a sidecar recover whenever `IsSpatiallyProjected` is false.
`EquippedChildRenderController` also no longer interprets every final `None`
equip mask as a detach; it requires the actual equipped-to-unequipped edge.
Partial-stack drops have an additional ACE-specific wire omission.
`HandleActionStackableSplitTo3D` creates a new GUID and sends Position updates,
but does not send that new object's CreateObject to the initiating session.
Retail records the source WCID, selected count, and request time for ten
seconds so the created object can be recognized. acdream now retains that same
single pending identity; the one matching unknown ACE Position hydrates a
canonical clone of the source appearance through the normal live-entity path.
Reconnect evidence proved all prior drops were persisted and received as
ordinary CreateObjects. Focused ordering, projection, and pending-identity
tests pass, including stale-authority rejection, first projection construction,
and no duplicate resource/ready publication.
The follow-up stale marker was a separate projection-lifetime ordering edge.
Retail keeps canonical selection but suppresses its vivid world marker while
the object is player-owned or `IN_CONTAINER`. acdream additionally must not
mistake a retained leave-world `WorldEntity` pose for a current ground pose:
ACE may publish the drop placement before the new Position. Marker resolution
now requires both world placement and a current top-level spatial projection.
The inverse packet order is also safe: a fresh Position remains suppressed by
ownership until the placement arrives. This uses no timer and does not impose
camera/PVS visibility, preserving off-screen and through-wall indicators.
**Research:**
[`research/2026-07-26-retail-inventory-placement-and-world-drop-pseudocode.md`](research/2026-07-26-retail-inventory-placement-and-world-drop-pseudocode.md).
**Acceptance:** Looted items occupy the retail-selected backpack slot in
server order; locally and remotely dropped items appear once in the world;
pickup removes the ground marker without clearing inventory selection; re-drop
shows the marker only at the new authoritative pose. User accepted all four
connected checks on 2026-07-26.
---
## #246 — Prepared indoor cells stopped traversing their portals
**Status:** DONE — 2026-07-26; connected house/dungeon gate passed