fix(vfx): bind effects after canonical placement

C3c created graphical effect, projectile, and static-animation sidecars before Runtime finished the entity's first SetPosition. One-shot F754/F755 packets could be discarded, projectiles could adopt a cell-less body, and animated statics could compete for body ownership. Keep effects behind an exact-incarnation presentation barrier, retry projectile/static binding on the committed visibility edge, and keep effect cells synchronized with canonical rebuckets. User verified spell, recall, arrow, projectile, portal, and static presentation; 90 focused App tests and the Release build pass.
This commit is contained in:
Erik 2026-08-03 12:10:21 +02:00
parent 1fc529cdcb
commit f24532adf3
11 changed files with 417 additions and 50 deletions

View file

@ -72,17 +72,52 @@ What does NOT go here:
longer hand-place ahead of publication); expected to resolve with the
O(changed)-clone slice — re-verify all three in its acceptance
session.
- **#279 — OPEN — one-shot spell/effect scripts arriving during the
suppressed-until-receipt window can be lost.** User-observed: spell
particle effects intermittently missing (2026-08-02 smoke test). C3c
suppresses presentation for a created entity until its placement
receipt binds it; a play-once VFX/script that fires while suppressed
has no presentation to land on and never replays at bind time —
"sometimes works" = the receipt won the race. Investigate retail's
pending-script handling for not-yet-in-world objects (HandleCreateObject
tail / PlayScript queuing) and defer one-shot scripts to the
presentation-binding moment. Route: presentation sink /
TryApplyInitialCreateCompletionPresentation.
- **#279 — DONE (2026-08-03, user-verified) — one-shot spell/effect
scripts arriving during the suppressed-until-receipt window were lost.**
`EntityEffectController` now retains the mixed F754/F755 FIFO behind an
exact-incarnation initial-presentation barrier and replays it only after
canonical placement has bound the mesh, pose owner, and particle visibility
resources. Live rebuckets also keep the effect cell synchronized with the
entity cell. Spell buffs, recalls, arrows, and combat spell projectiles were
verified in the connected client; focused effect, projectile, and
cell-transition tests cover the race.
- **#280 — OPEN — portal reveal can expose an incompletely streamed distant
landscape.** User-observed 2026-08-03: after some recalls, the nearby
destination is playable but terrain near the far end of the view continues
visibly building after portal space exits. The current outdoor reveal gate
is explicitly only `WorldRevealReadinessBarrier.OutdoorNeighborhoodRadius =
1` (a 3x3 landblock neighborhood), while the normal configured view extends
substantially farther; this permits the world viewport to open before its
visible static destination is complete.
**Retail oracle:** `CellManager::PreFetchCells @ 0x00455820` sets
`blocking_for_cells` until `LScape::PreFetchCells @ 0x00505660` has walked
the configured `mid_radius` square and each required
`CLandBlock::PreFetchCells` / `CLandBlockInfo::PreFetchCells` building and
connected EnvCell dependency is available. While blocked,
`SmartBox::UseTime @ 0x00455410` checks prefetch status but does not advance
ordinary object maintenance, physics, landscape, game time, or ambient
audio; the portal viewport and UI remain live and may show retail's centered
"In Portal Space - Please Wait..." notice. Once the destination is ready,
retail resumes it behind the portal viewport during `TAS_TUNNEL_CONTINUE`
before the later tunnel-to-world reveal.
**Fix shape:** replace the hard-coded radius-one reveal requirement with a
retail-derived, quality-configured destination prefetch window and keep one
generation-scoped reservation across terrain, statics/buildings, EnvCells,
render publication, composite textures, and collision until that complete
visible window is ready. Preserve bounded asynchronous preparation and the
existing wait cue; never reveal early merely to meet a timeout. Do not wait
for an unknowable "all dynamic server objects delivered" condition—ACE has
no such terminal marker and some object delivery follows LoginComplete.
**Acceptance:** at every quality/view-distance setting, repeated login,
`/ls`, spell recall, and portal routes reveal no constructing terrain,
buildings, statics, interiors, missing composite textures, or nearby
collision; slow destinations remain in the authored portal presentation
with responsive UI until ready, then receive the existing hidden settling
interval before the world viewport appears. Dynamic monsters/items may
continue to arrive authoritatively after reveal.
## Current queue — 2026-07-27