Load daemon zone view after facade rebuild

This commit is contained in:
Meta Vens 2026-06-21 18:51:50 +01:00
commit 62cb95d807
2 changed files with 25 additions and 22 deletions

View file

@ -7755,6 +7755,7 @@ static void RequireMainMenuContinueRunState(string root)
"CanApplyDaemonEntitySnapshotsInPlace",
"ZoneRenderer?.ApplyDaemonFrame(daemonZone, run)",
"ApplyDaemonEntitySnapshotsInPlace",
"PrepareObservedDaemonZoneContext(targetZone, daemonZone)",
"ReplaceObservedEntityFacadesFromTypedSnapshots",
"RestoreCurrentEntityBinding",
"RestoreCurrentEntityBinding(currentEntity, actionBarBindings)",
@ -7774,7 +7775,7 @@ static void RequireMainMenuContinueRunState(string root)
"_observedEntityFacadesByRecordKey",
"_observedEntityFacadesByDaemonIndex",
"RebuildObservedEntityFacadeIndex();",
"ZoneRenderer.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, daemonRun)",
"ZoneRenderer?.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, run)",
"entity.RestoreStatGrids(entitySnapshot.StatGrids)",
"RestoreThermalExposure((float)entitySnapshot.Heatstroke, (float)entitySnapshot.Hypothermia)",
"entity.HeatsinksEnabled = entitySnapshot.HeatsinksEnabled",
@ -8063,7 +8064,8 @@ static void RequireUnityObserverDoesNotTickLocalSimulation(string root)
"observed.IsAuthoritative",
"TryRestoreEntityGraphFromDaemonRun(observed.Run)",
"CreateDaemonZoneConstructionBlueprint(daemonZone)",
"ZoneRenderer.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, daemonRun)",
"PrepareObservedDaemonZoneContext(targetZone, daemonZone)",
"ZoneRenderer?.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, run)",
"ZoneRenderer?.ApplyDaemonFrame(daemonZone, run)",
"CreateDaemonEntitySnapshots(runId, daemonZone)",
"FindCurrentDaemonZoneSnapshot()",
@ -8134,6 +8136,19 @@ static void RequireUnityObserverDoesNotTickLocalSimulation(string root)
"Unity frame application must project observed daemon state, not instantiate authoritative gameplay entities.");
}
var contextPrepRendererLoads = FindMethodScopedLineHits(
actionGameManager,
new[] { "LoadDaemonZoneView(", "BindToEntity(" })
.Where(hit => hit.MethodName == "PrepareObservedDaemonZoneContext")
.Select(hit => $"{hit.MethodName}:{hit.LineNumber}: {hit.Line.Trim()}")
.ToArray();
if (contextPrepRendererLoads.Length > 0)
{
throw new InvalidOperationException(
"Unity zone context prep must not load renderer instances before observed daemon facades have been rebuilt: " +
string.Join("; ", contextPrepRendererLoads));
}
var unauthorizedEntityProjectionHits = FindMethodScopedLineHits(
actionGameManager,
new[] { "Zone.Entities.Add(", "Zone.Entities.Remove(", "Zone.Agents.Clear()" })

View file

@ -2075,10 +2075,9 @@ public class ActionGameManager : MonoBehaviour
}
}
public void PopulateLevel(
private void PrepareObservedDaemonZoneContext(
GalaxyZone galaxyZone,
AetheriaRuntimeZoneSnapshotCommit daemonZone = null,
AetheriaRuntimeRunCheckpointCommit daemonRun = null)
AetheriaRuntimeZoneSnapshotCommit daemonZone = null)
{
if (galaxyZone == null) throw new ArgumentNullException(nameof(galaxyZone));
@ -2097,14 +2096,6 @@ public class ActionGameManager : MonoBehaviour
PlayMusic(MusicType.Overworld);
Zone.Log = s => Debug.Log($"Zone: {s}");
ZoneRenderer.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, daemonRun);
if (CurrentEntity != null)
{
UnbindEntity();
BindToEntity(CurrentEntity);
}
}
public bool CanShowInputScreenFromMenu()
@ -2254,15 +2245,17 @@ public class ActionGameManager : MonoBehaviour
if (Zone?.GalaxyZone != targetZone)
{
PopulateLevel(targetZone, daemonZone, run);
PrepareObservedDaemonZoneContext(targetZone, daemonZone);
}
var actionBarBindings = run.ActionBarBindings?
.Select(ToActionBarBindingSnapshot)
.Where(binding => binding != null)
.ToArray() ?? Array.Empty<AetheriaRuntimeActionBarBindingSnapshot>();
ReplaceObservedEntityFacadesFromTypedSnapshots(entitySnapshots, currentEntityKey, actionBarBindings);
ZoneRenderer?.ApplyDaemonFrame(daemonZone, run);
ReplaceObservedEntityFacadesFromTypedSnapshots(entitySnapshots);
ZoneRenderer?.LoadDaemonZoneView(_observedEntityFacadesByDaemonIndex, daemonZone, run);
if (_observedEntityFacadesByRecordKey.TryGetValue(currentEntityKey, out var currentEntity))
RestoreCurrentEntityBinding(currentEntity, actionBarBindings);
RestoreDroppedPickupsFromDaemonZoneState(daemonZone);
_lastAppliedAuthoritativeDaemonRunId = runId;
_lastAppliedAuthoritativeDaemonZoneIndex = run.CurrentZoneIndex;
@ -2719,9 +2712,7 @@ public class ActionGameManager : MonoBehaviour
}
private void ReplaceObservedEntityFacadesFromTypedSnapshots(
IReadOnlyList<AetheriaRuntimeEntitySnapshot> entitySnapshots,
string currentEntityKey,
IReadOnlyList<AetheriaRuntimeActionBarBindingSnapshot> actionBarBindings)
IReadOnlyList<AetheriaRuntimeEntitySnapshot> entitySnapshots)
{
var restoredEntities = new Dictionary<string, Entity>();
foreach (var entitySnapshot in entitySnapshots)
@ -2765,9 +2756,6 @@ public class ActionGameManager : MonoBehaviour
foreach (var restoredEntity in restoredEntities)
_observedEntityFacadesByRecordKey[restoredEntity.Key] = restoredEntity.Value;
RebuildObservedEntityFacadeIndex();
if (restoredEntities.TryGetValue(currentEntityKey, out var currentEntity))
RestoreCurrentEntityBinding(currentEntity, actionBarBindings);
}
private void RebuildObservedEntityFacadeIndex()