diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index e9de43eaf..5ea48cb35 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -7621,12 +7621,11 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "ActionBarSlot.cs")); var requiredActionBarSymbols = new[] { - "public abstract class ActionBarBinding : IDisposable", - "CultMeshReactiveDocument _catalog", + "public abstract class ActionBarBinding", "AetheriaUnityRuntimeClientProvider", - ".ReactiveCatalogSnapshot(\"unity-action-bar\")", - "_catalog?.Current?.FindItem(item, x => x.ItemKey)", - "binding?.Dispose()", + ".RuntimeState()", + ".CurrentCatalog()", + ".FindItem(item, x => x.ItemKey)", "private void OnDestroy()" }; var missingActionBarSymbols = requiredActionBarSymbols @@ -7640,11 +7639,16 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) } if (actionBarSlot.Contains("AetheriaRuntimeCatalogSession _catalog", StringComparison.Ordinal) || + actionBarSlot.Contains("CultMeshReactiveDocument _catalog", StringComparison.Ordinal) || + actionBarSlot.Contains(".ReactiveCatalogSnapshot(\"unity-action-bar\")", StringComparison.Ordinal) || + actionBarSlot.Contains("_catalog?.Current?.FindItem", StringComparison.Ordinal) || + actionBarSlot.Contains("binding?.Dispose()", StringComparison.Ordinal) || + actionBarSlot.Contains("public virtual void Dispose()", StringComparison.Ordinal) || actionBarSlot.Contains("Client.State.ObserveCatalog()", StringComparison.Ordinal) || actionBarSlot.Contains("Client.State.ReactiveCatalogSnapshot()", StringComparison.Ordinal)) { throw new InvalidOperationException( - "ActionBarSlot still routes through client/session catalog plumbing instead of its managed reactive typed catalog document."); + "ActionBarSlot still routes through client/session/reactive catalog plumbing instead of reading the named current catalog from typed client state."); } var schematicDisplay = File.ReadAllText(Path.Combine( @@ -8408,55 +8412,79 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root "public CultMeshDocumentHandle AuthorityPolicy { get; }", "public CultMeshReactiveDocument ReactiveAuthorityPolicy()", "public CultMeshDocumentHandle DaemonFrame { get; }", + "public AetheriaRuntimeDaemonFrameDocument CurrentDaemonFrame()", "public CultMeshReactiveDocument ReactiveDaemonFrame()", "public CultMeshDocumentHandle DaemonSoaView { get; }", + "public AetheriaRuntimeDaemonSoaViewDocument CurrentDaemonSoaView()", "public CultMeshReactiveDocument ReactiveDaemonSoaView()", "public CultMeshDocumentHandle ZoneRender { get; }", + "public AetheriaRuntimeZoneRenderDocument CurrentZoneRender()", "public CultMeshReactiveDocument ReactiveZoneRender()", "public CultMeshDocumentHandle LoadoutTemplates { get; }", + "public AetheriaRuntimeLoadoutTemplatesDocument CurrentLoadoutTemplates()", "public CultMeshReactiveDocument ReactiveLoadoutTemplates()", "public CultMeshDocumentHandle SectorMap { get; }", + "public AetheriaRuntimeSectorMapDocument CurrentSectorMap()", "public CultMeshReactiveDocument ReactiveSectorMap()", "public CultMeshDocumentHandle CurrentZone { get; }", + "public AetheriaRuntimeCurrentZoneDocument CurrentZoneState()", "public CultMeshReactiveDocument ReactiveCurrentZone()", "public CultMeshDocumentHandle ZoneContacts { get; }", + "public AetheriaRuntimeZoneContactsDocument CurrentZoneContacts()", "public CultMeshReactiveDocument ReactiveZoneContacts()", "public CultMeshDocumentHandle VerseHostSettings { get; }", + "public AetheriaRuntimeVerseHostSettingsDocument CurrentVerseHostSettings()", "public CultMeshReactiveDocument ReactiveVerseHostSettings()", "public CultMeshDocumentHandle CurrentDocking { get; }", + "public AetheriaRuntimeCurrentDockingDocument CurrentDockingState()", "public CultMeshReactiveDocument ReactiveCurrentDocking()", "public CultMeshDocumentHandle CurrentEntity { get; }", + "public AetheriaRuntimeCurrentEntityDocument CurrentEntityState()", "public CultMeshReactiveDocument ReactiveCurrentEntity()", "public CultMeshDocumentHandle StationRefit { get; }", + "public AetheriaRuntimeStationRefitDocument CurrentStationRefit()", "public CultMeshReactiveDocument ReactiveStationRefit()", "public CultMeshDocumentHandle Catalog { get; }", + "public AetheriaRuntimeCatalogSnapshot CurrentCatalog()", "public CultMeshReactiveDocument ReactiveCatalogSnapshot()", "public CultMeshDocumentHandle PlayerSettings { get; }", + "public AetheriaRuntimePlayerSettingsDocument CurrentPlayerSettings()", "public CultMeshReactiveDocument ReactivePlayerSettingsDocument()", "public static bool TryResolveEveSurface(", "public CultMeshDocumentHandle? EveSurfaceDocument(", "public CultMeshReactiveDocument? ReactiveEveSurface(", "public CultMeshDocumentHandle RtsViewport(", + "public AetheriaRuntimeRtsViewportDocument CurrentRtsViewport(", "public CultMeshReactiveDocument ReactiveRtsViewport(", "public CultMeshDocumentHandle ObjectsViewport(", + "public AetheriaRuntimeObjectsViewportDocument CurrentObjectsViewport(", "public CultMeshReactiveDocument ReactiveObjectsViewport(", "public CultMeshDocumentHandle GravityViewport(", + "public AetheriaRuntimeGravityViewportDocument CurrentGravityViewport(", "public CultMeshReactiveDocument ReactiveGravityViewport(", "public CultMeshDocumentHandle RenderSplatsViewport(", + "public AetheriaRuntimeRenderSplatsViewportDocument CurrentRenderSplatsViewport(", "public CultMeshReactiveDocument ReactiveRenderSplatsViewport(", "public CultMeshDocumentHandle ZoneDetails(", + "public AetheriaRuntimeZoneDetailsDocument CurrentZoneDetails(", "public CultMeshReactiveDocument ReactiveZoneDetails(", "public CultMeshDocumentHandle SelectedObject(", + "public AetheriaRuntimeSelectedObjectDocument CurrentSelectedObject(", "public CultMeshReactiveDocument ReactiveSelectedObject(", "public CultMeshDocumentHandle Inventory(", + "public AetheriaRuntimeInventoryDocument CurrentInventory(", "public CultMeshReactiveDocument ReactiveInventory(", "public CultMeshDocumentHandle StarbridgeScenario { get; }", + "public AetheriaRuntimeStarbridgeScenarioDocument CurrentStarbridgeScenario()", "public CultMeshReactiveDocument ReactiveStarbridgeScenario()", "public CultMeshDocumentHandle StarbridgeSession { get; }", + "public AetheriaRuntimeStarbridgeSessionDocument CurrentStarbridgeSession()", "public CultMeshReactiveDocument ReactiveStarbridgeSession()", "public CultMeshDocumentHandle StarbridgeSummary { get; }", + "public AetheriaRuntimeStarbridgeSessionSummaryDocument CurrentStarbridgeSummary()", "public CultMeshReactiveDocument ReactiveStarbridgeSummary()", "public CultMeshDocumentHandle StarbridgePlayerSeat(", + "public AetheriaRuntimeStarbridgePlayerSeatDocument CurrentStarbridgePlayerSeat(", "public CultMeshReactiveDocument ReactiveStarbridgePlayerSeat(" }; var missingClientSymbols = requiredClientSymbols @@ -8471,6 +8499,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root if (clientState.Contains("public Task LatestAsync", StringComparison.Ordinal) || clientState.Contains("public TDocument Latest", StringComparison.Ordinal) || + clientState.Contains("public TDocument Current", StringComparison.Ordinal) || clientState.Contains("public CultMeshDocumentHandle Document", StringComparison.Ordinal) || clientState.Contains("public CultMeshReactiveDocument Reactive", StringComparison.Ordinal) || clientState.Contains("TryGetDocument", StringComparison.Ordinal) || diff --git a/Assets/Scripts/Gameplay/ActionBarSlot.cs b/Assets/Scripts/Gameplay/ActionBarSlot.cs index 7ebf638ff..7e927a5b7 100644 --- a/Assets/Scripts/Gameplay/ActionBarSlot.cs +++ b/Assets/Scripts/Gameplay/ActionBarSlot.cs @@ -1,7 +1,6 @@ using System; using System.Linq; using GameCult.Aetheria.State.Verse; -using GameCult.Mesh; using TMPro; using UniRx.Triggers; using UnityEngine; @@ -28,7 +27,6 @@ public class ActionBarSlot : MonoBehaviour if (ReferenceEquals(binding, value)) return; - binding?.Dispose(); binding = value; if (binding == null) { @@ -52,13 +50,12 @@ public class ActionBarSlot : MonoBehaviour } -public abstract class ActionBarBinding : IDisposable +public abstract class ActionBarBinding { public Entity Entity { get; } private readonly Func _resolveControl; protected ActionBarSlot Slot { get; } protected GameSettings Settings { get; } - private CultMeshReactiveDocument _catalog; public abstract void Activate(); public abstract void Deactivate(); public abstract void Update(); @@ -100,9 +97,10 @@ public abstract class ActionBarBinding : IDisposable { try { - _catalog ??= AetheriaUnityRuntimeClientProvider - .ReactiveCatalogSnapshot("unity-action-bar"); - return _catalog?.Current?.FindItem(item, x => x.ItemKey); + return AetheriaUnityRuntimeClientProvider + .RuntimeState() + .CurrentCatalog() + .FindItem(item, x => x.ItemKey); } catch (Exception ex) { @@ -110,12 +108,6 @@ public abstract class ActionBarBinding : IDisposable return null; } } - - public virtual void Dispose() - { - _catalog?.Dispose(); - _catalog = null; - } } public class ActionBarConsumableBinding : ActionBarBinding diff --git a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs index 1e952ae75..429cfbfba 100644 --- a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs +++ b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs @@ -188,6 +188,11 @@ public class DaemonRuntimeDocumentTests MaxX = 100, MaxY = 100 }; + var currentCatalog = client.State.CurrentCatalog(); + var currentPlayerSettings = client.State.CurrentPlayerSettings(); + var currentFrame = client.State.CurrentDaemonFrame(); + var currentEntityState = client.State.CurrentEntityState(); + var currentObjectsViewport = client.State.CurrentObjectsViewport(viewport); var objectsViewport = ReadLatest(client.State.ObjectsViewport(viewport)); var zoneDetails = ReadLatest(client.State.ZoneDetails(0)); var inventory = ReadLatest(client.State.Inventory(0)); @@ -288,6 +293,11 @@ public class DaemonRuntimeDocumentTests Assert.AreEqual(AetheriaRuntimeCatalogSnapshot.SchemaId, client.State.Catalog.Sources.Last().SchemaId); Assert.GreaterOrEqual(catalog.Items.Count, 0); Assert.AreEqual(AetheriaRuntimePlayerSettingsDocument.SchemaId, playerSettings.Schema); + Assert.AreSame(catalog, currentCatalog); + Assert.AreEqual(playerSettings.Schema, currentPlayerSettings.Schema); + Assert.AreEqual(latestFrame.FrameId, currentFrame.FrameId); + Assert.AreEqual(currentEntity.EntityKey, currentEntityState.EntityKey); + Assert.AreEqual(objectsViewport.Schema, currentObjectsViewport.Schema); Assert.AreSame(catalog, catalogReactive.Current); Assert.AreEqual(AetheriaRuntimeDaemonSchemas.Frame, daemonFrameReactive.Current.Schema); Assert.AreEqual(AetheriaRuntimeDaemonSchemas.SoaView, daemonSoaViewReactive.Current.Schema); diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs index c34f50441..51fe9e95a 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaClientState.cs @@ -126,12 +126,32 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle DaemonFrame { get; } + public AetheriaRuntimeDaemonFrameDocument CurrentDaemonFrame() + { + return DaemonFrame.Latest(); + } + public CultMeshDocumentHandle DaemonSoaView { get; } + public AetheriaRuntimeDaemonSoaViewDocument CurrentDaemonSoaView() + { + return DaemonSoaView.Latest(); + } + public CultMeshDocumentHandle Catalog { get; } + public AetheriaRuntimeCatalogSnapshot CurrentCatalog() + { + return Catalog.Latest(); + } + public CultMeshDocumentHandle LoadoutTemplates { get; } + public AetheriaRuntimeLoadoutTemplatesDocument CurrentLoadoutTemplates() + { + return LoadoutTemplates.Latest(); + } + public CultMeshDocumentHandle GameSurface { get; } public CultMeshDocumentHandle GameTuiSurface { get; } @@ -142,16 +162,46 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle PlayerSettings { get; } + public AetheriaRuntimePlayerSettingsDocument CurrentPlayerSettings() + { + return PlayerSettings.Latest(); + } + public CultMeshDocumentHandle VerseHostSettings { get; } + public AetheriaRuntimeVerseHostSettingsDocument CurrentVerseHostSettings() + { + return VerseHostSettings.Latest(); + } + public CultMeshDocumentHandle CurrentZone { get; } + public AetheriaRuntimeCurrentZoneDocument CurrentZoneState() + { + return CurrentZone.Latest(); + } + public CultMeshDocumentHandle CurrentEntity { get; } + public AetheriaRuntimeCurrentEntityDocument CurrentEntityState() + { + return CurrentEntity.Latest(); + } + public CultMeshDocumentHandle CurrentDocking { get; } + public AetheriaRuntimeCurrentDockingDocument CurrentDockingState() + { + return CurrentDocking.Latest(); + } + public CultMeshDocumentHandle StarbridgeScenario { get; } + public AetheriaRuntimeStarbridgeScenarioDocument CurrentStarbridgeScenario() + { + return StarbridgeScenario.Latest(); + } + public CultMeshReactiveDocument ReactiveStarbridgeScenario() { return StarbridgeScenario.Reactive(); @@ -159,6 +209,11 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle StarbridgeSession { get; } + public AetheriaRuntimeStarbridgeSessionDocument CurrentStarbridgeSession() + { + return StarbridgeSession.Latest(); + } + public CultMeshReactiveDocument ReactiveStarbridgeSession() { return StarbridgeSession.Reactive(); @@ -166,6 +221,11 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle StarbridgeSummary { get; } + public AetheriaRuntimeStarbridgeSessionSummaryDocument CurrentStarbridgeSummary() + { + return StarbridgeSummary.Latest(); + } + public CultMeshReactiveDocument ReactiveStarbridgeSummary() { return StarbridgeSummary.Reactive(); @@ -173,12 +233,32 @@ namespace GameCult.Aetheria.State.Verse public CultMeshDocumentHandle ZoneContacts { get; } + public AetheriaRuntimeZoneContactsDocument CurrentZoneContacts() + { + return ZoneContacts.Latest(); + } + public CultMeshDocumentHandle StationRefit { get; } + public AetheriaRuntimeStationRefitDocument CurrentStationRefit() + { + return StationRefit.Latest(); + } + public CultMeshDocumentHandle SectorMap { get; } + public AetheriaRuntimeSectorMapDocument CurrentSectorMap() + { + return SectorMap.Latest(); + } + public CultMeshDocumentHandle ZoneRender { get; } + public AetheriaRuntimeZoneRenderDocument CurrentZoneRender() + { + return ZoneRender.Latest(); + } + public CultMeshReactiveDocument ReactiveDaemonFrame() { return DaemonFrame.Reactive(); @@ -304,6 +384,11 @@ namespace GameCult.Aetheria.State.Verse return _mapViewport(viewport ?? new AetheriaRuntimeRtsViewportBounds()); } + public AetheriaRuntimeRtsViewportDocument CurrentRtsViewport(AetheriaRuntimeRtsViewportBounds viewport) + { + return RtsViewport(viewport).Latest(); + } + public CultMeshReactiveDocument ReactiveRtsViewport( AetheriaRuntimeRtsViewportBounds viewport) { @@ -316,6 +401,11 @@ namespace GameCult.Aetheria.State.Verse return _objectsViewport(viewport ?? new AetheriaRuntimeRtsViewportBounds()); } + public AetheriaRuntimeObjectsViewportDocument CurrentObjectsViewport(AetheriaRuntimeRtsViewportBounds viewport) + { + return ObjectsViewport(viewport).Latest(); + } + public CultMeshReactiveDocument ReactiveObjectsViewport( AetheriaRuntimeRtsViewportBounds viewport) { @@ -328,6 +418,11 @@ namespace GameCult.Aetheria.State.Verse return _gravityViewport(viewport ?? new AetheriaRuntimeRtsViewportBounds()); } + public AetheriaRuntimeGravityViewportDocument CurrentGravityViewport(AetheriaRuntimeRtsViewportBounds viewport) + { + return GravityViewport(viewport).Latest(); + } + public CultMeshReactiveDocument ReactiveGravityViewport( AetheriaRuntimeRtsViewportBounds viewport) { @@ -340,6 +435,11 @@ namespace GameCult.Aetheria.State.Verse return _renderSplatsViewport(viewport ?? new AetheriaRuntimeRtsViewportBounds()); } + public AetheriaRuntimeRenderSplatsViewportDocument CurrentRenderSplatsViewport(AetheriaRuntimeRtsViewportBounds viewport) + { + return RenderSplatsViewport(viewport).Latest(); + } + public CultMeshReactiveDocument ReactiveRenderSplatsViewport( AetheriaRuntimeRtsViewportBounds viewport) { @@ -354,6 +454,11 @@ namespace GameCult.Aetheria.State.Verse return _zoneDetails(zoneIndex); } + public AetheriaRuntimeZoneDetailsDocument CurrentZoneDetails(int zoneIndex) + { + return ZoneDetails(zoneIndex).Latest(); + } + public CultMeshReactiveDocument ReactiveZoneDetails(int zoneIndex) { return ZoneDetails(zoneIndex).Reactive(); @@ -367,6 +472,11 @@ namespace GameCult.Aetheria.State.Verse return _selectedObject(zoneIndex); } + public AetheriaRuntimeSelectedObjectDocument CurrentSelectedObject(int zoneIndex) + { + return SelectedObject(zoneIndex).Latest(); + } + public CultMeshReactiveDocument ReactiveSelectedObject(int zoneIndex) { return SelectedObject(zoneIndex).Reactive(); @@ -380,6 +490,11 @@ namespace GameCult.Aetheria.State.Verse return _inventory(entityIndex); } + public AetheriaRuntimeInventoryDocument CurrentInventory(int entityIndex) + { + return Inventory(entityIndex).Latest(); + } + public CultMeshReactiveDocument ReactiveInventory(int entityIndex) { return Inventory(entityIndex).Reactive(); @@ -393,6 +508,11 @@ namespace GameCult.Aetheria.State.Verse return _starbridgePlayerSeat(seatId); } + public AetheriaRuntimeStarbridgePlayerSeatDocument CurrentStarbridgePlayerSeat(string seatId) + { + return StarbridgePlayerSeat(seatId).Latest(); + } + public CultMeshReactiveDocument ReactiveStarbridgePlayerSeat( string seatId) {