adjust sync
This commit is contained in:
@@ -116,6 +116,7 @@
|
|||||||
<Compile Include="Networking\Messages\SceneChangeMessage.cs" />
|
<Compile Include="Networking\Messages\SceneChangeMessage.cs" />
|
||||||
<Compile Include="Patching\AIHealthPatches.cs" />
|
<Compile Include="Patching\AIHealthPatches.cs" />
|
||||||
<Compile Include="Patching\ButtonTogglePatches.cs" />
|
<Compile Include="Patching\ButtonTogglePatches.cs" />
|
||||||
|
<Compile Include="Patching\CartPatches.cs" />
|
||||||
<Compile Include="Patching\HolsterSlotPatches.cs" />
|
<Compile Include="Patching\HolsterSlotPatches.cs" />
|
||||||
<Compile Include="Networking\Messages\MagazineSyncMessage.cs" />
|
<Compile Include="Networking\Messages\MagazineSyncMessage.cs" />
|
||||||
<Compile Include="Networking\Messages\ObjectDamageMessage.cs" />
|
<Compile Include="Networking\Messages\ObjectDamageMessage.cs" />
|
||||||
@@ -134,6 +135,7 @@
|
|||||||
<Compile Include="Patching\PrefabSpawnerPatches.cs" />
|
<Compile Include="Patching\PrefabSpawnerPatches.cs" />
|
||||||
<Compile Include="Patching\SceneManagerPatches.cs" />
|
<Compile Include="Patching\SceneManagerPatches.cs" />
|
||||||
<Compile Include="Patching\SkeletonHandPatches.cs" />
|
<Compile Include="Patching\SkeletonHandPatches.cs" />
|
||||||
|
<Compile Include="Patching\UnityEventPatching.cs" />
|
||||||
<Compile Include="Patching\ZonePatches.cs" />
|
<Compile Include="Patching\ZonePatches.cs" />
|
||||||
<Compile Include="Sync\Components\SyncableAI.cs" />
|
<Compile Include="Sync\Components\SyncableAI.cs" />
|
||||||
<Compile Include="Sync\Components\SyncableBase.cs" />
|
<Compile Include="Sync\Components\SyncableBase.cs" />
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using StressLevelZero;
|
|||||||
using StressLevelZero.Combat;
|
using StressLevelZero.Combat;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -46,6 +47,8 @@ namespace BoneSync.Data
|
|||||||
}
|
}
|
||||||
internal class ByteEncoder
|
internal class ByteEncoder
|
||||||
{
|
{
|
||||||
|
//public BinaryWriter writer;
|
||||||
|
//public BinaryReader reader;
|
||||||
|
|
||||||
public List<byte> Data;
|
public List<byte> Data;
|
||||||
public ByteEncoder()
|
public ByteEncoder()
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ namespace BoneSync.Networking.Messages
|
|||||||
OnButtonPress = 3,
|
OnButtonPress = 3,
|
||||||
OnButtonRelease = 4,
|
OnButtonRelease = 4,
|
||||||
OnButtonOneShot = 5,
|
OnButtonOneShot = 5,
|
||||||
|
CartGo = 6,
|
||||||
|
CartGoBackwards = 7,
|
||||||
|
CartLaunch = 8,
|
||||||
|
CartGoForward = 9,
|
||||||
|
CartDrop = 10,
|
||||||
}
|
}
|
||||||
public struct SimpleSyncableEvent
|
public struct SimpleSyncableEvent
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,71 +7,13 @@ using BoneSync.Sync;
|
|||||||
using BoneSync.Sync.Components;
|
using BoneSync.Sync.Components;
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
using MelonLoader;
|
using MelonLoader;
|
||||||
|
using StressLevelZero.Environment;
|
||||||
using StressLevelZero.Interaction;
|
using StressLevelZero.Interaction;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Events;
|
using UnityEngine.Events;
|
||||||
|
|
||||||
namespace BoneSync.Patching
|
namespace BoneSync.Patching
|
||||||
{
|
{
|
||||||
public class UnityEventPatch<T>
|
|
||||||
{
|
|
||||||
private static Dictionary<int, UnityEventPatch<T>> patches = new Dictionary<int, UnityEventPatch<T>>();
|
|
||||||
|
|
||||||
private T arg;
|
|
||||||
private UnityEvent unityEvent;
|
|
||||||
private Func<T, bool> handler;
|
|
||||||
//private UnityAction listener;
|
|
||||||
//private float lastInvokeTime = 0f;
|
|
||||||
//private float invokeCooldown = 0.05f;
|
|
||||||
private UnityEventPatch(T arg, UnityEvent unityEvent, Func<T, bool> handler)
|
|
||||||
{
|
|
||||||
this.arg = arg;
|
|
||||||
this.unityEvent = unityEvent;
|
|
||||||
this.handler = handler;
|
|
||||||
|
|
||||||
//listener = (UnityAction)Listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TryInvoke()
|
|
||||||
{
|
|
||||||
bool allowInvokeResult = handler(arg);
|
|
||||||
Debug.Log("TryInvoke " + allowInvokeResult);
|
|
||||||
return allowInvokeResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PatchUnityEvent()
|
|
||||||
{
|
|
||||||
if (unityEvent == null) return;
|
|
||||||
patches[unityEvent.GetHashCode()] = this;
|
|
||||||
//unityEvent.AddListener(listener);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UnpatchUnityEvent()
|
|
||||||
{
|
|
||||||
if (unityEvent == null) return;
|
|
||||||
patches.Remove(unityEvent.GetHashCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UnityEventPatch<T> Patch(T arg, UnityEvent unityEvent, Func<T, bool> handler)
|
|
||||||
{
|
|
||||||
if (patches.TryGetValue(unityEvent.GetHashCode(), out UnityEventPatch<T> oldPatch))
|
|
||||||
{
|
|
||||||
oldPatch.UnpatchUnityEvent();
|
|
||||||
}
|
|
||||||
UnityEventPatch<T> patch = new UnityEventPatch<T>(arg, unityEvent, handler);
|
|
||||||
patch.PatchUnityEvent();
|
|
||||||
|
|
||||||
return patch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UnityEventPatch<T> TryGetPatch(UnityEvent unityEvent)
|
|
||||||
{
|
|
||||||
if (!patches.ContainsKey(unityEvent.GetHashCode())) return null;
|
|
||||||
return patches[unityEvent.GetHashCode()];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[HarmonyPatch(typeof(ButtonToggle))]
|
[HarmonyPatch(typeof(ButtonToggle))]
|
||||||
internal class ButtonTogglePatches
|
internal class ButtonTogglePatches
|
||||||
{
|
{
|
||||||
@@ -81,20 +23,4 @@ namespace BoneSync.Patching
|
|||||||
Syncable syncable = ObjectSync.MakeOrGetSyncable(__instance);
|
Syncable syncable = ObjectSync.MakeOrGetSyncable(__instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*[HarmonyPatch(typeof(UnityEvent))]
|
|
||||||
internal class UnityEventPatches
|
|
||||||
{
|
|
||||||
[HarmonyPatch(nameof(UnityEvent.Invoke)), HarmonyPrefix]
|
|
||||||
private static bool InvokePrefix(UnityEvent __instance)
|
|
||||||
{
|
|
||||||
if (CallPatchedMethods.allowPatchedMethodCall) return true;
|
|
||||||
UnityEventPatch<ButtonToggle> patch = UnityEventPatch<ButtonToggle>.TryGetPatch(__instance);
|
|
||||||
if (patch != null)
|
|
||||||
{
|
|
||||||
return patch.TryInvoke();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using StressLevelZero.Combat;
|
using BoneSync.Data;
|
||||||
|
using StressLevelZero.Combat;
|
||||||
|
using StressLevelZero.Environment;
|
||||||
using StressLevelZero.Pool;
|
using StressLevelZero.Pool;
|
||||||
using StressLevelZero.Props;
|
using StressLevelZero.Props;
|
||||||
using StressLevelZero.Props.Weapons;
|
using StressLevelZero.Props.Weapons;
|
||||||
@@ -9,6 +11,7 @@ using System.Text;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Events;
|
using UnityEngine.Events;
|
||||||
|
using Cart = StressLevelZero.Environment.Cart;
|
||||||
|
|
||||||
namespace BoneSync.Patching
|
namespace BoneSync.Patching
|
||||||
{
|
{
|
||||||
@@ -40,8 +43,41 @@ namespace BoneSync.Patching
|
|||||||
allowPatchedMethodCall = false;
|
allowPatchedMethodCall = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void CartGo(Cart __instance)
|
||||||
|
{
|
||||||
|
if (__instance == null) return;
|
||||||
|
allowPatchedMethodCall = true;
|
||||||
|
__instance.Go();
|
||||||
|
allowPatchedMethodCall = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CartLaunch(Cart __instance)
|
||||||
|
{
|
||||||
|
if (__instance == null) return;
|
||||||
|
allowPatchedMethodCall = true;
|
||||||
|
__instance.Launch();
|
||||||
|
allowPatchedMethodCall = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CartGoBackward(Cart __instance)
|
||||||
|
{
|
||||||
|
if (__instance == null) return;
|
||||||
|
allowPatchedMethodCall = true;
|
||||||
|
__instance.GoBackward();
|
||||||
|
allowPatchedMethodCall = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CartGoForward(Cart __instance)
|
||||||
|
{
|
||||||
|
if (__instance == null) return;
|
||||||
|
allowPatchedMethodCall = true;
|
||||||
|
__instance.GoForward();
|
||||||
|
allowPatchedMethodCall = false;
|
||||||
|
}
|
||||||
|
|
||||||
public static void BypassPatchInvoke(this UnityEvent e)
|
public static void BypassPatchInvoke(this UnityEvent e)
|
||||||
{
|
{
|
||||||
|
SyncLogger.Msg("BypassPatchInvoke "+ e.GetHashCode());
|
||||||
allowPatchedMethodCall = true;
|
allowPatchedMethodCall = true;
|
||||||
e.Invoke();
|
e.Invoke();
|
||||||
allowPatchedMethodCall = false;
|
allowPatchedMethodCall = false;
|
||||||
|
|||||||
55
BoneSync/Patching/CartPatches.cs
Normal file
55
BoneSync/Patching/CartPatches.cs
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using BoneSync.Data;
|
||||||
|
using BoneSync.Networking.Messages;
|
||||||
|
using BoneSync.Sync;
|
||||||
|
using BoneSync.Sync.Components;
|
||||||
|
using HarmonyLib;
|
||||||
|
using StressLevelZero.Environment;
|
||||||
|
|
||||||
|
namespace BoneSync.Patching
|
||||||
|
{
|
||||||
|
[HarmonyPatch(typeof(Cart))]
|
||||||
|
public class CartPatches
|
||||||
|
{
|
||||||
|
public static bool CartEvent(Cart cart, SimpleEventType eventType)
|
||||||
|
{
|
||||||
|
if (CallPatchedMethods.allowPatchedMethodCall) return true;
|
||||||
|
SyncLogger.Msg("CartEvent: " + cart.transform.GetPath() + " " + eventType);
|
||||||
|
Syncable syncable = ObjectSync.MakeOrGetSyncable(cart);
|
||||||
|
if (syncable == null)
|
||||||
|
{
|
||||||
|
SyncLogger.Error("CartEvent: syncable is null");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return syncable.AddSimpleEventToQueue(eventType);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(nameof(Cart.Go)), HarmonyPrefix]
|
||||||
|
public static bool CartStartPostfix(Cart __instance)
|
||||||
|
{
|
||||||
|
return CartEvent(__instance, SimpleEventType.CartGo);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(nameof(Cart.Launch)), HarmonyPrefix]
|
||||||
|
public static bool CartStopPostfix(Cart __instance)
|
||||||
|
{
|
||||||
|
return CartEvent(__instance, SimpleEventType.CartLaunch);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(nameof(Cart.GoBackward)), HarmonyPrefix]
|
||||||
|
public static bool CartGoBackwardPostfix(Cart __instance)
|
||||||
|
{
|
||||||
|
return CartEvent(__instance, SimpleEventType.CartGoBackwards);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(nameof(Cart.GoForward)), HarmonyPrefix]
|
||||||
|
public static bool CartGoForwardPostfix(Cart __instance)
|
||||||
|
{
|
||||||
|
return CartEvent(__instance, SimpleEventType.CartGoForward);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
88
BoneSync/Patching/UnityEventPatching.cs
Normal file
88
BoneSync/Patching/UnityEventPatching.cs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using BoneSync.Data;
|
||||||
|
using HarmonyLib;
|
||||||
|
using StressLevelZero.Interaction;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Events;
|
||||||
|
|
||||||
|
namespace BoneSync.Patching
|
||||||
|
{
|
||||||
|
public class UnityEventPatch<T>
|
||||||
|
{
|
||||||
|
private static Dictionary<int, UnityEventPatch<T>> patches = new Dictionary<int, UnityEventPatch<T>>();
|
||||||
|
|
||||||
|
private T arg;
|
||||||
|
private UnityEvent unityEvent;
|
||||||
|
private Func<T, bool> handler;
|
||||||
|
//private UnityAction listener;
|
||||||
|
//private float lastInvokeTime = 0f;
|
||||||
|
//private float invokeCooldown = 0.05f;
|
||||||
|
private UnityEventPatch(T arg, UnityEvent unityEvent, Func<T, bool> handler)
|
||||||
|
{
|
||||||
|
this.arg = arg;
|
||||||
|
this.unityEvent = unityEvent;
|
||||||
|
this.handler = handler;
|
||||||
|
|
||||||
|
//listener = (UnityAction)Listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryInvoke()
|
||||||
|
{
|
||||||
|
bool allowInvokeResult = handler(arg);
|
||||||
|
SyncLogger.Debug("TryInvoke " + allowInvokeResult);
|
||||||
|
return allowInvokeResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PatchUnityEvent()
|
||||||
|
{
|
||||||
|
if (unityEvent == null) return;
|
||||||
|
patches[unityEvent.GetHashCode()] = this;
|
||||||
|
//unityEvent.AddListener(listener);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UnpatchUnityEvent()
|
||||||
|
{
|
||||||
|
if (unityEvent == null) return;
|
||||||
|
patches.Remove(unityEvent.GetHashCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UnityEventPatch<T> Patch(T arg, UnityEvent unityEvent, Func<T, bool> handler)
|
||||||
|
{
|
||||||
|
if (patches.TryGetValue(unityEvent.GetHashCode(), out UnityEventPatch<T> oldPatch))
|
||||||
|
{
|
||||||
|
oldPatch.UnpatchUnityEvent();
|
||||||
|
}
|
||||||
|
UnityEventPatch<T> patch = new UnityEventPatch<T>(arg, unityEvent, handler);
|
||||||
|
patch.PatchUnityEvent();
|
||||||
|
|
||||||
|
return patch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UnityEventPatch<T> TryGetPatch(UnityEvent unityEvent)
|
||||||
|
{
|
||||||
|
if (!patches.ContainsKey(unityEvent.GetHashCode())) return null;
|
||||||
|
return patches[unityEvent.GetHashCode()];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(UnityEvent))]
|
||||||
|
internal class UnityEventPatches
|
||||||
|
{
|
||||||
|
[HarmonyPatch(nameof(UnityEvent.Invoke)), HarmonyPrefix]
|
||||||
|
private static bool InvokePrefix(UnityEvent __instance)
|
||||||
|
{
|
||||||
|
if (CallPatchedMethods.allowPatchedMethodCall) return true;
|
||||||
|
UnityEventPatch<ButtonToggle> patch = UnityEventPatch<ButtonToggle>.TryGetPatch(__instance);
|
||||||
|
if (patch != null)
|
||||||
|
{
|
||||||
|
return patch.TryInvoke();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -59,17 +59,32 @@ namespace BoneSync.Patching
|
|||||||
[HarmonyPatch(typeof(SceneZone))]
|
[HarmonyPatch(typeof(SceneZone))]
|
||||||
public static class SceneZonePatch
|
public static class SceneZonePatch
|
||||||
{
|
{
|
||||||
public static bool IsChildOfLocalRigRoot(Transform transform)
|
public static bool IsChildOfLocalRig(Transform transform)
|
||||||
{
|
{
|
||||||
if (PlayerRig.localRigWorldRoot == null) return false;
|
if (PlayerRig.localRigWorldRoot == null) return false;
|
||||||
return transform.root == PlayerRig.localRigWorldRoot;
|
return transform.root == PlayerRig.localRigWorldRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsChildOfHostRig(Transform transform)
|
||||||
|
{
|
||||||
|
if (!BoneSync.IsConnected|| BoneSync.lobby.IsHost)
|
||||||
|
{
|
||||||
|
return IsChildOfLocalRig(transform);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PlayerRig hostRig = PlayerRig.GetPlayerRig(BoneSync.lobby.GetHostId());
|
||||||
|
Transform hostRoot = hostRig?.transform.root;
|
||||||
|
return hostRoot != null && transform.root == hostRoot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[HarmonyPatch(nameof(SceneZone.OnTriggerEnter)), HarmonyPrefix]
|
[HarmonyPatch(nameof(SceneZone.OnTriggerEnter)), HarmonyPrefix]
|
||||||
public static bool EnterPrefix(SceneZone __instance, Collider other)
|
public static bool EnterPrefix(SceneZone __instance, Collider other)
|
||||||
{
|
{
|
||||||
if (other.CompareTag("Player"))
|
if (other.CompareTag("Player"))
|
||||||
{
|
{
|
||||||
return IsChildOfLocalRigRoot(other.transform);
|
return IsChildOfLocalRig(other.transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -80,7 +95,7 @@ namespace BoneSync.Patching
|
|||||||
{
|
{
|
||||||
if (other.CompareTag("Player"))
|
if (other.CompareTag("Player"))
|
||||||
{
|
{
|
||||||
return IsChildOfLocalRigRoot(other.transform);
|
return IsChildOfLocalRig(other.transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -97,7 +112,7 @@ namespace BoneSync.Patching
|
|||||||
if (other.CompareTag("Player"))
|
if (other.CompareTag("Player"))
|
||||||
{
|
{
|
||||||
|
|
||||||
return SceneZonePatch.IsChildOfLocalRigRoot(other.transform);
|
return SceneZonePatch.IsChildOfLocalRig(other.transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -110,7 +125,7 @@ namespace BoneSync.Patching
|
|||||||
{
|
{
|
||||||
if (other.CompareTag("Player"))
|
if (other.CompareTag("Player"))
|
||||||
{
|
{
|
||||||
return SceneZonePatch.IsChildOfLocalRigRoot(other.transform);
|
return SceneZonePatch.IsChildOfLocalRig(other.transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ namespace BoneSync.Player
|
|||||||
private Transform leftHandTransform;
|
private Transform leftHandTransform;
|
||||||
private Transform rightHandTransform;
|
private Transform rightHandTransform;
|
||||||
|
|
||||||
|
public Transform transform => playerRig.transform;
|
||||||
|
|
||||||
public static void LoadBundle()
|
public static void LoadBundle()
|
||||||
{
|
{
|
||||||
rigBundle = EmebeddedAssetBundle.LoadFromAssembly("BoneSync.playerrep.eres");
|
rigBundle = EmebeddedAssetBundle.LoadFromAssembly("BoneSync.playerrep.eres");
|
||||||
|
|||||||
@@ -16,8 +16,6 @@ namespace BoneSync.Sync.Components
|
|||||||
|
|
||||||
private void TrySendAISync()
|
private void TrySendAISync()
|
||||||
{
|
{
|
||||||
if (!Registered) return;
|
|
||||||
if (!isOwner) return;
|
|
||||||
if (!aiBrain) return;
|
if (!aiBrain) return;
|
||||||
if (Time.realtimeSinceStartup - _lastAISyncTime > 1 / AI_SYNC_FPS)
|
if (Time.realtimeSinceStartup - _lastAISyncTime > 1 / AI_SYNC_FPS)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ using StressLevelZero.AI;
|
|||||||
using PuppetMasta;
|
using PuppetMasta;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
using BoneSync.Data;
|
using BoneSync.Data;
|
||||||
|
using StressLevelZero.Environment;
|
||||||
|
|
||||||
|
|
||||||
namespace BoneSync.Sync.Components
|
namespace BoneSync.Sync.Components
|
||||||
@@ -142,6 +143,9 @@ namespace BoneSync.Sync.Components
|
|||||||
|
|
||||||
private SpawnFragment spawnFragment;
|
private SpawnFragment spawnFragment;
|
||||||
|
|
||||||
|
private Powerable powerable;
|
||||||
|
private Cart physicsCart;
|
||||||
|
|
||||||
private void CheckAutoSync()
|
private void CheckAutoSync()
|
||||||
{
|
{
|
||||||
if (!isValid) return;
|
if (!isValid) return;
|
||||||
@@ -182,6 +186,7 @@ namespace BoneSync.Sync.Components
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (buttonToggles.Length > 0) return true;
|
if (buttonToggles.Length > 0) return true;
|
||||||
|
if (physicsCart != null) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,6 +227,7 @@ namespace BoneSync.Sync.Components
|
|||||||
sockets = GetComponentsInChildren<Socket>();
|
sockets = GetComponentsInChildren<Socket>();
|
||||||
aiBrain = GetComponent<AIBrain>();
|
aiBrain = GetComponent<AIBrain>();
|
||||||
buttonToggles = GetComponentsInChildren<ButtonToggle>();
|
buttonToggles = GetComponentsInChildren<ButtonToggle>();
|
||||||
|
physicsCart = GetComponent<Cart>();
|
||||||
if (sockets.Length == 0)
|
if (sockets.Length == 0)
|
||||||
{
|
{
|
||||||
plugs = GetComponentsInChildren<AlignPlug>();
|
plugs = GetComponentsInChildren<AlignPlug>();
|
||||||
@@ -259,8 +265,8 @@ namespace BoneSync.Sync.Components
|
|||||||
|
|
||||||
if (spawnFragment) return false; // if has spawn fragment, don't sync
|
if (spawnFragment) return false; // if has spawn fragment, don't sync
|
||||||
FindAndUpdateComponents();
|
FindAndUpdateComponents();
|
||||||
if (buttonToggles?.Length > 0) return true;
|
|
||||||
if (rigidbodies?.Length > 0) return true;
|
if (rigidbodies?.Length > 0) return true;
|
||||||
|
if (ShouldAutoSync()) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,31 +23,31 @@ namespace BoneSync.Sync.Components
|
|||||||
ObjectSync.SendObjectSyncMessage(this);
|
ObjectSync.SendObjectSyncMessage(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TrySendObjectSync()
|
|
||||||
{
|
|
||||||
if (ShouldSendSync()) SendObjectSync();
|
|
||||||
}
|
|
||||||
public IEnumerator SyncCoroutineAsync()
|
public IEnumerator SyncCoroutineAsync()
|
||||||
{
|
{
|
||||||
SyncLogger.Msg("Running sync coroutine for: " + transform.GetPath());
|
SyncLogger.Msg("Running sync coroutine for: " + transform.GetPath());
|
||||||
if (_syncCoroutineRunning) yield break;
|
if (_syncCoroutineRunning) yield break;
|
||||||
_syncCoroutineRunning = true;
|
_syncCoroutineRunning = true;
|
||||||
while (isOwner)
|
while (ShouldSendSync())
|
||||||
{
|
{
|
||||||
TrySendAISync();
|
TrySendAISync();
|
||||||
TrySendObjectSync();
|
SendObjectSync();
|
||||||
TrySendPlugSync();
|
TrySendPlugSync();
|
||||||
yield return new WaitForSeconds(!Registered ? 1 : 1 / OBJECT_SYNC_FPS);
|
yield return new WaitForSeconds( 1 / OBJECT_SYNC_FPS );
|
||||||
}
|
}
|
||||||
_syncCoroutineRunning = false;
|
_syncCoroutineRunning = false;
|
||||||
yield break;
|
yield break;
|
||||||
}
|
}
|
||||||
|
private void RunSyncLoop()
|
||||||
|
{
|
||||||
|
MelonCoroutines.Start(SyncCoroutineAsync());
|
||||||
|
}
|
||||||
public void SetOwner(ulong ownerId)
|
public void SetOwner(ulong ownerId)
|
||||||
{
|
{
|
||||||
SyncLogger.Msg("Setting owner for " + _syncId + " to " + ownerId);
|
SyncLogger.Msg("Setting owner for " + _syncId + " to " + ownerId);
|
||||||
_ownerId = ownerId;
|
_ownerId = ownerId;
|
||||||
FindAndUpdateComponents();
|
FindAndUpdateComponents();
|
||||||
MelonCoroutines.Start(SyncCoroutineAsync());
|
RunSyncLoop();
|
||||||
UpdateKinematic();
|
UpdateKinematic();
|
||||||
TryCatchUpSimpleEvents();
|
TryCatchUpSimpleEvents();
|
||||||
}
|
}
|
||||||
@@ -123,6 +123,7 @@ namespace BoneSync.Sync.Components
|
|||||||
SetOwner(localId);
|
SetOwner(localId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
RunSyncLoop();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ShouldSendSync()
|
public bool ShouldSendSync()
|
||||||
@@ -135,10 +136,13 @@ namespace BoneSync.Sync.Components
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddSimpleEventToQueue(SimpleEventType eType, byte index = 0, byte len = 0)
|
public bool AddSimpleEventToQueue(SimpleEventType eType, byte index = 0, byte len = 0)
|
||||||
{
|
{
|
||||||
|
RegisterSyncable();
|
||||||
|
if (!isOwner && Registered) { return false; }
|
||||||
_simpleEventQueue.Enqueue(new byte[] { (byte)eType, index, len });
|
_simpleEventQueue.Enqueue(new byte[] { (byte)eType, index, len });
|
||||||
TryCatchUpSimpleEvents();
|
TryCatchUpSimpleEvents();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TryCatchUpSimpleEvents()
|
private void TryCatchUpSimpleEvents()
|
||||||
|
|||||||
@@ -23,10 +23,7 @@ namespace BoneSync.Sync.Components
|
|||||||
{
|
{
|
||||||
SyncLogger.Msg("ButtonToggle:" + eventType + " " + toggle.transform.GetPath());
|
SyncLogger.Msg("ButtonToggle:" + eventType + " " + toggle.transform.GetPath());
|
||||||
byte index = (byte)Array.IndexOf(buttonToggles, toggle);
|
byte index = (byte)Array.IndexOf(buttonToggles, toggle);
|
||||||
RegisterSyncable();
|
return AddSimpleEventToQueue(eventType, index, (byte)buttonToggles.Length);
|
||||||
if (!isOwner && Registered) return false;
|
|
||||||
AddSimpleEventToQueue(eventType, index, (byte)buttonToggles.Length);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
bool ButtonOnPress(ButtonToggle toggle)
|
bool ButtonOnPress(ButtonToggle toggle)
|
||||||
{
|
{
|
||||||
@@ -44,15 +41,11 @@ namespace BoneSync.Sync.Components
|
|||||||
|
|
||||||
bool DeviceOnPull(PullDevice device)
|
bool DeviceOnPull(PullDevice device)
|
||||||
{
|
{
|
||||||
if (!isOwner && Registered) { return false; }
|
return AddSimpleEventToQueue(SimpleEventType.OnDevicePull);
|
||||||
AddSimpleEventToQueue(SimpleEventType.OnDevicePull);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
bool DeviceOnRelease(PullDevice device)
|
bool DeviceOnRelease(PullDevice device)
|
||||||
{
|
{
|
||||||
if (!isOwner && Registered) { return false; }
|
return AddSimpleEventToQueue(SimpleEventType.OnDeviceRelease);
|
||||||
AddSimpleEventToQueue(SimpleEventType.OnDeviceRelease);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TryPatchUnityEvents()
|
private void TryPatchUnityEvents()
|
||||||
@@ -160,10 +153,11 @@ namespace BoneSync.Sync.Components
|
|||||||
for (int i = 0; i < objectSyncTransforms.Length; i++)
|
for (int i = 0; i < objectSyncTransforms.Length; i++)
|
||||||
{
|
{
|
||||||
ObjectSyncTransform objectSyncTransform = objectSyncTransforms[i];
|
ObjectSyncTransform objectSyncTransform = objectSyncTransforms[i];
|
||||||
rigidbodies[i].angularVelocity = objectSyncTransform.angularVelocity;
|
Rigidbody rb = rigidbodies[i];
|
||||||
rigidbodies[i].velocity = objectSyncTransform.velocity;
|
rb.angularVelocity = objectSyncTransform.angularVelocity;
|
||||||
rigidbodies[i].position = objectSyncTransform.transform.position;
|
rb.velocity = objectSyncTransform.velocity;
|
||||||
rigidbodies[i].rotation = objectSyncTransform.transform.rotation;
|
rb.MovePosition(objectSyncTransform.transform.position);
|
||||||
|
rb.MoveRotation(objectSyncTransform.transform.rotation);
|
||||||
_transforms[i].localScale = objectSyncTransform.transform.scale;
|
_transforms[i].localScale = objectSyncTransform.transform.scale;
|
||||||
//_transforms[i].ApplySimpleTransform(objectSyncTransform.transform);
|
//_transforms[i].ApplySimpleTransform(objectSyncTransform.transform);
|
||||||
}
|
}
|
||||||
@@ -248,6 +242,24 @@ namespace BoneSync.Sync.Components
|
|||||||
buttonToggles[index]?.onPressOneShot.BypassPatchInvoke();
|
buttonToggles[index]?.onPressOneShot.BypassPatchInvoke();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SimpleEventType.CartGo:
|
||||||
|
CallPatchedMethods.CartGo(physicsCart);
|
||||||
|
break;
|
||||||
|
case SimpleEventType.CartGoBackwards:
|
||||||
|
CallPatchedMethods.CartGoBackward(physicsCart);
|
||||||
|
break;
|
||||||
|
case SimpleEventType.CartLaunch:
|
||||||
|
CallPatchedMethods.CartLaunch(physicsCart);
|
||||||
|
break;
|
||||||
|
case SimpleEventType.CartGoForward:
|
||||||
|
CallPatchedMethods.CartGoForward(physicsCart);
|
||||||
|
break;
|
||||||
|
case SimpleEventType.CartDrop:
|
||||||
|
//CallPatchedMethods.Drop();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SyncLogger.Warning("Unknown SimpleEventType: " + eType);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// on collision
|
// on collision
|
||||||
|
|||||||
@@ -71,8 +71,6 @@ namespace BoneSync.Sync.Components
|
|||||||
private const float PLUG_SYNC_FPS = 1f;
|
private const float PLUG_SYNC_FPS = 1f;
|
||||||
private void TrySendPlugSync()
|
private void TrySendPlugSync()
|
||||||
{
|
{
|
||||||
if (!Registered) return;
|
|
||||||
if (!isOwner) return;
|
|
||||||
if (Time.realtimeSinceStartup - _lastPlugSyncTime > 1 / PLUG_SYNC_FPS)
|
if (Time.realtimeSinceStartup - _lastPlugSyncTime > 1 / PLUG_SYNC_FPS)
|
||||||
{
|
{
|
||||||
_SendPlugSync();
|
_SendPlugSync();
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using BoneSync.Patching;
|
|||||||
using BoneSync.Sync.Components;
|
using BoneSync.Sync.Components;
|
||||||
using MelonLoader;
|
using MelonLoader;
|
||||||
using StressLevelZero.Data;
|
using StressLevelZero.Data;
|
||||||
|
using StressLevelZero.Environment;
|
||||||
using StressLevelZero.Interaction;
|
using StressLevelZero.Interaction;
|
||||||
using StressLevelZero.Pool;
|
using StressLevelZero.Pool;
|
||||||
using System;
|
using System;
|
||||||
@@ -109,7 +110,22 @@ namespace BoneSync.Sync
|
|||||||
ObjectSyncMessage message = new ObjectSyncMessage(data);
|
ObjectSyncMessage message = new ObjectSyncMessage(data);
|
||||||
message.Broadcast();
|
message.Broadcast();
|
||||||
}
|
}
|
||||||
private static Syncable _MakeOrGetSyncable(GameObject gameObject, bool deleteSubSyncabled = true)
|
private static Transform _GetPerferredParentTransform(Transform t)
|
||||||
|
{
|
||||||
|
if (t == null) return null;
|
||||||
|
Transform parent = t.parent;
|
||||||
|
if (parent == null) return t;
|
||||||
|
|
||||||
|
Cart cart = parent.GetComponentInParent<Cart>();
|
||||||
|
if (cart) return cart.transform;
|
||||||
|
|
||||||
|
InteractableHostManager manager = parent.GetComponentInParent<InteractableHostManager>();
|
||||||
|
if (manager) return manager.transform;
|
||||||
|
|
||||||
|
return parent;
|
||||||
|
|
||||||
|
}
|
||||||
|
private static Syncable _MakeOrGetSyncable(GameObject gameObject, bool deleteSubSyncables = true)
|
||||||
{
|
{
|
||||||
//Scene scene = gameObject.scene;
|
//Scene scene = gameObject.scene;
|
||||||
//SyncLogger.Msg("Making or getting syncable for: " + gameObject.name);
|
//SyncLogger.Msg("Making or getting syncable for: " + gameObject.name);
|
||||||
@@ -120,7 +136,7 @@ namespace BoneSync.Sync
|
|||||||
Syncable syncable = gameObject.GetComponent<Syncable>();
|
Syncable syncable = gameObject.GetComponent<Syncable>();
|
||||||
|
|
||||||
// delete all sub syncables
|
// delete all sub syncables
|
||||||
if (deleteSubSyncabled)
|
if (deleteSubSyncables)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -146,8 +162,9 @@ namespace BoneSync.Sync
|
|||||||
|
|
||||||
if (syncable == null)
|
if (syncable == null)
|
||||||
{
|
{
|
||||||
syncable = gameObject.AddComponent<Syncable>();
|
Transform perferredObjectParent = _GetPerferredParentTransform(gameObject.transform);
|
||||||
// SyncLogger.Msg("Created syncable for: " + gameObject.name);
|
syncable = _MakeOrGetSyncable(perferredObjectParent.gameObject, deleteSubSyncables);
|
||||||
|
|
||||||
}
|
}
|
||||||
return syncable;
|
return syncable;
|
||||||
}
|
}
|
||||||
@@ -169,31 +186,31 @@ namespace BoneSync.Sync
|
|||||||
{
|
{
|
||||||
return parentSyncable;
|
return parentSyncable;
|
||||||
}
|
}
|
||||||
return _MakeOrGetSyncable(buttonToggle.gameObject);
|
return MakeOrGetSyncable(buttonToggle.gameObject);
|
||||||
}
|
}
|
||||||
public static Syncable MakeOrGetSyncable(GameObject gameObject)
|
public static Syncable MakeOrGetSyncable(GameObject gameObject, bool deleteSubSyncables = true)
|
||||||
{
|
{
|
||||||
Syncable syncable = _GetSyncableFromCache(gameObject);
|
Syncable syncable = _GetSyncableFromCache(gameObject);
|
||||||
if (syncable == null)
|
if (syncable == null)
|
||||||
{
|
{
|
||||||
syncable = _MakeOrGetSyncable(gameObject);
|
syncable = _MakeOrGetSyncable(gameObject, deleteSubSyncables);
|
||||||
}
|
}
|
||||||
return syncable;
|
return syncable;
|
||||||
}
|
}
|
||||||
public static Syncable MakeOrGetSyncable(Poolee poolee)
|
public static Syncable MakeOrGetSyncable(Poolee poolee)
|
||||||
{
|
{
|
||||||
return _MakeOrGetSyncable(poolee.gameObject);
|
return MakeOrGetSyncable(poolee.gameObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Syncable MakeOrGetSyncable(InteractableHost interactableHost)
|
public static Syncable MakeOrGetSyncable(InteractableHost interactableHost)
|
||||||
{
|
{
|
||||||
if (interactableHost.manager) return MakeOrGetSyncable(interactableHost.manager);
|
if (interactableHost.manager) return MakeOrGetSyncable(interactableHost.manager);
|
||||||
return _MakeOrGetSyncable(interactableHost.gameObject);
|
return MakeOrGetSyncable(interactableHost.gameObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Syncable MakeOrGetSyncable(InteractableHostManager interactableHostManager)
|
public static Syncable MakeOrGetSyncable(InteractableHostManager interactableHostManager)
|
||||||
{
|
{
|
||||||
return _MakeOrGetSyncable(interactableHostManager.gameObject, true);
|
return MakeOrGetSyncable(interactableHostManager.gameObject, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Syncable SpawnPooleeAndMakeSyncable(SpawnPoolableInfo spawnInfo)
|
public static Syncable SpawnPooleeAndMakeSyncable(SpawnPoolableInfo spawnInfo)
|
||||||
@@ -350,5 +367,11 @@ namespace BoneSync.Sync
|
|||||||
syncable.OnOwnershipTransferRequest(newOwnerId);
|
syncable.OnOwnershipTransferRequest(newOwnerId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static Syncable MakeOrGetSyncable(Cart instance)
|
||||||
|
{
|
||||||
|
Syncable syncable = MakeOrGetSyncable(instance.gameObject);
|
||||||
|
return syncable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user