fix(world): retire motion links at hidden transitions

Port CPhysicsObj::set_hidden's PartArray HandleEnterWorld boundary on both Hidden and UnHide. This strips linked recall/casting animations and aborts their pending completions before cell visibility changes, preventing spell-recall tails after portal travel without arrival resets or action classifiers.\n\nCo-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-16 07:39:34 +02:00
parent 75acae02d6
commit bfb4b26dff
6 changed files with 185 additions and 21 deletions

View file

@ -301,7 +301,8 @@ recorded end-to-end dungeon round-trip user gate, plus the far-town
teleport-OUT arrival cascade residual (**#145-residual, REOPENED** —
capture-harness-first).
**2026-07-15 portal presentation completion (visual gate pending).** The
**2026-07-15 portal presentation completion (single-client visual gate passed
2026-07-16; non-blocking polish deferred).** The
temporary black tunnel cover is retired. F751 transit now renders retail's
client-enum-resolved DAT Setup `0x02000306` with animation `0x030005AC` at
40 frames/s in a dedicated CreatureMode-equivalent viewport, using retail's
@ -317,10 +318,19 @@ object, projectile, animation, final-pose, animation-hook, particle, and
owner-script work completes before the inbound network queue is dispatched.
Local movement/jump output is committed on that same pre-network side, while a
non-advancing post-network pass reconciles children and attached effect/light
anchors after authoritative root moves. This prevents ACE's teleport Hidden state
from freezing the final fraction of recall and replaying it after materialize,
without an arrival reset or Hidden-time animation exception. Automated recall
DAT conformance is green; destination-side visual confirmation remains.
anchors after authoritative root moves. The accepted Hidden and UnHide paths
now also port `CPhysicsObj::set_hidden @ 0x00514C60` completely. Hidden invokes
the PartArray boundary after its effect, child visibility, collision stop, and
cell hide; UnHide invokes it after effect/child/collision restoration but before
the cell becomes visible. Both route through `CPartArray::HandleEnterWorld`
`MotionTableManager::HandleEnterWorld`. That
strips every link animation and aborts pending motion completions before a
spell-cast recoil or recall remainder can survive portal space. This is the
generic retail visibility boundary, not a recall classifier, an arrival reset,
or a Hidden-time animation exception. Installed-DAT conformance covers both
the Lifestone recall boundary and a MagicPortal casting timeline. The user
confirmed `/ls` and spell-recall arrivals no longer replay their animation
tails; additional portal visual polish is explicitly deferred.
---