diff --git a/MiraAPI/Modifiers/ModifierComponent.cs b/MiraAPI/Modifiers/ModifierComponent.cs index 8c7f6f2..53a8ac4 100644 --- a/MiraAPI/Modifiers/ModifierComponent.cs +++ b/MiraAPI/Modifiers/ModifierComponent.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; -using System.Globalization; using System.Linq; using System.Text; using Il2CppInterop.Runtime.Attributes; @@ -25,7 +24,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) /// Gets the active modifiers on the player. /// [HideFromIl2Cpp] - public ImmutableList ActiveModifiers => Modifiers.ToImmutableList(); + public ImmutableList ActiveModifiers { get; private set; } = ImmutableList.Empty; [HideFromIl2Cpp] private List Modifiers { get; set; } = []; @@ -59,13 +58,13 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) private void FixedUpdate() { - foreach (var modifier in _toRemove) + foreach (var modifier in _toRemove.ToArray()) { modifier.OnDeactivate(); Modifiers.Remove(modifier); } - foreach (var modifier in _toAdd) + foreach (var modifier in _toAdd.ToArray()) { Modifiers.Add(modifier); modifier.Initialized = true; @@ -85,9 +84,11 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) } _toAdd.Clear(); _toRemove.Clear(); + + ActiveModifiers = Modifiers.ToImmutableList(); } - foreach (var modifier in Modifiers) + foreach (var modifier in ActiveModifiers) { modifier.FixedUpdate(); } @@ -95,7 +96,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) private void Update() { - foreach (var modifier in Modifiers) + foreach (var modifier in ActiveModifiers) { modifier.Update(); } @@ -105,21 +106,26 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) return; } - var filteredModifiers = Modifiers.Where(mod => !mod.HideOnUi).ToArray(); + if (MeetingHud.Instance) + { + return; + } - if (filteredModifiers.Length != 0 && !MeetingHud.Instance) + var showText = false; + var builder = new StringBuilder("Modifiers:\n"); + + foreach (var modifier in ActiveModifiers) { - var stringBuild = new StringBuilder(); - foreach (var mod in filteredModifiers) + if (modifier.HideOnUi) { - stringBuild.Append(CultureInfo.InvariantCulture, $"\n{mod.GetHudString()}"); + continue; } - _modifierText!.text = $"Modifiers:{stringBuild}"; - } - else if (_modifierText!.text != string.Empty) - { - _modifierText.text = string.Empty; + + showText = true; + builder.AppendLine(modifier.GetHudString()); } + + _modifierText!.text = showText ? builder.ToString() : string.Empty; } /// @@ -131,7 +137,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) [HideFromIl2Cpp] public IEnumerable GetModifiers(Func? predicate=null) where T : BaseModifier { - return Modifiers.OfType().Where(x => predicate == null || predicate(x)); + return ActiveModifiers.OfType().Where(x => predicate == null || predicate(x)); } /// @@ -143,7 +149,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) [HideFromIl2Cpp] public IEnumerable GetModifiers(Type type, Func? predicate=null) { - return Modifiers.Where(x => x.GetType() == type && (predicate == null || predicate(x))); + return ActiveModifiers.Where(x => x.GetType() == type && (predicate == null || predicate(x))); } /// @@ -263,7 +269,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) [HideFromIl2Cpp] public BaseModifier? GetModifier(Guid modifierGuid) { - return Modifiers.Find(x => x.UniqueId == modifierGuid); + return ActiveModifiers.Find(x => x.UniqueId == modifierGuid); } /// @@ -285,7 +291,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) [HideFromIl2Cpp] public void RemoveModifier(Type type, Func? predicate = null) { - var modifiers = Modifiers.Where(x => x.GetType() == type && (predicate == null || predicate(x))).ToList(); + var modifiers = ActiveModifiers.Where(x => x.GetType() == type && (predicate == null || predicate(x))).ToList(); if (modifiers.Count > 1) { throw new InvalidOperationException($"Cannot remove modifier {type.Name} because there are multiple instances of that modifier."); @@ -308,7 +314,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) [HideFromIl2Cpp] public void RemoveModifier(BaseModifier modifier) { - if (!Modifiers.Contains(modifier)) + if (!ActiveModifiers.Contains(modifier)) { Logger.Error($"Cannot remove modifier {modifier.ModifierName} because it is not active on this player."); return; @@ -374,13 +380,13 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) } var id = modifier.TypeId; - if (modifier.Unique && Modifiers.Find(x => x.TypeId == id) != null) + if (modifier.Unique && ActiveModifiers.Find(x => x.TypeId == id) != null) { Logger.Error($"Player already has modifier with id {id}!"); return null; } - if (Modifiers.Contains(modifier)) + if (ActiveModifiers.Contains(modifier)) { Logger.Error($"Player already has this modifier!"); return null; @@ -446,7 +452,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) [HideFromIl2Cpp] public bool HasModifier(Func? predicate=null) where T : BaseModifier { - return Modifiers.Exists(x => x is T modifier && (predicate == null || predicate(modifier))); + return ActiveModifiers.Exists(x => x is T modifier && (predicate == null || predicate(modifier))); } /// @@ -458,7 +464,7 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) [HideFromIl2Cpp] public bool HasModifier(Type type, Func? predicate=null) { - return Modifiers.Exists(x => x.GetType() == type && (predicate == null || predicate(x))); + return ActiveModifiers.Exists(x => x.GetType() == type && (predicate == null || predicate(x))); } /// @@ -484,6 +490,6 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) [HideFromIl2Cpp] public bool HasModifier(Guid id) { - return Modifiers.Exists(x => x.UniqueId == id); + return ActiveModifiers.Exists(x => x.UniqueId == id); } }