Add named current typed state accessors

This commit is contained in:
Meta Vens 2026-06-29 09:43:35 +01:00
commit 06a3f8dab2
4 changed files with 170 additions and 19 deletions

View file

@ -7621,12 +7621,11 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root)
"ActionBarSlot.cs"));
var requiredActionBarSymbols = new[]
{
"public abstract class ActionBarBinding : IDisposable",
"CultMeshReactiveDocument<AetheriaRuntimeCatalogSnapshot> _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<AetheriaRuntimeCatalogSnapshot> _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<AetheriaRuntimeVerseAuthorityPolicyDocument> AuthorityPolicy { get; }",
"public CultMeshReactiveDocument<AetheriaRuntimeVerseAuthorityPolicyDocument> ReactiveAuthorityPolicy()",
"public CultMeshDocumentHandle<AetheriaRuntimeDaemonFrameDocument> DaemonFrame { get; }",
"public AetheriaRuntimeDaemonFrameDocument CurrentDaemonFrame()",
"public CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> ReactiveDaemonFrame()",
"public CultMeshDocumentHandle<AetheriaRuntimeDaemonSoaViewDocument> DaemonSoaView { get; }",
"public AetheriaRuntimeDaemonSoaViewDocument CurrentDaemonSoaView()",
"public CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument> ReactiveDaemonSoaView()",
"public CultMeshDocumentHandle<AetheriaRuntimeZoneRenderDocument> ZoneRender { get; }",
"public AetheriaRuntimeZoneRenderDocument CurrentZoneRender()",
"public CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> ReactiveZoneRender()",
"public CultMeshDocumentHandle<AetheriaRuntimeLoadoutTemplatesDocument> LoadoutTemplates { get; }",
"public AetheriaRuntimeLoadoutTemplatesDocument CurrentLoadoutTemplates()",
"public CultMeshReactiveDocument<AetheriaRuntimeLoadoutTemplatesDocument> ReactiveLoadoutTemplates()",
"public CultMeshDocumentHandle<AetheriaRuntimeSectorMapDocument> SectorMap { get; }",
"public AetheriaRuntimeSectorMapDocument CurrentSectorMap()",
"public CultMeshReactiveDocument<AetheriaRuntimeSectorMapDocument> ReactiveSectorMap()",
"public CultMeshDocumentHandle<AetheriaRuntimeCurrentZoneDocument> CurrentZone { get; }",
"public AetheriaRuntimeCurrentZoneDocument CurrentZoneState()",
"public CultMeshReactiveDocument<AetheriaRuntimeCurrentZoneDocument> ReactiveCurrentZone()",
"public CultMeshDocumentHandle<AetheriaRuntimeZoneContactsDocument> ZoneContacts { get; }",
"public AetheriaRuntimeZoneContactsDocument CurrentZoneContacts()",
"public CultMeshReactiveDocument<AetheriaRuntimeZoneContactsDocument> ReactiveZoneContacts()",
"public CultMeshDocumentHandle<AetheriaRuntimeVerseHostSettingsDocument> VerseHostSettings { get; }",
"public AetheriaRuntimeVerseHostSettingsDocument CurrentVerseHostSettings()",
"public CultMeshReactiveDocument<AetheriaRuntimeVerseHostSettingsDocument> ReactiveVerseHostSettings()",
"public CultMeshDocumentHandle<AetheriaRuntimeCurrentDockingDocument> CurrentDocking { get; }",
"public AetheriaRuntimeCurrentDockingDocument CurrentDockingState()",
"public CultMeshReactiveDocument<AetheriaRuntimeCurrentDockingDocument> ReactiveCurrentDocking()",
"public CultMeshDocumentHandle<AetheriaRuntimeCurrentEntityDocument> CurrentEntity { get; }",
"public AetheriaRuntimeCurrentEntityDocument CurrentEntityState()",
"public CultMeshReactiveDocument<AetheriaRuntimeCurrentEntityDocument> ReactiveCurrentEntity()",
"public CultMeshDocumentHandle<AetheriaRuntimeStationRefitDocument> StationRefit { get; }",
"public AetheriaRuntimeStationRefitDocument CurrentStationRefit()",
"public CultMeshReactiveDocument<AetheriaRuntimeStationRefitDocument> ReactiveStationRefit()",
"public CultMeshDocumentHandle<AetheriaRuntimeCatalogSnapshot> Catalog { get; }",
"public AetheriaRuntimeCatalogSnapshot CurrentCatalog()",
"public CultMeshReactiveDocument<AetheriaRuntimeCatalogSnapshot> ReactiveCatalogSnapshot()",
"public CultMeshDocumentHandle<AetheriaRuntimePlayerSettingsDocument> PlayerSettings { get; }",
"public AetheriaRuntimePlayerSettingsDocument CurrentPlayerSettings()",
"public CultMeshReactiveDocument<AetheriaRuntimePlayerSettingsDocument> ReactivePlayerSettingsDocument()",
"public static bool TryResolveEveSurface(",
"public CultMeshDocumentHandle<global::Aetheria.State.Documents.EveSurfaceState>? EveSurfaceDocument(",
"public CultMeshReactiveDocument<global::Aetheria.State.Documents.EveSurfaceState>? ReactiveEveSurface(",
"public CultMeshDocumentHandle<AetheriaRuntimeRtsViewportDocument> RtsViewport(",
"public AetheriaRuntimeRtsViewportDocument CurrentRtsViewport(",
"public CultMeshReactiveDocument<AetheriaRuntimeRtsViewportDocument> ReactiveRtsViewport(",
"public CultMeshDocumentHandle<AetheriaRuntimeObjectsViewportDocument> ObjectsViewport(",
"public AetheriaRuntimeObjectsViewportDocument CurrentObjectsViewport(",
"public CultMeshReactiveDocument<AetheriaRuntimeObjectsViewportDocument> ReactiveObjectsViewport(",
"public CultMeshDocumentHandle<AetheriaRuntimeGravityViewportDocument> GravityViewport(",
"public AetheriaRuntimeGravityViewportDocument CurrentGravityViewport(",
"public CultMeshReactiveDocument<AetheriaRuntimeGravityViewportDocument> ReactiveGravityViewport(",
"public CultMeshDocumentHandle<AetheriaRuntimeRenderSplatsViewportDocument> RenderSplatsViewport(",
"public AetheriaRuntimeRenderSplatsViewportDocument CurrentRenderSplatsViewport(",
"public CultMeshReactiveDocument<AetheriaRuntimeRenderSplatsViewportDocument> ReactiveRenderSplatsViewport(",
"public CultMeshDocumentHandle<AetheriaRuntimeZoneDetailsDocument> ZoneDetails(",
"public AetheriaRuntimeZoneDetailsDocument CurrentZoneDetails(",
"public CultMeshReactiveDocument<AetheriaRuntimeZoneDetailsDocument> ReactiveZoneDetails(",
"public CultMeshDocumentHandle<AetheriaRuntimeSelectedObjectDocument> SelectedObject(",
"public AetheriaRuntimeSelectedObjectDocument CurrentSelectedObject(",
"public CultMeshReactiveDocument<AetheriaRuntimeSelectedObjectDocument> ReactiveSelectedObject(",
"public CultMeshDocumentHandle<AetheriaRuntimeInventoryDocument> Inventory(",
"public AetheriaRuntimeInventoryDocument CurrentInventory(",
"public CultMeshReactiveDocument<AetheriaRuntimeInventoryDocument> ReactiveInventory(",
"public CultMeshDocumentHandle<AetheriaRuntimeStarbridgeScenarioDocument> StarbridgeScenario { get; }",
"public AetheriaRuntimeStarbridgeScenarioDocument CurrentStarbridgeScenario()",
"public CultMeshReactiveDocument<AetheriaRuntimeStarbridgeScenarioDocument> ReactiveStarbridgeScenario()",
"public CultMeshDocumentHandle<AetheriaRuntimeStarbridgeSessionDocument> StarbridgeSession { get; }",
"public AetheriaRuntimeStarbridgeSessionDocument CurrentStarbridgeSession()",
"public CultMeshReactiveDocument<AetheriaRuntimeStarbridgeSessionDocument> ReactiveStarbridgeSession()",
"public CultMeshDocumentHandle<AetheriaRuntimeStarbridgeSessionSummaryDocument> StarbridgeSummary { get; }",
"public AetheriaRuntimeStarbridgeSessionSummaryDocument CurrentStarbridgeSummary()",
"public CultMeshReactiveDocument<AetheriaRuntimeStarbridgeSessionSummaryDocument> ReactiveStarbridgeSummary()",
"public CultMeshDocumentHandle<AetheriaRuntimeStarbridgePlayerSeatDocument> StarbridgePlayerSeat(",
"public AetheriaRuntimeStarbridgePlayerSeatDocument CurrentStarbridgePlayerSeat(",
"public CultMeshReactiveDocument<AetheriaRuntimeStarbridgePlayerSeatDocument> ReactiveStarbridgePlayerSeat("
};
var missingClientSymbols = requiredClientSymbols
@ -8471,6 +8499,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root
if (clientState.Contains("public Task<TDocument> LatestAsync<TDocument>", StringComparison.Ordinal) ||
clientState.Contains("public TDocument Latest<TDocument>", StringComparison.Ordinal) ||
clientState.Contains("public TDocument Current<TDocument>", StringComparison.Ordinal) ||
clientState.Contains("public CultMeshDocumentHandle<TDocument> Document<TDocument>", StringComparison.Ordinal) ||
clientState.Contains("public CultMeshReactiveDocument<TDocument> Reactive<TDocument>", StringComparison.Ordinal) ||
clientState.Contains("TryGetDocument<TDocument>", StringComparison.Ordinal) ||

View file

@ -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<AetheriaControl> _resolveControl;
protected ActionBarSlot Slot { get; }
protected GameSettings Settings { get; }
private CultMeshReactiveDocument<AetheriaRuntimeCatalogSnapshot> _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

View file

@ -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);

