From b00f2ce346b42a73a15d32dbddb786b6fb380b89 Mon Sep 17 00:00:00 2001 From: Jamie Greunbaum Date: Wed, 26 Nov 2025 22:10:49 -0500 Subject: [PATCH] Maps are now resynced properly if a player drops out or joins late. --- .../CaseVideoSyncPlayer.asset | 116 +++++++++++++----- .../CaseVideoSyncPlayer.cs | 41 ++++++- 2 files changed, 124 insertions(+), 33 deletions(-) diff --git a/Assets/UdonSharp/CaseVideoSyncPlayer/CaseVideoSyncPlayer.asset b/Assets/UdonSharp/CaseVideoSyncPlayer/CaseVideoSyncPlayer.asset index 1de83ea..a1ebef9 100644 --- a/Assets/UdonSharp/CaseVideoSyncPlayer/CaseVideoSyncPlayer.asset +++ b/Assets/UdonSharp/CaseVideoSyncPlayer/CaseVideoSyncPlayer.asset @@ -44,7 +44,7 @@ MonoBehaviour: Data: - Name: Entry: 12 - Data: 22 + Data: 23 - Name: Entry: 7 Data: @@ -995,19 +995,19 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: _MapDownloader + Data: _CachedMapIndices - Name: $v Entry: 7 Data: 68|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: _MapDownloader + Data: _CachedMapIndices - Name: k__BackingField Entry: 7 Data: 69|System.RuntimeType, mscorlib - Name: Entry: 1 - Data: VRC.SDK3.Image.VRCImageDownloader, VRCSDK3 + Data: System.Int32[], mscorlib - Name: Entry: 8 Data: @@ -1018,8 +1018,8 @@ MonoBehaviour: Entry: 7 Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib - Name: - Entry: 6 - Data: + Entry: 3 + Data: 1 - Name: Entry: 8 Data: @@ -1031,7 +1031,13 @@ MonoBehaviour: Data: 70|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib - Name: Entry: 12 - Data: 0 + Data: 1 + - Name: + Entry: 7 + Data: 71|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime + - Name: + Entry: 8 + Data: - Name: Entry: 13 Data: @@ -1049,25 +1055,19 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: _MapImages + Data: _LoadedMaps - Name: $v Entry: 7 - Data: 71|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + Data: 72|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: _MapImages + Data: _LoadedMaps - Name: k__BackingField - Entry: 7 - Data: 72|System.RuntimeType, mscorlib - - Name: - Entry: 1 - Data: UnityEngine.Texture2D[], UnityEngine.CoreModule - - Name: - Entry: 8 - Data: + Entry: 9 + Data: 69 - Name: k__BackingField Entry: 9 - Data: 72 + Data: 69 - Name: k__BackingField Entry: 7 Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib @@ -1103,19 +1103,19 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: _UdonEventReceiverThis + Data: _MapDownloader - Name: $v Entry: 7 Data: 74|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: _UdonEventReceiverThis + Data: _MapDownloader - Name: k__BackingField Entry: 7 Data: 75|System.RuntimeType, mscorlib - Name: Entry: 1 - Data: VRC.Udon.Common.Interfaces.IUdonEventReceiver, VRC.Udon.Common + Data: VRC.SDK3.Image.VRCImageDownloader, VRCSDK3 - Name: Entry: 8 Data: @@ -1157,19 +1157,19 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: _CachedMapIndices + Data: _MapImages - Name: $v Entry: 7 Data: 77|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 - Data: _CachedMapIndices + Data: _MapImages - Name: k__BackingField Entry: 7 Data: 78|System.RuntimeType, mscorlib - Name: Entry: 1 - Data: System.Int32[], mscorlib + Data: UnityEngine.Texture2D[], UnityEngine.CoreModule - Name: Entry: 8 Data: @@ -1211,10 +1211,64 @@ MonoBehaviour: Data: - Name: $k Entry: 1 - Data: _MapDownloadIndex + Data: _UdonEventReceiverThis - Name: $v Entry: 7 Data: 80|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + - Name: k__BackingField + Entry: 1 + Data: _UdonEventReceiverThis + - Name: k__BackingField + Entry: 7 + Data: 81|System.RuntimeType, mscorlib + - Name: + Entry: 1 + Data: VRC.Udon.Common.Interfaces.IUdonEventReceiver, VRC.Udon.Common + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 9 + Data: 81 + - Name: k__BackingField + Entry: 7 + Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib + - Name: + Entry: 6 + Data: + - Name: + Entry: 8 + Data: + - Name: k__BackingField + Entry: 5 + Data: false + - Name: _fieldAttributes + Entry: 7 + Data: 82|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + - Name: + Entry: 12 + Data: 0 + - Name: + Entry: 13 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 8 + Data: + - Name: + Entry: 7 + Data: + - Name: $k + Entry: 1 + Data: _MapDownloadIndex + - Name: $v + Entry: 7 + Data: 83|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 Data: _MapDownloadIndex @@ -1238,7 +1292,7 @@ MonoBehaviour: Data: false - Name: _fieldAttributes Entry: 7 - Data: 81|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + Data: 84|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib - Name: Entry: 12 Data: 0 @@ -1262,7 +1316,7 @@ MonoBehaviour: Data: _MapDownloadsInProgress - Name: $v Entry: 7 - Data: 82|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + Data: 85|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 Data: _MapDownloadsInProgress @@ -1286,7 +1340,7 @@ MonoBehaviour: Data: false - Name: _fieldAttributes Entry: 7 - Data: 83|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + Data: 86|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib - Name: Entry: 12 Data: 0 @@ -1310,7 +1364,7 @@ MonoBehaviour: Data: _UseFallback - Name: $v Entry: 7 - Data: 84|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor + Data: 87|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor - Name: k__BackingField Entry: 1 Data: _UseFallback @@ -1334,7 +1388,7 @@ MonoBehaviour: Data: false - Name: _fieldAttributes Entry: 7 - Data: 85|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib + Data: 88|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib - Name: Entry: 12 Data: 0 diff --git a/Assets/UdonSharp/CaseVideoSyncPlayer/CaseVideoSyncPlayer.cs b/Assets/UdonSharp/CaseVideoSyncPlayer/CaseVideoSyncPlayer.cs index 901688a..cc1f767 100644 --- a/Assets/UdonSharp/CaseVideoSyncPlayer/CaseVideoSyncPlayer.cs +++ b/Assets/UdonSharp/CaseVideoSyncPlayer/CaseVideoSyncPlayer.cs @@ -6,6 +6,7 @@ using VRC.SDK3.Image; using VRC.SDK3.UdonNetworkCalling; using VRC.SDK3.Video.Components.Base; using VRC.SDKBase; +using VRC.Udon.Common; using VRC.Udon.Common.Interfaces; @@ -46,10 +47,12 @@ public class CaseVideoSyncPlayer : UdonSharpBehaviour [UdonSynced, FieldChangeCallback(nameof(PlayVideo))] private bool _VideoIsPlaying; + [UdonSynced] private int[] _CachedMapIndices = new int[0]; + private int[] _LoadedMaps = new int[0]; + private VRCImageDownloader _MapDownloader; private Texture2D[] _MapImages = new Texture2D[0]; private IUdonEventReceiver _UdonEventReceiverThis; - private int[] _CachedMapIndices = new int[0]; private int _MapDownloadIndex = 0; private bool _MapDownloadsInProgress = false; @@ -73,6 +76,39 @@ public class CaseVideoSyncPlayer : UdonSharpBehaviour _MapDownloader.Dispose(); } + public override void OnDeserialization(DeserializationResult Result) + { + if (_MapDownloadsInProgress) + { + return; + } + + bool MapsNeedLoading = false; + if (_LoadedMaps.Length == _CachedMapIndices.Length) + { + for(int i = 0; i < _CachedMapIndices.Length; i++) + { + if (_CachedMapIndices[i] != _LoadedMaps[i]) + { + MapsNeedLoading = true; + break; + } + } + } + else + { + MapsNeedLoading = true; + } + + if (MapsNeedLoading) + { + Debug.Log("[CaseVideoSyncPlayer] Redownloading old maps..."); + QueueMapDownloads(_CachedMapIndices); + } + + base.OnDeserialization(Result); + } + [NetworkCallable] public void QueueMapDownloads(int[] MapIndices) @@ -110,6 +146,7 @@ public class CaseVideoSyncPlayer : UdonSharpBehaviour _MapDownloadIndex = 0; LoadMapFromIndex(_CachedMapIndices[_MapDownloadIndex]); } + _LoadedMaps = _CachedMapIndices; } private void LoadMapFromIndex(int MapIndex) { @@ -325,7 +362,7 @@ public class CaseVideoSyncPlayer : UdonSharpBehaviour { if (Indicator.GetOwner() == Networking.LocalPlayer.displayName) { - Debug.Log("[CaseVideoSyncPlayer] " + Indicator.GetOwner() + "'s video load indicator was found. Setting status..."); + Debug.Log("[CaseVideoSyncPlayer] " + Indicator.GetOwner() + "'s video load indicator was found. Setting status to " + Status + "..."); Indicator.IndicateStatus = Status; } else