diff --git a/MiraAPI/Modifiers/Types/GameModifier.cs b/MiraAPI/Modifiers/Types/GameModifier.cs
index abcd1f7..13f6754 100644
--- a/MiraAPI/Modifiers/Types/GameModifier.cs
+++ b/MiraAPI/Modifiers/Types/GameModifier.cs
@@ -34,7 +34,7 @@ public abstract class GameModifier : BaseModifier
public virtual bool IsModifierValidOn(RoleBehaviour role) => true;
///
- /// Determines whether the player won the game with this modifier.
+ /// Determines whether the player won the game with this modifier. The modifier with the highest priority will override other modifiers.
///
/// 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.
diff --git a/MiraAPI/Patches/Modifiers/EndGameDidWinPatch.cs b/MiraAPI/Patches/Modifiers/EndGameDidWinPatch.cs
index 1a7046c..eee933c 100644
--- a/MiraAPI/Patches/Modifiers/EndGameDidWinPatch.cs
+++ b/MiraAPI/Patches/Modifiers/EndGameDidWinPatch.cs
@@ -1,19 +1,20 @@
-using System.Linq;
+using System.Collections.Generic;
+using System.Linq;
using HarmonyLib;
using MiraAPI.Modifiers;
using MiraAPI.Modifiers.Types;
-using MiraAPI.Utilities;
-using Reactor.Utilities;
namespace MiraAPI.Patches.Modifiers;
[HarmonyPatch(typeof(AmongUsClient), nameof(AmongUsClient.OnGameEnd))]
-public static class EndGameDidWinPatch
+internal static class EndGameDidWinPatch
{
- public static void Postfix()
+ private static List CachedWinners { get; set; } = [];
+
+ public static void Prefix(EndGameResult endGameResult)
{
- var gameOverReason = EndGameResult.CachedGameOverReason;
- EndGameResult.CachedWinners.Clear();
+ CachedWinners.Clear();
+ var gameOverReason = endGameResult.GameOverReason;
var players = GameData.Instance.AllPlayers.ToArray();
for (var i = 0; i < GameData.Instance.PlayerCount; i++)
@@ -26,25 +27,37 @@ public static class EndGameDidWinPatch
var didWin = networkedPlayerInfo.Role.DidWin(gameOverReason);
- bool? modifierDidWin = null;
+ if (!networkedPlayerInfo.Object)
+ {
+ if (didWin)
+ {
+ CachedWinners.Add(new CachedPlayerData(networkedPlayerInfo));
+ }
+ continue;
+ }
+
foreach (var modifier in networkedPlayerInfo.Object.GetModifiers().OrderByDescending(x => x.Priority()))
{
var result = modifier.DidWin(gameOverReason);
if (!result.HasValue) continue;
- modifierDidWin = result.Value;
+ didWin = result.Value;
break;
}
- if (modifierDidWin.HasValue)
- {
- didWin = modifierDidWin.Value;
- }
-
if (didWin)
{
- EndGameResult.CachedWinners.Add(new CachedPlayerData(networkedPlayerInfo));
+ CachedWinners.Add(new CachedPlayerData(networkedPlayerInfo));
}
}
}
+
+ public static void Postfix(EndGameResult endGameResult)
+ {
+ EndGameResult.CachedWinners.Clear();
+ foreach (var winner in CachedWinners)
+ {
+ EndGameResult.CachedWinners.Add(winner);
+ }
+ }
}