From 195b434702e44f936c2e13e98daaf779bf787ce7 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 29 Jun 2026 00:44:55 +0100 Subject: [PATCH] Sample docking state from reactive documents --- Aetheria.State.Verify/Program.cs | 38 +++++++++------- .../AetheriaUnityObservedDockingIndex.cs | 45 ++++++++++++------- 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index e851446ae..e55a95d1a 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -7248,15 +7248,18 @@ static bool HasManagedDockingSnapshotAccess(string source) return source.Contains("public sealed class AetheriaUnityObservedDockingIndex", StringComparison.Ordinal) && source.Contains("AetheriaRuntimeObservedDockingState", StringComparison.Ordinal) && - source.Contains("var state = _resolveClient()?.State;", StringComparison.Ordinal) && - source.Contains("state.Latest()", StringComparison.Ordinal) && - source.Contains("state.Latest()", StringComparison.Ordinal) && - source.Contains("state.Latest()", StringComparison.Ordinal) && + source.Contains("CultMeshReactiveDocument _currentEntity", StringComparison.Ordinal) && + source.Contains("CultMeshReactiveDocument _currentDocking", StringComparison.Ordinal) && + source.Contains("CultMeshReactiveDocument _stationRefit", StringComparison.Ordinal) && + source.Contains("AetheriaRuntimeObservedDockingState.TryCreateCurrent(", StringComparison.Ordinal) && + source.Contains("state.Reactive()", StringComparison.Ordinal) && + source.Contains("state.Reactive()", StringComparison.Ordinal) && + source.Contains("state.Reactive()", StringComparison.Ordinal) && !source.Contains("State?.CurrentDocking()", StringComparison.Ordinal) && !source.Contains(".State.CurrentDocking()", StringComparison.Ordinal) && - !source.Contains("CultMeshReactiveDocument _currentEntity", StringComparison.Ordinal) && - !source.Contains("CultMeshReactiveDocument _currentDocking", StringComparison.Ordinal) && - !source.Contains("CultMeshReactiveDocument _stationRefit", StringComparison.Ordinal) && + !source.Contains("state.Latest()", StringComparison.Ordinal) && + !source.Contains("state.Latest()", StringComparison.Ordinal) && + !source.Contains("state.Latest()", StringComparison.Ordinal) && !source.Contains("AetheriaClientReactiveDockingState _dockingState", StringComparison.Ordinal) && !source.Contains(".ReactiveDockingState()", StringComparison.Ordinal); } @@ -13015,10 +13018,13 @@ static void RequireMainMenuContinueRunState(string root) { "public sealed class AetheriaUnityObservedDockingIndex", "AetheriaRuntimeObservedDockingState", - "var state = _resolveClient()?.State;", - "state.Latest()", - "state.Latest()", - "state.Latest()", + "CultMeshReactiveDocument _currentEntity", + "CultMeshReactiveDocument _currentDocking", + "CultMeshReactiveDocument _stationRefit", + "AetheriaRuntimeObservedDockingState.TryCreateCurrent(", + "state.Reactive()", + "state.Reactive()", + "state.Reactive()", "public bool IsEntityUndocked(Entity entity)", "public bool TryResolveDockingBay(", "out AetheriaRuntimeCurrentDockingDocument docking", @@ -13037,14 +13043,14 @@ static void RequireMainMenuContinueRunState(string root) var forbiddenObservedDockingSymbols = new[] { - "CultMeshReactiveDocument _currentEntity", - "CultMeshReactiveDocument _currentDocking", - "CultMeshReactiveDocument _stationRefit", + "state.Latest()", + "state.Latest()", + "state.Latest()", + "new AetheriaRuntimeObservedDockingState(", "State?.CurrentDocking()", ".State.CurrentDocking()", "ReactiveEntity()", - "ReactiveDocking()", - "state.Reactive()" + "ReactiveDocking()" }; var observedDockingHits = forbiddenObservedDockingSymbols .Where(symbol => observedDockingIndex.Contains(symbol, StringComparison.Ordinal)) diff --git a/Assets/Scripts/Gameplay/AetheriaUnityObservedDockingIndex.cs b/Assets/Scripts/Gameplay/AetheriaUnityObservedDockingIndex.cs index 8783764d6..d747a5267 100644 --- a/Assets/Scripts/Gameplay/AetheriaUnityObservedDockingIndex.cs +++ b/Assets/Scripts/Gameplay/AetheriaUnityObservedDockingIndex.cs @@ -4,11 +4,15 @@ using System; using GameCult.Aetheria.State.Verse; +using GameCult.Mesh; public sealed class AetheriaUnityObservedDockingIndex : IDisposable { private readonly Func _resolveClient; private readonly AetheriaUnityObservedEntityIndex _observedEntityIndex; + private CultMeshReactiveDocument _currentEntity; + private CultMeshReactiveDocument _currentDocking; + private CultMeshReactiveDocument _stationRefit; public AetheriaUnityObservedDockingIndex( Func resolveClient, @@ -167,21 +171,12 @@ public sealed class AetheriaUnityObservedDockingIndex : IDisposable docking = null; try { - var state = _resolveClient()?.State; - if (state == null) - return false; - - var currentEntity = state.Latest(); - var currentDocking = state.Latest(); - var stationRefit = state.Latest(); - if (currentDocking == null || stationRefit == null) - return false; - - docking = new AetheriaRuntimeObservedDockingState( - currentEntity, - currentDocking, - stationRefit); - return docking != null; + EnsureDockingDocuments(); + return AetheriaRuntimeObservedDockingState.TryCreateCurrent( + _currentEntity, + _currentDocking, + _stationRefit, + out docking); } catch { @@ -189,7 +184,27 @@ public sealed class AetheriaUnityObservedDockingIndex : IDisposable } } + private void EnsureDockingDocuments() + { + if (_currentEntity != null && _currentDocking != null && _stationRefit != null) + return; + + var state = _resolveClient()?.State; + if (state == null) + return; + + _currentEntity ??= state.Reactive(); + _currentDocking ??= state.Reactive(); + _stationRefit ??= state.Reactive(); + } + public void Dispose() { + _currentEntity?.Dispose(); + _currentEntity = null; + _currentDocking?.Dispose(); + _currentDocking = null; + _stationRefit?.Dispose(); + _stationRefit = null; } }