From 5d05a07364cc7791ffd48d311365d99509beb66e Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:33:30 -0400 Subject: [PATCH 01/13] add modifier assignment priority --- MiraAPI/Modifiers/ModifierManager.cs | 15 +++++++++++++++ MiraAPI/Modifiers/Types/GameModifier.cs | 7 +++++++ 2 files changed, 22 insertions(+) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 819f289..65b6af7 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -97,6 +97,21 @@ public static class ModifierManager } var shuffledModifiers = filteredModifiers.Randomize(); + var map = new Dictionary(); + + foreach (var id in shuffledModifiers) + { + if (Activator.CreateInstance(IdToTypeModifierMap[id]) is not GameModifier mod) + { + Logger.Error($"Failed to create instance of {IdToTypeModifierMap[id].Name}"); + continue; + } + + map[id] = mod.Priority(); + } + + shuffledModifiers = map.OrderByDescending(x => x.Value).Select(x => x.Key).ToList(); + if (shuffledModifiers.Count > plrs.Count) { shuffledModifiers = shuffledModifiers.GetRange(0, plrs.Count); diff --git a/MiraAPI/Modifiers/Types/GameModifier.cs b/MiraAPI/Modifiers/Types/GameModifier.cs index 60c5f56..a7b1fe1 100644 --- a/MiraAPI/Modifiers/Types/GameModifier.cs +++ b/MiraAPI/Modifiers/Types/GameModifier.cs @@ -17,6 +17,12 @@ public abstract class GameModifier : BaseModifier /// An int value greater than or equal to zero. public abstract int GetAmountPerGame(); + /// + /// Gets the priority at which the modifier will spawn. The higher the value, the higher up on the assignment list. + /// + /// An int value greater than or equal to -1. + public virtual int Priority() => -1; + /// /// Determines whether the modifier is valid on a role. /// @@ -27,6 +33,7 @@ public abstract class GameModifier : BaseModifier /// /// Determines whether the player won the game with this modifier. /// + /// The reason why the game ended. /// True if the player won, false if they lost. Return null to use the player's default win condition. public virtual bool? DidWin(GameOverReason reason) => null; } From 570bb388b61523e433259393765b993badf22b52 Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Wed, 25 Sep 2024 12:23:39 -0400 Subject: [PATCH 02/13] add loggin for debugging --- MiraAPI/Modifiers/ModifierManager.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 65b6af7..eb27206 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -84,6 +84,7 @@ public static class ModifierManager var num = Math.Clamp(mod.GetAmountPerGame(), 0, maxCount); var chance = mod.GetAssignmentChance(); + Logger.Warning($"{mod}:{modifier.Key}:{mod.Priority()}:{mod.GetAssignmentChance()}"); for (var i = 0; i < num; i++) { @@ -108,6 +109,7 @@ public static class ModifierManager } map[id] = mod.Priority(); + Logger.Warning($"{mod}:{id}:{mod.Priority()}:{mod.GetAssignmentChance()}"); } shuffledModifiers = map.OrderByDescending(x => x.Value).Select(x => x.Key).ToList(); From 23e11fef934143f7444623dcb545e9ae3b43241f Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Wed, 25 Sep 2024 12:40:13 -0400 Subject: [PATCH 03/13] reverse mod assignment order --- MiraAPI/Modifiers/ModifierManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index eb27206..11fe449 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -65,8 +65,9 @@ public static class ModifierManager var rand = new Random(); List filteredModifiers = []; + var modifiers = IdToTypeModifierMap.Where(pair => pair.Value.IsAssignableTo(typeof(GameModifier))).Reverse(); // For some reason the modifiers are sorted in reverse by namespace, but alphabetical by class name lol - foreach (var modifier in IdToTypeModifierMap.Where(pair => pair.Value.IsAssignableTo(typeof(GameModifier)))) + foreach (var modifier in modifiers) { if (Activator.CreateInstance(modifier.Value) is not GameModifier mod) { From 9de2ba8e4145dcaacab6611bfcfe45460802088e Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Sat, 5 Oct 2024 18:11:17 -0400 Subject: [PATCH 04/13] i think i got a better solution to this --- MiraAPI/Modifiers/ModifierManager.cs | 80 ++++++++++++++-------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 11fe449..50597f6 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -20,6 +20,7 @@ public static class ModifierManager { private static readonly Dictionary IdToTypeModifierMap = []; private static readonly Dictionary TypeToIdModifierMap = []; + private static readonly Dictionary> PrioritiesToTypesMap = []; private static uint _nextId; @@ -58,62 +59,59 @@ public static class ModifierManager IdToTypeModifierMap.Add(GetNextId(), modifierType); TypeToIdModifierMap.Add(modifierType, _nextId); + + if (!typeof(GameModifier).IsAssignableFrom(modifierType)) + { + return; + } + + var mod = Activator.CreateInstance(modifierType) as GameModifier; + var prio = mod!.Priority(); + + if (!PrioritiesToTypesMap.TryGetValue(prio, out var list)) + { + PrioritiesToTypesMap[prio] = list = []; + } + + list.Add(modifierType); } internal static void AssignModifiers(List plrs) { var rand = new Random(); - List filteredModifiers = []; - var modifiers = IdToTypeModifierMap.Where(pair => pair.Value.IsAssignableTo(typeof(GameModifier))).Reverse(); // For some reason the modifiers are sorted in reverse by namespace, but alphabetical by class name lol + Dictionary filteredModifiers = []; - foreach (var modifier in modifiers) + foreach (var prioPairs in PrioritiesToTypesMap) { - if (Activator.CreateInstance(modifier.Value) is not GameModifier mod) + foreach (var modifier in prioPairs.Value) { - Logger.Error($"Failed to create instance of {modifier.Value.Name}"); - continue; - } + var mod = Activator.CreateInstance(modifier) as GameModifier; + var id = TypeToIdModifierMap[modifier]; - if (!plrs.Exists(x => IsGameModifierValid(x, mod, modifier.Key))) - { - Logger.Warning("No players are valid for modifier: " + mod.ModifierName); - continue; - } - - var maxCount = plrs.Count(x => IsGameModifierValid(x, mod, modifier.Key)); - - var num = Math.Clamp(mod.GetAmountPerGame(), 0, maxCount); - var chance = mod.GetAssignmentChance(); - Logger.Warning($"{mod}:{modifier.Key}:{mod.Priority()}:{mod.GetAssignmentChance()}"); - - for (var i = 0; i < num; i++) - { - var randomNum = rand.Next(100); - - if (randomNum < Math.Clamp(chance, 0, 100)) + if (!plrs.Exists(x => IsGameModifierValid(x, mod!, id))) { - filteredModifiers.Add(TypeToIdModifierMap[modifier.Value]); + Logger.Warning("No players are valid for modifier: " + mod!.ModifierName); + continue; + } + + var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, id)); + var num = Math.Clamp(mod!.GetAmountPerGame(), 0, maxCount); + var chance = mod.GetAssignmentChance(); + + for (var i = 0; i < num; i++) + { + var randomNum = rand.Next(100); + + if (randomNum < Math.Clamp(chance, 0, 100)) + { + filteredModifiers.Add(id, prioPairs.Key); + } } } } - var shuffledModifiers = filteredModifiers.Randomize(); - var map = new Dictionary(); - - foreach (var id in shuffledModifiers) - { - if (Activator.CreateInstance(IdToTypeModifierMap[id]) is not GameModifier mod) - { - Logger.Error($"Failed to create instance of {IdToTypeModifierMap[id].Name}"); - continue; - } - - map[id] = mod.Priority(); - Logger.Warning($"{mod}:{id}:{mod.Priority()}:{mod.GetAssignmentChance()}"); - } - - shuffledModifiers = map.OrderByDescending(x => x.Value).Select(x => x.Key).ToList(); + var shuffledModifiers = filteredModifiers.ToList().Randomize().OrderByDescending(x => x.Value).Select(x => x.Key).ToList(); if (shuffledModifiers.Count > plrs.Count) { From 8b9621dafacef1899f3a1b0666e91d814c78a4a2 Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Sat, 5 Oct 2024 20:52:30 -0400 Subject: [PATCH 05/13] fix up assignment + hide from il2cpp was being annoying --- MiraAPI/Hud/CustomPlayerMenu.cs | 2 + MiraAPI/Modifiers/ModifierManager.cs | 79 +++++++++++++--------------- 2 files changed, 39 insertions(+), 42 deletions(-) diff --git a/MiraAPI/Hud/CustomPlayerMenu.cs b/MiraAPI/Hud/CustomPlayerMenu.cs index b2cb47a..7c861ec 100644 --- a/MiraAPI/Hud/CustomPlayerMenu.cs +++ b/MiraAPI/Hud/CustomPlayerMenu.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using AmongUs.GameOptions; +using Il2CppInterop.Runtime.Attributes; using MiraAPI.Patches.Stubs; using Reactor.Utilities.Attributes; using Reactor.Utilities.Extensions; @@ -84,6 +85,7 @@ public class CustomPlayerMenu(IntPtr il2CppPtr) : Minigame(il2CppPtr) /// /// Function to determine if player should show in the custom menu. /// Onclick action for player. + [HideFromIl2Cpp] public void Begin(Func playerMatch, Action onClick) { MinigameStubs.Begin(this, null); diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 50597f6..f882f24 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -20,7 +20,7 @@ public static class ModifierManager { private static readonly Dictionary IdToTypeModifierMap = []; private static readonly Dictionary TypeToIdModifierMap = []; - private static readonly Dictionary> PrioritiesToTypesMap = []; + private static readonly Dictionary> PrioritiesToIdsMap = []; private static uint _nextId; @@ -66,36 +66,36 @@ public static class ModifierManager } var mod = Activator.CreateInstance(modifierType) as GameModifier; - var prio = mod!.Priority(); + var priority = mod!.Priority(); - if (!PrioritiesToTypesMap.TryGetValue(prio, out var list)) + if (!PrioritiesToIdsMap.TryGetValue(priority, out var list)) { - PrioritiesToTypesMap[prio] = list = []; + PrioritiesToIdsMap[priority] = list = []; } - list.Add(modifierType); + list.Add(_nextId); } internal static void AssignModifiers(List plrs) { var rand = new Random(); + var sequence = PrioritiesToIdsMap.Keys.OrderByDescending(x => x); - Dictionary filteredModifiers = []; - - foreach (var prioPairs in PrioritiesToTypesMap) + foreach (var priority in sequence) { - foreach (var modifier in prioPairs.Value) - { - var mod = Activator.CreateInstance(modifier) as GameModifier; - var id = TypeToIdModifierMap[modifier]; + var map = new List(); - if (!plrs.Exists(x => IsGameModifierValid(x, mod!, id))) + foreach (var modifier in PrioritiesToIdsMap[priority]) + { + var mod = Activator.CreateInstance(IdToTypeModifierMap[modifier]) as GameModifier; + + if (!plrs.Exists(x => IsGameModifierValid(x, mod!, modifier))) { Logger.Warning("No players are valid for modifier: " + mod!.ModifierName); continue; } - var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, id)); + var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, modifier)); var num = Math.Clamp(mod!.GetAmountPerGame(), 0, maxCount); var chance = mod.GetAssignmentChance(); @@ -105,44 +105,39 @@ public static class ModifierManager if (randomNum < Math.Clamp(chance, 0, 100)) { - filteredModifiers.Add(id, prioPairs.Key); + map.Add(modifier); } } } - } - var shuffledModifiers = filteredModifiers.ToList().Randomize().OrderByDescending(x => x.Value).Select(x => x.Key).ToList(); + var shuffledList = map.ToList().Randomize(); - if (shuffledModifiers.Count > plrs.Count) - { - shuffledModifiers = shuffledModifiers.GetRange(0, plrs.Count); - } - - while (shuffledModifiers.Count > 0) - { - var id = shuffledModifiers[0]; - - if (Activator.CreateInstance(IdToTypeModifierMap[id]) is not GameModifier mod) + if (shuffledList.Count > plrs.Count) { - Logger.Error($"Failed to create instance of {IdToTypeModifierMap[id].Name}"); - continue; + shuffledList = shuffledList.GetRange(0, plrs.Count)!; } - if (!plrs.Exists(x => IsGameModifierValid(x, mod, id))) + while (shuffledList.Count > 0) { - shuffledModifiers.RemoveAt(0); - continue; + var id = shuffledList[0]; + var mod = Activator.CreateInstance(IdToTypeModifierMap[id]) as GameModifier; + + if (!plrs.Exists(x => IsGameModifierValid(x, mod!, id))) + { + shuffledList.RemoveAt(0); + continue; + } + + var plr = plrs.Random(); + + if (plr == null || !IsGameModifierValid(plr, mod!, id)) + { + continue; + } + + shuffledList.RemoveAt(0); + plr.RpcAddModifier(id); } - - var plr = plrs.Random(); - - if (plr == null || !IsGameModifierValid(plr, mod, id)) - { - continue; - } - - shuffledModifiers.RemoveAt(0); - plr.RpcAddModifier(id); } } From b909fb7447c31d772c0113dbb68d3c6db976058f Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Sat, 5 Oct 2024 20:53:40 -0400 Subject: [PATCH 06/13] insurance --- MiraAPI/Modifiers/ModifierManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index f882f24..9fa700d 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -132,6 +132,7 @@ public static class ModifierManager if (plr == null || !IsGameModifierValid(plr, mod!, id)) { + shuffledList.RemoveAt(0); // Just some insurance continue; } From 14276b6c2bfe9ddb49df7762fe88107a0c29fae4 Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Sat, 5 Oct 2024 21:08:59 -0400 Subject: [PATCH 07/13] why check the players twice --- MiraAPI/Modifiers/ModifierManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 9fa700d..0edbc35 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -88,14 +88,14 @@ public static class ModifierManager foreach (var modifier in PrioritiesToIdsMap[priority]) { var mod = Activator.CreateInstance(IdToTypeModifierMap[modifier]) as GameModifier; + var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, modifier)); - if (!plrs.Exists(x => IsGameModifierValid(x, mod!, modifier))) + if (maxCount == 0) { Logger.Warning("No players are valid for modifier: " + mod!.ModifierName); continue; } - var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, modifier)); var num = Math.Clamp(mod!.GetAmountPerGame(), 0, maxCount); var chance = mod.GetAssignmentChance(); From 160d42470766e2b7955132bc061caa5981adff2b Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Sat, 5 Oct 2024 21:24:34 -0400 Subject: [PATCH 08/13] adding some logging to see what's wrong --- MiraAPI/Modifiers/ModifierManager.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 0edbc35..65ef738 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -78,17 +78,24 @@ public static class ModifierManager internal static void AssignModifiers(List plrs) { + foreach (var player in plrs) + { + Logger.Message(player.Data.PlayerName); + } + var rand = new Random(); var sequence = PrioritiesToIdsMap.Keys.OrderByDescending(x => x); foreach (var priority in sequence) { - var map = new List(); + var filteredModifiers = new List(); + Logger.Message(priority); - foreach (var modifier in PrioritiesToIdsMap[priority]) + foreach (var id in PrioritiesToIdsMap[priority]) { - var mod = Activator.CreateInstance(IdToTypeModifierMap[modifier]) as GameModifier; - var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, modifier)); + var mod = Activator.CreateInstance(IdToTypeModifierMap[id]) as GameModifier; + var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, id)); + Logger.Message(maxCount); if (maxCount == 0) { @@ -105,12 +112,12 @@ public static class ModifierManager if (randomNum < Math.Clamp(chance, 0, 100)) { - map.Add(modifier); + filteredModifiers.Add(id); } } } - var shuffledList = map.ToList().Randomize(); + var shuffledList = filteredModifiers.ToList().Randomize(); if (shuffledList.Count > plrs.Count) { From 246e40539ccf0e4f8780855c024187f0473b0d76 Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Sun, 6 Oct 2024 10:08:54 -0400 Subject: [PATCH 09/13] finally works --- MiraAPI/Modifiers/ModifierComponent.cs | 20 +++++++++++ MiraAPI/Modifiers/ModifierManager.cs | 49 ++++++++++++-------------- MiraAPI/Utilities/Extensions.cs | 4 +-- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/MiraAPI/Modifiers/ModifierComponent.cs b/MiraAPI/Modifiers/ModifierComponent.cs index 7558562..35a4d83 100644 --- a/MiraAPI/Modifiers/ModifierComponent.cs +++ b/MiraAPI/Modifiers/ModifierComponent.cs @@ -255,4 +255,24 @@ public class ModifierComponent(IntPtr cppPtr) : MonoBehaviour(cppPtr) { return AddModifier(typeof(T)) as T; } + + /// + /// Checks if a player has an active or queued modifier by its ID. + /// + /// The Modifier ID. + /// True if the Modifier is present, false otherwise. + public bool HasModifier(uint id) + { + return ActiveModifiers.Exists(x => x.ModifierId == id) || _toAdd.Exists(x => x.ModifierId == id); + } + + /// + /// Checks if a player has an active or queued modifier by its type. + /// + /// The Type of the Modifier. + /// True if the Modifier is present, false otherwise. + public bool HasModifier() + { + return ActiveModifiers.Exists(x => x is T) || _toAdd.Exists(x => x is T); + } } diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 65ef738..927a9ee 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -78,73 +78,68 @@ public static class ModifierManager internal static void AssignModifiers(List plrs) { - foreach (var player in plrs) - { - Logger.Message(player.Data.PlayerName); - } - var rand = new Random(); - var sequence = PrioritiesToIdsMap.Keys.OrderByDescending(x => x); - foreach (var priority in sequence) + foreach (var priority in PrioritiesToIdsMap.Keys.OrderByDescending(x => x)) { var filteredModifiers = new List(); - Logger.Message(priority); foreach (var id in PrioritiesToIdsMap[priority]) { var mod = Activator.CreateInstance(IdToTypeModifierMap[id]) as GameModifier; + var chance = Math.Clamp(mod!.GetAssignmentChance(), 0, 100); var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, id)); - Logger.Message(maxCount); + + if (chance == 0 || mod!.GetAmountPerGame() == 0) + { + continue; + } if (maxCount == 0) { - Logger.Warning("No players are valid for modifier: " + mod!.ModifierName); + Logger.Warning($"No players are valid for {mod!.ModifierName}"); continue; } var num = Math.Clamp(mod!.GetAmountPerGame(), 0, maxCount); - var chance = mod.GetAssignmentChance(); for (var i = 0; i < num; i++) { var randomNum = rand.Next(100); - if (randomNum < Math.Clamp(chance, 0, 100)) + if (randomNum < chance) { filteredModifiers.Add(id); } } } - var shuffledList = filteredModifiers.ToList().Randomize(); + if (filteredModifiers.Count == 0) + { + Logger.Warning($"No filtered modifiers for priority {priority}"); + continue; + } + + var shuffledList = filteredModifiers.Randomize(); if (shuffledList.Count > plrs.Count) { shuffledList = shuffledList.GetRange(0, plrs.Count)!; } - while (shuffledList.Count > 0) + foreach (var id in shuffledList) { - var id = shuffledList[0]; var mod = Activator.CreateInstance(IdToTypeModifierMap[id]) as GameModifier; + var plr = plrs.Where(x => IsGameModifierValid(x, mod!, id)).Random(); - if (!plrs.Exists(x => IsGameModifierValid(x, mod!, id))) + if (plr == null) { - shuffledList.RemoveAt(0); - continue; + Logger.Warning($"Somehow valid players for modifier {mod!.ModifierName} disappeared"); } - - var plr = plrs.Random(); - - if (plr == null || !IsGameModifierValid(plr, mod!, id)) + else { - shuffledList.RemoveAt(0); // Just some insurance - continue; + plr.RpcAddModifier(id); } - - shuffledList.RemoveAt(0); - plr.RpcAddModifier(id); } } } diff --git a/MiraAPI/Utilities/Extensions.cs b/MiraAPI/Utilities/Extensions.cs index f7c667a..ef5d1f2 100644 --- a/MiraAPI/Utilities/Extensions.cs +++ b/MiraAPI/Utilities/Extensions.cs @@ -194,7 +194,7 @@ public static class Extensions public static bool HasModifier(this PlayerControl? player) where T : BaseModifier { return player?.GetModifierComponent() != null && - player.GetModifierComponent()!.ActiveModifiers.Exists(x => x is T); + player.GetModifierComponent()!.HasModifier(); } /// @@ -206,7 +206,7 @@ public static class Extensions public static bool HasModifier(this PlayerControl? player, uint id) { return player?.GetModifierComponent() != null && - player.GetModifierComponent()!.ActiveModifiers.Exists(x => x.ModifierId == id); + player.GetModifierComponent()!.HasModifier(id); } /// From ed0c75acf8b81f785a5e4c9319d86cff8a17b35d Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Sun, 6 Oct 2024 10:14:46 -0400 Subject: [PATCH 10/13] move max count down a bit --- MiraAPI/Modifiers/ModifierManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 927a9ee..e2f4f6e 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -88,13 +88,14 @@ public static class ModifierManager { var mod = Activator.CreateInstance(IdToTypeModifierMap[id]) as GameModifier; var chance = Math.Clamp(mod!.GetAssignmentChance(), 0, 100); - var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, id)); if (chance == 0 || mod!.GetAmountPerGame() == 0) { continue; } + var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, id)); + if (maxCount == 0) { Logger.Warning($"No players are valid for {mod!.ModifierName}"); From 3d2f53ce250e62c298542e2d893fcc398326c58d Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:09:08 -0400 Subject: [PATCH 11/13] not get the count twice --- MiraAPI/Modifiers/ModifierManager.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index e2f4f6e..89c0b9d 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -88,8 +88,9 @@ public static class ModifierManager { var mod = Activator.CreateInstance(IdToTypeModifierMap[id]) as GameModifier; var chance = Math.Clamp(mod!.GetAssignmentChance(), 0, 100); + var count = mod!.GetAmountPerGame(); - if (chance == 0 || mod!.GetAmountPerGame() == 0) + if (chance == 0 || count == 0) { continue; } @@ -102,7 +103,7 @@ public static class ModifierManager continue; } - var num = Math.Clamp(mod!.GetAmountPerGame(), 0, maxCount); + var num = Math.Clamp(count, 0, maxCount); for (var i = 0; i < num; i++) { From 9fb8a6bda4a035fb591db3314202c98fa8851b6e Mon Sep 17 00:00:00 2001 From: AlchlcDvl <56699741+AlchlcDvl@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:41:09 -0400 Subject: [PATCH 12/13] make click handler public to allow forced behaviour --- MiraAPI/Hud/CustomActionButton.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MiraAPI/Hud/CustomActionButton.cs b/MiraAPI/Hud/CustomActionButton.cs index 0c89062..9502032 100644 --- a/MiraAPI/Hud/CustomActionButton.cs +++ b/MiraAPI/Hud/CustomActionButton.cs @@ -284,7 +284,7 @@ public abstract class CustomActionButton /// This method takes into account cooldowns, effects, and uses, before calling the method. /// It can be overridden for custom behavior. /// - protected virtual void ClickHandler() + public virtual void ClickHandler() { if (!CanUse()) { From 0fe6d98c67a4f532381a5ff639a863d690699905 Mon Sep 17 00:00:00 2001 From: XtraCube <72575280+XtraCube@users.noreply.github.com> Date: Sat, 21 Dec 2024 16:21:38 -0500 Subject: [PATCH 13/13] remove unnecessary stuff --- MiraAPI.Example/ExamplePlugin.cs | 4 ---- .../Modifiers/HighPriorityModifier.cs | 24 +++++++++++++++++++ MiraAPI/Events/MiraEventManager.cs | 1 - MiraAPI/Modifiers/ModifierManager.cs | 9 ++++--- MiraAPI/Networking/CustomMurderRpc.cs | 1 - .../Patches/Events/HudButtonEventPatches.cs | 1 - MiraAPI/Patches/Events/VentEventPatches.cs | 3 --- MiraAPI/Patches/HudManagerPatches.cs | 1 - MiraAPI/Patches/VentPatches.cs | 4 +--- MiraAPI/PluginLoading/MiraPluginInfo.cs | 4 ---- MiraAPI/Utilities/Assets/SpriteTools.cs | 2 -- 11 files changed, 29 insertions(+), 25 deletions(-) create mode 100644 MiraAPI.Example/Modifiers/HighPriorityModifier.cs diff --git a/MiraAPI.Example/ExamplePlugin.cs b/MiraAPI.Example/ExamplePlugin.cs index 4a62da2..b20ec41 100644 --- a/MiraAPI.Example/ExamplePlugin.cs +++ b/MiraAPI.Example/ExamplePlugin.cs @@ -2,14 +2,10 @@ using BepInEx.Configuration; using BepInEx.Unity.IL2CPP; using HarmonyLib; -using MiraAPI.Events; -using MiraAPI.Events.Mira; -using MiraAPI.Example.Buttons.Freezer; using MiraAPI.PluginLoading; using Reactor; using Reactor.Networking; using Reactor.Networking.Attributes; -using Reactor.Utilities; namespace MiraAPI.Example; diff --git a/MiraAPI.Example/Modifiers/HighPriorityModifier.cs b/MiraAPI.Example/Modifiers/HighPriorityModifier.cs new file mode 100644 index 0000000..c96507a --- /dev/null +++ b/MiraAPI.Example/Modifiers/HighPriorityModifier.cs @@ -0,0 +1,24 @@ +using MiraAPI.Modifiers; +using MiraAPI.Modifiers.Types; + +namespace MiraAPI.Example.Modifiers; + +[RegisterModifier] +public class HighPriorityModifier : GameModifier +{ + public override string ModifierName => "High Priority"; + public override int GetAssignmentChance() + { + return 100; + } + + public override int GetAmountPerGame() + { + return 1; + } + + public override int Priority() + { + return 100; + } +} diff --git a/MiraAPI/Events/MiraEventManager.cs b/MiraAPI/Events/MiraEventManager.cs index 7d6486c..3b4d5ce 100644 --- a/MiraAPI/Events/MiraEventManager.cs +++ b/MiraAPI/Events/MiraEventManager.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using BepInEx.Unity.IL2CPP; using Reactor.Utilities; namespace MiraAPI.Events; diff --git a/MiraAPI/Modifiers/ModifierManager.cs b/MiraAPI/Modifiers/ModifierManager.cs index 89c0b9d..fab840c 100644 --- a/MiraAPI/Modifiers/ModifierManager.cs +++ b/MiraAPI/Modifiers/ModifierManager.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using MiraAPI.Modifiers.Types; using MiraAPI.Networking; -using MiraAPI.PluginLoading; using MiraAPI.Roles; using MiraAPI.Utilities; using Reactor.Networking.Rpc; @@ -88,18 +87,18 @@ public static class ModifierManager { var mod = Activator.CreateInstance(IdToTypeModifierMap[id]) as GameModifier; var chance = Math.Clamp(mod!.GetAssignmentChance(), 0, 100); - var count = mod!.GetAmountPerGame(); + var count = mod.GetAmountPerGame(); if (chance == 0 || count == 0) { continue; } - var maxCount = plrs.Count(x => IsGameModifierValid(x, mod!, id)); + var maxCount = plrs.Count(x => IsGameModifierValid(x, mod, id)); if (maxCount == 0) { - Logger.Warning($"No players are valid for {mod!.ModifierName}"); + Logger.Warning($"No players are valid for {mod.ModifierName}"); continue; } @@ -126,7 +125,7 @@ public static class ModifierManager if (shuffledList.Count > plrs.Count) { - shuffledList = shuffledList.GetRange(0, plrs.Count)!; + shuffledList = shuffledList.GetRange(0, plrs.Count); } foreach (var id in shuffledList) diff --git a/MiraAPI/Networking/CustomMurderRpc.cs b/MiraAPI/Networking/CustomMurderRpc.cs index df565c2..e28ddf2 100644 --- a/MiraAPI/Networking/CustomMurderRpc.cs +++ b/MiraAPI/Networking/CustomMurderRpc.cs @@ -3,7 +3,6 @@ using System.Linq; using AmongUs.GameOptions; using Assets.CoreScripts; using BepInEx.Unity.IL2CPP.Utils; -using Discord; using MiraAPI.Events; using MiraAPI.Events.Vanilla; using Reactor.Networking.Attributes; diff --git a/MiraAPI/Patches/Events/HudButtonEventPatches.cs b/MiraAPI/Patches/Events/HudButtonEventPatches.cs index 8ea7c5b..42dde11 100644 --- a/MiraAPI/Patches/Events/HudButtonEventPatches.cs +++ b/MiraAPI/Patches/Events/HudButtonEventPatches.cs @@ -1,7 +1,6 @@ using HarmonyLib; using MiraAPI.Events; using MiraAPI.Events.Vanilla; -using Reactor.Utilities; namespace MiraAPI.Patches.Events; diff --git a/MiraAPI/Patches/Events/VentEventPatches.cs b/MiraAPI/Patches/Events/VentEventPatches.cs index f978f15..2617ff8 100644 --- a/MiraAPI/Patches/Events/VentEventPatches.cs +++ b/MiraAPI/Patches/Events/VentEventPatches.cs @@ -1,10 +1,7 @@ using System.Linq; -using BepInEx.Unity.IL2CPP.Utils.Collections; using HarmonyLib; using MiraAPI.Events; using MiraAPI.Events.Vanilla; -using MiraAPI.Utilities; -using Reactor.Utilities; namespace MiraAPI.Patches.Events; diff --git a/MiraAPI/Patches/HudManagerPatches.cs b/MiraAPI/Patches/HudManagerPatches.cs index af7057d..85d7750 100644 --- a/MiraAPI/Patches/HudManagerPatches.cs +++ b/MiraAPI/Patches/HudManagerPatches.cs @@ -1,6 +1,5 @@ using HarmonyLib; using MiraAPI.Hud; -using MiraAPI.Roles; using Reactor.Utilities.Extensions; using UnityEngine; using Object = UnityEngine.Object; diff --git a/MiraAPI/Patches/VentPatches.cs b/MiraAPI/Patches/VentPatches.cs index f976af5..66c9aae 100644 --- a/MiraAPI/Patches/VentPatches.cs +++ b/MiraAPI/Patches/VentPatches.cs @@ -1,8 +1,6 @@ -using System.Linq; -using HarmonyLib; +using HarmonyLib; using MiraAPI.Roles; using MiraAPI.Utilities; -using Reactor.Utilities; using UnityEngine; namespace MiraAPI.Patches; diff --git a/MiraAPI/PluginLoading/MiraPluginInfo.cs b/MiraAPI/PluginLoading/MiraPluginInfo.cs index ecdfa5e..25a4dca 100644 --- a/MiraAPI/PluginLoading/MiraPluginInfo.cs +++ b/MiraAPI/PluginLoading/MiraPluginInfo.cs @@ -3,12 +3,8 @@ using BepInEx.Configuration; using MiraAPI.GameModes; using MiraAPI.GameOptions; using System.Collections.Generic; -using System.Collections.Immutable; using System.Collections.ObjectModel; -using System.Linq; -using MiraAPI.GameOptions.OptionTypes; using MiraAPI.Hud; -using MiraAPI.Roles; namespace MiraAPI.PluginLoading; diff --git a/MiraAPI/Utilities/Assets/SpriteTools.cs b/MiraAPI/Utilities/Assets/SpriteTools.cs index d8da0d0..b168435 100644 --- a/MiraAPI/Utilities/Assets/SpriteTools.cs +++ b/MiraAPI/Utilities/Assets/SpriteTools.cs @@ -1,7 +1,5 @@ using System; using System.Reflection; -using Il2CppInterop.Runtime; -using Il2CppInterop.Runtime.InteropTypes.Arrays; using Reactor.Utilities; using Reactor.Utilities.Extensions; using UnityEngine;