From 06ab2542c0b2552afd29ebcc61d1f673dd21c506 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Fri, 28 Aug 2026 17:48:35 -0500 Subject: [PATCH] Make PlayerInfo command use NetworkedPlayerInfo --- src/Commands/Arguments/PlayerArgument.cs | 4 -- src/Commands/Arguments/PlayerInfoArgument.cs | 76 ++++++++++++++++++++ src/Commands/PlayerInfoCommand.cs | 24 ++++--- src/Commands/RemovePlayerCommand.cs | 4 +- 4 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 src/Commands/Arguments/PlayerInfoArgument.cs diff --git a/src/Commands/Arguments/PlayerArgument.cs b/src/Commands/Arguments/PlayerArgument.cs index 0f32627..e6d4503 100644 --- a/src/Commands/Arguments/PlayerArgument.cs +++ b/src/Commands/Arguments/PlayerArgument.cs @@ -36,8 +36,6 @@ internal sealed class PlayerArgument(BaseCommand command, string argInfo = "{pla /// /// Tries to parse the player argument and find the corresponding PlayerControl. /// - /// - /// internal override bool TryParse(out PlayerControl result) { foreach (var player in BAUPlugin.AllPlayerControls) @@ -59,8 +57,6 @@ internal sealed class PlayerArgument(BaseCommand command, string argInfo = "{pla /// /// Checks if the given player info matches the argument value. /// - /// - /// private bool IsMatchingPlayer(NetworkedPlayerInfo data) { return Arg.Equals(data.PlayerName.Replace(' ', '_'), StringComparison.OrdinalIgnoreCase) diff --git a/src/Commands/Arguments/PlayerInfoArgument.cs b/src/Commands/Arguments/PlayerInfoArgument.cs new file mode 100644 index 0000000..0d66403 --- /dev/null +++ b/src/Commands/Arguments/PlayerInfoArgument.cs @@ -0,0 +1,76 @@ +using BetterAmongUs.Utilities; + +namespace BetterAmongUs.Commands.Arguments; + +/// +/// Represents a player command argument. +/// +/// The command this argument belongs to. +/// Information about the argument (default: "{player}"). +internal sealed class PlayerInfoArgument(BaseCommand command, string argInfo = "{player}") : BaseArgument(command, argInfo) +{ + protected override string[] GetArgSuggestions() + { + List suggestions = []; + var allPlayers = GameData.Instance.AllPlayers; + int count = allPlayers.Count; + + for (int i = 0; i < count; i++) + { + var playerData = allPlayers[i]; + if (playerData.IsLocalData()) + { + int insertIndex = suggestions.Count; + + if (!string.IsNullOrEmpty(playerData.PlayerName)) + suggestions.Insert(insertIndex, playerData.PlayerName.Replace(' ', '_')); + + if (!string.IsNullOrEmpty(playerData.FriendCode)) + suggestions.Insert(insertIndex + 1, playerData.FriendCode); + + suggestions.Insert(insertIndex + 2, $"ID{playerData.PlayerId}"); + } + else + { + if (!string.IsNullOrEmpty(playerData.PlayerName)) + suggestions.Add(playerData.PlayerName.Replace(' ', '_')); + + if (!string.IsNullOrEmpty(playerData.FriendCode)) + suggestions.Add(playerData.FriendCode); + + suggestions.Add($"ID{playerData.PlayerId}"); + } + } + + return [.. suggestions]; + } + + /// + /// Tries to parse the player argument and find the corresponding PlayerControl. + /// + internal override bool TryParse(out NetworkedPlayerInfo result) + { + foreach (var playerData in GameData.Instance.AllPlayers) + { + if (IsMatchingPlayer(playerData)) + { + result = playerData; + return true; + } + } + + result = default!; + BaseCommand.CommandErrorText("Player not found!"); + return false; + } + + /// + /// Checks if the given player info matches the argument value. + /// + private bool IsMatchingPlayer(NetworkedPlayerInfo data) + { + return Arg.Equals(data.PlayerName.Replace(' ', '_'), StringComparison.OrdinalIgnoreCase) + || Arg.Equals(data.FriendCode, StringComparison.OrdinalIgnoreCase) + || Arg.Equals($"ID{data.PlayerId}", StringComparison.OrdinalIgnoreCase); + } +} \ No newline at end of file diff --git a/src/Commands/PlayerInfoCommand.cs b/src/Commands/PlayerInfoCommand.cs index 3b0cd1c..ce9a0d5 100644 --- a/src/Commands/PlayerInfoCommand.cs +++ b/src/Commands/PlayerInfoCommand.cs @@ -13,29 +13,33 @@ internal sealed class PlayerInfoCommand : BaseCommand public PlayerInfoCommand() { - _playerArgument = new PlayerArgument(this); + _playerArgument = new PlayerInfoArgument(this); Arguments = [_playerArgument]; } - private readonly PlayerArgument _playerArgument; + private readonly PlayerInfoArgument _playerArgument; internal override void Run() { - if (!_playerArgument.TryParse(out var player)) + if (!_playerArgument.TryParse(out var playerData)) return; - if (player.Data == null) + if (playerData == null) return; StringBuilder sb = new(); - var hexColor = Utils.Color32ToHex(Palette.PlayerColors[player.CurrentOutfit.ColorId]); + var hexColor = Utils.Color32ToHex(Palette.PlayerColors[playerData.DefaultOutfit.ColorId]); var format1 = "┌ •"; var format2 = "├ •"; var format3 = "└ •"; - sb.Append($"{player.Data.PlayerName} Info:\n"); - sb.Append($"{format1} ID: {player.Data.PlayerId}\n"); - sb.Append($"{format2} HashPUID: {Utils.GetHashStr($"{player.Data.Puid}")}\n"); - sb.Append($"{format2} Platform: {Utils.GetPlatformName(player)}\n"); - sb.Append($"{format3} FriendCode: {player.Data.FriendCode}"); + sb.Append($"{playerData.PlayerName} Info:\n"); + sb.Append($"{format1} ID: {playerData.PlayerId}\n"); + sb.Append($"{format2} HashPUID: {Utils.GetHashStr($"{playerData.Puid}")}\n"); + var client = Utils.ClientFromClientId(playerData.ClientId); + if (client != null) + { + sb.Append($"{format2} Platform: {Utils.GetPlatformName(client.PlatformData.Platform)}\n"); + } + sb.Append($"{format3} FriendCode: {playerData.FriendCode}"); CommandResultText(sb.ToString()); } } diff --git a/src/Commands/RemovePlayerCommand.cs b/src/Commands/RemovePlayerCommand.cs index 34a83e0..5b49089 100644 --- a/src/Commands/RemovePlayerCommand.cs +++ b/src/Commands/RemovePlayerCommand.cs @@ -16,9 +16,7 @@ internal sealed class RemovePlayerCommand : BaseCommand _identifierArgument = new StringArgument(this, "{identifier}") { ArgSuggestions = () => - BetterDataManager.Files.BetterDataFile.AllCheatData - .SelectMany(info => new[] { info.HashPuid.Replace(' ', '_'), info.FriendCode.Replace(' ', '_'), info.PlayerName.Replace(' ', '_') }) - .ToArray() + [.. BetterDataManager.Files.BetterDataFile.AllCheatData.SelectMany(info => new[] { info.HashPuid.Replace(' ', '_'), info.FriendCode.Replace(' ', '_'), info.PlayerName.Replace(' ', '_') })] }; Arguments = [_identifierArgument]; }