diff --git a/AmongUs.props b/AmongUs.props index afc343f..ba7e7f2 100644 --- a/AmongUs.props +++ b/AmongUs.props @@ -2,7 +2,7 @@ - + diff --git a/MiraAPI/Events/Vanilla/Meeting/Voting/ProcessVotesEvent.cs b/MiraAPI/Events/Vanilla/Meeting/Voting/ProcessVotesEvent.cs index a61cc51..8e4894a 100644 --- a/MiraAPI/Events/Vanilla/Meeting/Voting/ProcessVotesEvent.cs +++ b/MiraAPI/Events/Vanilla/Meeting/Voting/ProcessVotesEvent.cs @@ -33,6 +33,16 @@ public class ProcessVotesEvent(List votes, NetworkedPlayerInfo? exil /// public List Votes { get; } = votes; + /// + /// Gets or sets a value indicating whether an overruling was done. Normally set by judge but can be overwritten. + /// + public bool OverruledVote { get; set; } + + /// + /// Gets or sets a value specifically to determine which Judge (if any) caused the overruling. Normally set by judge but can be overwritten. + /// + public ushort OverruledNonce { get; set; } + /// /// Gets or sets the player to be exiled. Will be if no player is to be exiled. /// diff --git a/MiraAPI/Patches/Voting/MeetingHudPatches.cs b/MiraAPI/Patches/Voting/MeetingHudPatches.cs index 7a4338a..ed71003 100644 --- a/MiraAPI/Patches/Voting/MeetingHudPatches.cs +++ b/MiraAPI/Patches/Voting/MeetingHudPatches.cs @@ -77,7 +77,7 @@ internal static class MeetingHudPatches [HarmonyPatch(nameof(MeetingHud.Update))] public static void ForceSkipPatch(MeetingHud __instance) { - if (__instance.state is not (MeetingHud.VoteStates.NotVoted or MeetingHud.VoteStates.Voted)) + if (__instance.state is not (MeetingHud.MeetingStates.NotVoted or MeetingHud.MeetingStates.Voted)) { return; } @@ -127,13 +127,13 @@ internal static class MeetingHudPatches return false; } - var playerVoteArea = __instance.playerStates.First(pv => pv.TargetPlayerId == pc.PlayerId); + var playerVoteArea = __instance.playerStates.First(pv => pv.PlayerId == pc.PlayerId); playerVoteArea.AmDead = true; playerVoteArea.Overlay.gameObject.SetActive(true); foreach (var player in Helpers.GetAlivePlayers()) { - var pva = __instance.playerStates.First(pv => pv.TargetPlayerId == player.PlayerId); + var pva = __instance.playerStates.First(pv => pv.PlayerId == player.PlayerId); var voteData = player.GetVoteData(); if (pva.AmDead || !voteData.VotedFor(pc.PlayerId)) @@ -150,7 +150,7 @@ internal static class MeetingHudPatches __instance.SetDirtyBit(1U); __instance.CheckForEndVoting(); - if (__instance.state == MeetingHud.VoteStates.Results) + if (__instance.state == MeetingHud.MeetingStates.Results) { __instance.SetupProceedButton(); } @@ -199,7 +199,7 @@ internal static class MeetingHudPatches }) ]); - __instance.RpcVotingComplete(voterStates, exiled, isTie); + __instance.RpcVotingComplete(voterStates, exiled, isTie, @event.OverruledVote, @event.OverruledNonce); return false; } diff --git a/MiraAPI/Utilities/Extensions.cs b/MiraAPI/Utilities/Extensions.cs index 53e395e..ede8c0f 100644 --- a/MiraAPI/Utilities/Extensions.cs +++ b/MiraAPI/Utilities/Extensions.cs @@ -164,7 +164,7 @@ public static class Extensions /// /// The . /// The player's . - public static PlayerControl? GetPlayer(this PlayerVoteArea state) => GameData.Instance.GetPlayerById(state.TargetPlayerId)?.Object; + public static PlayerControl? GetPlayer(this PlayerVoteArea state) => GameData.Instance.GetPlayerById(state.PlayerId)?.Object; /// /// Gets an representing the amount of tasks a player has left. diff --git a/MiraAPI/VanillaEvents/JudgeEvents.cs b/MiraAPI/VanillaEvents/JudgeEvents.cs new file mode 100644 index 0000000..639642e --- /dev/null +++ b/MiraAPI/VanillaEvents/JudgeEvents.cs @@ -0,0 +1,22 @@ +using MiraAPI.Events; +using MiraAPI.Events.Vanilla.Meeting.Voting; +using MiraAPI.Roles; + +namespace MiraAPI.VanillaEvents; + +public static class JudgeEvents +{ + [RegisterEvent(100000)] + public static void ProcessVotesEventHandler(ProcessVotesEvent @event) + { + if (MeetingHud.Instance.TryGetWinningOverrule(out var judgeOverrule, out var networkedPlayerInfo, out var networkedPlayerInfo2)) + { + @event.OverruledVote = true; + @event.OverruledNonce = judgeOverrule.OverruleNonce; + + @event.ExiledPlayer = networkedPlayerInfo2.Role is ICustomRole { Team: not ModdedRoleTeams.Crewmate } || networkedPlayerInfo2.Role.TeamType == RoleTeamTypes.Impostor + ? GameData.Instance.GetPlayerById(judgeOverrule.OverruledPlayerId) + : networkedPlayerInfo; + } + } +} diff --git a/MiraAPI/Voting/VotingUtils.cs b/MiraAPI/Voting/VotingUtils.cs index fb117e4..fdbdce1 100644 --- a/MiraAPI/Voting/VotingUtils.cs +++ b/MiraAPI/Voting/VotingUtils.cs @@ -75,14 +75,14 @@ public static class VotingUtils { if (!source.IsHost()) return; - MeetingHud.Instance.playerStates.First(state => state.TargetPlayerId == voterId).UnsetVote(); + MeetingHud.Instance.playerStates.First(state => state.PlayerId == voterId).UnsetVote(); if (PlayerControl.LocalPlayer.PlayerId != voterId) { return; } - MeetingHud.Instance.playerStates.First(state => state.TargetPlayerId == votedFor).ThumbsDown.enabled = false; + MeetingHud.Instance.playerStates.First(state => state.PlayerId == votedFor).ThumbsDown.enabled = false; if (!AmongUsClient.Instance.AmHost) { @@ -93,10 +93,10 @@ public static class VotingUtils foreach (var t in MeetingHud.Instance.playerStates) { - t.voteComplete = false; + t.VoteComplete = false; } - MeetingHud.Instance.SkipVoteButton.voteComplete = false; + MeetingHud.Instance.SkipVoteButton.VoteComplete = false; MeetingHud.Instance.SkipVoteButton.gameObject.SetActive(true); } @@ -137,7 +137,7 @@ public static class VotingUtils var localVoteData = PlayerControl.LocalPlayer.GetVoteData(); if (!localVoteData || localVoteData.VotesRemaining != 0) return; - MeetingHud.Instance.SkipVoteButton.voteComplete = true; + MeetingHud.Instance.SkipVoteButton.VoteComplete = true; MeetingHud.Instance.SkipVoteButton.gameObject.SetActive(false); } @@ -146,7 +146,7 @@ public static class VotingUtils // If player has no more votes, then make it show that the player has used all their votes. if (voteData.VotesRemaining == 0) { - MeetingHud.Instance.playerStates.First(x => x.TargetPlayerId == srcPlayerId).SetVote(suspectPlayerId); + MeetingHud.Instance.playerStates.First(x => x.PlayerId == srcPlayerId).SetVote(suspectPlayerId); } // If host, then check end voting, and set votes/send chat if applicable @@ -233,7 +233,7 @@ public static class VotingUtils MeetingHud.Instance.BloopAVoteIcon(playerById, num, MeetingHud.Instance.SkippedVoting.transform); num++; } - else if (vote.Suspect == playerVoteArea.TargetPlayerId) + else if (vote.Suspect == playerVoteArea.PlayerId) { if (!delays.TryAdd(vote.Suspect, 0)) {