From 9e4a17bb229ef3f0c22d119cbdd6a58cc9a352c0 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 28 Jun 2026 16:04:43 +0100 Subject: [PATCH] Use reactive typed docs in schematic HUD --- Aetheria.State.Verify/Program.cs | 46 +++++++++++-------- Assets/Scripts/UI/HUD/SchematicDisplay.cs | 55 ++++++++++++++++++----- 2 files changed, 71 insertions(+), 30 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 838c6a145..05948faa9 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -2556,13 +2556,17 @@ static void RequireDaemonRenderQueryAuthority(string root) var requiredSchematicHudSymbols = new[] { - "private AetheriaRuntimePlayerHudSession _playerHud;", - "ResolvePlayerHud()", + "CultMeshReactiveDocument _catalog", + "CultMeshReactiveDocument _playerSettings", + "CultMeshReactiveDocument _currentEntity", + "ResolveCatalog()", "ResolveCurrentEntityHudStatus()", "AetheriaUnityRuntimeClientProvider.ResolveClient(", - "ResolveClient().State.ObservePlayerHud()", - "return ResolvePlayerHud()?.Hud ?? new AetheriaRuntimeCurrentEntityHudStatus();", - "_playerHud?.Dispose()", + "ResolveClient().State.ReactiveCatalog()", + "ResolveClient().State.Settings.ReactivePlayer()", + "ResolveClient().State.Current.ReactiveEntity()", + "return _currentEntity?.Current?.Hud ?? new AetheriaRuntimeCurrentEntityHudStatus();", + "_currentEntity?.Dispose()", "hud.OverrideShutdown", "hud.HeatsinksEnabled", "hud.Heatstroke", @@ -7361,11 +7365,17 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "AetheriaRuntimePlayerHudState.cs")); var requiredSchematicDisplaySymbols = new[] { - "AetheriaRuntimePlayerHudSession _playerHud", - "ResolveClient().State.ObservePlayerHud()", - "_playerHud?.Dispose()", - "ResolvePlayerHud()?.Catalog?.FindItem(item, x => x.ItemKey)", - "ResolvePlayerHud()?.PlayerSettings", + "CultMeshReactiveDocument _catalog", + "CultMeshReactiveDocument _playerSettings", + "CultMeshReactiveDocument _currentEntity", + "ResolveClient().State.ReactiveCatalog()", + "ResolveClient().State.Settings.ReactivePlayer()", + "ResolveClient().State.Current.ReactiveEntity()", + "_catalog?.Dispose()", + "_playerSettings?.Dispose()", + "_currentEntity?.Dispose()", + "ResolveCatalog()?.Current?.FindItem(item, x => x.ItemKey)", + "return _playerSettings?.Current;", "private void OnDestroy()" }; var missingSchematicDisplaySymbols = requiredSchematicDisplaySymbols @@ -7374,18 +7384,18 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) if (missingSchematicDisplaySymbols.Length > 0) { throw new InvalidOperationException( - "SchematicDisplay should bind shared catalog/settings/current-entity HUD through one managed Aetheria player HUD session: " + + "SchematicDisplay should bind shared catalog/settings/current-entity HUD through managed reactive typed documents: " + string.Join(", ", missingSchematicDisplaySymbols)); } var forbiddenSchematicDisplaySymbols = new[] { - "CultMeshReactiveDocument _catalog", - "CultMeshReactiveDocument _playerSettings", - "CultMeshReactiveDocument _currentEntity", - ".State.ReactiveCatalog()", - ".ReactivePlayer()", - ".ReactiveEntity()" + "AetheriaRuntimePlayerHudSession _playerHud", + "ResolvePlayerHud()", + "ResolveClient().State.ObservePlayerHud()", + "ResolvePlayerHud()?.Catalog", + "ResolvePlayerHud()?.PlayerSettings", + "ResolvePlayerHud()?.Hud" }; var schematicDisplayHits = forbiddenSchematicDisplaySymbols .Where(symbol => schematicDisplay.Contains(symbol, StringComparison.Ordinal)) @@ -7393,7 +7403,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) if (schematicDisplayHits.Length > 0) { throw new InvalidOperationException( - "SchematicDisplay still owns raw player HUD CultMesh documents instead of AetheriaRuntimePlayerHudSession: " + + "SchematicDisplay still routes through AetheriaRuntimePlayerHudSession instead of direct managed reactive typed documents: " + string.Join(", ", schematicDisplayHits)); } diff --git a/Assets/Scripts/UI/HUD/SchematicDisplay.cs b/Assets/Scripts/UI/HUD/SchematicDisplay.cs index dadbd6d3c..3a5d42542 100644 --- a/Assets/Scripts/UI/HUD/SchematicDisplay.cs +++ b/Assets/Scripts/UI/HUD/SchematicDisplay.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using GameCult.Aetheria.State.Verse; +using GameCult.Mesh; using TMPro; using UnityEngine; using UnityEngine.UI; @@ -69,7 +70,9 @@ public class SchematicDisplay : MonoBehaviour private SchematicDisplayItem[] _schematicItems; private AetherDrive _aetherDrive; private string _clientStatePath = ""; - private AetheriaRuntimePlayerHudSession _playerHud; + private CultMeshReactiveDocument _catalog; + private CultMeshReactiveDocument _playerSettings; + private CultMeshReactiveDocument _currentEntity; private AetheriaRuntimeDaemonRenderSettings? _renderSettings; private bool _enemy; @@ -313,34 +316,58 @@ public class SchematicDisplay : MonoBehaviour private AetheriaRuntimeCatalogItem FindTypedItem(ItemInstance item) { - return ResolvePlayerHud()?.Catalog?.FindItem(item, x => x.ItemKey); + return ResolveCatalog()?.Current?.FindItem(item, x => x.ItemKey); } - private AetheriaRuntimePlayerHudSession ResolvePlayerHud() + private CultMeshReactiveDocument ResolveCatalog() { - if (_playerHud != null) - return _playerHud; + if (_catalog != null) + return _catalog; try { - _playerHud = ResolveClient().State.ObservePlayerHud(); + _catalog = ResolveClient().State.ReactiveCatalog(); } catch (Exception ex) { - Debug.LogWarning($"Failed to bind Aetheria player HUD state for schematic display: {ex.Message}"); + Debug.LogWarning($"Failed to bind Aetheria runtime catalog for schematic display: {ex.Message}"); } - return _playerHud; + return _catalog; } private AetheriaRuntimePlayerSettingsDocument ResolvePlayerSettings() { - return ResolvePlayerHud()?.PlayerSettings; + if (_playerSettings == null) + { + try + { + _playerSettings = ResolveClient().State.Settings.ReactivePlayer(); + } + catch (Exception ex) + { + Debug.LogWarning($"Failed to bind Aetheria player settings for schematic display: {ex.Message}"); + } + } + + return _playerSettings?.Current; } private AetheriaRuntimeCurrentEntityHudStatus ResolveCurrentEntityHudStatus() { - return ResolvePlayerHud()?.Hud ?? new AetheriaRuntimeCurrentEntityHudStatus(); + if (_currentEntity == null) + { + try + { + _currentEntity = ResolveClient().State.Current.ReactiveEntity(); + } + catch (Exception ex) + { + Debug.LogWarning($"Failed to bind Aetheria current entity for schematic display: {ex.Message}"); + } + } + + return _currentEntity?.Current?.Hud ?? new AetheriaRuntimeCurrentEntityHudStatus(); } private AetheriaClient ResolveClient() @@ -385,8 +412,12 @@ public class SchematicDisplay : MonoBehaviour private void ClearClientCaches() { - _playerHud?.Dispose(); - _playerHud = null; + _catalog?.Dispose(); + _catalog = null; + _playerSettings?.Dispose(); + _playerSettings = null; + _currentEntity?.Dispose(); + _currentEntity = null; } private void OnDestroy()