diff --git a/CHANGELOG.md b/CHANGELOG.md index 54e5d06a..c1fdfeca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin * Replace `TShock.CheckTilePermission` with `TSPlayer.HasBuildPermission`, `TSPlayer.HasPaintPermission`, and `TSPlayer.HasModifiedIceSuccessfully` respectively. (@hakusaro) * Fix stack hack detection being inconsistent between two different check points. Moved `TShock.HackedInventory` to `TSPlayer.HasHackedItemStacks`. Added `GetDataHandlers.GetDataHandledEventArgs` which is where most hooks will inherit from in the future. (@hakusaro) * All `GetDataHandlers` hooks now inherit from `GetDataHandledEventArgs` which includes a `TSPlayer` and a `MemoryStream` of raw data. (@hakusaro) +* Replaced `Utils.FindPlayer` with `TSPlayer.FindByNameOrID` to more appropriately be object orientated. (@hakusaro) ## TShock 4.3.25 * Fixed a critical exploit in the Terraria protocol that could cause massive unpreventable world corruption as well as a number of other problems. Thanks to @bartico6 for reporting. Fixed by the efforts of @QuiCM, @hakusaro, and tips in the right directioon from @bartico6. diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 542d3367..68a3619a 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1195,7 +1195,7 @@ namespace TShockAPI return; } - var players = TShock.Utils.FindPlayer(args.Parameters[0]); + var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count < 1) args.Player.SendErrorMessage("Invalid player."); else if (players.Count > 1) @@ -1265,7 +1265,7 @@ namespace TShockAPI } string plStr = args.Parameters[0]; - var players = TShock.Utils.FindPlayer(plStr); + var players = TSPlayer.FindByNameOrID(plStr); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -1308,7 +1308,7 @@ namespace TShockAPI string targetGeneralizedName = ""; // Effective ban target assignment - List players = TShock.Utils.FindPlayer(args.Parameters[1]); + List players = TSPlayer.FindByNameOrID(args.Parameters[1]); UserAccount offlineUserAccount = TShock.UserAccounts.GetUserAccountByName(args.Parameters[1]); // Storage variable to determine if the command executor is the server console @@ -1658,7 +1658,7 @@ namespace TShockAPI } string playerNameToMatch = string.Join(" ", args.Parameters); - var matchedPlayers = TShock.Utils.FindPlayer(playerNameToMatch); + var matchedPlayers = TSPlayer.FindByNameOrID(playerNameToMatch); if (matchedPlayers.Count < 1) { args.Player.SendErrorMessage("No players matched \"{0}\".", playerNameToMatch); @@ -1696,7 +1696,7 @@ namespace TShockAPI TSPlayer targetPlayer = args.Player; if (args.Parameters.Count == 1 && args.Player.HasPermission(Permissions.uploadothersdata)) { - List players = TShock.Utils.FindPlayer(args.Parameters[0]); + List players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count > 1) { TShock.Utils.SendMultipleMatchError(args.Player, players.Select(p => p.Name)); @@ -1777,7 +1777,7 @@ namespace TShockAPI return; } - List ply = TShock.Utils.FindPlayer(args.Parameters[0]); + List ply = TSPlayer.FindByNameOrID(args.Parameters[0]); if (ply.Count < 1) { args.Player.SendErrorMessage("Could not find player {0}.", args.Parameters[0]); @@ -2396,7 +2396,7 @@ namespace TShockAPI if (args.Parameters.Count == 1) { - var players = TShock.Utils.FindPlayer(args.Parameters[0]); + var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count == 0) args.Player.SendErrorMessage("Invalid player!"); else if (players.Count > 1) @@ -2425,8 +2425,8 @@ namespace TShockAPI return; } - var players1 = TShock.Utils.FindPlayer(args.Parameters[0]); - var players2 = TShock.Utils.FindPlayer(args.Parameters[1]); + var players1 = TSPlayer.FindByNameOrID(args.Parameters[0]); + var players2 = TSPlayer.FindByNameOrID(args.Parameters[1]); if (players2.Count == 0) args.Player.SendErrorMessage("Invalid player!"); @@ -2520,7 +2520,7 @@ namespace TShockAPI } string playerName = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(playerName); + var players = TSPlayer.FindByNameOrID(playerName); if (players.Count == 0) { if (playerName == "*") @@ -2605,7 +2605,7 @@ namespace TShockAPI player = String.Join(" ", args.Parameters); } - var players = TShock.Utils.FindPlayer(player); + var players = TSPlayer.FindByNameOrID(player); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -2766,7 +2766,7 @@ namespace TShockAPI return; } - var foundplr = TShock.Utils.FindPlayer(args.Parameters[1]); + var foundplr = TSPlayer.FindByNameOrID(args.Parameters[1]); if (foundplr.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -4075,7 +4075,7 @@ namespace TShockAPI } string plStr = args.Parameters[0]; - var players = TShock.Utils.FindPlayer(plStr); + var players = TSPlayer.FindByNameOrID(plStr); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -4929,7 +4929,7 @@ namespace TShockAPI return; } - var players = TShock.Utils.FindPlayer(args.Parameters[0]); + var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -4977,7 +4977,7 @@ namespace TShockAPI return; } - var players = TShock.Utils.FindPlayer(args.Parameters[0]); + var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -5029,7 +5029,7 @@ namespace TShockAPI int annoy = 5; int.TryParse(args.Parameters[1], out annoy); - var players = TShock.Utils.FindPlayer(args.Parameters[0]); + var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count == 0) args.Player.SendErrorMessage("Invalid player!"); else if (players.Count > 1) @@ -5049,7 +5049,7 @@ namespace TShockAPI args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}confuse ", Specifier); return; } - var players = TShock.Utils.FindPlayer(args.Parameters[0]); + var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count == 0) args.Player.SendErrorMessage("Invalid player!"); else if (players.Count > 1) @@ -5069,7 +5069,7 @@ namespace TShockAPI args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}rocket ", Specifier); return; } - var players = TShock.Utils.FindPlayer(args.Parameters[0]); + var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count == 0) args.Player.SendErrorMessage("Invalid player!"); else if (players.Count > 1) @@ -5098,7 +5098,7 @@ namespace TShockAPI args.Player.SendErrorMessage("Invalid syntax! Proper syntax: {0}firework [red|green|blue|yellow]", Specifier); return; } - var players = TShock.Utils.FindPlayer(args.Parameters[0]); + var players = TSPlayer.FindByNameOrID(args.Parameters[0]); if (players.Count == 0) args.Player.SendErrorMessage("Invalid player!"); else if (players.Count > 1) @@ -5266,7 +5266,7 @@ namespace TShockAPI } string plStr = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(plStr); + var players = TSPlayer.FindByNameOrID(plStr); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -5531,7 +5531,7 @@ namespace TShockAPI if (item.type >= 1 && item.type < Main.maxItemTypes) { - var players = TShock.Utils.FindPlayer(plStr); + var players = TSPlayer.FindByNameOrID(plStr); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -5577,7 +5577,7 @@ namespace TShockAPI if (args.Parameters.Count > 0) { string plStr = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(plStr); + var players = TSPlayer.FindByNameOrID(plStr); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -5662,7 +5662,7 @@ namespace TShockAPI } int id = 0; int time = 60; - var foundplr = TShock.Utils.FindPlayer(args.Parameters[0]); + var foundplr = TSPlayer.FindByNameOrID(args.Parameters[0]); if (foundplr.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); @@ -5794,7 +5794,7 @@ namespace TShockAPI return; } string plStr = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(plStr); + var players = TSPlayer.FindByNameOrID(plStr); if (players.Count == 0) { args.Player.SendErrorMessage("Invalid player!"); diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 636e0407..1cf5fe96 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -1244,7 +1244,7 @@ namespace TShockAPI if (string.IsNullOrWhiteSpace(name)) return RestMissingParam("player"); - var found = TShock.Utils.FindPlayer(name); + var found = TSPlayer.FindByNameOrID(name); switch(found.Count) { case 1: diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 3c747b9d..26dac4e9 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -73,6 +73,43 @@ namespace TShockAPI /// public static readonly TSPlayer All = new TSPlayer("All"); + /// + /// Finds a TSPlayer based on name or ID + /// + /// Player name or ID + /// A list of matching players + public static List FindByNameOrID(string plr) + { + var found = new List(); + // Avoid errors caused by null search + if (plr == null) + return found; + + byte plrID; + if (byte.TryParse(plr, out plrID) && plrID < Main.maxPlayers) + { + TSPlayer player = TShock.Players[plrID]; + if (player != null && player.Active) + { + return new List { player }; + } + } + + string plrLower = plr.ToLower(); + foreach (TSPlayer player in TShock.Players) + { + if (player != null) + { + // Must be an EXACT match + if (player.Name == plr) + return new List { player }; + if (player.Name.ToLower().StartsWith(plrLower)) + found.Add(player); + } + } + return found; + } + /// /// The amount of tiles that the player has killed in the last second. /// diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index 99480b58..0b2ced71 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -210,42 +210,7 @@ namespace TShockAPI return Main.player.Where(p => null != p && p.active).Count(); } - /// - /// Finds a TSPlayer based on name or ID - /// - /// Player name or ID - /// A list of matching players - public List FindPlayer(string plr) - { - var found = new List(); - // Avoid errors caused by null search - if (plr == null) - return found; - byte plrID; - if (byte.TryParse(plr, out plrID) && plrID < Main.maxPlayers) - { - TSPlayer player = TShock.Players[plrID]; - if (player != null && player.Active) - { - return new List { player }; - } - } - - string plrLower = plr.ToLower(); - foreach (TSPlayer player in TShock.Players) - { - if (player != null) - { - // Must be an EXACT match - if (player.Name == plr) - return new List { player }; - if (player.Name.ToLower().StartsWith(plrLower)) - found.Add(player); - } - } - return found; - } //Random should not be generated in a method Random r = new Random();