From 0b8f284676a3d109e1c49715f9e092f4c986d85a Mon Sep 17 00:00:00 2001 From: D1GQ Date: Fri, 26 Jun 2026 22:32:04 -0500 Subject: [PATCH] Add ability to count votes in force skip command --- src/Commands/ForceSkipCommand.cs | 36 +++++++++++++++++-- src/Commands/KickCommand.cs | 3 +- src/Commands/RemovePlayerCommand.cs | 15 ++++---- src/Commands/SetPrefixCommand.cs | 5 ++- .../Gameplay/UI/Chat/ChatCommandsPatch.cs | 4 +-- 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/Commands/ForceSkipCommand.cs b/src/Commands/ForceSkipCommand.cs index bb439e9..e95fcfe 100644 --- a/src/Commands/ForceSkipCommand.cs +++ b/src/Commands/ForceSkipCommand.cs @@ -1,5 +1,7 @@ using BetterAmongUs.Attributes; +using BetterAmongUs.Commands.Arguments; using BetterAmongUs.Modules; +using BetterAmongUs.Utilities.Extension; namespace BetterAmongUs.Commands; @@ -25,12 +27,42 @@ internal sealed class ForceSkipCommand : BaseCommand return base.CanRunCommand(out reason); } + public ForceSkipCommand() + { + _boolArgument = new BoolArgument(this, "{count votes}"); + Arguments = [_boolArgument]; + } + private readonly BoolArgument _boolArgument; + internal override void Run() { + if (!_boolArgument.TryParse(out var countVotes)) + return; + if (GameState.IsHost) { - var states = Array.Empty(); - MeetingHud.Instance.RpcVotingComplete(states, null, false); + if (!countVotes) + { + var states = Array.Empty(); + MeetingHud.Instance.RpcVotingComplete(states, null, false); + } + else + { + var dictionary = MeetingHud.Instance.CalculateVotes(); + var max = dictionary.MaxPair(out bool tie); + NetworkedPlayerInfo? networkedPlayerInfo = GameData.Instance.AllPlayers.FirstOrDefaultIl2Cpp((NetworkedPlayerInfo v) => !tie && v.PlayerId == max.Key); + MeetingHud.VoterState[] array = new MeetingHud.VoterState[MeetingHud.Instance.playerStates.Length]; + for (int i = 0; i < MeetingHud.Instance.playerStates.Length; i++) + { + PlayerVoteArea playerVoteArea = MeetingHud.Instance.playerStates[i]; + array[i] = new MeetingHud.VoterState + { + VoterId = playerVoteArea.TargetPlayerId, + VotedForId = playerVoteArea.VotedFor + }; + } + MeetingHud.Instance.RpcVotingComplete(array, networkedPlayerInfo, tie); + } } } } diff --git a/src/Commands/KickCommand.cs b/src/Commands/KickCommand.cs index 65da31f..d2ce97c 100644 --- a/src/Commands/KickCommand.cs +++ b/src/Commands/KickCommand.cs @@ -34,8 +34,7 @@ internal sealed class KickCommand : BaseCommand if (!_playerArgument.TryParse(out var player)) return; - var isBan = _boolArgument.TryParse(out var ban); - if (!isBan) + if (!_boolArgument.TryParse(out var ban)) return; if (!player.IsHost()) diff --git a/src/Commands/RemovePlayerCommand.cs b/src/Commands/RemovePlayerCommand.cs index 3db6518..34a83e0 100644 --- a/src/Commands/RemovePlayerCommand.cs +++ b/src/Commands/RemovePlayerCommand.cs @@ -26,13 +26,16 @@ internal sealed class RemovePlayerCommand : BaseCommand internal override void Run() { - if (BetterDataManager.RemovePlayer(_identifierArgument.Arg) == true) + if (_identifierArgument.TryParse(out var identifierArgument)) { - Utils.AddChatPrivate($"{_identifierArgument.Arg} successfully removed from local Anti-Cheat data!"); - } - else - { - Utils.AddChatPrivate($"{_identifierArgument.Arg} Could not find player data from identifier"); + if (BetterDataManager.RemovePlayer(identifierArgument) == true) + { + Utils.AddChatPrivate($"{identifierArgument} successfully removed from local Anti-Cheat data!"); + } + else + { + Utils.AddChatPrivate($"{identifierArgument} Could not find player data from identifier"); + } } } } diff --git a/src/Commands/SetPrefixCommand.cs b/src/Commands/SetPrefixCommand.cs index da0fd48..8656075 100644 --- a/src/Commands/SetPrefixCommand.cs +++ b/src/Commands/SetPrefixCommand.cs @@ -24,7 +24,10 @@ internal sealed class SetPrefixCommand : BaseCommand internal override void Run() { var oldPrefix = BAUConfigs.CommandPrefix.Value; - var prefix = _prefixArgument.Arg.ToCharArray()?.First().ToString(); + if (!_prefixArgument.TryParse(out var prefix)) + return; + + prefix = prefix.ToCharArray()?.First().ToString(); if (!string.IsNullOrEmpty(prefix)) { BAUConfigs.CommandPrefix.Value = prefix; diff --git a/src/Patches/Gameplay/UI/Chat/ChatCommandsPatch.cs b/src/Patches/Gameplay/UI/Chat/ChatCommandsPatch.cs index 6d74d51..74b5ba9 100644 --- a/src/Patches/Gameplay/UI/Chat/ChatCommandsPatch.cs +++ b/src/Patches/Gameplay/UI/Chat/ChatCommandsPatch.cs @@ -1,8 +1,8 @@ using BetterAmongUs.Commands; using BetterAmongUs.Data.Config; -using BetterAmongUs.Utilities; using BetterAmongUs.Modules; using BetterAmongUs.Modules.Support; +using BetterAmongUs.Utilities; using HarmonyLib; using TMPro; using UnityEngine; @@ -194,7 +194,7 @@ internal static class ChatCommandsPatch // Red text if command cannot be run if (!closestCommand.CanRunCommand(out string _)) { - fullSuggestion = fullSuggestion.ToColor("#FF0300".HexToColor()); + fullSuggestion = fullSuggestion.ToColor("#FF0300"); } // Update UI elements