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(); + } + } } }