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];
}