fix(world): preserve portal materialization effects

Route accepted Hidden and UnHide transitions through retail's internal typed-script path so their DAT scripts queue while the owner is cell-less and resume at the destination. Consume ACE's successful teleport control statuses silently, matching retail HandleFailureEvent.

Co-authored-by: OpenAI Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-16 08:14:48 +02:00
parent bfb4b26dff
commit 4b1bceefbb
12 changed files with 142 additions and 8 deletions

View file

@ -271,6 +271,14 @@ PlayerTeleported():
SendMovementEvent()
```
The numeric `0x3c` is the internal `ITeleported` completion status, not a
player-visible error. `ClientCommunicationSystem::HandleFailureEvent`
`0x00571990` has a visible case for `0x3d` (`YouChargedTooFar`) but no case for
`0x3b` (`ILeftTheWorld`) or `0x3c`; both fall through without adding scroll
text. ACE also sends `ITeleported` after a successful portal use. acdream must
consume those two control statuses silently rather than formatting an unknown
`WeenieError` line.
The viewer reset copies the player's complete position into both `viewer` and
`viewer_sought_position`. Subsequent ordinary camera updates extend the chase
boom outward through the same damped and swept path used after camera
@ -384,6 +392,12 @@ no Marketplace-specific classifier or portal-exit behavior is required.
`AnimationSequencer.Manager.HandleEnterWorld`, matching retail's PartArray
boundary for player, creature, and object animations without classifying the
preceding action.
- Hidden/UnHide typed scripts use retail's internal path, not ordinary
`CPhysicsObj::play_script` (`0x00513260`). `set_hidden` resolves the current
PhysicsScriptTable and calls `play_script_internal` even when the object has
no current cell. The serial script remains paused until destination re-entry;
this preserves table `0x34000004`'s purple Hidden emitters across asynchronous
portal placement. Ordinary F755/default-hook playback retains the cell gate.
- Destination residency remains acdream's asynchronous adaptation. It supplies
the same `EndTeleportAnimation` edge retail receives when its blocking cell
load completes; it does not alter presentation ordering.