From a9ff1c7f6351f2ab14e38a4098e36f7b86d3a08f Mon Sep 17 00:00:00 2001 From: XtraCube <72575280+XtraCube@users.noreply.github.com> Date: Sat, 24 Aug 2024 13:36:49 -0400 Subject: [PATCH] networking modifiers --- MiraAPI/Modifiers/ModifierComponent.cs | 12 +++--- MiraAPI/Modifiers/ModifierManager.cs | 60 ++++++++++++++++++++++++-- MiraAPI/Utilities/Extensions.cs | 6 ++- 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/MiraAPI/Modifiers/ModifierComponent.cs b/MiraAPI/Modifiers/ModifierComponent.cs index e9955af5..ac7c20ae 100644 --- a/MiraAPI/Modifiers/ModifierComponent.cs +++ b/MiraAPI/Modifiers/ModifierComponent.cs @@ -13,7 +13,7 @@ namespace MiraAPI.Modifiers; [RegisterInIl2Cpp] public class ModifierComponent(IntPtr ptr) : MonoBehaviour(ptr) { - public List activeModifiers = []; + public readonly List ActiveModifiers = []; public PlayerControl player; @@ -24,7 +24,7 @@ public class ModifierComponent(IntPtr ptr) : MonoBehaviour(ptr) public void Update() { - foreach (var modifier in activeModifiers) + foreach (var modifier in ActiveModifiers) { modifier.Update(); } @@ -40,7 +40,7 @@ public class ModifierComponent(IntPtr ptr) : MonoBehaviour(ptr) var modifierComponent = target.GetModifierComponent(); - var modifier = modifierComponent.activeModifiers.Find(x => x.GetType() == type); + var modifier = modifierComponent.ActiveModifiers.Find(x => x.GetType() == type); if (modifier is null) { @@ -49,7 +49,7 @@ public class ModifierComponent(IntPtr ptr) : MonoBehaviour(ptr) } modifier.OnDeactivate(); - modifierComponent.activeModifiers.Remove(modifier); + modifierComponent.ActiveModifiers.Remove(modifier); } public static void AddModifier(PlayerControl target, uint modifierId) @@ -70,11 +70,11 @@ public class ModifierComponent(IntPtr ptr) : MonoBehaviour(ptr) return; } - modifierComponent.activeModifiers.Add(modifier); + modifierComponent.ActiveModifiers.Add(modifier); modifier.Player = modifierComponent.player; modifier.OnActivate(); - if (modifier is TimedModifier timer && timer.AutoStart && target.AmOwner) + if (modifier is TimedModifier { AutoStart: true } timer && target.AmOwner) { timer.StartTimer(); } diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 32d95ef6..f647e8d9 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -1,6 +1,8 @@ using MiraAPI.Networking; using System; using System.Collections.Generic; +using MiraAPI.Utilities; +using Reactor.Networking.Rpc; namespace MiraAPI.Modifiers; @@ -30,18 +32,68 @@ public static class ModifierManager public static void SyncAllModifiers(int targetId = -1) { - + var data = new List(); + + if (targetId == -1) + { + foreach (var player in GameData.Instance.AllPlayers) + { + data.Add(GetPlayerModifiers(player.Object)); + } + } + else + { + var player = GameData.Instance.GetPlayerById((byte)targetId).Object; + + data.Add(GetPlayerModifiers(player)); + } + + + Rpc.Instance.Send(PlayerControl.LocalPlayer, data.ToArray(), true); } - + public static void HandleSyncModifiers(NetData[] data) { foreach (var netData in data) { - PlayerControl plr = GameData.Instance.GetPlayerById((byte)netData.Id).Object; - foreach (var id in netData.Data) + var ids = new uint[netData.Data.Length / 4]; + Buffer.BlockCopy(netData.Data, 0, ids, 0, netData.Data.Length); + + var plr = GameData.Instance.GetPlayerById((byte)netData.Id).Object; + var modifierComponent = plr.GetComponent(); + + if (!modifierComponent) + { + continue; + } + + foreach (var modifier in modifierComponent.ActiveModifiers) + { + modifier.OnDeactivate(); + } + modifierComponent.ActiveModifiers.Clear(); + + foreach (var id in ids) { ModifierComponent.AddModifier(plr, id); } } } + + private static NetData GetPlayerModifiers(PlayerControl player) + { + var bytes = new List(); + var modifierComponent = player.GetComponent(); + if (!modifierComponent) + { + return new NetData(player.PlayerId, []); + } + + foreach (var modifier in modifierComponent.ActiveModifiers) + { + bytes.AddRange(BitConverter.GetBytes(TypeToIdModifiers[modifier.GetType()])); + } + + return new NetData(player.PlayerId, bytes.ToArray()); + } } \ No newline at end of file diff --git a/MiraAPI/Utilities/Extensions.cs b/MiraAPI/Utilities/Extensions.cs index 21d7d5a9..7187b5bc 100644 --- a/MiraAPI/Utilities/Extensions.cs +++ b/MiraAPI/Utilities/Extensions.cs @@ -1,10 +1,12 @@ -using MiraAPI.GameOptions; +using System; +using MiraAPI.GameOptions; using MiraAPI.Modifiers; using MiraAPI.Roles; using Reactor.Utilities; using Reactor.Utilities.Extensions; using System.Linq; using UnityEngine; +using Object = UnityEngine.Object; namespace MiraAPI.Utilities; @@ -22,7 +24,7 @@ public static class Extensions public static bool HasModifier(this PlayerControl player) where T : BaseModifier { - return player.GetModifierComponent().activeModifiers.Exists(x => x is T); + return player.GetModifierComponent().ActiveModifiers.Exists(x => x is T); } public static void AddModifier(this PlayerControl player) where T : BaseModifier