From 474cadac1c173e24b2c9b9ddde7b781059dbae4c Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Tue, 14 Jul 2026 00:45:39 +0100 Subject: [PATCH] Poll advertised entity views for live updates --- .../EveUnityCultMeshLiveProviderTransport.cs | 40 ++++++++++++++++++- .../org.gamecult.eve.unity-scene/package.json | 2 +- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/org.gamecult.eve.unity-scene/Runtime/CultMesh/EveUnityCultMeshLiveProviderTransport.cs b/packages/org.gamecult.eve.unity-scene/Runtime/CultMesh/EveUnityCultMeshLiveProviderTransport.cs index d5e2dac..9129d74 100644 --- a/packages/org.gamecult.eve.unity-scene/Runtime/CultMesh/EveUnityCultMeshLiveProviderTransport.cs +++ b/packages/org.gamecult.eve.unity-scene/Runtime/CultMesh/EveUnityCultMeshLiveProviderTransport.cs @@ -57,6 +57,9 @@ namespace GameCult.Eve.UnityScene private EveAdvertisedSurface? _advertisedSurface; private CultMeshBodyPublicationResolver? _bodyResolver; private DateTime _nextReceiptPollUtc; + private DateTime _nextEntityViewPollUtc; + private long _lastQueuedEntityViewEpoch = -1; + private long _lastQueuedEntityViewSequence = -1; public EveUnityCultMeshLiveProviderTransport( string replicaPath, @@ -133,6 +136,7 @@ namespace GameCult.Eve.UnityScene public void PumpLiveEvents() { + PollCurrentEntityView(); while (_liveDocuments.TryDequeue(out var document)) { if (document is EveEntitySoaViewDocument entityView) @@ -145,6 +149,36 @@ namespace GameCult.Eve.UnityScene PollPendingReceipts(); } + private void PollCurrentEntityView() + { + if (DateTime.UtcNow < _nextEntityViewPollUtc) + return; + _nextEntityViewPollUtc = DateTime.UtcNow.AddMilliseconds(250); + var lowered = new EveUnitySceneSurfaceLowerer() + .Lower(CurrentSurfaceDocument.SurfaceDocument, CurrentSurfaceDocument.AdvertisedSurface); + var pointer = lowered.PlayableWorld?.EntityViewPointerId ?? ""; + if (string.IsNullOrWhiteSpace(pointer)) + return; + var current = _snapshot! + .FetchDocumentsAsync( + recordKeys: new[] { pointer }, + schemaIds: new[] { EveEntitySoaViewDocument.SchemaId }) + .GetAwaiter().GetResult().FirstOrDefault(); + if (current != null) + QueueEntityView(current); + } + + private void QueueEntityView(EveEntitySoaViewDocument document) + { + if (document.ProducerEpoch < _lastQueuedEntityViewEpoch || + (document.ProducerEpoch == _lastQueuedEntityViewEpoch && + document.Sequence <= _lastQueuedEntityViewSequence)) + return; + _lastQueuedEntityViewEpoch = document.ProducerEpoch; + _lastQueuedEntityViewSequence = document.Sequence; + _liveDocuments.Enqueue(document); + } + private void PollPendingReceipts() { if (_pendingCommandIds.Count == 0 || DateTime.UtcNow < _nextReceiptPollUtc) @@ -509,7 +543,7 @@ namespace GameCult.Eve.UnityScene schemaIds: new[] { EveEntitySoaViewDocument.SchemaId }) .GetAwaiter().GetResult().FirstOrDefault(); if (current != null) - _liveDocuments.Enqueue(current); + QueueEntityView(current); } _subscriptions.SubscribeAsync( "eve-unity-surface", @@ -530,7 +564,9 @@ namespace GameCult.Eve.UnityScene private void OnReplicatedDocumentChanged(CultNetReplicatedDocumentChange change) { - if (change.Document is EveEntitySoaViewDocument or EveSurfaceDocument or EveCommandReceiptDocument) + if (change.Document is EveEntitySoaViewDocument entityView) + QueueEntityView(entityView); + else if (change.Document is EveSurfaceDocument or EveCommandReceiptDocument) _liveDocuments.Enqueue(change.Document); } diff --git a/packages/org.gamecult.eve.unity-scene/package.json b/packages/org.gamecult.eve.unity-scene/package.json index ebd9a68..04df3ce 100644 --- a/packages/org.gamecult.eve.unity-scene/package.json +++ b/packages/org.gamecult.eve.unity-scene/package.json @@ -1,7 +1,7 @@ { "name": "org.gamecult.eve.unity-scene", "displayName": "Eve Unity Scene Lowering", - "version": "0.3.14", + "version": "0.3.15", "unity": "2021.3", "description": "Provider-agnostic Unity scene shell for gamecult.eve.surface.v1 interactive world surfaces.", "dependencies": {