diff --git a/src/AcDream.App/Rendering/GameWindow.cs b/src/AcDream.App/Rendering/GameWindow.cs index 468abab3..fc9483cb 100644 --- a/src/AcDream.App/Rendering/GameWindow.cs +++ b/src/AcDream.App/Rendering/GameWindow.cs @@ -6563,8 +6563,22 @@ public sealed class GameWindow : IDisposable // the orbit camera at startup centers on the hardcoded // 0xA9B4 (Holtburg) and Holtburg landblocks render briefly // until the player spawn arrives + auto-entry switches to chase. + // + // #106 gate-3 (2026-06-09): narrowed to PRE-LOGIN only. The original + // form also blocked the in-world window between EnterWorld and + // auto-entry, which deadlocked the spawn-ground entry hold: + // auto-entry waits for terrain under the spawn, terrain streaming + // waited for chase mode. Once the session is InWorld the player's + // landblock is known (the fly-camera else-if below was written for + // exactly this window) — stream it. Pre-login, streaming stays + // blocked, which is the hardcoded-Holtburg flash K-fix1 targeted. + // The world-geometry RENDER gate (IsLiveModeWaitingForLogin at the + // draw site) is unchanged — the pre-entry screen still shows sky + // only. + bool liveInWorld = _liveSession is not null + && _liveSession.CurrentState == AcDream.Core.Net.WorldSession.State.InWorld; if (_streamingController is not null && _cameraController is not null - && !IsLiveModeWaitingForLogin) + && (!IsLiveModeWaitingForLogin || liveInWorld)) { int observerCx = _liveCenterX; int observerCy = _liveCenterY;