View file

@ -126,12 +126,32 @@ namespace GameCult.Aetheria.State.Verse
public CultMeshDocumentHandle<AetheriaRuntimeDaemonFrameDocument> DaemonFrame { get; }
public AetheriaRuntimeDaemonFrameDocument CurrentDaemonFrame()
{
return DaemonFrame.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeDaemonSoaViewDocument> DaemonSoaView { get; }
public AetheriaRuntimeDaemonSoaViewDocument CurrentDaemonSoaView()
{
return DaemonSoaView.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeCatalogSnapshot> Catalog { get; }
public AetheriaRuntimeCatalogSnapshot CurrentCatalog()
{
return Catalog.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeLoadoutTemplatesDocument> LoadoutTemplates { get; }
public AetheriaRuntimeLoadoutTemplatesDocument CurrentLoadoutTemplates()
{
return LoadoutTemplates.Latest();
}
public CultMeshDocumentHandle<global::Aetheria.State.Documents.EveSurfaceState> GameSurface { get; }
public CultMeshDocumentHandle<global::Aetheria.State.Documents.EveSurfaceState> GameTuiSurface { get; }
@ -142,16 +162,46 @@ namespace GameCult.Aetheria.State.Verse
public CultMeshDocumentHandle<AetheriaRuntimePlayerSettingsDocument> PlayerSettings { get; }
public AetheriaRuntimePlayerSettingsDocument CurrentPlayerSettings()
{
return PlayerSettings.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeVerseHostSettingsDocument> VerseHostSettings { get; }
public AetheriaRuntimeVerseHostSettingsDocument CurrentVerseHostSettings()
{
return VerseHostSettings.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeCurrentZoneDocument> CurrentZone { get; }
public AetheriaRuntimeCurrentZoneDocument CurrentZoneState()
{
return CurrentZone.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeCurrentEntityDocument> CurrentEntity { get; }
public AetheriaRuntimeCurrentEntityDocument CurrentEntityState()
{
return CurrentEntity.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeCurrentDockingDocument> CurrentDocking { get; }
public AetheriaRuntimeCurrentDockingDocument CurrentDockingState()
{
return CurrentDocking.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeStarbridgeScenarioDocument> StarbridgeScenario { get; }
public AetheriaRuntimeStarbridgeScenarioDocument CurrentStarbridgeScenario()
{
return StarbridgeScenario.Latest();
}
public CultMeshReactiveDocument<AetheriaRuntimeStarbridgeScenarioDocument> ReactiveStarbridgeScenario()
{
return StarbridgeScenario.Reactive();
@ -159,6 +209,11 @@ namespace GameCult.Aetheria.State.Verse
public CultMeshDocumentHandle<AetheriaRuntimeStarbridgeSessionDocument> StarbridgeSession { get; }
public AetheriaRuntimeStarbridgeSessionDocument CurrentStarbridgeSession()
{
return StarbridgeSession.Latest();
}
public CultMeshReactiveDocument<AetheriaRuntimeStarbridgeSessionDocument> ReactiveStarbridgeSession()
{
return StarbridgeSession.Reactive();
@ -166,6 +221,11 @@ namespace GameCult.Aetheria.State.Verse
public CultMeshDocumentHandle<AetheriaRuntimeStarbridgeSessionSummaryDocument> StarbridgeSummary { get; }
public AetheriaRuntimeStarbridgeSessionSummaryDocument CurrentStarbridgeSummary()
{
return StarbridgeSummary.Latest();
}
public CultMeshReactiveDocument<AetheriaRuntimeStarbridgeSessionSummaryDocument> ReactiveStarbridgeSummary()
{
return StarbridgeSummary.Reactive();
@ -173,12 +233,32 @@ namespace GameCult.Aetheria.State.Verse
public CultMeshDocumentHandle<AetheriaRuntimeZoneContactsDocument> ZoneContacts { get; }
public AetheriaRuntimeZoneContactsDocument CurrentZoneContacts()
{
return ZoneContacts.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeStationRefitDocument> StationRefit { get; }
public AetheriaRuntimeStationRefitDocument CurrentStationRefit()
{
return StationRefit.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeSectorMapDocument> SectorMap { get; }
public AetheriaRuntimeSectorMapDocument CurrentSectorMap()
{
return SectorMap.Latest();
}
public CultMeshDocumentHandle<AetheriaRuntimeZoneRenderDocument> ZoneRender { get; }
public AetheriaRuntimeZoneRenderDocument CurrentZoneRender()
{
return ZoneRender.Latest();
}
public CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> 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<AetheriaRuntimeRtsViewportDocument> 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<AetheriaRuntimeObjectsViewportDocument> 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<AetheriaRuntimeGravityViewportDocument> 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<AetheriaRuntimeRenderSplatsViewportDocument> 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<AetheriaRuntimeZoneDetailsDocument> 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<AetheriaRuntimeSelectedObjectDocument> 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<AetheriaRuntimeInventoryDocument> 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<AetheriaRuntimeStarbridgePlayerSeatDocument> ReactiveStarbridgePlayerSeat(
string seatId)
{