add oneshot event patch

This commit is contained in:
2025-03-14 14:21:12 +02:00
parent f1f8f1cbcf
commit 95cd554eb0
7 changed files with 104 additions and 16 deletions

View File

@@ -86,6 +86,22 @@
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\BONEWORKS\BONEWORKS\MelonLoader\Managed\UnityEngine.PhysicsModule.dll</HintPath> <HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\BONEWORKS\BONEWORKS\MelonLoader\Managed\UnityEngine.PhysicsModule.dll</HintPath>
</Reference> </Reference>
<Reference Include="UnityEngine.TextRenderingModule, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\BONEWORKS\BONEWORKS\MelonLoader\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UI, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\BONEWORKS\BONEWORKS\MelonLoader\Managed\UnityEngine.UI.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UIElementsModule, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\BONEWORKS\BONEWORKS\MelonLoader\Managed\UnityEngine.UIElementsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.UIModule, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\BONEWORKS\BONEWORKS\MelonLoader\Managed\UnityEngine.UIModule.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Data\ByteEncoder.cs" /> <Compile Include="Data\ByteEncoder.cs" />

View File

@@ -5,6 +5,8 @@ using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
namespace BoneSync.Data namespace BoneSync.Data
{ {
@@ -36,4 +38,60 @@ namespace BoneSync.Data
#endif #endif
} }
} }
internal static class SyncDebugUI
{
public static Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
public static Text debugText;
public static void CreateUI()
{
if (debugText != null)
return;
GameObject canvas = new GameObject("BoneSyncDebugCanvas");
canvas.AddComponent<Canvas>();
canvas.AddComponent<CanvasScaler>();
canvas.AddComponent<GraphicRaycaster>();
canvas.GetComponent<Canvas>().renderMode = RenderMode.ScreenSpaceOverlay;
GameObject panel = new GameObject("BoneSyncDebugPanel");
panel.transform.SetParent(canvas.transform);
panel.AddComponent<CanvasRenderer>();
panel.AddComponent<Image>();
panel.GetComponent<Image>().color = new Color(0, 0, 0, 0.5f);
panel.GetComponent<RectTransform>().anchorMin = new Vector2(0, 0);
panel.GetComponent<RectTransform>().anchorMax = new Vector2(1, 1);
panel.GetComponent<RectTransform>().offsetMin = new Vector2(0, 0);
panel.GetComponent<RectTransform>().offsetMax = new Vector2(0, 0);
GameObject text = new GameObject("BoneSyncDebugText");
text.transform.SetParent(panel.transform);
text.AddComponent<RectTransform>();
text.AddComponent<Text>();
text.GetComponent<Text>().font = Font.CreateDynamicFontFromOSFont("Arial", 12);
text.GetComponent<Text>().color = Color.white;
text.GetComponent<Text>().alignment = TextAnchor.UpperLeft;
text.GetComponent<Text>().resizeTextForBestFit = true;
text.GetComponent<Text>().resizeTextMaxSize = 12;
text.GetComponent<Text>().resizeTextMinSize = 8;
text.GetComponent<Text>().text = "BoneSync Debug";
text.GetComponent<RectTransform>().anchorMin = new Vector2(0, 0);
text.GetComponent<RectTransform>().anchorMax = new Vector2(1, 1);
text.GetComponent<RectTransform>().offsetMin = new Vector2(0, 0);
text.GetComponent<RectTransform>().offsetMax = new Vector2(0, 0);
debugText = text.GetComponent<Text>();
}
public static void UpdateUI()
{
CreateUI();
StringBuilder sb = new StringBuilder();
foreach (var kvp in keyValuePairs)
{
sb.AppendLine($"{kvp.Key}: {kvp.Value}");
}
debugText.text = sb.ToString();
}
}
} }

View File

@@ -79,6 +79,8 @@ namespace BoneSync
PlayerRig.LocalSyncTick(); PlayerRig.LocalSyncTick();
transport.Tick(); transport.Tick();
//SyncDebugUI.UpdateUI();
//PlayerRig.Tick(); //PlayerRig.Tick();
if (Input.GetKeyDown(KeyCode.P)) if (Input.GetKeyDown(KeyCode.P))

View File

