revert(teleport): drop the Slice 2 outdoor readiness-gate hold
User-tested: the Slice 2 'hold outdoor until landblock loaded' gate made EVERY outdoor teleport a ~10 s freeze, because the destination landblock does NOT load fast during the hold (lbs=0 the whole time — the #138 streaming gap + _datLock starvation from the CreateObject flood). The hold was band-aiding a broken/slow foundation rather than fixing it, and it never actually prevented the #145 edge cascade anyway (it force-snapped onto NO-LANDBLOCK after the timeout regardless). Reverts ad8c24e..c880973 to the pre-Slice-2 state (00ef47e): outdoor places immediately again (fast teleports). The genuine bug found along the way — IsLandblockLoaded queried the wrong key form (& 0xFFFF0000 vs the stored | 0xFFFF) — is preserved in the history (c880973) and will be re-applied when we re-introduce a proper hold ON A FIXED FOUNDATION. Decision (user, 2026-06-21): fix the foundation FIRST — fast/complete streaming during teleport (#138), the post-teleport lost-collision bug, and the FPS leak (Work item C) — then revisit the teleport-flow animation. Slice 1 (the pure TeleportAnimSequencer) stays in (dormant, unwired, harmless). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
c8809735f3
commit
dd2eb8b39d
6 changed files with 43 additions and 195 deletions
|
|
@ -116,29 +116,29 @@ public static class TeleportArrivalRules
|
|||
/// <param name="claimUnhydratable">The destination cell can never hydrate.</param>
|
||||
/// <param name="indoor">Destination is an indoor cell (cell index ≥ 0x0100).</param>
|
||||
/// <param name="indoorCellReady">For an indoor destination, the EnvCell floor has hydrated.</param>
|
||||
/// <param name="outdoorReady">For an outdoor destination, the physics landblock is loaded
|
||||
/// (<see cref="AcDream.Core.Physics.PhysicsEngine.IsLandblockLoaded"/> returned true for the
|
||||
/// destination landblock id). Ignored for indoor destinations.</param>
|
||||
public static ArrivalReadiness Decide(
|
||||
bool claimUnhydratable,
|
||||
bool indoor,
|
||||
bool indoorCellReady,
|
||||
bool outdoorReady)
|
||||
bool indoorCellReady)
|
||||
{
|
||||
if (claimUnhydratable)
|
||||
return ArrivalReadiness.Impossible;
|
||||
|
||||
// Indoor (sealed dungeon / building interior): gate on the EnvCell floor hydrating,
|
||||
// exactly as #135. Unaffected by the outdoor-landblock gate.
|
||||
// exactly as #135. The dungeon-IN path pre-collapses + waits for the cell struct, and
|
||||
// its placement validates the specific claimed cell (the indoor resolve is cell-keyed,
|
||||
// not the grid-snap), so it is unaffected by the overlap that broke teleport-OUT.
|
||||
if (indoor)
|
||||
return indoorCellReady ? ArrivalReadiness.Ready : ArrivalReadiness.NotReady;
|
||||
|
||||
// Outdoor (#145 §3.4): hold until the physics landblock is registered.
|
||||
// AddLandblock is atomic (terrain + cells + portals in one write — PhysicsEngine.cs:70),
|
||||
// so ContainsKey implies the collision mesh is present and resolvable. The hold is
|
||||
// self-resolving: streaming progresses unconditionally during the hold because the
|
||||
// streaming controller runs before TeleportArrivalController.Tick (GameWindow.cs:7420-7551).
|
||||
// The 10 s timeout safety-net (_maxHoldFrames) remains active.
|
||||
return outdoorReady ? ArrivalReadiness.Ready : ArrivalReadiness.NotReady;
|
||||
// Outdoor: place IMMEDIATELY on the server-authoritative position. #145/#138 — holding
|
||||
// for the destination to stream in is futile: streaming does NOT progress while the
|
||||
// player is held in PortalSpace (the destination only loads once placement flips the
|
||||
// state to InWorld). The stale source center landblock is dropped at recenter (see
|
||||
// GameWindow.OnLivePositionUpdated), so the arrival resolve falls through to the
|
||||
// server-authoritative cell/position (Resolve NO-LANDBLOCK verbatim) and the player is
|
||||
// placed grounded there; streaming then loads the destination and the per-frame resolve
|
||||
// grounds onto it. This trusts the server's teleport position — retail-faithful.
|
||||
return ArrivalReadiness.Ready;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue