fix(streaming): #138-B avatar vanishes after teleporting out — don't relocate during PortalSpace
After a teleport-OUT the per-frame avatar-sync (GameWindow ~:8018) called GpuWorldState.RelocateEntity with the player controller's cell — which stays the FROZEN SOURCE cell until PlaceTeleportArrival materializes the destination. So mid-transit it dragged the avatar (which the teleport's rescue/re-inject had correctly placed at the destination center) back into the now-UNLOADED source landblock's pending bucket, where nothing recovers it (RelocateEntity only scans _loaded). Net: the avatar vanished after teleporting out and stayed gone. Fix: skip the per-frame relocate while the player is in PortalSpace. The teleport machinery (DrainRescued + PlaceTeleportArrival) owns the avatar's landblock during transit; per-frame relocation resumes at FireLoginComplete (InWorld). Live-verified with a new env-gated avatar-lifecycle probe (ACDREAM_PROBE_ENT / EntityVanishProbe; [ent] draw-set transitions + [dyn] cull check): pre-fix the trace showed `[ent] APPEND lb=0x0007FFFF(source) -> PENDING -> DRAWSET ABSENT` never recovering; post-fix every teleport goes RESCUE -> ABSENT -> APPEND(destination) -> PRESENT and stays drawn (4 teleports incl. to Holtburg, session ended PRESENT). Suites green: Core 1568(+2 skip), App 468(+2 skip), UI 425, Net 317. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
57e79dc679
commit
afd5f2a012
4 changed files with 111 additions and 1 deletions
|
|
@ -2394,6 +2394,7 @@ public sealed class GameWindow : IDisposable
|
|||
_vitalsVm?.SetLocalPlayerGuid(chosen.Id);
|
||||
Chat.SetLocalPlayerGuid(chosen.Id);
|
||||
_worldState.MarkPersistent(chosen.Id);
|
||||
AcDream.App.Streaming.EntityVanishProbe.PlayerGuid = chosen.Id; // TEMP #138-B probe
|
||||
Console.WriteLine($"live: entering world as 0x{chosen.Id:X8} {chosen.Name}");
|
||||
_liveSession.EnterWorld(user, characterIndex: 0);
|
||||
|
||||
|
|
@ -8014,7 +8015,21 @@ public sealed class GameWindow : IDisposable
|
|||
int ply = _liveCenterY + (int)System.Math.Floor(pp.Y / 192f);
|
||||
currentLb = (uint)((plx << 24) | (ply << 16) | 0xFFFF);
|
||||
}
|
||||
_worldState.RelocateEntity(pe, currentLb);
|
||||
// #138-B (2026-06-24): do NOT relocate the avatar while a teleport
|
||||
// is in transit (PortalSpace). The controller's cell is still the
|
||||
// FROZEN SOURCE until PlaceTeleportArrival materializes the
|
||||
// destination, so relocating here drags the avatar — which the
|
||||
// teleport's rescue/re-inject (GpuWorldState.DrainRescued) already
|
||||
// placed at the destination center — back into the now-UNLOADED
|
||||
// SOURCE landblock's pending bucket, where nothing recovers it
|
||||
// (RelocateEntity only scans _loaded). Net: the avatar vanishes
|
||||
// after teleporting out. The teleport machinery owns the avatar's
|
||||
// landblock during transit; per-frame relocation resumes at
|
||||
// FireLoginComplete (InWorld). Probe-confirmed: launch4 line 561
|
||||
// APPEND guid=player lb=0x0007FFFF(source dungeon) -> PENDING ->
|
||||
// DRAWSET ABSENT, never recovered.
|
||||
if (_playerController.State != AcDream.App.Input.PlayerState.PortalSpace)
|
||||
_worldState.RelocateEntity(pe, currentLb);
|
||||
}
|
||||
|
||||
// Update chase camera(s). The CameraController exposes whichever
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue