|
|
@@ -98,9 +98,10 @@ bool client_region_ready(const Session& session, const RefreshReport* refresh) n
|
|
|
return !movePending && held >= 0;
|
|
|
}
|
|
|
|
|
|
-/** Tests whether the client has completed spawning into its instantiated region. */
|
|
|
+/** Tests whether the client has reported arrival in its instantiated region. */
|
|
|
bool client_in_world(const Session& session, const RefreshReport* refresh) noexcept {
|
|
|
- // World-state 8 is post-spawn, so no roster field that releases the spawn may read it.
|
|
|
+ // WS-702 world-state 8 follows the bootflow's arrival, independently of the player spawn.
|
|
|
+ // Holding a region alone can precede that report and the world-transition fade's final arm.
|
|
|
const state::activity::membership::ClientPlacement placement =
|
|
|
client_placement(session, refresh);
|
|
|
return placement.entered && client_region_ready(session, refresh);
|
|
|
@@ -607,9 +608,10 @@ build_roster_snapshot(Session& session,
|
|
|
// carries matches nothing.
|
|
|
snapshot.playerKey = published_player_key(session);
|
|
|
snapshot.lifetime = lifetimeState;
|
|
|
- // Hold the spawn gate only until the region is instantiated. World-state 8 is written after
|
|
|
- // the spawn, so waiting on it here deadlocks the spawn.
|
|
|
- snapshot.awaitClientSync = !client_region_ready(session, refresh);
|
|
|
+ // Hold the native spawn gate until the client's arrival report, WS-702 world-state 8. A
|
|
|
+ // region can be loaded before the bootflow arms its fade; a spawn before the arm releases an
|
|
|
+ // inactive fade and leaves the screen black. Arrival does not depend on the spawn (RE/30).
|
|
|
+ snapshot.awaitClientSync = !client_in_world(session, refresh);
|
|
|
// Player_BindComponents walks every type-13 reference and the player datum can name any one of
|
|
|
// them. So every participation record carries the same player key. Selecting the first slot
|
|
|
// leaves the authored cinematic participant unbound whenever it names another record.
|