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:
parent
1fc529cdcb
commit
f24532adf3
11 changed files with 417 additions and 50 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue