Maps are now resynced properly if a player drops out or joins late.

This commit is contained in:
Jamie Greunbaum 2025-11-26 22:10:49 -05:00
parent 6635272a6b
commit b00f2ce346
2 changed files with 124 additions and 33 deletions

View File

@ -44,7 +44,7 @@ MonoBehaviour:
Data: Data:
- Name: - Name:
Entry: 12 Entry: 12
Data: 22 Data: 23
- Name: - Name:
Entry: 7 Entry: 7
Data: Data:
@ -995,19 +995,19 @@ MonoBehaviour:
Data: Data:
- Name: $k - Name: $k
Entry: 1 Entry: 1
Data: _MapDownloader Data: _CachedMapIndices
- Name: $v - Name: $v
Entry: 7 Entry: 7
Data: 68|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor Data: 68|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
- Name: <Name>k__BackingField - Name: <Name>k__BackingField
Entry: 1 Entry: 1
Data: _MapDownloader Data: _CachedMapIndices
- Name: <UserType>k__BackingField - Name: <UserType>k__BackingField
Entry: 7 Entry: 7
Data: 69|System.RuntimeType, mscorlib Data: 69|System.RuntimeType, mscorlib
- Name: - Name:
Entry: 1 Entry: 1
Data: VRC.SDK3.Image.VRCImageDownloader, VRCSDK3 Data: System.Int32[], mscorlib
- Name: - Name:
Entry: 8 Entry: 8
Data: Data:
@ -1018,8 +1018,8 @@ MonoBehaviour:
Entry: 7 Entry: 7
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
- Name: - Name:
Entry: 6 Entry: 3
Data: Data: 1
- Name: - Name:
Entry: 8 Entry: 8
Data: Data:
@ -1031,7 +1031,13 @@ MonoBehaviour:
Data: 70|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib Data: 70|System.Collections.Generic.List`1[[System.Attribute, mscorlib]], mscorlib
- Name: - Name:
Entry: 12 Entry: 12
Data: 0 Data: 1
- Name:
Entry: 7
Data: 71|UdonSharp.UdonSyncedAttribute, UdonSharp.Runtime
- Name:
Entry: 8
Data:
- Name: - Name:
Entry: 13 Entry: 13
Data: Data:
@ -1049,25 +1055,19 @@ MonoBehaviour:
Data: Data:
- Name: $k - Name: $k
Entry: 1 Entry: 1
Data: _MapImages Data: _LoadedMaps
- Name: $v - Name: $v
Entry: 7 Entry: 7
Data: 71|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor Data: 72|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
- Name: <Name>k__BackingField - Name: <Name>k__BackingField
Entry: 1 Entry: 1
Data: _MapImages Data: _LoadedMaps
- Name: <UserType>k__BackingField - Name: <UserType>k__BackingField
Entry: 7 Entry: 9
Data: 72|System.RuntimeType, mscorlib Data: 69
- Name:
Entry: 1
Data: UnityEngine.Texture2D[], UnityEngine.CoreModule
- Name:
Entry: 8
Data:
- Name: <SystemType>k__BackingField - Name: <SystemType>k__BackingField
Entry: 9 Entry: 9
Data: 72 Data: 69
- Name: <SyncMode>k__BackingField - Name: <SyncMode>k__BackingField
Entry: 7 Entry: 7
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
@ -1103,19 +1103,19 @@ MonoBehaviour:
Data: Data:
- Name: $k - Name: $k
Entry: 1 Entry: 1
Data: _UdonEventReceiverThis Data: _MapDownloader
- Name: $v - Name: $v
Entry: 7 Entry: 7
Data: 74|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor Data: 74|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
- Name: <Name>k__BackingField - Name: <Name>k__BackingField
Entry: 1 Entry: 1
Data: _UdonEventReceiverThis Data: _MapDownloader
- Name: <UserType>k__BackingField - Name: <UserType>k__BackingField
Entry: 7 Entry: 7
Data: 75|System.RuntimeType, mscorlib Data: 75|System.RuntimeType, mscorlib
- Name: - Name:
Entry: 1 Entry: 1
Data: VRC.Udon.Common.Interfaces.IUdonEventReceiver, VRC.Udon.Common Data: VRC.SDK3.Image.VRCImageDownloader, VRCSDK3
- Name: - Name:
Entry: 8 Entry: 8
Data: Data:
@ -1157,19 +1157,19 @@ MonoBehaviour:
Data: Data:
- Name: $k - Name: $k
Entry: 1 Entry: 1
Data: _CachedMapIndices Data: _MapImages
- Name: $v - Name: $v
Entry: 7 Entry: 7
Data: 77|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor Data: 77|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
- Name: <Name>k__BackingField - Name: <Name>k__BackingField
Entry: 1 Entry: 1
Data: _CachedMapIndices Data: _MapImages
- Name: <UserType>k__BackingField - Name: <UserType>k__BackingField
Entry: 7 Entry: 7
Data: 78|System.RuntimeType, mscorlib Data: 78|System.RuntimeType, mscorlib
- Name: - Name:
Entry: 1 Entry: 1
Data: System.Int32[], mscorlib Data: UnityEngine.Texture2D[], UnityEngine.CoreModule
- Name: - Name:
Entry: 8 Entry: 8
Data: Data:
@ -1211,10 +1211,64 @@ MonoBehaviour:
Data: Data:
- Name: $k - Name: $k
Entry: 1 Entry: 1
Data: _MapDownloadIndex Data: _UdonEventReceiverThis
- Name: $v - Name: $v
Entry: 7 Entry: 7
Data: 80|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor Data: 80|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
- Name: <Name>k__BackingField
Entry: 1
Data: _UdonEventReceiverThis
- Name: <UserType>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: <SystemType>k__BackingField
Entry: 9
Data: 81
- Name: <SyncMode>k__BackingField
Entry: 7
Data: System.Nullable`1[[UdonSharp.UdonSyncMode, UdonSharp.Runtime]], mscorlib
- Name:
Entry: 6
Data:
- Name:
Entry: 8
Data:
- Name: <IsSerialized>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: <Name>k__BackingField - Name: <Name>k__BackingField
Entry: 1 Entry: 1
Data: _MapDownloadIndex Data: _MapDownloadIndex
@ -1238,7 +1292,7 @@ MonoBehaviour:
Data: false Data: false
- Name: _fieldAttributes - Name: _fieldAttributes
Entry: 7 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: - Name:
Entry: 12 Entry: 12
Data: 0 Data: 0
@ -1262,7 +1316,7 @@ MonoBehaviour:
Data: _MapDownloadsInProgress Data: _MapDownloadsInProgress
- Name: $v - Name: $v
Entry: 7 Entry: 7
Data: 82|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor Data: 85|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
- Name: <Name>k__BackingField - Name: <Name>k__BackingField
Entry: 1 Entry: 1
Data: _MapDownloadsInProgress Data: _MapDownloadsInProgress
@ -1286,7 +1340,7 @@ MonoBehaviour:
Data: false Data: false
- Name: _fieldAttributes - Name: _fieldAttributes
Entry: 7 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: - Name:
Entry: 12 Entry: 12
Data: 0 Data: 0
@ -1310,7 +1364,7 @@ MonoBehaviour:
Data: _UseFallback Data: _UseFallback
- Name: $v - Name: $v
Entry: 7 Entry: 7
Data: 84|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor Data: 87|UdonSharp.Compiler.FieldDefinition, UdonSharp.Editor
- Name: <Name>k__BackingField - Name: <Name>k__BackingField
Entry: 1 Entry: 1
Data: _UseFallback Data: _UseFallback
@ -1334,7 +1388,7 @@ MonoBehaviour:
Data: false Data: false
- Name: _fieldAttributes - Name: _fieldAttributes
Entry: 7 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: - Name:
Entry: 12 Entry: 12
Data: 0 Data: 0

