From 5c244880491741ec5b6376966dcba1ed52cf4468 Mon Sep 17 00:00:00 2001 From: ang-xd Date: Fri, 23 Aug 2024 15:18:21 -0400 Subject: [PATCH] Idk --- MiraAPI.Example/ModifierExample.cs | 15 ++++++++---- MiraAPI/Modifiers/BaseModifier.cs | 3 ++- MiraAPI/Modifiers/ModifierManager.cs | 29 +++++++++++++++++++----- MiraAPI/Modifiers/Types/TimedModifier.cs | 21 ++++++++++++++--- MiraAPI/Utilities/Extensions.cs | 3 ++- 5 files changed, 56 insertions(+), 15 deletions(-) diff --git a/MiraAPI.Example/ModifierExample.cs b/MiraAPI.Example/ModifierExample.cs index 03df100..f30f079 100644 --- a/MiraAPI.Example/ModifierExample.cs +++ b/MiraAPI.Example/ModifierExample.cs @@ -1,8 +1,15 @@ -namespace MiraAPI.Example; +using MiraAPI.Modifiers.Types; -public class ModifierExample +namespace MiraAPI.Example; + +[RegisterModifier] +public class ModifierExample : TimedModifier { - //name, role specific, etc + public override string ModifierName => "Timed modifier example"; + public override float Duration => 10; - // mono behaviour stuff here (ModdedPlayerModifier inherits monobehaviour) + public override void OnTimerComplete() + { + + } } \ No newline at end of file diff --git a/MiraAPI/Modifiers/BaseModifier.cs b/MiraAPI/Modifiers/BaseModifier.cs index 284f989..e0855e6 100644 --- a/MiraAPI/Modifiers/BaseModifier.cs +++ b/MiraAPI/Modifiers/BaseModifier.cs @@ -2,7 +2,8 @@ public abstract class BaseModifier { public abstract string ModifierName { get; } - public uint ModifierId { get; set; } + public uint ModifierId { get; internal set; } + public PlayerControl Player { get; set; } public virtual void OnActivate() { } public virtual void OnDeactivate() { } public virtual void Update() { } diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index fc07183..454a5bf 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -1,9 +1,11 @@ -using MiraAPI.Networking; +using MiraAPI.Modifiers.Types; +using MiraAPI.Networking; using MiraAPI.Utilities; using Reactor.Networking.Attributes; using Reactor.Utilities; using Reactor.Utilities.Attributes; using System; +using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -12,7 +14,7 @@ namespace MiraAPI.Modifiers; [RegisterInIl2Cpp] public class ModifierManager(IntPtr ptr) : MonoBehaviour(ptr) { - public List activeModifiersIds = new(); + public Dictionary activeModifiers = new(); public static List registeredModifiers = new(); public static void RegisterModifier(Type modifierType) @@ -27,11 +29,25 @@ public class ModifierManager(IntPtr ptr) : MonoBehaviour(ptr) registeredModifiers.Add(newMod); } + public void Update() + { + foreach (var modifier in activeModifiers.Values) + { + modifier.Update(); + } + } + + public IEnumerator ModifierTimer(TimedModifier modifier) + { + yield return new WaitForSeconds(modifier.Duration); + modifier.timerOngoing = false; + modifier.OnTimerComplete(); + } public bool HasModifier(PlayerControl target) where T : BaseModifier { uint id = registeredModifiers.Find(mod => mod.GetType() == typeof(T)).ModifierId; - return target.GetModifierManager().activeModifiersIds.Contains(id); + return target.GetModifierManager().activeModifiers.ContainsKey(id); } public void AddModifier(PlayerControl target) where T : BaseModifier @@ -43,7 +59,7 @@ public class ModifierManager(IntPtr ptr) : MonoBehaviour(ptr) public void RemoveModifier(PlayerControl target) where T : BaseModifier { uint id = registeredModifiers.Find(mod => mod.GetType() == typeof(T)).ModifierId; - if (!activeModifiersIds.Contains(id)) + if (!activeModifiers.ContainsKey(id)) { Logger.Error($"Cannot remove modifier {typeof(T).Name} because it is not active."); return; @@ -59,7 +75,7 @@ public class ModifierManager(IntPtr ptr) : MonoBehaviour(ptr) if (modifier is null) return; modifier.OnDeactivate(); - target.GetModifierManager().activeModifiersIds.Remove(modifierId); + target.GetModifierManager().activeModifiers.Remove(modifierId); } [MethodRpc((uint)MiraRpc.AddModifier)] @@ -68,7 +84,8 @@ public class ModifierManager(IntPtr ptr) : MonoBehaviour(ptr) BaseModifier modifier = registeredModifiers.Find(mod => mod.ModifierId == modifierId); if (modifier is null) return; - target.GetModifierManager().activeModifiersIds.Add(modifierId); + target.GetModifierManager().activeModifiers.Add(modifierId, modifier); + modifier.Player = target; modifier.OnActivate(); } } \ No newline at end of file diff --git a/MiraAPI/Modifiers/Types/TimedModifier.cs b/MiraAPI/Modifiers/Types/TimedModifier.cs index 2ed10a2..7408ff2 100644 --- a/MiraAPI/Modifiers/Types/TimedModifier.cs +++ b/MiraAPI/Modifiers/Types/TimedModifier.cs @@ -1,7 +1,22 @@ -namespace MiraAPI.Modifiers.Types; +using Reactor.Utilities; + +namespace MiraAPI.Modifiers.Types; public abstract class TimedModifier : BaseModifier { public abstract float Duration { get; } - public abstract bool StartOnAssignment { get; } - public abstract bool RemoveOnCompletion { get; } + public abstract void OnTimerComplete(); + + internal bool timerOngoing = false; + + public void StartTimer(ModifierManager manager) + { + if (!timerOngoing) + { + Logger.Error("Can't start a timer that is already ongoing."); + return; + } + + timerOngoing = true; + Coroutines.Start(manager.ModifierTimer(this)); + } } \ No newline at end of file diff --git a/MiraAPI/Utilities/Extensions.cs b/MiraAPI/Utilities/Extensions.cs index 2cc615c..25d6bcd 100644 --- a/MiraAPI/Utilities/Extensions.cs +++ b/MiraAPI/Utilities/Extensions.cs @@ -21,11 +21,12 @@ public static class Extensions public static void AddModifier(this PlayerControl player) where T : BaseModifier { - player.GetModifierManager().AddModifier(); + player.GetModifierManager().AddModifier(player); } public static void RemoveModifier(this PlayerControl player) where T : BaseModifier { + player.GetModifierManager().RemoveModifier(player); } public static Color DarkenColor(this Color color)