diff --git a/BoneSync/Sync/Components/SyncableNetworking.cs b/BoneSync/Sync/Components/SyncableNetworking.cs index c6a7fda..7ce9b6c 100644 --- a/BoneSync/Sync/Components/SyncableNetworking.cs +++ b/BoneSync/Sync/Components/SyncableNetworking.cs @@ -16,6 +16,7 @@ namespace BoneSync.Sync.Components // SyncableNetworking.cs public partial class Syncable : MonoBehaviour { + private Queue _simpleEventQueue = new Queue(); private void SendObjectSync() { _lastSyncTime = Time.realtimeSinceStartup; @@ -45,6 +46,13 @@ namespace BoneSync.Sync.Components { SyncLogger.Msg("Setting owner for " + _syncId + " to " + ownerId); _ownerId = ownerId; + if (!isOwner) + { + _simpleEventQueue.Clear(); + } else + { + TryCatchUpSimpleEvents(); + } FindAndUpdateComponents(); MelonCoroutines.Start(SyncCoroutineAsync()); UpdateKinematic(); @@ -62,8 +70,8 @@ namespace BoneSync.Sync.Components private IEnumerator __SendRegisterSyncCo() { yield return null; // wait a frame - SetOwner(BoneSync.lobby.GetLocalId()); SetSyncId(ObjectSync.SendRegisterSyncableMessage(this)); + SetOwner(BoneSync.lobby.GetLocalId()); yield break; } @@ -133,6 +141,21 @@ namespace BoneSync.Sync.Components return true; } + private void AddSimpleEventToQueue(SimpleEventType eType, byte index = 0, byte len = 0) + { + _simpleEventQueue.Enqueue(new byte[] { (byte)eType, index, len }); + TryCatchUpSimpleEvents(); + } + + private void TryCatchUpSimpleEvents() + { + if (_simpleEventQueue.Count > 0 && Registered && isOwner) + { + byte[] eventData = _simpleEventQueue.Dequeue(); + _SendSimpleEvent((SimpleEventType)eventData[0], eventData[1], eventData[2]); + TryCatchUpSimpleEvents(); + } + } private void _SendSimpleEvent(SimpleEventType eType, byte index = 0, byte len = 0) { SyncLogger.Msg("Sending simple event: " + eType); diff --git a/BoneSync/Sync/Components/SyncablePhysics.cs b/BoneSync/Sync/Components/SyncablePhysics.cs index e7e6ade..839be59 100644 --- a/BoneSync/Sync/Components/SyncablePhysics.cs +++ b/BoneSync/Sync/Components/SyncablePhysics.cs @@ -24,9 +24,8 @@ namespace BoneSync.Sync.Components SyncLogger.Msg("ButtonToggle:" + eventType + " " + toggle.transform.GetPath()); byte index = (byte)Array.IndexOf(buttonToggles, toggle); RegisterSyncable(); - if (!Registered) return false; - if (!isOwner) return false; - _SendSimpleEvent(eventType, index); + if (!isOwner && Registered) return false; + AddSimpleEventToQueue(eventType, index); return true; } bool ButtonOnPress(ButtonToggle toggle) @@ -43,15 +42,17 @@ namespace BoneSync.Sync.Components return OnButtonEvent(toggle, SimpleEventType.OnButtonOneShot); } - void DeviceOnPull() + bool DeviceOnPull(PullDevice device) { - if (!isOwner) { return; } - _SendSimpleEvent(SimpleEventType.OnDevicePull); + if (!isOwner && Registered) { return false; } + AddSimpleEventToQueue(SimpleEventType.OnDevicePull); + return true; } - void DeviceOnRelease() + bool DeviceOnRelease(PullDevice device) { - if (!isOwner) { return; } - _SendSimpleEvent(SimpleEventType.OnDeviceRelease); + if (!isOwner && Registered) { return false; } + AddSimpleEventToQueue(SimpleEventType.OnDeviceRelease); + return true; } private void TryPatchUnityEvents() @@ -76,6 +77,9 @@ namespace BoneSync.Sync.Components //pullDevice.OnHandlePull.AddListener((UnityAction)DeviceOnPull); //pullDevice.OnHandleReturn.AddListener((UnityAction)DeviceOnRelease); + UnityEventPatch.Patch(pullDevice, pullDevice.OnHandlePull, DeviceOnPull); + UnityEventPatch.Patch(pullDevice, pullDevice.OnHandleReturn, DeviceOnRelease); + pullDevicePatched = true; }