tried to create a universal unity event hook
This commit is contained in:
@@ -98,6 +98,7 @@
|
|||||||
<Compile Include="Networking\Messages\GunSyncMessage.cs" />
|
<Compile Include="Networking\Messages\GunSyncMessage.cs" />
|
||||||
<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\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" />
|
||||||
|
|||||||
54
BoneSync/Patching/ButtonTogglePatches.cs
Normal file
54
BoneSync/Patching/ButtonTogglePatches.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using BoneSync.Sync;
|
||||||
|
using BoneSync.Sync.Components;
|
||||||
|
using HarmonyLib;
|
||||||
|
using MelonLoader;
|
||||||
|
using StressLevelZero.Interaction;
|
||||||
|
using UnityEngine.Events;
|
||||||
|
|
||||||
|
namespace BoneSync.Patching
|
||||||
|
{
|
||||||
|
public class UnityEventPatch<T>
|
||||||
|
{
|
||||||
|
private T arg;
|
||||||
|
private UnityEvent unityEvent;
|
||||||
|
private Action<T> handler;
|
||||||
|
private UnityEventPatch(T arg, UnityEvent unityEvent, Action<T> handler)
|
||||||
|
{
|
||||||
|
this.arg = arg;
|
||||||
|
this.unityEvent = unityEvent;
|
||||||
|
this.handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Listener()
|
||||||
|
{
|
||||||
|
handler(arg);
|
||||||
|
}
|
||||||
|
private void PatchUnityEvent()
|
||||||
|
{
|
||||||
|
if (unityEvent == null) return;
|
||||||
|
unityEvent.AddListener((UnityAction)Listener);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Patch(T arg, UnityEvent unityEvent, Action<T> handler)
|
||||||
|
{
|
||||||
|
UnityEventPatch<T> patch = new UnityEventPatch<T>(arg, unityEvent, handler);
|
||||||
|
patch.PatchUnityEvent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPatch(typeof(ButtonToggle))]
|
||||||
|
internal class ButtonTogglePatches
|
||||||
|
{
|
||||||
|
[HarmonyPatch(nameof(ButtonToggle.OnEnable)), HarmonyPostfix]
|
||||||
|
private static void OnEnablePostfix(ButtonToggle __instance)
|
||||||
|
{
|
||||||
|
Syncable syncable = ObjectSync.MakeOrGetSyncable(__instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@ namespace BoneSync.Patching
|
|||||||
[HarmonyPatch(typeof(BoneworksSceneManager))]
|
[HarmonyPatch(typeof(BoneworksSceneManager))]
|
||||||
internal class SceneManagerPatches
|
internal class SceneManagerPatches
|
||||||
{
|
{
|
||||||
[HarmonyPatch(nameof(BoneworksSceneManager.LoadScene)), HarmonyPostfix]
|
/*[HarmonyPatch(nameof(BoneworksSceneManager.LoadScene)), HarmonyPostfix]
|
||||||
private static void LoadScenePrefix(int sceneBuildIndex)
|
private static void LoadScenePrefix(int sceneBuildIndex)
|
||||||
{
|
{
|
||||||
MelonLogger.Msg("LoadScenePrefix: " + sceneBuildIndex);
|
MelonLogger.Msg("LoadScenePrefix: " + sceneBuildIndex);
|
||||||
@@ -23,6 +23,6 @@ namespace BoneSync.Patching
|
|||||||
MelonLogger.Msg("Host is loading scene, sending message to clients...");
|
MelonLogger.Msg("Host is loading scene, sending message to clients...");
|
||||||
SceneSync.SendSceneSyncMessage(sceneBuildIndex);
|
SceneSync.SendSceneSyncMessage(sceneBuildIndex);
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,18 +14,6 @@ using UnityEngine;
|
|||||||
using UnityEngine.Events;
|
using UnityEngine.Events;
|
||||||
namespace BoneSync.Sync.Components
|
namespace BoneSync.Sync.Components
|
||||||
{
|
{
|
||||||
public static class UnityEventExtentions
|
|
||||||
{
|
|
||||||
public static void AddListenerWithArgsRaw(this UnityEvent unityEvent, Action<object[]> action, object[] args)
|
|
||||||
{
|
|
||||||
unityEvent.AddListener((UnityAction)(() => action(args)));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AddListenerWithArgs<T>(this UnityEvent unityEvent, Action<T, object[]> action, params object[] args)
|
|
||||||
{
|
|
||||||
unityEvent.AddListenerWithArgsRaw((object[] argss) => action((T)argss[0], argss), args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public partial class Syncable : MonoBehaviour
|
public partial class Syncable : MonoBehaviour
|
||||||
{
|
{
|
||||||
private HashSet<ButtonToggle> patchedButtonToggles = new HashSet<ButtonToggle>();
|
private HashSet<ButtonToggle> patchedButtonToggles = new HashSet<ButtonToggle>();
|
||||||
@@ -86,8 +74,10 @@ namespace BoneSync.Sync.Components
|
|||||||
{
|
{
|
||||||
if (patchedButtonToggles.Contains(buttonToggle)) return;
|
if (patchedButtonToggles.Contains(buttonToggle)) return;
|
||||||
MelonLogger.Msg("Patching ButtonToggle: " + buttonToggle.transform.GetPath());
|
MelonLogger.Msg("Patching ButtonToggle: " + buttonToggle.transform.GetPath());
|
||||||
buttonToggle.onPress.AddListenerWithArgs<ButtonToggle>((btn, args) => ButtonOnPress(btn), buttonToggle);
|
//buttonToggle.onPress.AddListenerWithArgs<ButtonToggle>((btn, args) => ButtonOnPress(btn), buttonToggle);
|
||||||
buttonToggle.onDepress.AddListenerWithArgs<ButtonToggle>((btn, args) => ButtonOnRelease(btn), buttonToggle);
|
//buttonToggle.onDepress.AddListenerWithArgs<ButtonToggle>((btn, args) => ButtonOnRelease(btn), buttonToggle);
|
||||||
|
UnityEventPatch<ButtonToggle>.Patch(buttonToggle, buttonToggle.onPress, ButtonOnPress);
|
||||||
|
UnityEventPatch<ButtonToggle>.Patch(buttonToggle, buttonToggle.onDepress, ButtonOnRelease);
|
||||||
|
|
||||||
patchedButtonToggles.Add(buttonToggle);
|
patchedButtonToggles.Add(buttonToggle);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,9 +162,18 @@ namespace BoneSync.Sync
|
|||||||
return syncable;
|
return syncable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Syncable MakeOrGetSyncable(ButtonToggle buttonToggle)
|
||||||
|
{
|
||||||
|
Syncable parentSyncable = buttonToggle.GetComponentInParent<Syncable>();
|
||||||
|
if (parentSyncable)
|
||||||
|
{
|
||||||
|
return parentSyncable;
|
||||||
|
}
|
||||||
|
return _MakeOrGetSyncable(buttonToggle.gameObject);
|
||||||
|
}
|
||||||
public static Syncable MakeOrGetSyncable(GameObject gameObject)
|
public static Syncable MakeOrGetSyncable(GameObject gameObject)
|
||||||
{
|
{
|
||||||
Syncable syncable = _GetSyncableFromCache(gameObject);
|
Syncable syncable = _GetSyncableFromCache(gameObject); // buttons must never be a sub syncable
|
||||||
if (syncable == null)
|
if (syncable == null)
|
||||||
{
|
{
|
||||||
syncable = _MakeOrGetSyncable(gameObject);
|
syncable = _MakeOrGetSyncable(gameObject);
|
||||||
|
|||||||
Reference in New Issue
Block a user