Route player HUD through managed sessions

This commit is contained in:
Meta Vens 2026-06-28 15:04:31 +01:00
commit df65dbcb70
3 changed files with 59 additions and 12 deletions

View file

@ -7294,6 +7294,12 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root)
"UI",
"HUD",
"SchematicDisplay.cs"));
var playerHudState = File.ReadAllText(Path.Combine(
root,
"Packages",
"org.gamecult.aetheria.state",
"Runtime",
"AetheriaRuntimePlayerHudState.cs"));
var requiredSchematicDisplaySymbols = new[]
{
"AetheriaRuntimePlayerHudSession _playerHud",
@ -7332,6 +7338,48 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root)
string.Join(", ", schematicDisplayHits));
}
var requiredPlayerHudSessionSymbols = new[]
{
"private readonly AetheriaRuntimeCatalogSession _catalog;",
"private readonly AetheriaRuntimePlayerSettingsSession _playerSettings;",
"private readonly AetheriaRuntimeCurrentEntitySession _currentEntity;",
"public AetheriaRuntimePlayerHudSession(",
"AetheriaRuntimeCatalogSession catalog",
"AetheriaRuntimePlayerSettingsSession playerSettings",
"AetheriaRuntimeCurrentEntitySession currentEntity",
"public AetheriaRuntimeCatalogSnapshot? Catalog => _catalog.Current;",
"public AetheriaRuntimePlayerSettingsDocument? PlayerSettings => _playerSettings.Current;",
"public AetheriaRuntimeCurrentEntityDocument? CurrentEntity => _currentEntity.Current;"
};
var missingPlayerHudSessionSymbols = requiredPlayerHudSessionSymbols
.Where(symbol => !playerHudState.Contains(symbol, StringComparison.Ordinal))
.ToArray();
if (missingPlayerHudSessionSymbols.Length > 0)
{
throw new InvalidOperationException(
"AetheriaRuntimePlayerHudSession must compose named managed sessions instead of owning raw reactive documents: " +
string.Join(", ", missingPlayerHudSessionSymbols));
}
if (playerHudState.Contains("CultMeshReactiveDocument<", StringComparison.Ordinal) ||
playerHudState.Contains("using GameCult.Mesh;", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"AetheriaRuntimePlayerHudSession reintroduced raw CultMesh reactive document ownership.");
}
if (!clientState.Contains("var catalog = ObserveCatalog(options);", StringComparison.Ordinal) ||
!clientState.Contains("AetheriaRuntimePlayerSettingsSession? playerSettings = null;", StringComparison.Ordinal) ||
!clientState.Contains("AetheriaRuntimeCurrentEntitySession? currentEntity = null;", StringComparison.Ordinal) ||
!clientState.Contains("playerSettings = Settings.ObservePlayer(options);", StringComparison.Ordinal) ||
!clientState.Contains("currentEntity = Current.ObserveEntity(options);", StringComparison.Ordinal) ||
clientState.Contains("playerSettings = Settings.ReactivePlayer(options);", StringComparison.Ordinal) ||
clientState.Contains("currentEntity = Current.ReactiveEntity(options);", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"AetheriaClientState.ObservePlayerHud() must compose named managed sessions instead of raw reactive CultMesh documents.");
}
var volumeCloudRenderer = File.ReadAllText(Path.Combine(
root,
"Assets",

View file

@ -320,13 +320,13 @@ namespace GameCult.Aetheria.State.Verse
public AetheriaRuntimePlayerHudSession ObservePlayerHud(
CultMeshReactiveDocumentOptions? options = null)
{
var catalog = ReactiveCatalog(options);
CultMeshReactiveDocument<AetheriaRuntimePlayerSettingsDocument>? playerSettings = null;
CultMeshReactiveDocument<AetheriaRuntimeCurrentEntityDocument>? currentEntity = null;
var catalog = ObserveCatalog(options);
AetheriaRuntimePlayerSettingsSession? playerSettings = null;
AetheriaRuntimeCurrentEntitySession? currentEntity = null;
try
{
playerSettings = Settings.ReactivePlayer(options);
currentEntity = Current.ReactiveEntity(options);
playerSettings = Settings.ObservePlayer(options);
currentEntity = Current.ObserveEntity(options);
return new AetheriaRuntimePlayerHudSession(catalog, playerSettings, currentEntity);
}
catch

View file

@ -1,5 +1,4 @@
using System;
using GameCult.Mesh;
#nullable enable
@ -7,14 +6,14 @@ namespace GameCult.Aetheria.State.Verse
{
public sealed class AetheriaRuntimePlayerHudSession : IDisposable
{
private readonly CultMeshReactiveDocument<AetheriaRuntimeCatalogSnapshot> _catalog;
private readonly CultMeshReactiveDocument<AetheriaRuntimePlayerSettingsDocument> _playerSettings;
private readonly CultMeshReactiveDocument<AetheriaRuntimeCurrentEntityDocument> _currentEntity;
private readonly AetheriaRuntimeCatalogSession _catalog;
private readonly AetheriaRuntimePlayerSettingsSession _playerSettings;
private readonly AetheriaRuntimeCurrentEntitySession _currentEntity;
public AetheriaRuntimePlayerHudSession(
CultMeshReactiveDocument<AetheriaRuntimeCatalogSnapshot> catalog,
CultMeshReactiveDocument<AetheriaRuntimePlayerSettingsDocument> playerSettings,
CultMeshReactiveDocument<AetheriaRuntimeCurrentEntityDocument> currentEntity)
AetheriaRuntimeCatalogSession catalog,
AetheriaRuntimePlayerSettingsSession playerSettings,
AetheriaRuntimeCurrentEntitySession currentEntity)
{
_catalog = catalog ?? throw new ArgumentNullException(nameof(catalog));
_playerSettings = playerSettings ?? throw new ArgumentNullException(nameof(playerSettings));