fix(ui): gate — no void frames around the login wormhole; vitals icons centered
The login tunnel now covers from the first world-facing frame (the sky-void backdrop can never present pre-tunnel) and holds through an atomic tunnel-to-world swap at reveal completion — the void is structurally unreachable on both edges, pinned by frame-sequence tests across WorldSceneRenderer/WorldRevealCoordinator/LocalPlayerTeleport- Controller/RuntimeWorldTransitState. Vitals detail icons draw at their authored centered offsets in both stacked and side-by-side layouts. Implemented and live-probed by the fix agent; finalized by the lead after the agent parked post-verification (gates re-run green: App 5512/3, Runtime 1747/0). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
2f8c046aba
commit
fdc4fd496d
17 changed files with 649 additions and 66 deletions
|
|
@ -1161,11 +1161,23 @@ internal sealed class LocalPlayerTeleportController
|
|||
return;
|
||||
break;
|
||||
case TeleportAnimEvent.Place:
|
||||
// No login Place edge: the canonical initial placement is
|
||||
// No login PLACEMENT: the canonical initial placement is
|
||||
// the first-entry conductor's, already committed (the
|
||||
// worldReady latch above requires it). Retail's login
|
||||
// analogue only flips position_update_complete
|
||||
// (SmartBox::UseTime @ 0x00455483).
|
||||
// (SmartBox::UseTime @ 0x00455483) — but that same
|
||||
// blocking-ends edge is where retail RESUMES
|
||||
// CObjectMaint/CPhysics (@ 0x00455410), while the tunnel
|
||||
// is still in front. Acknowledge the login
|
||||
// materialization/simulation release here, the exact
|
||||
// login mirror of the teleport pump's
|
||||
// ObserveMaterialized — without it the world generation
|
||||
// stayed unavailable until Complete, so the whole
|
||||
// WorldFadeIn second presented an EMPTY world frame (the
|
||||
// 2026-08-17 gate's exit-edge void).
|
||||
_worldReveal.ObserveLoginMaterialized(revealGeneration);
|
||||
if (!IsCurrentLoginLifetime(generation, revealGeneration))
|
||||
return;
|
||||
break;
|
||||
case TeleportAnimEvent.PlayExitSound:
|
||||
// Release destination cell blocking at the exact
|
||||
|
|
|
|||
|
|
@ -244,6 +244,22 @@ internal sealed class WorldRevealCoordinator
|
|||
return acknowledged;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The login mirror of <see cref="ObserveMaterialized"/>: acknowledges
|
||||
/// the login reveal's materialization/simulation-release edge (retail
|
||||
/// resumes <c>CObjectMaint</c>/<c>CPhysics</c> when destination cells
|
||||
/// stop blocking, <c>SmartBox::UseTime @ 0x00455483</c> — while the
|
||||
/// tunnel is still in front). See
|
||||
/// <c>RuntimeWorldTransitState.AcknowledgeLoginMaterialized</c>.
|
||||
/// </summary>
|
||||
public bool ObserveLoginMaterialized(long generation)
|
||||
{
|
||||
bool acknowledged =
|
||||
_transit.AcknowledgeLoginMaterialized(generation);
|
||||
RetryPendingHostWork();
|
||||
return acknowledged;
|
||||
}
|
||||
|
||||
public void ObserveWorldViewportVisible()
|
||||
{
|
||||
RetryPendingHostWork();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue