diff --git a/BoneSync/BoneSync.csproj b/BoneSync/BoneSync.csproj
index 54373c3..7055f63 100644
--- a/BoneSync/BoneSync.csproj
+++ b/BoneSync/BoneSync.csproj
@@ -88,12 +88,14 @@
+
+
diff --git a/BoneSync/Networking/Messages/GunSyncMessage.cs b/BoneSync/Networking/Messages/GunSyncMessage.cs
new file mode 100644
index 0000000..c10399c
--- /dev/null
+++ b/BoneSync/Networking/Messages/GunSyncMessage.cs
@@ -0,0 +1,60 @@
+using BoneSync.Sync;
+using BoneSync.Sync.Components;
+using StressLevelZero.Combat;
+using StressLevelZero.Props.Weapons;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace BoneSync.Networking.Messages
+{
+ public enum GunSyncMessageType
+ {
+ StateUpdate = 0,
+ Fire = 1,
+ }
+
+ public struct GunSyncInfo
+ {
+ public ushort syncId;
+ public BulletObject bulletObject;
+ public GunSyncMessageType messageType;
+ public Gun.HammerStates hammerState;
+ public Gun.CartridgeStates cartridgeState;
+ }
+
+ [PacketType(PacketType.GunSync)]
+ public class GunSyncMessage : NetworkMessage
+ {
+ GunSyncInfo gunSyncInfo;
+ public GunSyncMessage(GunSyncInfo gunSyncInfo)
+ {
+ this.gunSyncInfo = gunSyncInfo;
+
+ byteEncoder.WriteUShort(gunSyncInfo.syncId);
+ byteEncoder.WriteByte((byte)gunSyncInfo.messageType);
+ byteEncoder.WriteByte((byte)gunSyncInfo.hammerState);
+ byteEncoder.WriteByte((byte)gunSyncInfo.cartridgeState);
+ byteEncoder.WriteAmmoVariables(gunSyncInfo.bulletObject.ammoVariables);
+
+ }
+
+ public GunSyncMessage(Packet packet) {
+ byteEncoder.WriteBytes(packet.Data);
+ gunSyncInfo.syncId = byteEncoder.ReadUShort();
+ gunSyncInfo.messageType = (GunSyncMessageType)byteEncoder.ReadByte();
+ gunSyncInfo.hammerState = (Gun.HammerStates)byteEncoder.ReadByte();
+ gunSyncInfo.cartridgeState = (Gun.CartridgeStates)byteEncoder.ReadByte();
+ gunSyncInfo.bulletObject.ammoVariables = byteEncoder.ReadAmmoVariables();
+ }
+
+ public override void Execute()
+ {
+ Syncable syncable = ObjectSyncCache.GetSyncable(gunSyncInfo.syncId);
+ if (syncable == null) return;
+ syncable.OnWeaponSyncData(gunSyncInfo);
+ }
+ }
+}
diff --git a/BoneSync/Networking/PacketTypes.cs b/BoneSync/Networking/PacketTypes.cs
index 62b07fd..cb3550e 100644
--- a/BoneSync/Networking/PacketTypes.cs
+++ b/BoneSync/Networking/PacketTypes.cs
@@ -17,5 +17,6 @@ namespace BoneSync.Networking
ObjectOwnership = 6,
DiscardSyncable = 7,
MagazineSync = 8,
+ GunSync = 9,
}
}
diff --git a/BoneSync/Patching/DebugPatches.cs b/BoneSync/Patching/DebugPatches.cs
new file mode 100644
index 0000000..3c0b7b1
--- /dev/null
+++ b/BoneSync/Patching/DebugPatches.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HarmonyLib;
+using StressLevelZero.AI;
+using StressLevelZero.Combat;
+using StressLevelZero.Pool;
+using UnityEngine;
+
+namespace BoneSync.Patching
+{
+ [HarmonyPatch(typeof(PoolSpawner))]
+ internal class DebugPatches
+ {
+ // patch the static method "PoolSpawner.SpawnProjectile"
+ [HarmonyPatch(nameof(PoolSpawner.SpawnProjectile)), HarmonyPrefix]
+ private static void SpawnProjectilePrefix(Vector3 position, Quaternion rotation, BulletObject bulletObject, string weaponName, TriggerRefProxy proxy)
+ {
+ MelonLoader.MelonLogger.Msg("PoolSpawner.SpawnProjectile " + weaponName);
+ }
+ }
+}
diff --git a/BoneSync/Patching/GunPatches.cs b/BoneSync/Patching/GunPatches.cs
index 5010275..99d4592 100644
--- a/BoneSync/Patching/GunPatches.cs
+++ b/BoneSync/Patching/GunPatches.cs
@@ -3,6 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using BoneSync.Networking.Messages;
+using BoneSync.Sync;
+using BoneSync.Sync.Components;
using HarmonyLib;
using StressLevelZero.Props.Weapons;
@@ -12,10 +15,46 @@ namespace BoneSync.Patching
[HarmonyPatch(typeof(Gun))]
public class GunPatches
{
- [HarmonyPatch(nameof(Gun.Fire)), HarmonyPostfix]
- public static void FirePatch(Gun __instance)
+ [HarmonyPatch(nameof(Gun.Fire)), HarmonyPrefix]
+ public static bool FirePatch(Gun __instance)
{
+ if (CallPatchedMethods.allowPatchedMethodCall) return true;
MelonLoader.MelonLogger.Msg("Gun fired: " + __instance.name);
+ if (!BoneSync.lobby.IsConnected()) return true;
+
+ Syncable syncable = ObjectSync.MakeOrGetSyncable(__instance.gameObject);
+ if (syncable == null) return true;
+ if (!syncable.Registered) return true;
+
+ if (syncable.isOwner)
+ {
+ GunSyncInfo gunSyncInfo = new GunSyncInfo()
+ {
+ cartridgeState = __instance.cartridgeState,
+ hammerState = __instance.hammerState,
+ syncId = syncable.GetSyncId(),
+ messageType = GunSyncMessageType.Fire,
+ };
+
+ GunSyncMessage gunSyncMessage = new GunSyncMessage(gunSyncInfo);
+ gunSyncMessage.Broadcast();
+ }
+
+ return true;
+ }
+
+
+ [HarmonyPatch(nameof(Gun.OnFire)), HarmonyPrefix]
+ public static bool OnFirePatch(Gun __instance)
+ {
+ if (CallPatchedMethods.allowPatchedMethodCall) return true;
+ MelonLoader.MelonLogger.Msg("Gun.OnFire: " + __instance.name);
+ if (!BoneSync.lobby.IsConnected()) return true;
+
+ Syncable syncable = ObjectSync.MakeOrGetSyncable(__instance.gameObject);
+ if (syncable == null) return true;
+ if (!syncable.Registered) return true;
+ return syncable.isOwner; // only allow owner to fire
}
}
diff --git a/BoneSync/Patching/ZonePatches.cs b/BoneSync/Patching/ZonePatches.cs
index 97fe633..122048f 100644
--- a/BoneSync/Patching/ZonePatches.cs
+++ b/BoneSync/Patching/ZonePatches.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks;
using BoneSync.Sync.Components;
using HarmonyLib;
using MelonLoader;
+using StressLevelZero.Pool;
using StressLevelZero.Zones;
namespace BoneSync.Patching
diff --git a/BoneSync/Sync/Components/SyncableBase.cs b/BoneSync/Sync/Components/SyncableBase.cs
index 797740f..0b1f6a9 100644
--- a/BoneSync/Sync/Components/SyncableBase.cs
+++ b/BoneSync/Sync/Components/SyncableBase.cs
@@ -113,6 +113,8 @@ namespace BoneSync.Sync.Components
private AIBrain aiBrain;
private PuppetMaster puppetMaster;
+ private PullDevice pullDevice;
+
private SpawnFragment spawnFragment;
private void CheckAutoSync()
@@ -170,6 +172,7 @@ namespace BoneSync.Sync.Components
{
ObjectSyncCache.RemoveSyncable(this);
+ pullDevice = GetComponent();
interactableManager = GetComponent();
interactableHost = GetComponent();
poolee = GetComponent();
@@ -243,11 +246,6 @@ namespace BoneSync.Sync.Components
if (despawn) MelonCoroutines.Start(DespawnSyncable());
}
- private void OnRegister()
- {
-
- }
-
public void OnDestroy()
{
if (Registered)
diff --git a/BoneSync/Sync/Components/SyncablePhysics.cs b/BoneSync/Sync/Components/SyncablePhysics.cs
index 5277fdf..1bc946b 100644
--- a/BoneSync/Sync/Components/SyncablePhysics.cs
+++ b/BoneSync/Sync/Components/SyncablePhysics.cs
@@ -2,6 +2,7 @@
using BoneSync.Networking;
using BoneSync.Networking.Messages;
using BoneSync.Patching;
+using Facepunch.Steamworks;
using MelonLoader;
using System;
using System.Collections.Generic;
@@ -9,10 +10,23 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
+using UnityEngine.Events;
namespace BoneSync.Sync.Components
{
public partial class Syncable : MonoBehaviour
{
+ private bool pullDevicePatched = false;
+
+ void OnPull()
+ {
+ MelonLogger.Msg("OnPull");
+ }
+ private void _TryPatchPullDevice()
+ {
+ if (pullDevicePatched) return;
+ if (!pullDevice) return;
+ pullDevice.OnHandlePull.AddListener((UnityAction)OnPull);
+ }
public bool AllRigidbodiesSleeping()
{
diff --git a/BoneSync/Sync/Components/SyncableProperties.cs b/BoneSync/Sync/Components/SyncableProperties.cs
index d414b2a..e1df861 100644
--- a/BoneSync/Sync/Components/SyncableProperties.cs
+++ b/BoneSync/Sync/Components/SyncableProperties.cs
@@ -43,5 +43,19 @@ namespace BoneSync.Sync.Components
MagazineSyncMessage message = new MagazineSyncMessage(data);
message.Broadcast();
}
+
+ public void OnWeaponSyncData(GunSyncInfo gunSyncInfo)
+ {
+ if (!gun) return;
+
+ gun.chamberedCartridge = gunSyncInfo.bulletObject;
+ gun.cartridgeState = gunSyncInfo.cartridgeState;
+ gun.hammerState = gunSyncInfo.hammerState;
+
+ if (gunSyncInfo.messageType == GunSyncMessageType.Fire)
+ {
+ gun.Fire();
+ }
+ }
}
}