View File

@ -6,6 +6,7 @@ using VRC.SDK3.Image;
using VRC.SDK3.UdonNetworkCalling; using VRC.SDK3.UdonNetworkCalling;
using VRC.SDK3.Video.Components.Base; using VRC.SDK3.Video.Components.Base;
using VRC.SDKBase; using VRC.SDKBase;
using VRC.Udon.Common;
using VRC.Udon.Common.Interfaces; using VRC.Udon.Common.Interfaces;
@ -46,10 +47,12 @@ public class CaseVideoSyncPlayer : UdonSharpBehaviour
[UdonSynced, FieldChangeCallback(nameof(PlayVideo))] private bool _VideoIsPlaying; [UdonSynced, FieldChangeCallback(nameof(PlayVideo))] private bool _VideoIsPlaying;
[UdonSynced] private int[] _CachedMapIndices = new int[0];
private int[] _LoadedMaps = new int[0];
private VRCImageDownloader _MapDownloader; private VRCImageDownloader _MapDownloader;
private Texture2D[] _MapImages = new Texture2D[0]; private Texture2D[] _MapImages = new Texture2D[0];
private IUdonEventReceiver _UdonEventReceiverThis; private IUdonEventReceiver _UdonEventReceiverThis;
private int[] _CachedMapIndices = new int[0];
private int _MapDownloadIndex = 0; private int _MapDownloadIndex = 0;
private bool _MapDownloadsInProgress = false; private bool _MapDownloadsInProgress = false;
@ -73,6 +76,39 @@ public class CaseVideoSyncPlayer : UdonSharpBehaviour
_MapDownloader.Dispose(); _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] [NetworkCallable]
public void QueueMapDownloads(int[] MapIndices) public void QueueMapDownloads(int[] MapIndices)
@ -110,6 +146,7 @@ public class CaseVideoSyncPlayer : UdonSharpBehaviour
_MapDownloadIndex = 0; _MapDownloadIndex = 0;
LoadMapFromIndex(_CachedMapIndices[_MapDownloadIndex]); LoadMapFromIndex(_CachedMapIndices[_MapDownloadIndex]);
} }
_LoadedMaps = _CachedMapIndices;
} }
private void LoadMapFromIndex(int MapIndex) private void LoadMapFromIndex(int MapIndex)
{ {
@ -325,7 +362,7 @@ public class CaseVideoSyncPlayer : UdonSharpBehaviour
{ {
if (Indicator.GetOwner() == Networking.LocalPlayer.displayName) 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; Indicator.IndicateStatus = Status;
} }
else else