@@ -15,6 +15,7 @@ namespace BoneSync.Networking.Messages
OnDeviceRelease = 2, OnDeviceRelease = 2,
OnButtonPress = 3, OnButtonPress = 3,
OnButtonRelease = 4, OnButtonRelease = 4,
OnButtonOneShot = 5,
} }
public struct SimpleSyncableEvent public struct SimpleSyncableEvent
{ {

View File

@@ -61,9 +61,9 @@ namespace BoneSync.Networking.Transport
} }
} }
public override bool Tick() public override int Tick()
{ {
if (!SteamClient.IsValid) return false; if (!SteamClient.IsValid) return 0;
int processed = 0; int processed = 0;
while (SteamNetworking.IsP2PPacketAvailable()) while (SteamNetworking.IsP2PPacketAvailable())
{ {
@@ -72,7 +72,7 @@ namespace BoneSync.Networking.Transport
ProcessPacket(packet.Value); ProcessPacket(packet.Value);
processed++; processed++;
} }
return processed > 0; return processed;
} }
public P2PSend GetSteamSendType(PacketReliability packetReliability) public P2PSend GetSteamSendType(PacketReliability packetReliability)

View File

@@ -10,7 +10,7 @@ namespace BoneSync.Networking.Transport
{ {
public const int BORADCAST_ID = 0; public const int BORADCAST_ID = 0;
public abstract void Send(Packet packet); public abstract void Send(Packet packet);
public abstract bool Tick(); public abstract int Tick();
public abstract void CleanUp(); public abstract void CleanUp();
} }
} }

View File

@@ -19,25 +19,28 @@ namespace BoneSync.Sync.Components
private HashSet<int> patchedButtonToggles = new HashSet<int>(); private HashSet<int> patchedButtonToggles = new HashSet<int>();
private bool pullDevicePatched = false; private bool pullDevicePatched = false;
bool ButtonOnPress(ButtonToggle toggle) bool OnButtonEvent(ButtonToggle toggle, SimpleEventType eventType)
{ {
SyncLogger.Msg("ButtonToggle:OnPress " + 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(); RegisterSyncable();
if (!Registered) return false; if (!Registered) return false;
if (!isOwner) return false; if (!isOwner) return false;
_SendSimpleEvent(SimpleEventType.OnButtonPress, index); _SendSimpleEvent(eventType, index);
return true; return true;
} }
bool ButtonOnPress(ButtonToggle toggle)
{
return OnButtonEvent(toggle, SimpleEventType.OnButtonPress);
}
bool ButtonOnRelease(ButtonToggle toggle) bool ButtonOnRelease(ButtonToggle toggle)
{ {
SyncLogger.Msg("ButtonToggle:OnRelease " + toggle.transform.GetPath()); return OnButtonEvent(toggle, SimpleEventType.OnButtonRelease);
byte index = (byte)Array.IndexOf(buttonToggles, toggle); }
RegisterSyncable();
if (!Registered) return false; bool ButtonOnOneShot(ButtonToggle toggle)
if (!isOwner) return false; {
_SendSimpleEvent(SimpleEventType.OnButtonRelease, index); return OnButtonEvent(toggle, SimpleEventType.OnButtonOneShot);
return true;
} }
void DeviceOnPull() void DeviceOnPull()
@@ -84,6 +87,7 @@ namespace BoneSync.Sync.Components
//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.onPress, ButtonOnPress);
UnityEventPatch<ButtonToggle>.Patch(buttonToggle, buttonToggle.onDepress, ButtonOnRelease); UnityEventPatch<ButtonToggle>.Patch(buttonToggle, buttonToggle.onDepress, ButtonOnRelease);
UnityEventPatch<ButtonToggle>.Patch(buttonToggle, buttonToggle.onPressOneShot, ButtonOnOneShot);
patchedButtonToggles.Add(buttonToggle.GetHashCode()); patchedButtonToggles.Add(buttonToggle.GetHashCode());
} }
@@ -231,8 +235,15 @@ namespace BoneSync.Sync.Components
buttonToggles[index]?.onDepress.BypassPatchInvoke(); buttonToggles[index]?.onDepress.BypassPatchInvoke();
} }
break; break;
case SimpleEventType.OnButtonOneShot:
if (len != eventData.length) {
SyncLogger.Warning("ButtonPress length mismatch: " + len + " != " + eventData.length);
}
if (index < buttonToggles.Length)
{
buttonToggles[index]?.onPressOneShot.BypassPatchInvoke();
}
break;
} }
} }
// on collision // on collision