Aetheria/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderComponent.cs

161 lines
5.7 KiB
C#

using System;
using GameCult.Aetheria.State.Verse;
using GameCult.Eve.Surface;
using GameCult.Eve.UnityScene;
using UnityEngine;
#nullable enable
namespace GameCult.Aetheria.EveRuntime
{
public sealed class AetheriaEveUnitySceneProviderComponent :
EveUnitySceneLiveProviderTransportBehaviour,
IEveUnitySceneProviderSurfaceDocumentSource,
IEveUnityPlayableWorldAssetManifestDocumentSource,
IEveUnitySceneCommandSink,
IEveUnitySceneCommandReceiptSource,
IEveUnityProviderRefreshSource,
IDisposable
{
[SerializeField] private string stateFilePathOverride = "";
[SerializeField] private string cultMeshEndpoint = "";
[SerializeField] private string surfaceId = AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId;
[SerializeField] private string runtimeId = "unity-scene";
[SerializeField] private bool refreshOnEnable = true;
private AetheriaEveUnitySceneProviderBridge? _bridge;
public override string TransportKind => Bridge.TransportKind;
public override string SurfacePointer => Bridge.SurfacePointer;
public override string AssetManifestPointer => Bridge.AssetManifestPointer;
public override EveUnitySceneProviderSurfaceDocument CurrentSurfaceDocument =>
((IEveUnitySceneLiveProviderTransport)Bridge).CurrentSurfaceDocument;
public override EveUnityPlayableWorldAssetManifestDocument CurrentAssetManifestDocument =>
((IEveUnitySceneLiveProviderTransport)Bridge).CurrentAssetManifestDocument;
public string SinkKind => Bridge.SinkKind;
public string ManifestRef => ((IEveUnityPlayableWorldAssetManifestDocumentSource)Bridge).ManifestRef;
public EveUnitySceneProviderSurfaceDocument CurrentDocument => Bridge.CurrentDocument;
EveUnityPlayableWorldAssetManifestDocument IEveUnityPlayableWorldAssetManifestDocumentSource.CurrentDocument =>
((IEveUnityPlayableWorldAssetManifestDocumentSource)Bridge).CurrentDocument;
public event Action<EveUnitySceneProviderSurfaceDocument>? DocumentAvailable
{
add => Bridge.DocumentAvailable += value;
remove => Bridge.DocumentAvailable -= value;
}
public override event Action<EveUnitySceneProviderSurfaceDocument> SurfaceDocumentAvailable
{
add => ((IEveUnitySceneLiveProviderTransport)Bridge).SurfaceDocumentAvailable += value;
remove => ((IEveUnitySceneLiveProviderTransport)Bridge).SurfaceDocumentAvailable -= value;
}
public event Action<EveUnitySceneCommandReceipt>? ReceiptAvailable
{
add => Bridge.ReceiptAvailable += value;
remove => Bridge.ReceiptAvailable -= value;
}
public override event Action<EveUnitySceneCommandReceipt> CommandReceiptAvailable
{
add => ((IEveUnitySceneLiveProviderTransport)Bridge).CommandReceiptAvailable += value;
remove => ((IEveUnitySceneLiveProviderTransport)Bridge).CommandReceiptAvailable -= value;
}
event Action<EveUnityPlayableWorldAssetManifestDocument> IEveUnityPlayableWorldAssetManifestDocumentSource.DocumentAvailable
{
add => ((IEveUnityPlayableWorldAssetManifestDocumentSource)Bridge).DocumentAvailable += value;
remove => ((IEveUnityPlayableWorldAssetManifestDocumentSource)Bridge).DocumentAvailable -= value;
}
public override event Action<EveUnityPlayableWorldAssetManifestDocument> AssetManifestDocumentAvailable
{
add => ((IEveUnitySceneLiveProviderTransport)Bridge).AssetManifestDocumentAvailable += value;
remove => ((IEveUnitySceneLiveProviderTransport)Bridge).AssetManifestDocumentAvailable -= value;
}
public void Configure(
string stateFilePath,
string surfaceId = AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId,
string runtimeId = "unity-scene",
string endpoint = "")
{
Dispose();
stateFilePathOverride = stateFilePath ?? "";
this.surfaceId = string.IsNullOrWhiteSpace(surfaceId)
? AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId
: surfaceId;
this.runtimeId = string.IsNullOrWhiteSpace(runtimeId)
? "unity-scene"
: runtimeId;
cultMeshEndpoint = endpoint ?? "";
}
public override void Connect()
{
Bridge.Connect();
}
public override void Disconnect()
{
Bridge.Disconnect();
}
public override void Refresh()
{
Bridge.Refresh();
}
public void Submit(EveSurfaceCommandRequest request)
{
Bridge.Submit(request);
}
public override void SubmitCommand(EveSurfaceCommandRequest request)
{
Bridge.SubmitCommand(request);
}
public void Dispose()
{
_bridge?.Dispose();
_bridge = null;
}
private AetheriaEveUnitySceneProviderBridge Bridge
{
get
{
if (_bridge == null)
{
_bridge = new AetheriaEveUnitySceneProviderBridge(
stateFilePathOverride,
surfaceId,
runtimeId,
cultMeshEndpoint);
}
return _bridge;
}
}
private void OnEnable()
{
if (refreshOnEnable)
Refresh();
}
private void OnDestroy()
{
Dispose();
}
}
}