From 9e3755061024eee07115f0ebccaccd01151cd6b9 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sun, 27 May 2012 19:37:17 -0600 Subject: [PATCH 01/22] Unbanning a player is now case sensitive --- TShockAPI/Commands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index c7eb3e5b..76b3fe02 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -866,7 +866,7 @@ namespace TShockAPI } string plStr = args.Parameters[0]; - var ban = TShock.Bans.GetBanByName(plStr); + var ban = TShock.Bans.GetBanByName(plStr, false); if (ban != null) { if (TShock.Bans.RemoveBan(ban.Name, true)) From bb657995f075bb6e385ddd6eaebc39dc9d94686f Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sun, 27 May 2012 22:14:15 -0400 Subject: [PATCH 02/22] Fix chat over heads. --- TShockAPI/ConfigFile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 25859cc8..70e2af0a 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -168,7 +168,7 @@ namespace TShockAPI "Change ingame chat format, {0} = Group Name, {1} = Group Prefix, {2} = Player Name, {3} = Group Suffix, {4} = Chat Message" )] public string ChatFormat = "{1}{2}{3}: {4}"; - [Description("Change the chat format when using chat above heads. This begins with a player name wrapped in brackets, as per Terraria's formatting. Same formatting as ChatFormat.")] public string ChatAboveHeadsFormat = "{3}:"; + [Description("Change the chat format when using chat above heads. This begins with a player name wrapped in brackets, as per Terraria's formatting. Same formatting as ChatFormat.")] public string ChatAboveHeadsFormat = "{2}: {4}"; [Description("Force the world time to be normal, day, or night")] public string ForceTime = "normal"; From 162d90126d77f8065b08dc67f30d75c627fa72dd Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sun, 27 May 2012 22:16:10 -0400 Subject: [PATCH 03/22] Decision: Only display the text by default --- TShockAPI/ConfigFile.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 70e2af0a..69c78720 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -168,7 +168,7 @@ namespace TShockAPI "Change ingame chat format, {0} = Group Name, {1} = Group Prefix, {2} = Player Name, {3} = Group Suffix, {4} = Chat Message" )] public string ChatFormat = "{1}{2}{3}: {4}"; - [Description("Change the chat format when using chat above heads. This begins with a player name wrapped in brackets, as per Terraria's formatting. Same formatting as ChatFormat.")] public string ChatAboveHeadsFormat = "{2}: {4}"; + [Description("Change the chat format when using chat above heads. This begins with a player name wrapped in brackets, as per Terraria's formatting. Same formatting as ChatFormat.")] public string ChatAboveHeadsFormat = "{4}"; [Description("Force the world time to be normal, day, or night")] public string ForceTime = "normal"; From cfd08ad946433700256ebf8d13a7a800535185f7 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sun, 27 May 2012 20:34:51 -0600 Subject: [PATCH 04/22] Theoreatically added a listbans command --- TShockAPI/Commands.cs | 54 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 76b3fe02..21a41669 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -127,6 +127,7 @@ namespace TShockAPI add(Permissions.ban, BanIP, "banip"); add(Permissions.ban, UnBan, "unban"); add(Permissions.ban, UnBanIP, "unbanip"); + add(Permissions.ban, ListBans, "listbans"); add(Permissions.maintenance, ClearBans, "clearbans"); add(Permissions.whitelist, Whitelist, "whitelist"); add(Permissions.maintenance, Off, "off", "exit"); @@ -852,6 +853,59 @@ namespace TShockAPI TShock.Bans.AddBan(ip, "", reason); } + private static void ListBans(CommandArgs args) + { + if (TShock.Bans.GetBans().Count == 0) + { + args.Player.SendMessage("There are currently no players banned."); + return; + } + + string banString = ""; + foreach (Ban b in TShock.Bans.GetBans()) + { + + if (b.Name.Trim() == "") + { + continue; + } + + if (banString.Length == 0) + { + banString = b.Name; + } + else + { + int length = banString.Length; + while (length > 60) + { + length = length - 60; + } + if (length + b.Name.Length >= 60) + { + banString += "|, " + b.Name; + } else + { + banString += ", " + b.Name; + } + } + } + + String[] banStrings = banString.Split('|'); + + if (banStrings.Length == 0) + { + args.Player.SendMessage("There are currently no players with valid names banned."); + return; + } + + args.Player.SendMessage("List of banned players:"); + foreach (string s in banStrings) + { + args.Player.SendMessage(s, Color.Yellow); + } + } + private static void UnBan(CommandArgs args) { if (args.Parameters.Count < 1) From c28319eac62f3ed1d151d04c7ac0bf0a3f71f7c2 Mon Sep 17 00:00:00 2001 From: Zack Piispanen Date: Sun, 27 May 2012 23:22:05 -0400 Subject: [PATCH 05/22] SetSpawn now outputs a result. --- TShockAPI/Commands.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 76b3fe02..143b14d0 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -2146,6 +2146,7 @@ namespace TShockAPI Main.spawnTileX = args.Player.TileX + 1; Main.spawnTileY = args.Player.TileY + 3; SaveManager.Instance.SaveWorld(false); + args.Player.SendMessage( "Spawn has now been set at your location.", Color.Green); } private static void Reload(CommandArgs args) From f6c5c0ea83631179692789178ae4bd2ac23502dc Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sun, 27 May 2012 22:11:35 -0600 Subject: [PATCH 06/22] All ban commands are now under the ban command For the first release of 4.x, all previous commands will point to the new command. Added list and listip to the ban command to easily detect when a player is or isn't banned. Unbanning is no longer case sensitive. --- TShockAPI/Commands.cs | 431 ++++++++++++++++++++++++------------------ 1 file changed, 243 insertions(+), 188 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 21a41669..b896aa15 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -123,12 +123,7 @@ namespace TShockAPI { AddChatCommand add = (p, c, n) => ChatCommands.Add(new Command(p, c, n)); add(Permissions.kick, Kick, "kick"); - add(Permissions.ban, Ban, "ban"); - add(Permissions.ban, BanIP, "banip"); - add(Permissions.ban, UnBan, "unban"); - add(Permissions.ban, UnBanIP, "unbanip"); - add(Permissions.ban, ListBans, "listbans"); - add(Permissions.maintenance, ClearBans, "clearbans"); + add(Permissions.ban, Ban, "ban", "banip", "listbans", "unban", "unbanip", "clearbans"); add(Permissions.whitelist, Whitelist, "whitelist"); add(Permissions.maintenance, Off, "off", "exit"); add(Permissions.maintenance, Restart, "restart"); //Added restart command @@ -786,224 +781,284 @@ namespace TShockAPI } } - private static void Ban(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /ban [reason]", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing player name", Color.Red); - return; - } + private static void Ban(CommandArgs args) + { - string plStr = args.Parameters[0]; - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - } - else if (players.Count > 1) - { - var plrMatches = ""; - foreach (TSPlayer plr in players) + if (args.Parameters[0].ToLower() == "help") + { + args.Player.SendMessage("All ban commands were merged into one in TShock 4.0.", Color.Yellow); + args.Player.SendMessage("Syntax: /ban [option] [arguments]", Color.Green); + args.Player.SendMessage("Options: list, listip, clear, add, addip, del, delip", Color.Green); + args.Player.SendMessage("Arguments: list, listip, clear [code], add [name], addip [ip], del [name], delip [name]", Color.Green); + args.Player.SendMessage("In addition, a reason may be provided for all new bans after the arguments.", Color.Green); + return; + } + if (args.Parameters[0].ToLower() == "list") + { + #region List bans + if (TShock.Bans.GetBans().Count == 0) { - if (plrMatches.Length != 0) + args.Player.SendMessage("There are currently no players banned."); + return; + } + + string banString = ""; + foreach (Ban b in TShock.Bans.GetBans()) + { + + if (b.Name.Trim() == "") { - plrMatches += ", " + plr.Name; + continue; + } + + if (banString.Length == 0) + { + banString = b.Name; } else { - plrMatches += plr.Name; + int length = banString.Length; + while (length > 60) + { + length = length - 60; + } + if (length + b.Name.Length >= 60) + { + banString += "|, " + b.Name; + } + else + { + banString += ", " + b.Name; + } } } - args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red); - } - else - { - string reason = args.Parameters.Count > 1 - ? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)) - : "Misbehaviour."; - if (!TShock.Utils.Ban(players[0], reason, !args.Player.RealPlayer, args.Player.Name)) - { - args.Player.SendMessage("You can't ban another admin!", Color.Red); - } - } - } - private static void BanIP(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Syntax: /banip [reason]", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing IP address", Color.Red); - return; - } + String[] banStrings = banString.Split('|'); - string ip = args.Parameters[0]; - string reason = args.Parameters.Count > 1 - ? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)) - : "Manually added IP address ban."; - TShock.Bans.AddBan(ip, "", reason); - } + if (banStrings.Length == 0) + { + args.Player.SendMessage("There are currently no players with valid names banned."); + return; + } - private static void ListBans(CommandArgs args) - { - if (TShock.Bans.GetBans().Count == 0) - { - args.Player.SendMessage("There are currently no players banned."); + if (banStrings[0].Trim() == "") + { + args.Player.SendMessage("There are currently no bans with valid names found."); + return; + } + + args.Player.SendMessage("List of banned players:"); + foreach (string s in banStrings) + { + args.Player.SendMessage(s, Color.Yellow); + } return; + #endregion List bans } - string banString = ""; - foreach (Ban b in TShock.Bans.GetBans()) + if (args.Parameters[0].ToLower() == "listip") { - - if (b.Name.Trim() == "") + #region List ip bans + if (TShock.Bans.GetBans().Count == 0) { - continue; + args.Player.SendMessage("There are currently no players banned."); + return; } - if (banString.Length == 0) + string banString = ""; + foreach (Ban b in TShock.Bans.GetBans()) { - banString = b.Name; - } - else - { - int length = banString.Length; - while (length > 60) + + if (b.IP.Trim() == "") { - length = length - 60; + continue; } - if (length + b.Name.Length >= 60) + + if (banString.Length == 0) { - banString += "|, " + b.Name; - } else + banString = b.IP; + } + else { - banString += ", " + b.Name; + int length = banString.Length; + while (length > 60) + { + length = length - 60; + } + if (length + b.Name.Length >= 60) + { + banString += "|, " + b.IP; + } + else + { + banString += ", " + b.IP; + } } } - } - String[] banStrings = banString.Split('|'); + String[] banStrings = banString.Split('|'); - if (banStrings.Length == 0) - { - args.Player.SendMessage("There are currently no players with valid names banned."); + if (banStrings.Length == 0) + { + args.Player.SendMessage("There are currently no players with valid IPs banned."); + return; + } + + if (banStrings[0].Trim() == "") + { + args.Player.SendMessage("There are currently no bans with valid IPs found."); + return; + } + + args.Player.SendMessage("List of IP banned players:"); + foreach (string s in banStrings) + { + args.Player.SendMessage(s, Color.Yellow); + } return; + #endregion List ip bans } - args.Player.SendMessage("List of banned players:"); - foreach (string s in banStrings) + if (args.Parameters.Count >= 2) { - args.Player.SendMessage(s, Color.Yellow); + if (args.Parameters[0].ToLower() == "add") + { + #region Add ban + string plStr = args.Parameters[1]; + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + } + else if (players.Count > 1) + { + var plrMatches = ""; + foreach (TSPlayer plr in players) + { + if (plrMatches.Length != 0) + { + plrMatches += ", " + plr.Name; + } + else + { + plrMatches += plr.Name; + } + } + args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red); + } + else + { + string reason = args.Parameters.Count > 2 + ? String.Join(" ", args.Parameters.GetRange(2, args.Parameters.Count - 2)) + : "Misbehavior."; + if (!TShock.Utils.Ban(players[0], reason, !args.Player.RealPlayer, args.Player.Name)) + { + args.Player.SendMessage("You can't ban another admin!", Color.Red); + } + } + return; + #endregion Add ban + } + else if (args.Parameters[0].ToLower() == "addip") + { + #region Add ip ban + string ip = args.Parameters[1]; + string reason = args.Parameters.Count > 2 + ? String.Join(" ", args.Parameters.GetRange(2, args.Parameters.Count - 2)) + : "Manually added IP address ban."; + TShock.Bans.AddBan(ip, "", reason); + args.Player.SendMessage(ip + " banned.", Color.Green); + return; + #endregion Add ip ban + } + else if (args.Parameters[0].ToLower() == "delip") + { + #region Delete ip ban + var ip = args.Parameters[1]; + var ban = TShock.Bans.GetBanByIp(ip); + if (ban != null) + { + if (TShock.Bans.RemoveBan(ban.IP)) + args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + else + args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); + } + else + { + args.Player.SendMessage(string.Format("No bans for ip {0} exist", ip), Color.Red); + } + return; + #endregion Delete ip ban + } + else if (args.Parameters[0].ToLower() == "del") + { + #region Delete ban + string plStr = args.Parameters[1]; + var ban = TShock.Bans.GetBanByName(plStr, false); + if (ban != null) + { + if (TShock.Bans.RemoveBan(ban.Name, true)) + args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + else + args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); + } + else + { + args.Player.SendMessage(string.Format("No bans for player {0} exist", plStr), Color.Red); + } + return; + #endregion Delete ban + } + + #region Clear bans + if (args.Parameters[0].ToLower() == "clear") + { + if (args.Parameters.Count < 1 && ClearBansCode == -1) + { + ClearBansCode = new Random().Next(0, short.MaxValue); + args.Player.SendMessage("ClearBans Code: " + ClearBansCode, Color.Red); + return; + } + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /ban clear "); + return; + } + + int num; + if (!int.TryParse(args.Parameters[1], out num)) + { + args.Player.SendMessage("Invalid syntax! Expecting number"); + return; + } + + if (num == ClearBansCode) + { + ClearBansCode = -1; + if (TShock.Bans.ClearBans()) + { + Log.ConsoleInfo("Bans cleared"); + args.Player.SendMessage("Bans cleared"); + } + else + { + args.Player.SendMessage("Failed to clear bans"); + } + } + else + { + args.Player.SendMessage("Incorrect clear code"); + } + } + return; + #endregion Clear bans } + args.Player.SendMessage("Invalid syntax or old command provided.", Color.Red); + args.Player.SendMessage("Type /ban help for more information.", Color.Red); } - private static void UnBan(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /unban ", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing player name", Color.Red); - return; - } - - string plStr = args.Parameters[0]; - var ban = TShock.Bans.GetBanByName(plStr, false); - if (ban != null) - { - if (TShock.Bans.RemoveBan(ban.Name, true)) - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); - else - args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); - } - else - { - args.Player.SendMessage(string.Format("No bans for player {0} exist", plStr), Color.Red); - } - } - private static int ClearBansCode = -1; - private static void ClearBans(CommandArgs args) - { - if (args.Parameters.Count < 1 && ClearBansCode == -1) - { - ClearBansCode = new Random().Next(0, short.MaxValue); - args.Player.SendMessage("ClearBans Code: " + ClearBansCode, Color.Red); - return; - } - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /clearbans "); - return; - } - - int num; - if (!int.TryParse(args.Parameters[0], out num)) - { - args.Player.SendMessage("Invalid syntax! Expecting number"); - return; - } - - if (num == ClearBansCode) - { - ClearBansCode = -1; - if (TShock.Bans.ClearBans()) - { - Log.ConsoleInfo("Bans cleared"); - args.Player.SendMessage("Bans cleared"); - } - else - { - args.Player.SendMessage("Failed to clear bans"); - } - } - else - { - args.Player.SendMessage("Incorrect clear code"); - } - } - - private static void UnBanIP(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /unbanip ", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing ip", Color.Red); - return; - } - - var ip = args.Parameters[0]; - var ban = TShock.Bans.GetBanByIp(ip); - if (ban != null) - { - if (TShock.Bans.RemoveBan(ban.IP)) - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); - else - args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); - } - else - { - args.Player.SendMessage(string.Format("No bans for ip {0} exist", ip), Color.Red); - } - } - public static void Whitelist(CommandArgs args) { if (args.Parameters.Count == 1) From 1673d004c0b7f7c174e1e624c5203f2c83d69e9c Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Mon, 28 May 2012 01:04:43 -0600 Subject: [PATCH 07/22] Surprise tab conversion go --- TShockAPI/Commands.cs | 1144 ++++++++++++++++++++--------------------- 1 file changed, 572 insertions(+), 572 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 8ffd0808..63cbd765 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -126,7 +126,7 @@ namespace TShockAPI add(Permissions.ban, Ban, "ban", "banip", "listbans", "unban", "unbanip", "clearbans"); add(Permissions.whitelist, Whitelist, "whitelist"); add(Permissions.maintenance, Off, "off", "exit"); - add(Permissions.maintenance, Restart, "restart"); //Added restart command + add(Permissions.maintenance, Restart, "restart"); //Added restart command add(Permissions.maintenance, OffNoSave, "off-nosave", "exit-nosave"); add(Permissions.maintenance, CheckUpdates, "checkupdates"); add(Permissions.causeevents, DropMeteor, "dropmeteor"); @@ -157,7 +157,7 @@ namespace TShockAPI add(Permissions.managegroup, AddGroup, "addgroup"); add(Permissions.managegroup, DeleteGroup, "delgroup"); add(Permissions.managegroup, ModifyGroup, "modgroup"); - add(Permissions.managegroup, ViewGroups, "group"); + add(Permissions.managegroup, ViewGroups, "group"); add(Permissions.manageitem, AddItem, "additem", "banitem"); add(Permissions.manageitem, DeleteItem, "delitem", "unbanitem"); add(Permissions.manageitem, ListItems, "listitems", "listbanneditems"); @@ -207,12 +207,12 @@ namespace TShockAPI add(Permissions.hardmode, StartHardMode, "hardmode"); add(Permissions.hardmode, DisableHardMode, "stophardmode", "disablehardmode"); add(Permissions.cfg, ServerInfo, "stats"); - add(Permissions.cfg, WorldInfo, "world"); + add(Permissions.cfg, WorldInfo, "world"); add(Permissions.converthardmode, ConvertCorruption, "convertcorruption"); add(Permissions.converthardmode, ConvertHallow, "converthallow"); - add(Permissions.converthardmode, RemoveSpecial, "removespecial"); - add(Permissions.savessi, SaveSSI, "savessi"); - add(Permissions.savessi, OverrideSSI, "overridessi", "ossi"); + add(Permissions.converthardmode, RemoveSpecial, "removespecial"); + add(Permissions.savessi, SaveSSI, "savessi"); + add(Permissions.savessi, OverrideSSI, "overridessi", "ossi"); } public static bool HandleCommand(TSPlayer player, string text) @@ -398,12 +398,12 @@ namespace TShockAPI args.Player.IsLoggedIn = true; args.Player.IgnoreActionsForInventory = "none"; - if (!args.Player.IgnoreActionsForClearingTrashCan) - { - args.Player.PlayerData.CopyInventory(args.Player); - TShock.InventoryDB.InsertPlayerData(args.Player); - } - args.Player.SendMessage("Authenticated as " + user.Name + " successfully.", Color.LimeGreen); + if (!args.Player.IgnoreActionsForClearingTrashCan) + { + args.Player.PlayerData.CopyInventory(args.Player); + TShock.InventoryDB.InsertPlayerData(args.Player); + } + args.Player.SendMessage("Authenticated as " + user.Name + " successfully.", Color.LimeGreen); Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + user.Name); if ((args.Player.LoginHarassed) && (TShock.Config.RememberLeavePos)){ @@ -572,10 +572,10 @@ namespace TShockAPI else if (subcmd == "del" && args.Parameters.Count == 2) { var user = new User(); - if (args.Parameters[1].Split('.').Count() ==4) + if (args.Parameters[1].Split('.').Count() ==4) - // changed to support dot character in usernames - // if (args.Parameters[1].Contains(".")) + // changed to support dot character in usernames + // if (args.Parameters[1].Contains(".")) user.Address = args.Parameters[1]; else user.Name = args.Parameters[1]; @@ -621,10 +621,10 @@ namespace TShockAPI else if (subcmd == "group") { var user = new User(); - if (args.Parameters[1].Split('.').Count()==4) + if (args.Parameters[1].Split('.').Count()==4) - //changed to support dot character in usernames - //if (args.Parameters[1].Contains(".")) + //changed to support dot character in usernames + //if (args.Parameters[1].Contains(".")) user.Address = args.Parameters[1]; else @@ -688,11 +688,11 @@ namespace TShockAPI args.Player.SendMessage("Machine name: " + Environment.MachineName); } - public static void WorldInfo(CommandArgs args) - { - args.Player.SendMessage("World Name: " + Main.worldName); - args.Player.SendMessage("World ID: " + Main.worldID); - } + public static void WorldInfo(CommandArgs args) + { + args.Player.SendMessage("World Name: " + Main.worldName); + args.Player.SendMessage("World ID: " + Main.worldID); + } #endregion @@ -709,24 +709,24 @@ namespace TShockAPI var players = TShock.Utils.FindPlayer(args.Parameters[0]); if (players.Count > 1) { - var plrMatches = ""; - foreach (TSPlayer plr in players) - { - if (plrMatches.Length != 0) - { - plrMatches += ", " + plr.Name; - } - else - { - plrMatches += plr.Name; - } - } - args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red); + var plrMatches = ""; + foreach (TSPlayer plr in players) + { + if (plrMatches.Length != 0) + { + plrMatches += ", " + plr.Name; + } + else + { + plrMatches += plr.Name; + } + } + args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red); return; } try { - args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName + " Group: " + players[0].Group.Name, Color.Green); + args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName + " Group: " + players[0].Group.Name, Color.Green); } catch (Exception) { @@ -755,20 +755,20 @@ namespace TShockAPI } else if (players.Count > 1) { - var plrMatches = ""; - foreach (TSPlayer plr in players) - { - if (plrMatches.Length != 0) - { - plrMatches += ", " + plr.Name; - } - else - { - plrMatches += plr.Name; - } - } - args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red); - } + var plrMatches = ""; + foreach (TSPlayer plr in players) + { + if (plrMatches.Length != 0) + { + plrMatches += ", " + plr.Name; + } + else + { + plrMatches += plr.Name; + } + } + args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red); + } else { string reason = args.Parameters.Count > 1 @@ -781,281 +781,281 @@ namespace TShockAPI } } - private static void Ban(CommandArgs args) - { + private static void Ban(CommandArgs args) + { - if (args.Parameters[0].ToLower() == "help") - { - args.Player.SendMessage("All ban commands were merged into one in TShock 4.0.", Color.Yellow); - args.Player.SendMessage("Syntax: /ban [option] [arguments]", Color.Green); - args.Player.SendMessage("Options: list, listip, clear, add, addip, del, delip", Color.Green); - args.Player.SendMessage("Arguments: list, listip, clear [code], add [name], addip [ip], del [name], delip [name]", Color.Green); - args.Player.SendMessage("In addition, a reason may be provided for all new bans after the arguments.", Color.Green); - return; - } - if (args.Parameters[0].ToLower() == "list") - { - #region List bans - if (TShock.Bans.GetBans().Count == 0) - { - args.Player.SendMessage("There are currently no players banned."); - return; - } + if (args.Parameters[0].ToLower() == "help") + { + args.Player.SendMessage("All ban commands were merged into one in TShock 4.0.", Color.Yellow); + args.Player.SendMessage("Syntax: /ban [option] [arguments]", Color.Green); + args.Player.SendMessage("Options: list, listip, clear, add, addip, del, delip", Color.Green); + args.Player.SendMessage("Arguments: list, listip, clear [code], add [name], addip [ip], del [name], delip [name]", Color.Green); + args.Player.SendMessage("In addition, a reason may be provided for all new bans after the arguments.", Color.Green); + return; + } + if (args.Parameters[0].ToLower() == "list") + { + #region List bans + if (TShock.Bans.GetBans().Count == 0) + { + args.Player.SendMessage("There are currently no players banned."); + return; + } - string banString = ""; - foreach (Ban b in TShock.Bans.GetBans()) - { + string banString = ""; + foreach (Ban b in TShock.Bans.GetBans()) + { - if (b.Name.Trim() == "") - { - continue; - } + if (b.Name.Trim() == "") + { + continue; + } - if (banString.Length == 0) - { - banString = b.Name; - } - else - { - int length = banString.Length; - while (length > 60) - { - length = length - 60; - } - if (length + b.Name.Length >= 60) - { - banString += "|, " + b.Name; - } - else - { - banString += ", " + b.Name; - } - } - } + if (banString.Length == 0) + { + banString = b.Name; + } + else + { + int length = banString.Length; + while (length > 60) + { + length = length - 60; + } + if (length + b.Name.Length >= 60) + { + banString += "|, " + b.Name; + } + else + { + banString += ", " + b.Name; + } + } + } - String[] banStrings = banString.Split('|'); + String[] banStrings = banString.Split('|'); - if (banStrings.Length == 0) - { - args.Player.SendMessage("There are currently no players with valid names banned."); - return; - } + if (banStrings.Length == 0) + { + args.Player.SendMessage("There are currently no players with valid names banned."); + return; + } - if (banStrings[0].Trim() == "") - { - args.Player.SendMessage("There are currently no bans with valid names found."); - return; - } + if (banStrings[0].Trim() == "") + { + args.Player.SendMessage("There are currently no bans with valid names found."); + return; + } - args.Player.SendMessage("List of banned players:"); - foreach (string s in banStrings) - { - args.Player.SendMessage(s, Color.Yellow); - } - return; - #endregion List bans - } + args.Player.SendMessage("List of banned players:"); + foreach (string s in banStrings) + { + args.Player.SendMessage(s, Color.Yellow); + } + return; + #endregion List bans + } - if (args.Parameters[0].ToLower() == "listip") - { - #region List ip bans - if (TShock.Bans.GetBans().Count == 0) - { - args.Player.SendMessage("There are currently no players banned."); - return; - } + if (args.Parameters[0].ToLower() == "listip") + { + #region List ip bans + if (TShock.Bans.GetBans().Count == 0) + { + args.Player.SendMessage("There are currently no players banned."); + return; + } - string banString = ""; - foreach (Ban b in TShock.Bans.GetBans()) - { + string banString = ""; + foreach (Ban b in TShock.Bans.GetBans()) + { - if (b.IP.Trim() == "") - { - continue; - } + if (b.IP.Trim() == "") + { + continue; + } - if (banString.Length == 0) - { - banString = b.IP; - } - else - { - int length = banString.Length; - while (length > 60) - { - length = length - 60; - } - if (length + b.Name.Length >= 60) - { - banString += "|, " + b.IP; - } - else - { - banString += ", " + b.IP; - } - } - } + if (banString.Length == 0) + { + banString = b.IP; + } + else + { + int length = banString.Length; + while (length > 60) + { + length = length - 60; + } + if (length + b.Name.Length >= 60) + { + banString += "|, " + b.IP; + } + else + { + banString += ", " + b.IP; + } + } + } - String[] banStrings = banString.Split('|'); + String[] banStrings = banString.Split('|'); - if (banStrings.Length == 0) - { - args.Player.SendMessage("There are currently no players with valid IPs banned."); - return; - } + if (banStrings.Length == 0) + { + args.Player.SendMessage("There are currently no players with valid IPs banned."); + return; + } - if (banStrings[0].Trim() == "") - { - args.Player.SendMessage("There are currently no bans with valid IPs found."); - return; - } + if (banStrings[0].Trim() == "") + { + args.Player.SendMessage("There are currently no bans with valid IPs found."); + return; + } - args.Player.SendMessage("List of IP banned players:"); - foreach (string s in banStrings) - { - args.Player.SendMessage(s, Color.Yellow); - } - return; - #endregion List ip bans - } + args.Player.SendMessage("List of IP banned players:"); + foreach (string s in banStrings) + { + args.Player.SendMessage(s, Color.Yellow); + } + return; + #endregion List ip bans + } - if (args.Parameters.Count >= 2) - { - if (args.Parameters[0].ToLower() == "add") - { - #region Add ban - string plStr = args.Parameters[1]; - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - } - else if (players.Count > 1) - { - var plrMatches = ""; - foreach (TSPlayer plr in players) - { - if (plrMatches.Length != 0) - { - plrMatches += ", " + plr.Name; - } - else - { - plrMatches += plr.Name; - } - } - args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red); - } - else - { - string reason = args.Parameters.Count > 2 - ? String.Join(" ", args.Parameters.GetRange(2, args.Parameters.Count - 2)) - : "Misbehavior."; - if (!TShock.Utils.Ban(players[0], reason, !args.Player.RealPlayer, args.Player.Name)) - { - args.Player.SendMessage("You can't ban another admin!", Color.Red); - } - } - return; - #endregion Add ban - } - else if (args.Parameters[0].ToLower() == "addip") - { - #region Add ip ban - string ip = args.Parameters[1]; - string reason = args.Parameters.Count > 2 - ? String.Join(" ", args.Parameters.GetRange(2, args.Parameters.Count - 2)) - : "Manually added IP address ban."; - TShock.Bans.AddBan(ip, "", reason); - args.Player.SendMessage(ip + " banned.", Color.Green); - return; - #endregion Add ip ban - } - else if (args.Parameters[0].ToLower() == "delip") - { - #region Delete ip ban - var ip = args.Parameters[1]; - var ban = TShock.Bans.GetBanByIp(ip); - if (ban != null) - { - if (TShock.Bans.RemoveBan(ban.IP)) - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); - else - args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); - } - else - { - args.Player.SendMessage(string.Format("No bans for ip {0} exist", ip), Color.Red); - } - return; - #endregion Delete ip ban - } - else if (args.Parameters[0].ToLower() == "del") - { - #region Delete ban - string plStr = args.Parameters[1]; - var ban = TShock.Bans.GetBanByName(plStr, false); - if (ban != null) - { - if (TShock.Bans.RemoveBan(ban.Name, true)) - args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); - else - args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); - } - else - { - args.Player.SendMessage(string.Format("No bans for player {0} exist", plStr), Color.Red); - } - return; - #endregion Delete ban - } + if (args.Parameters.Count >= 2) + { + if (args.Parameters[0].ToLower() == "add") + { + #region Add ban + string plStr = args.Parameters[1]; + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + } + else if (players.Count > 1) + { + var plrMatches = ""; + foreach (TSPlayer plr in players) + { + if (plrMatches.Length != 0) + { + plrMatches += ", " + plr.Name; + } + else + { + plrMatches += plr.Name; + } + } + args.Player.SendMessage("More than one player matched! Matches: " + plrMatches, Color.Red); + } + else + { + string reason = args.Parameters.Count > 2 + ? String.Join(" ", args.Parameters.GetRange(2, args.Parameters.Count - 2)) + : "Misbehavior."; + if (!TShock.Utils.Ban(players[0], reason, !args.Player.RealPlayer, args.Player.Name)) + { + args.Player.SendMessage("You can't ban another admin!", Color.Red); + } + } + return; + #endregion Add ban + } + else if (args.Parameters[0].ToLower() == "addip") + { + #region Add ip ban + string ip = args.Parameters[1]; + string reason = args.Parameters.Count > 2 + ? String.Join(" ", args.Parameters.GetRange(2, args.Parameters.Count - 2)) + : "Manually added IP address ban."; + TShock.Bans.AddBan(ip, "", reason); + args.Player.SendMessage(ip + " banned.", Color.Green); + return; + #endregion Add ip ban + } + else if (args.Parameters[0].ToLower() == "delip") + { + #region Delete ip ban + var ip = args.Parameters[1]; + var ban = TShock.Bans.GetBanByIp(ip); + if (ban != null) + { + if (TShock.Bans.RemoveBan(ban.IP)) + args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + else + args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); + } + else + { + args.Player.SendMessage(string.Format("No bans for ip {0} exist", ip), Color.Red); + } + return; + #endregion Delete ip ban + } + else if (args.Parameters[0].ToLower() == "del") + { + #region Delete ban + string plStr = args.Parameters[1]; + var ban = TShock.Bans.GetBanByName(plStr, false); + if (ban != null) + { + if (TShock.Bans.RemoveBan(ban.Name, true)) + args.Player.SendMessage(string.Format("Unbanned {0} ({1})!", ban.Name, ban.IP), Color.Red); + else + args.Player.SendMessage(string.Format("Failed to unban {0} ({1})!", ban.Name, ban.IP), Color.Red); + } + else + { + args.Player.SendMessage(string.Format("No bans for player {0} exist", plStr), Color.Red); + } + return; + #endregion Delete ban + } - #region Clear bans - if (args.Parameters[0].ToLower() == "clear") - { - if (args.Parameters.Count < 1 && ClearBansCode == -1) - { - ClearBansCode = new Random().Next(0, short.MaxValue); - args.Player.SendMessage("ClearBans Code: " + ClearBansCode, Color.Red); - return; - } - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /ban clear "); - return; - } + #region Clear bans + if (args.Parameters[0].ToLower() == "clear") + { + if (args.Parameters.Count < 1 && ClearBansCode == -1) + { + ClearBansCode = new Random().Next(0, short.MaxValue); + args.Player.SendMessage("ClearBans Code: " + ClearBansCode, Color.Red); + return; + } + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /ban clear "); + return; + } - int num; - if (!int.TryParse(args.Parameters[1], out num)) - { - args.Player.SendMessage("Invalid syntax! Expecting number"); - return; - } + int num; + if (!int.TryParse(args.Parameters[1], out num)) + { + args.Player.SendMessage("Invalid syntax! Expecting number"); + return; + } - if (num == ClearBansCode) - { - ClearBansCode = -1; - if (TShock.Bans.ClearBans()) - { - Log.ConsoleInfo("Bans cleared"); - args.Player.SendMessage("Bans cleared"); - } - else - { - args.Player.SendMessage("Failed to clear bans"); - } - } - else - { - args.Player.SendMessage("Incorrect clear code"); - } - } - return; - #endregion Clear bans - } - args.Player.SendMessage("Invalid syntax or old command provided.", Color.Red); - args.Player.SendMessage("Type /ban help for more information.", Color.Red); - } + if (num == ClearBansCode) + { + ClearBansCode = -1; + if (TShock.Bans.ClearBans()) + { + Log.ConsoleInfo("Bans cleared"); + args.Player.SendMessage("Bans cleared"); + } + else + { + args.Player.SendMessage("Failed to clear bans"); + } + } + else + { + args.Player.SendMessage("Incorrect clear code"); + } + } + return; + #endregion Clear bans + } + args.Player.SendMessage("Invalid syntax or old command provided.", Color.Red); + args.Player.SendMessage("Type /ban help for more information.", Color.Red); + } private static int ClearBansCode = -1; @@ -1077,47 +1077,47 @@ namespace TShockAPI args.Player.SendMessage("You now " + (args.Player.DisplayLogs ? "receive" : "stopped receiving") + " logs"); } - public static void SaveSSI(CommandArgs args ) - { - if (TShock.Config.ServerSideInventory) - { - args.Player.SendMessage("SSI has been saved.", Color.Green); - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) - { - TShock.InventoryDB.InsertPlayerData(player); - } - } - } - } + public static void SaveSSI(CommandArgs args ) + { + if (TShock.Config.ServerSideInventory) + { + args.Player.SendMessage("SSI has been saved.", Color.Green); + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) + { + TShock.InventoryDB.InsertPlayerData(player); + } + } + } + } - public static void OverrideSSI( CommandArgs args ) - { - if( args.Parameters.Count < 1 ) - { - args.Player.SendMessage("Correct usage: /overridessi(/ossi) ", Color.Red); - return; - } + public static void OverrideSSI( CommandArgs args ) + { + if( args.Parameters.Count < 1 ) + { + args.Player.SendMessage("Correct usage: /overridessi(/ossi) ", Color.Red); + return; + } - var players = TShock.Utils.FindPlayer(args.Parameters[0]); - if( players.Count < 1 ) - { - args.Player.SendMessage("No players match " + args.Parameters[0], Color.Red); - } - else if( players.Count > 1 ) - { - args.Player.SendMessage( players.Count + " players matched " + args.Parameters[0], Color.Red); - } - else if (TShock.Config.ServerSideInventory) - { - if( players[0] != null && players[0].IsLoggedIn && !players[0].IgnoreActionsForClearingTrashCan) - { - args.Player.SendMessage( players[0].Name + " has been exempted and updated.", Color.Green); - TShock.InventoryDB.InsertPlayerData(players[0]); - } - } - } + var players = TShock.Utils.FindPlayer(args.Parameters[0]); + if( players.Count < 1 ) + { + args.Player.SendMessage("No players match " + args.Parameters[0], Color.Red); + } + else if( players.Count > 1 ) + { + args.Player.SendMessage( players.Count + " players matched " + args.Parameters[0], Color.Red); + } + else if (TShock.Config.ServerSideInventory) + { + if( players[0] != null && players[0].IsLoggedIn && !players[0].IgnoreActionsForClearingTrashCan) + { + args.Player.SendMessage( players[0].Name + " has been exempted and updated.", Color.Green); + TShock.InventoryDB.InsertPlayerData(players[0]); + } + } + } #endregion Player Management Commands @@ -1145,12 +1145,12 @@ namespace TShockAPI { if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) { - player.SaveServerInventory(); + player.SaveServerInventory(); } } } - string reason = ((args.Parameters.Count > 0) ? "Server shutting down: " + String.Join(" ", args.Parameters) : "Server shutting down!"); + string reason = ((args.Parameters.Count > 0) ? "Server shutting down: " + String.Join(" ", args.Parameters) : "Server shutting down!"); TShock.Utils.StopServer(true, reason); } //Added restart command @@ -1173,8 +1173,8 @@ namespace TShockAPI } } - string reason = ((args.Parameters.Count > 0) ? "Server shutting down: " + String.Join(" ", args.Parameters) : "Server shutting down!"); - TShock.Utils.StopServer(true, reason); + string reason = ((args.Parameters.Count > 0) ? "Server shutting down: " + String.Join(" ", args.Parameters) : "Server shutting down!"); + TShock.Utils.StopServer(true, reason); System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); Environment.Exit(0); } @@ -1182,8 +1182,8 @@ namespace TShockAPI private static void OffNoSave(CommandArgs args) { - string reason = ((args.Parameters.Count > 0) ? "Server shutting down: " + String.Join(" ", args.Parameters) : "Server shutting down!"); - TShock.Utils.StopServer(false, reason); + string reason = ((args.Parameters.Count > 0) ? "Server shutting down: " + String.Join(" ", args.Parameters) : "Server shutting down!"); + TShock.Utils.StopServer(false, reason); } private static void CheckUpdates(CommandArgs args) @@ -1563,52 +1563,52 @@ namespace TShockAPI TShock.Utils.Broadcast("Hallow conversion done."); } - private static void RemoveSpecial(CommandArgs args) - { - TShock.Utils.Broadcast("Server may lag for a moment.", Color.Red); - for (int x = 0; x < Main.maxTilesX; x++) - { - for (int y = 0; y < Main.maxTilesY; y++) - { - switch (Main.tile[x, y].type) - { - case 117: - case 25: - Main.tile[x, y].type = 1; - break; - case 109: - case 23: - Main.tile[x, y].type = 2; - break; - case 32: - case 113: - case 110: - Main.tile[x, y].type = 0; - Main.tile[x, y].active = false; - break; - case 24: - Main.tile[x, y].type = 3; - break; - case 112: - case 116: - Main.tile[x, y].type = 53; - break; - case 118: - Main.tile[x, y].type = 38; - break; - case 115: - Main.tile[x, y].type = 52; - break; - default: - continue; - } - } - } - WorldGen.CountTiles(0); - TSPlayer.All.SendData(PacketTypes.UpdateGoodEvil); - Netplay.ResetSections(); - TShock.Utils.Broadcast("Special tile conversion done."); - } + private static void RemoveSpecial(CommandArgs args) + { + TShock.Utils.Broadcast("Server may lag for a moment.", Color.Red); + for (int x = 0; x < Main.maxTilesX; x++) + { + for (int y = 0; y < Main.maxTilesY; y++) + { + switch (Main.tile[x, y].type) + { + case 117: + case 25: + Main.tile[x, y].type = 1; + break; + case 109: + case 23: + Main.tile[x, y].type = 2; + break; + case 32: + case 113: + case 110: + Main.tile[x, y].type = 0; + Main.tile[x, y].active = false; + break; + case 24: + Main.tile[x, y].type = 3; + break; + case 112: + case 116: + Main.tile[x, y].type = 53; + break; + case 118: + Main.tile[x, y].type = 38; + break; + case 115: + Main.tile[x, y].type = 52; + break; + default: + continue; + } + } + } + WorldGen.CountTiles(0); + TSPlayer.All.SendData(PacketTypes.UpdateGoodEvil); + Netplay.ResetSections(); + TShock.Utils.Broadcast("Special tile conversion done."); + } #endregion Cause Events and Spawn Monsters Commands #region Teleport Commands @@ -1955,42 +1955,42 @@ namespace TShockAPI String groupname = args.Parameters[0]; args.Parameters.RemoveAt(0); - string response = ""; + string response = ""; if (com.Equals("add")) { - if( groupname == "*" ) - { - int count = 0; - foreach( Group g in TShock.Groups ) - { - response = TShock.Groups.AddPermissions(g.Name, args.Parameters); - if (!response.StartsWith("Error:")) - count++; - } - args.Player.SendMessage(String.Format("{0} groups were modified.", count ), Color.Green ); - return; - } + if( groupname == "*" ) + { + int count = 0; + foreach( Group g in TShock.Groups ) + { + response = TShock.Groups.AddPermissions(g.Name, args.Parameters); + if (!response.StartsWith("Error:")) + count++; + } + args.Player.SendMessage(String.Format("{0} groups were modified.", count ), Color.Green ); + return; + } response = TShock.Groups.AddPermissions(groupname, args.Parameters); if (response.Length > 0) args.Player.SendMessage(response, Color.Green); return; } - if (com.Equals("del") || com.Equals("delete")) - { - if (groupname == "*") - { - int count = 0; - foreach (Group g in TShock.Groups) - { - response = TShock.Groups.DeletePermissions(g.Name, args.Parameters); - if (!response.StartsWith("Error:")) - count++; - } - args.Player.SendMessage(String.Format("{0} groups were modified.", count), Color.Green); - return; - } - response = TShock.Groups.DeletePermissions(groupname, args.Parameters); + if (com.Equals("del") || com.Equals("delete")) + { + if (groupname == "*") + { + int count = 0; + foreach (Group g in TShock.Groups) + { + response = TShock.Groups.DeletePermissions(g.Name, args.Parameters); + if (!response.StartsWith("Error:")) + count++; + } + args.Player.SendMessage(String.Format("{0} groups were modified.", count), Color.Green); + return; + } + response = TShock.Groups.DeletePermissions(groupname, args.Parameters); if (response.Length > 0) args.Player.SendMessage(response, Color.Green); return; @@ -1999,79 +1999,79 @@ namespace TShockAPI args.Player.SendMessage("Incorrect format: /modGroup add|del ", Color.Red); } - private static void ViewGroups(CommandArgs args) - { - if (args.Parameters.Count > 0) - { - String com = args.Parameters[0]; + private static void ViewGroups(CommandArgs args) + { + if (args.Parameters.Count > 0) + { + String com = args.Parameters[0]; - if( com == "list" ) - { - string ret = "Groups: "; - foreach( Group g in TShock.Groups.groups ) - { - if (ret.Length > 50) - { - args.Player.SendMessage(ret, Color.Green); - ret = ""; - } + if( com == "list" ) + { + string ret = "Groups: "; + foreach( Group g in TShock.Groups.groups ) + { + if (ret.Length > 50) + { + args.Player.SendMessage(ret, Color.Green); + ret = ""; + } - if( ret != "" ) - { - ret += ", "; - } - - ret += g.Name; - } + if( ret != "" ) + { + ret += ", "; + } + + ret += g.Name; + } - if (ret.Length > 0) - { - args.Player.SendMessage(ret, Color.Green); - } - return; - } - else if( com == "perm") - { - if (args.Parameters.Count > 1) - { - String groupname = args.Parameters[1]; + if (ret.Length > 0) + { + args.Player.SendMessage(ret, Color.Green); + } + return; + } + else if( com == "perm") + { + if (args.Parameters.Count > 1) + { + String groupname = args.Parameters[1]; - if( TShock.Groups.GroupExists( groupname ) ) - { - string ret = String.Format("Permissions for {0}: ", groupname); - foreach (string p in TShock.Utils.GetGroup( groupname ).permissions) - { - if (ret.Length > 50) - { - args.Player.SendMessage(ret, Color.Green); - ret = ""; - } + if( TShock.Groups.GroupExists( groupname ) ) + { + string ret = String.Format("Permissions for {0}: ", groupname); + foreach (string p in TShock.Utils.GetGroup( groupname ).permissions) + { + if (ret.Length > 50) + { + args.Player.SendMessage(ret, Color.Green); + ret = ""; + } - if (ret != "") - { - ret += ", "; - } + if (ret != "") + { + ret += ", "; + } - ret += p; - } - if (ret.Length > 0) - { - args.Player.SendMessage(ret, Color.Green); - } + ret += p; + } + if (ret.Length > 0) + { + args.Player.SendMessage(ret, Color.Green); + } - return; - } - else - { - args.Player.SendMessage("Group does not exist.", Color.Red); - return; - } - } - } - } - args.Player.SendMessage("Incorrect format: /group list", Color.Red); - args.Player.SendMessage(" /group perm ", Color.Red); - } + return; + } + else + { + args.Player.SendMessage("Group does not exist.", Color.Red); + return; + } + } + } + } + args.Player.SendMessage("Incorrect format: /group list", Color.Red); + args.Player.SendMessage(" /group perm ", Color.Red); + } #endregion Group Management @@ -2255,13 +2255,13 @@ namespace TShockAPI Main.spawnTileX = args.Player.TileX + 1; Main.spawnTileY = args.Player.TileY + 3; SaveManager.Instance.SaveWorld(false); - args.Player.SendMessage( "Spawn has now been set at your location.", Color.Green); + args.Player.SendMessage( "Spawn has now been set at your location.", Color.Green); } private static void Reload(CommandArgs args) { FileTools.SetupConfig(); - TShock.HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); + TShock.HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); TShock.Groups.LoadPermisions(); TShock.Regions.ReloadAllRegions(); args.Player.SendMessage( @@ -2282,14 +2282,14 @@ namespace TShockAPI private static void Save(CommandArgs args) { - SaveManager.Instance.SaveWorld(false); - foreach (TSPlayer tsply in TShock.Players.Where(tsply => tsply != null)) - { - tsply.SaveServerInventory(); - } + SaveManager.Instance.SaveWorld(false); + foreach (TSPlayer tsply in TShock.Players.Where(tsply => tsply != null)) + { + tsply.SaveServerInventory(); + } } - private static void Settle(CommandArgs args) + private static void Settle(CommandArgs args) { if (Liquid.panicMode) { @@ -2305,23 +2305,23 @@ namespace TShockAPI if (args.Parameters.Count != 1) { args.Player.SendMessage("Invalid syntax! Proper syntax: /maxspawns ", Color.Red); - args.Player.SendMessage("Proper syntax: /maxspawns show", Color.Red); - args.Player.SendMessage("Proper syntax: /maxspawns default", Color.Red); + args.Player.SendMessage("Proper syntax: /maxspawns show", Color.Red); + args.Player.SendMessage("Proper syntax: /maxspawns default", Color.Red); return; } - if (args.Parameters[0] == "show") - { - args.Player.SendMessage("Current maximum spawns is: " + TShock.Config.DefaultMaximumSpawns); - return; - } - - if(args.Parameters[0]=="default"){ - TShock.Config.DefaultMaximumSpawns = 5; - NPC.defaultMaxSpawns = 5; - TShock.Utils.Broadcast(string.Format("{0} changed the maximum spawns to: 5", args.Player.Name)); - return; - } + if (args.Parameters[0] == "show") + { + args.Player.SendMessage("Current maximum spawns is: " + TShock.Config.DefaultMaximumSpawns); + return; + } + + if(args.Parameters[0]=="default"){ + TShock.Config.DefaultMaximumSpawns = 5; + NPC.defaultMaxSpawns = 5; + TShock.Utils.Broadcast(string.Format("{0} changed the maximum spawns to: 5", args.Player.Name)); + return; + } int amount = Convert.ToInt32(args.Parameters[0]); int.TryParse(args.Parameters[0], out amount); @@ -2335,24 +2335,24 @@ namespace TShockAPI if (args.Parameters.Count != 1) { args.Player.SendMessage("Invalid syntax! Proper syntax: /spawnrate ", Color.Red); - args.Player.SendMessage("/spawnrate show", Color.Red); - args.Player.SendMessage("/spawnrate default", Color.Red); + args.Player.SendMessage("/spawnrate show", Color.Red); + args.Player.SendMessage("/spawnrate default", Color.Red); return; } - if (args.Parameters[0] == "show") - { - args.Player.SendMessage("Current spawn rate is: " + TShock.Config.DefaultSpawnRate); - return; - } + if (args.Parameters[0] == "show") + { + args.Player.SendMessage("Current spawn rate is: " + TShock.Config.DefaultSpawnRate); + return; + } - if (args.Parameters[0] == "default") - { - TShock.Config.DefaultSpawnRate = 600; - NPC.defaultSpawnRate = 600; - TShock.Utils.Broadcast(string.Format("{0} changed the spawn rate to: 600", args.Player.Name)); - return; - } + if (args.Parameters[0] == "default") + { + TShock.Config.DefaultSpawnRate = 600; + NPC.defaultSpawnRate = 600; + TShock.Utils.Broadcast(string.Format("{0} changed the spawn rate to: 600", args.Player.Name)); + return; + } int amount = Convert.ToInt32(args.Parameters[0]); int.TryParse(args.Parameters[0], out amount); @@ -2815,26 +2815,26 @@ namespace TShockAPI break; } - case "z": - { - if (args.Parameters.Count == 3) - { - string regionName = args.Parameters[1]; - int z = 0; - if (int.TryParse(args.Parameters[2], out z ) ) - { - if (TShock.Regions.SetZ(regionName, z)) - args.Player.SendMessage("Region's z is now " + z, Color.Yellow); - else - args.Player.SendMessage("Could not find specified region", Color.Red); - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region z [name] [#]", Color.Red); - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region z [name] [#]", Color.Red); - break; - } + case "z": + { + if (args.Parameters.Count == 3) + { + string regionName = args.Parameters[1]; + int z = 0; + if (int.TryParse(args.Parameters[2], out z ) ) + { + if (TShock.Regions.SetZ(regionName, z)) + args.Player.SendMessage("Region's z is now " + z, Color.Yellow); + else + args.Player.SendMessage("Could not find specified region", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region z [name] [#]", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region z [name] [#]", Color.Red); + break; + } case "resize": case "expand": { @@ -2954,10 +2954,10 @@ namespace TShockAPI private static void ListConnectedPlayers(CommandArgs args) { - string response = args.Player.Group.HasPermission(Permissions.seeids) - ? TShock.Utils.GetPlayersWithIds() - : TShock.Utils.GetPlayers(); - args.Player.SendMessage(string.Format("Current players: {0}.", response), 255, 240, 20); + string response = args.Player.Group.HasPermission(Permissions.seeids) + ? TShock.Utils.GetPlayersWithIds() + : TShock.Utils.GetPlayers(); + args.Player.SendMessage(string.Format("Current players: {0}.", response), 255, 240, 20); args.Player.SendMessage(string.Format("TShock: {0} ({1}): ({2}/{3})", TShock.VersionNum, TShock.VersionCodename, TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots)); } @@ -3218,9 +3218,9 @@ namespace TShockAPI return; } - bool killTownNPCs = false; - if (args.Parameters.Count == 1) - bool.TryParse(args.Parameters[0], out killTownNPCs); + bool killTownNPCs = false; + if (args.Parameters.Count == 1) + bool.TryParse(args.Parameters[0], out killTownNPCs); int killcount = 0; for (int i = 0; i < Main.npc.Length; i++) @@ -3233,7 +3233,7 @@ namespace TShockAPI } TShock.Utils.Broadcast(string.Format("Killed {0} NPCs.", killcount)); } - + private static void Item(CommandArgs args) { if (args.Parameters.Count < 1) @@ -3276,14 +3276,14 @@ namespace TShockAPI { if (itemAmount == 0 || itemAmount > item.maxStack) itemAmount = item.maxStack; - if (args.Player.GiveItemCheck(item.type, item.name, item.width, item.height, itemAmount, prefix)) - { - args.Player.SendMessage(string.Format("Gave {0} {1}(s).", itemAmount, item.name)); - } - else - { - args.Player.SendMessage("The item is banned and the config prevents you from spawning banned items.", Color.Red); - } + if (args.Player.GiveItemCheck(item.type, item.name, item.width, item.height, itemAmount, prefix)) + { + args.Player.SendMessage(string.Format("Gave {0} {1}(s).", itemAmount, item.name)); + } + else + { + args.Player.SendMessage("The item is banned and the config prevents you from spawning banned items.", Color.Red); + } } else { @@ -3360,15 +3360,15 @@ namespace TShockAPI { if (itemAmount == 0 || itemAmount > item.maxStack) itemAmount = item.maxStack; - if (plr.GiveItemCheck(item.type, item.name, item.width, item.height, itemAmount, prefix)) - { - args.Player.SendMessage(string.Format("Gave {0} {1} {2}(s).", plr.Name, itemAmount, item.name)); - plr.SendMessage(string.Format("{0} gave you {1} {2}(s).", args.Player.Name, itemAmount, item.name)); - } - else - { - args.Player.SendMessage("The item is banned and the config prevents spawning banned items.", Color.Red); - } + if (plr.GiveItemCheck(item.type, item.name, item.width, item.height, itemAmount, prefix)) + { + args.Player.SendMessage(string.Format("Gave {0} {1} {2}(s).", plr.Name, itemAmount, item.name)); + plr.SendMessage(string.Format("{0} gave you {1} {2}(s).", args.Player.Name, itemAmount, item.name)); + } + else + { + args.Player.SendMessage("The item is banned and the config prevents spawning banned items.", Color.Red); + } } else From 52aa90ff9a13a6c70e9a90614152c17583e6613f Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 00:26:09 -0600 Subject: [PATCH 08/22] Thoreatically, /who should be paginated now Version is now its own command with a different permission. --- TShockAPI/Commands.cs | 75 +++++++++++++++++++++++++++++++++++++------ TShockAPI/Utils.cs | 29 +++++++++++++++++ 2 files changed, 94 insertions(+), 10 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 63cbd765..e6a7bf25 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -177,7 +177,8 @@ namespace TShockAPI add(Permissions.manageregion, Region, "region"); add(Permissions.manageregion, DebugRegions, "debugreg"); add(null, Help, "help"); - add(null, ListConnectedPlayers, "playing", "online", "who", "version"); + add(null, ListConnectedPlayers, "playing", "online", "who"); + add(Permissions.maintenance, GetVersion, "version"); add(null, AuthToken, "auth"); add(Permissions.cantalkinthird, ThirdPerson, "me"); add(Permissions.canpartychat, PartyChat, "p"); @@ -2952,15 +2953,69 @@ namespace TShockAPI } } - private static void ListConnectedPlayers(CommandArgs args) - { - string response = args.Player.Group.HasPermission(Permissions.seeids) - ? TShock.Utils.GetPlayersWithIds() - : TShock.Utils.GetPlayers(); - args.Player.SendMessage(string.Format("Current players: {0}.", response), 255, 240, 20); - args.Player.SendMessage(string.Format("TShock: {0} ({1}): ({2}/{3})", TShock.VersionNum, TShock.VersionCodename, - TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots)); - } + private static void GetVersion(CommandArgs args) + { + args.Player.SendMessage(string.Format("TShock: {0} ({1}): ({2}/{3})", TShock.VersionNum, TShock.VersionCodename, + TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots)); + } + + //TODO: Continue this + private static void ListConnectedPlayers(CommandArgs args) + { + //How many players per page + const int pagelimit = 15; + //How many players per line + const int perline = 5; + //Pages start at 0 but are displayed and parsed at 1 + int page = 0; + + + if (args.Parameters.Count > 0) + { + if (!int.TryParse(args.Parameters[0], out page) || page < 1) + { + args.Player.SendMessage(string.Format("Invalid page number ({0})", page), Color.Red); + return; + } + page--; //Substract 1 as pages are parsed starting at 1 and not 0 + } + + var playerList = args.Player.Group.HasPermission(Permissions.seeids) + ? TShock.Utils.GetPlayers(true) + : TShock.Utils.GetPlayers(false); + + //Check if they are trying to access a page that doesn't exist. + int pagecount = playerList.Count / pagelimit; + if (page > pagecount) + { + args.Player.SendMessage(string.Format("Page number exceeds pages ({0}/{1})", page + 1, pagecount + 1), Color.Red); + return; + } + + //Display the current page and the number of pages. + args.Player.SendMessage(string.Format("Players: {0}/{1}", + TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots)); + args.Player.SendMessage(string.Format("Current players page {0}/{1}:", page + 1, pagecount + 1), Color.Green); + + //Add up to pagelimit names to a list + var nameslist = new List(); + for (int i = (page * pagelimit); (i < ((page * pagelimit) + pagelimit)) && i < playerList.Count; i++) + { + nameslist.Add(playerList[i]); + } + + //convert the list to an array for joining + var names = nameslist.ToArray(); + for (int i = 0; i < names.Length; i += perline) + { + args.Player.SendMessage(string.Join(", ", names, i, Math.Min(names.Length - i, perline)), Color.Yellow); + } + + if (page < pagecount) + { + args.Player.SendMessage(string.Format("Type /who {0} for more warps.", (page + 2)), Color.Yellow); + } + } private static void AuthToken(CommandArgs args) { diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index dd3c1966..21e5cbb1 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -64,6 +64,7 @@ namespace TShockAPI /// Used for some places where a list of players might be used. /// /// String of players seperated by commas. + [Obsolete("Use GetPlayers and manually create strings. This should never have been kept as far as actual functions go.")] public string GetPlayers() { var sb = new StringBuilder(); @@ -81,10 +82,38 @@ namespace TShockAPI return sb.ToString(); } + /// + /// Returns a list of current players on the server + /// + /// bool includeIDs - whether or not the string of each player name should include ID data + /// List of strings with names + public List GetPlayers(bool includeIDs) + { + var players = new List(); + + foreach (TSPlayer ply in TShock.Players) + { + if (ply != null && ply.Active) + { + if (includeIDs) + { + players.Add(ply.Name + " (IX: " + ply.Index + ", ID: " + ply.UserID + ")"); + } + else + { + players.Add(ply.Name); + } + } + } + + return players; + } + /// /// Used for some places where a list of players might be used. /// /// String of players and their id seperated by commas. + [Obsolete("Use GetPlayers and manually create strings. This should never have been kept as far as actual functions go.")] public string GetPlayersWithIds() { var sb = new StringBuilder(); From 45e4eb0f9e37ee2b33d7ce02d6cf12df333dcda0 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 17:40:16 -0600 Subject: [PATCH 09/22] Merged all warp commands into one setwarp -> warp add delwarp -> warp del hidewarp -> warp hide --- TShockAPI/Commands.cs | 178 ++++++++++++++++++++++-------------------- 1 file changed, 94 insertions(+), 84 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index e6a7bf25..6519b3e1 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -151,9 +151,9 @@ namespace TShockAPI add(Permissions.tphere, SendWarp, "sendwarp", "sw"); add(Permissions.tpallow, TPAllow, "tpallow"); add(Permissions.warp, UseWarp, "warp"); - add(Permissions.managewarp, SetWarp, "setwarp"); - add(Permissions.managewarp, DeleteWarp, "delwarp"); - add(Permissions.managewarp, HideWarp, "hidewarp"); + //add(Permissions.managewarp, SetWarp, "setwarp"); + //add(Permissions.managewarp, DeleteWarp, "delwarp"); + //add(Permissions.managewarp, HideWarp, "hidewarp"); add(Permissions.managegroup, AddGroup, "addgroup"); add(Permissions.managegroup, DeleteGroup, "delgroup"); add(Permissions.managegroup, ModifyGroup, "modgroup"); @@ -1771,74 +1771,26 @@ namespace TShockAPI } } - private static void SetWarp(CommandArgs args) - { - if (args.Parameters.Count > 0) - { - string warpName = String.Join(" ", args.Parameters); - if (warpName.Equals("list")) - { - args.Player.SendMessage("Name reserved, use a different name", Color.Red); - } - else if (TShock.Warps.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldID.ToString())) - { - args.Player.SendMessage("Set warp " + warpName, Color.Yellow); - } - else - { - args.Player.SendMessage("Warp " + warpName + " already exists", Color.Red); - } - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /setwarp [name]", Color.Red); - } - - private static void DeleteWarp(CommandArgs args) - { - if (args.Parameters.Count > 0) - { - string warpName = String.Join(" ", args.Parameters); - if (TShock.Warps.RemoveWarp(warpName)) - args.Player.SendMessage("Deleted warp " + warpName, Color.Yellow); - else - args.Player.SendMessage("Could not find specified warp", Color.Red); - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /delwarp [name]", Color.Red); - } - - private static void HideWarp(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - string warpName = String.Join(" ", args.Parameters); - bool state = false; - if (Boolean.TryParse(args.Parameters[1], out state)) - { - if (TShock.Warps.HideWarp(args.Parameters[0], state)) - { - if (state) - args.Player.SendMessage("Made warp " + warpName + " private", Color.Yellow); - else - args.Player.SendMessage("Made warp " + warpName + " public", Color.Yellow); - } - else - args.Player.SendMessage("Could not find specified warp", Color.Red); - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /hidewarp [name] ", Color.Red); - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /hidewarp [name] ", Color.Red); - } - private static void UseWarp(CommandArgs args) { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or /warp list ", Color.Red); - return; - } + bool hasManageWarpPermission = args.Player.Group.HasPermission(Permissions.managewarp); + if (args.Parameters.Count < 1) + { + if (hasManageWarpPermission) + { + args.Player.SendMessage("All warp commands were merged into one in TShock 4.0.", Color.Yellow); + args.Player.SendMessage("Invalid syntax. Syntax: /warp [command] [arguments]", Color.Green); + args.Player.SendMessage("Commands: add, del, hide, list, [warpname]", Color.Green); + args.Player.SendMessage("Arguments: add [warp name], del [warp name], hide [warp name] [Enable(true/false)], list [page]", Color.Green); + args.Player.SendMessage("Examples: /warp add foobar, /warp hide foobar true, /warp foobar", Color.Green); + return; + } + else + { + args.Player.SendMessage("Invalid syntax. Syntax: /warp [name] or /warp list ", Color.Red); + return; + } + } if (args.Parameters[0].Equals("list")) { @@ -1891,21 +1843,79 @@ namespace TShockAPI { args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 2)), Color.Yellow); } - } - else - { - string warpName = String.Join(" ", args.Parameters); - var warp = TShock.Warps.FindWarp(warpName); - if (warp.WarpPos != Vector2.Zero) - { - if (args.Player.Teleport((int) warp.WarpPos.X, (int) warp.WarpPos.Y + 3)) - args.Player.SendMessage("Warped to " + warpName, Color.Yellow); - } - else - { - args.Player.SendMessage("Specified warp not found", Color.Red); - } - } + } + else if (args.Parameters[0].ToLower() == "add" && hasManageWarpPermission) + { + if (args.Parameters.Count == 2) + { + string warpName = args.Parameters[1]; + if (warpName == "list" || warpName == "hide" || warpName == "del" || warpName == "add") + { + args.Player.SendMessage("Name reserved, use a different name", Color.Red); + } + else if (TShock.Warps.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldID.ToString())) + { + args.Player.SendMessage("Warp added: " + warpName, Color.Yellow); + } + else + { + args.Player.SendMessage("Warp " + warpName + " already exists", Color.Red); + } + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /warp add [name]", Color.Red); + } + else if (args.Parameters[0].ToLower() == "del" && hasManageWarpPermission) + { + if (args.Parameters.Count == 2) + { + string warpName = args.Parameters[1]; + if (TShock.Warps.RemoveWarp(warpName)) + args.Player.SendMessage("Warp deleted: " + warpName, Color.Yellow); + else + args.Player.SendMessage("Could not find specified warp.", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /warp del [name]", Color.Red); + } + else if (args.Parameters[0].ToLower() == "hide" && hasManageWarpPermission) + { + if (args.Parameters.Count == 3) + { + string warpName = args.Parameters[1]; + bool state = false; + if (Boolean.TryParse(args.Parameters[2], out state)) + { + if (TShock.Warps.HideWarp(args.Parameters[0], state)) + { + if (state) + args.Player.SendMessage("Warp " + warpName + " is now private.", Color.Yellow); + else + args.Player.SendMessage("Warp " + warpName + " is now public.", Color.Yellow); + } + else + args.Player.SendMessage("Could not find specified warp.", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /warp hide [name] ", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /warp hide [name] ", Color.Red); + } + else + { + string warpName = String.Join(" ", args.Parameters); + var warp = TShock.Warps.FindWarp(warpName); + if (warp.WarpPos != Vector2.Zero) + { + if (args.Player.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) + args.Player.SendMessage("Warped to " + warpName, Color.Yellow); + } + else + { + args.Player.SendMessage("Specified warp not found", Color.Red); + } + } } #endregion Teleport Commands From d890359551bffb4e5fe7b8238e7d4d6998faa38e Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 18:06:18 -0600 Subject: [PATCH 10/22] SendWarp is now wrapped into Warp Removed old functions that are no longer relevant. Changed help to be a little more helpful in Warp. Wrapped the Warp command into regions. --- TShockAPI/Commands.cs | 106 +++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 6519b3e1..e4068e5a 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -148,12 +148,8 @@ namespace TShockAPI add(Permissions.tp, Spawn, "spawn"); add(Permissions.tp, TP, "tp"); add(Permissions.tphere, TPHere, "tphere"); - add(Permissions.tphere, SendWarp, "sendwarp", "sw"); add(Permissions.tpallow, TPAllow, "tpallow"); - add(Permissions.warp, UseWarp, "warp"); - //add(Permissions.managewarp, SetWarp, "setwarp"); - //add(Permissions.managewarp, DeleteWarp, "delwarp"); - //add(Permissions.managewarp, HideWarp, "hidewarp"); + add(Permissions.warp, Warp, "warp", "setwarp", "delwarp", "sendwarp", "sw"); add(Permissions.managegroup, AddGroup, "addgroup"); add(Permissions.managegroup, DeleteGroup, "delgroup"); add(Permissions.managegroup, ModifyGroup, "modgroup"); @@ -1735,43 +1731,7 @@ namespace TShockAPI args.Player.TPAllow = !args.Player.TPAllow; } - private static void SendWarp(CommandArgs args) - { - if (args.Parameters.Count < 2) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /sendwarp [player] [warpname]", Color.Red); - return; - } - - var foundplr = TShock.Utils.FindPlayer(args.Parameters[0]); - if (foundplr.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - return; - } - else if (foundplr.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) player matched!", args.Parameters.Count), Color.Red); - return; - } - string warpName = String.Join(" ", args.Parameters[1]); - var warp = TShock.Warps.FindWarp(warpName); - var plr = foundplr[0]; - if (warp.WarpPos != Vector2.Zero) - { - if (plr.Teleport((int) warp.WarpPos.X, (int) warp.WarpPos.Y + 3)) - { - plr.SendMessage(string.Format("{0} Warped you to {1}", args.Player.Name, warpName), Color.Yellow); - args.Player.SendMessage(string.Format("You warped {0} to {1}.", plr.Name, warpName), Color.Yellow); - } - } - else - { - args.Player.SendMessage("Specified warp not found", Color.Red); - } - } - - private static void UseWarp(CommandArgs args) + private static void Warp(CommandArgs args) { bool hasManageWarpPermission = args.Player.Group.HasPermission(Permissions.managewarp); if (args.Parameters.Count < 1) @@ -1779,22 +1739,27 @@ namespace TShockAPI if (hasManageWarpPermission) { args.Player.SendMessage("All warp commands were merged into one in TShock 4.0.", Color.Yellow); + args.Player.SendMessage("Previous warps with spaces should be wrapped in single quotes.", Color.Red); args.Player.SendMessage("Invalid syntax. Syntax: /warp [command] [arguments]", Color.Green); - args.Player.SendMessage("Commands: add, del, hide, list, [warpname]", Color.Green); - args.Player.SendMessage("Arguments: add [warp name], del [warp name], hide [warp name] [Enable(true/false)], list [page]", Color.Green); + args.Player.SendMessage("Commands: add, del, hide, list, send, [warpname]", Color.Green); + args.Player.SendMessage("Arguments: add [warp name], del [warp name], list [page]", Color.Green); + args.Player.SendMessage("Arguments: send [player] [warp name], hide [warp name] [Enable(true/false)]", Color.Green); args.Player.SendMessage("Examples: /warp add foobar, /warp hide foobar true, /warp foobar", Color.Green); return; } else { args.Player.SendMessage("Invalid syntax. Syntax: /warp [name] or /warp list ", Color.Red); + args.Player.SendMessage("Previous warps with spaces should be wrapped in single quotes.", Color.Red); + return; } } if (args.Parameters[0].Equals("list")) - { - //How many warps per page + { + #region + //How many warps per page const int pagelimit = 15; //How many warps per line const int perline = 5; @@ -1842,10 +1807,12 @@ namespace TShockAPI if (page < pagecount) { args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 2)), Color.Yellow); - } + } + #endregion } else if (args.Parameters[0].ToLower() == "add" && hasManageWarpPermission) { + #region Add warp if (args.Parameters.Count == 2) { string warpName = args.Parameters[1]; @@ -1864,9 +1831,12 @@ namespace TShockAPI } else args.Player.SendMessage("Invalid syntax! Proper syntax: /warp add [name]", Color.Red); + #endregion + } else if (args.Parameters[0].ToLower() == "del" && hasManageWarpPermission) { + #region Del warp if (args.Parameters.Count == 2) { string warpName = args.Parameters[1]; @@ -1877,9 +1847,12 @@ namespace TShockAPI } else args.Player.SendMessage("Invalid syntax! Proper syntax: /warp del [name]", Color.Red); + #endregion + } else if (args.Parameters[0].ToLower() == "hide" && hasManageWarpPermission) { + #region Hide warp if (args.Parameters.Count == 3) { string warpName = args.Parameters[1]; @@ -1901,6 +1874,45 @@ namespace TShockAPI } else args.Player.SendMessage("Invalid syntax! Proper syntax: /warp hide [name] ", Color.Red); + #endregion + } + else if (args.Parameters[0].ToLower() == "send" && args.Player.Group.HasPermission(Permissions.tphere)) + { + #region Warp send + if (args.Parameters.Count < 3) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /warp send [player] [warpname]", Color.Red); + return; + } + + var foundplr = TShock.Utils.FindPlayer(args.Parameters[1]); + if (foundplr.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + return; + } + else if (foundplr.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) player matched!", args.Parameters.Count), Color.Red); + return; + } + string warpName = args.Parameters[2]; + var warp = TShock.Warps.FindWarp(warpName); + var plr = foundplr[0]; + if (warp.WarpPos != Vector2.Zero) + { + if (plr.Teleport((int)warp.WarpPos.X, (int)warp.WarpPos.Y + 3)) + { + plr.SendMessage(string.Format("{0} Warped you to {1}", args.Player.Name, warpName), Color.Yellow); + args.Player.SendMessage(string.Format("You warped {0} to {1}.", plr.Name, warpName), Color.Yellow); + } + } + else + { + args.Player.SendMessage("Specified warp not found.", Color.Red); + } + #endregion + } else { From 598049856924180e6be95f1a719a856db3ad9da8 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 19:07:22 -0600 Subject: [PATCH 11/22] Changed the /who output to more appropriately reflect what it is --- TShockAPI/Commands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index e4068e5a..3facea72 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -3035,7 +3035,7 @@ namespace TShockAPI if (page < pagecount) { - args.Player.SendMessage(string.Format("Type /who {0} for more warps.", (page + 2)), Color.Yellow); + args.Player.SendMessage(string.Format("Type /who {0} for more players.", (page + 2)), Color.Yellow); } } From f1c9ef3c13897f3b7a8d8f755e8b28f185ee482e Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 19:13:59 -0600 Subject: [PATCH 12/22] Removed placeholder todo --- TShockAPI/Commands.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 3facea72..17b41516 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -2981,7 +2981,6 @@ namespace TShockAPI TShock.Utils.ActivePlayers(), TShock.Config.MaxSlots)); } - //TODO: Continue this private static void ListConnectedPlayers(CommandArgs args) { //How many players per page From 6721abf78c5ae81800f1ea7aa15f2a81f8ce286f Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 20:03:01 -0600 Subject: [PATCH 13/22] Removed all boss specific commands They can now be spawned using /boss --- TShockAPI/Commands.cs | 412 +++++++++++++++++------------------------- 1 file changed, 162 insertions(+), 250 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 17b41516..ec2783d7 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -134,15 +134,8 @@ namespace TShockAPI add(Permissions.causeevents, Fullmoon, "fullmoon"); add(Permissions.causeevents, Bloodmoon, "bloodmoon"); add(Permissions.causeevents, Invade, "invade"); - add(Permissions.spawnboss, Eater, "eater"); - add(Permissions.spawnboss, Eye, "eye"); - add(Permissions.spawnboss, King, "king"); - add(Permissions.spawnboss, Skeletron, "skeletron"); - add(Permissions.spawnboss, WoF, "wof", "wallofflesh"); - add(Permissions.spawnboss, Twins, "twins"); - add(Permissions.spawnboss, Destroyer, "destroyer"); - add(Permissions.spawnboss, SkeletronPrime, "skeletronp", "prime"); - add(Permissions.spawnboss, Hardcore, "hardcore"); + add(Permissions.spawnboss, SpawnBoss, "boss", "eater", "king", "eye", "skeletron", "wof", "wallofflesh", "twins", + "destroyer", "prime", "skeletronp", "hardcore"); add(Permissions.spawnmob, SpawnMob, "spawnmob", "sm"); add(Permissions.tp, Home, "home"); add(Permissions.tp, Spawn, "spawn"); @@ -1240,260 +1233,179 @@ namespace TShockAPI } } - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void Eater(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /eater [amount]", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /eater [amount]", Color.Red); - return; - } - amount = Math.Min(amount, Main.maxNPCs); - NPC eater = TShock.Utils.GetNPCById(13); - TSPlayer.Server.SpawnNPC(eater.type, eater.name, amount, args.Player.TileX, args.Player.TileY); - TShock.Utils.Broadcast(string.Format("{0} has spawned eater of worlds {1} times!", args.Player.Name, amount)); - } + private static void SpawnBoss(CommandArgs args) + { + if (args.Parameters.Count == 0) + { + args.Player.SendMessage("As of TShock 4.0, all boss specific spawning commands are now in /boss.", Color.Yellow); + args.Player.SendMessage("Invalid syntax. Syntax: /boss [name] [count]", Color.Green); + args.Player.SendMessage("Bosses: eow, king, eye, skeletron, wof, twins, destroyer, prime, *", Color.Green); + return; + } + int numberOfEnemies = 0; + string boss = args.Parameters[0]; + int.TryParse(args.Parameters[1], out numberOfEnemies); + numberOfEnemies = Math.Min(numberOfEnemies, Main.maxNPCs); - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void Eye(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /eye [amount]", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /eye [amount]", Color.Red); - return; - } - amount = Math.Min(amount, Main.maxNPCs); - NPC eye = TShock.Utils.GetNPCById(4); - TSPlayer.Server.SetTime(false, 0.0); - TSPlayer.Server.SpawnNPC(eye.type, eye.name, amount, args.Player.TileX, args.Player.TileY); - TShock.Utils.Broadcast(string.Format("{0} has spawned eye {1} times!", args.Player.Name, amount)); - } + if (boss.ToLower() == "eow" || boss.ToLower() == "eater") + { + NPC eater = TShock.Utils.GetNPCById(13); + TSPlayer.Server.SpawnNPC(eater.type, eater.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TShock.Utils.Broadcast(string.Format("{0} has spawned the eater of worlds {1} times!", args.Player.Name, numberOfEnemies)); + return; + } - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void King(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /king [amount]", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /king [amount]", Color.Red); - return; - } - amount = Math.Min(amount, Main.maxNPCs); - NPC king = TShock.Utils.GetNPCById(50); - TSPlayer.Server.SpawnNPC(king.type, king.name, amount, args.Player.TileX, args.Player.TileY); - TShock.Utils.Broadcast(string.Format("{0} has spawned king slime {1} times!", args.Player.Name, amount)); - } + if (boss.ToLower() == "eye") + { + NPC eye = TShock.Utils.GetNPCById(4); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(eye.type, eye.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TShock.Utils.Broadcast(string.Format("{0} has spawned the eye of cthulhu {1} times!", args.Player.Name, numberOfEnemies)); + return; + } - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void Skeletron(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /skeletron [amount]", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /skeletron [amount]", Color.Red); - return; - } - amount = Math.Min(amount, Main.maxNPCs); - NPC skeletron = TShock.Utils.GetNPCById(35); - TSPlayer.Server.SetTime(false, 0.0); - TSPlayer.Server.SpawnNPC(skeletron.type, skeletron.name, amount, args.Player.TileX, args.Player.TileY); - TShock.Utils.Broadcast(string.Format("{0} has spawned skeletron {1} times!", args.Player.Name, amount)); - } + if (boss.ToLower() == "king") + { + NPC king = TShock.Utils.GetNPCById(50); + TSPlayer.Server.SpawnNPC(king.type, king.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TShock.Utils.Broadcast(string.Format("{0} has spawned the king of slimes {1} times!", args.Player.Name, numberOfEnemies)); + return; + } - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void WoF(CommandArgs args) - { - if (Main.wof >= 0 || (args.Player.Y/16f < (Main.maxTilesY - 205))) - { - args.Player.SendMessage("Can't spawn Wall of Flesh!", Color.Red); - return; - } - NPC.SpawnWOF(new Vector2(args.Player.X, args.Player.Y)); - TShock.Utils.Broadcast(string.Format("{0} has spawned Wall of Flesh!", args.Player.Name)); - } + if (boss.ToLower() == "skeleton") + { + NPC skeletron = TShock.Utils.GetNPCById(35); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(skeletron.type, skeletron.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TShock.Utils.Broadcast(string.Format("{0} has spawned skeletron {1} times!", args.Player.Name, numberOfEnemies)); + return; + } - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void Twins(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /twins [amount]", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /twins [amount]", Color.Red); - return; - } - amount = Math.Min(amount, Main.maxNPCs); - NPC retinazer = TShock.Utils.GetNPCById(125); - NPC spaz = TShock.Utils.GetNPCById(126); - TSPlayer.Server.SetTime(false, 0.0); - TSPlayer.Server.SpawnNPC(retinazer.type, retinazer.name, amount, args.Player.TileX, args.Player.TileY); - TSPlayer.Server.SpawnNPC(spaz.type, spaz.name, amount, args.Player.TileX, args.Player.TileY); - TShock.Utils.Broadcast(string.Format("{0} has spawned the twins {1} times!", args.Player.Name, amount)); - } + if (boss.ToLower() == "wof" || boss.ToLower() == "flesh") + { + if (Main.wof >= 0 || (args.Player.Y / 16f < (Main.maxTilesY - 205))) + { + args.Player.SendMessage("Can't spawn a Wall of Flesh!", Color.Red); + return; + } + NPC.SpawnWOF(new Vector2(args.Player.X, args.Player.Y)); + TShock.Utils.Broadcast(string.Format("{0} has spawned a Wall of Flesh!", args.Player.Name)); + return; + } - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void Destroyer(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /destroyer [amount]", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /destroyer [amount]", Color.Red); - return; - } - amount = Math.Min(amount, Main.maxNPCs); - NPC destroyer = TShock.Utils.GetNPCById(134); - TSPlayer.Server.SetTime(false, 0.0); - TSPlayer.Server.SpawnNPC(destroyer.type, destroyer.name, amount, args.Player.TileX, args.Player.TileY); - TShock.Utils.Broadcast(string.Format("{0} has spawned the destroyer {1} times!", args.Player.Name, amount)); - } + if (boss.ToLower() == "twins") + { + NPC retinazer = TShock.Utils.GetNPCById(125); + NPC spaz = TShock.Utils.GetNPCById(126); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(retinazer.type, retinazer.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TSPlayer.Server.SpawnNPC(spaz.type, spaz.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TShock.Utils.Broadcast(string.Format("{0} has spawned the twins {1} times!", args.Player.Name, numberOfEnemies)); + return; + } - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void SkeletronPrime(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /prime [amount]", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /prime [amount]", Color.Red); - return; - } - amount = Math.Min(amount, Main.maxNPCs); - NPC prime = TShock.Utils.GetNPCById(127); - TSPlayer.Server.SetTime(false, 0.0); - TSPlayer.Server.SpawnNPC(prime.type, prime.name, amount, args.Player.TileX, args.Player.TileY); - TShock.Utils.Broadcast(string.Format("{0} has spawned skeletron prime {1} times!", args.Player.Name, amount)); - } + if (boss.ToLower() == "destroyer") + { + NPC destroyer = TShock.Utils.GetNPCById(134); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(destroyer.type, destroyer.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TShock.Utils.Broadcast(string.Format("{0} has spawned the destroyer {1} times!", args.Player.Name, numberOfEnemies)); + return; + } - [Obsolete("This specific command for spawning mobs will replaced soon.")] - private static void Hardcore(CommandArgs args) // TODO: Add all 8 bosses - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /hardcore [amount]", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /hardcore [amount]", Color.Red); - return; - } - amount = Math.Min(amount, Main.maxNPCs/4); - NPC retinazer = TShock.Utils.GetNPCById(125); - NPC spaz = TShock.Utils.GetNPCById(126); - NPC destroyer = TShock.Utils.GetNPCById(134); - NPC prime = TShock.Utils.GetNPCById(127); - NPC eater = TShock.Utils.GetNPCById(13); - NPC eye = TShock.Utils.GetNPCById(4); - NPC king = TShock.Utils.GetNPCById(50); - NPC skeletron = TShock.Utils.GetNPCById(35); - TSPlayer.Server.SetTime(false, 0.0); - TSPlayer.Server.SpawnNPC(retinazer.type, retinazer.name, amount, args.Player.TileX, args.Player.TileY); - TSPlayer.Server.SpawnNPC(spaz.type, spaz.name, amount, args.Player.TileX, args.Player.TileY); - TSPlayer.Server.SpawnNPC(destroyer.type, destroyer.name, amount, args.Player.TileX, args.Player.TileY); - TSPlayer.Server.SpawnNPC(prime.type, prime.name, amount, args.Player.TileX, args.Player.TileY); - TSPlayer.Server.SpawnNPC(eater.type, eater.name, amount, args.Player.TileX, args.Player.TileY); - TSPlayer.Server.SpawnNPC(eye.type, eye.name, amount, args.Player.TileX, args.Player.TileY); - TSPlayer.Server.SpawnNPC(king.type, king.name, amount, args.Player.TileX, args.Player.TileY); - TSPlayer.Server.SpawnNPC(skeletron.type, skeletron.name, amount, args.Player.TileX, args.Player.TileY); - TShock.Utils.Broadcast(string.Format("{0} has spawned all bosses {1} times!", args.Player.Name, amount)); - } + if (boss.ToLower() == "prime") + { + NPC prime = TShock.Utils.GetNPCById(127); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(prime.type, prime.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TShock.Utils.Broadcast(string.Format("{0} has spawned skeletron prime {1} times!", args.Player.Name, numberOfEnemies)); + return; + } - private static void SpawnMob(CommandArgs args) - { - if (args.Parameters.Count < 1 || args.Parameters.Count > 2) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /spawnmob [amount]", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing mob name/id", Color.Red); - return; - } - int amount = 1; - if (args.Parameters.Count == 2 && !int.TryParse(args.Parameters[1], out amount)) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /spawnmob [amount]", Color.Red); - return; - } + if (boss == "*") + { + NPC retinazer = TShock.Utils.GetNPCById(125); + NPC spaz = TShock.Utils.GetNPCById(126); + NPC destroyer = TShock.Utils.GetNPCById(134); + NPC prime = TShock.Utils.GetNPCById(127); + NPC eater = TShock.Utils.GetNPCById(13); + NPC eye = TShock.Utils.GetNPCById(4); + NPC king = TShock.Utils.GetNPCById(50); + NPC skeletron = TShock.Utils.GetNPCById(35); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(retinazer.type, retinazer.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TSPlayer.Server.SpawnNPC(spaz.type, spaz.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TSPlayer.Server.SpawnNPC(destroyer.type, destroyer.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TSPlayer.Server.SpawnNPC(prime.type, prime.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TSPlayer.Server.SpawnNPC(eater.type, eater.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TSPlayer.Server.SpawnNPC(eye.type, eye.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TSPlayer.Server.SpawnNPC(king.type, king.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TSPlayer.Server.SpawnNPC(skeletron.type, skeletron.name, numberOfEnemies, args.Player.TileX, args.Player.TileY); + TShock.Utils.Broadcast(string.Format("{0} has spawned all bosses {1} times!", args.Player.Name, numberOfEnemies)); + return; + } + } - amount = Math.Min(amount, Main.maxNPCs); + private static void SpawnMob(CommandArgs args) + { + if (args.Parameters.Count < 1 || args.Parameters.Count > 2) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /spawnmob [amount]", Color.Red); + return; + } + if (args.Parameters[0].Length == 0) + { + args.Player.SendMessage("Missing mob name/id", Color.Red); + return; + } + int amount = 1; + if (args.Parameters.Count == 2 && !int.TryParse(args.Parameters[1], out amount)) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /spawnmob [amount]", Color.Red); + return; + } - var npcs = TShock.Utils.GetNPCByIdOrName(args.Parameters[0]); - if (npcs.Count == 0) - { - args.Player.SendMessage("Invalid mob type!", Color.Red); - } - else if (npcs.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) mob matched!", npcs.Count), Color.Red); - } - else - { - var npc = npcs[0]; - if (npc.type >= 1 && npc.type < Main.maxNPCTypes && npc.type != 113) - //Do not allow WoF to spawn, in certain conditions may cause loops in client - { - TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY, 50, 20); - TShock.Utils.Broadcast(string.Format("{0} was spawned {1} time(s).", npc.name, amount)); - } - else if (npc.type == 113) - args.Player.SendMessage("Sorry, you can't spawn Wall of Flesh! Try /wof instead."); - // Maybe perhaps do something with WorldGen.SpawnWoF? - else - args.Player.SendMessage("Invalid mob type!", Color.Red); - } - } + amount = Math.Min(amount, Main.maxNPCs); - private static void StartHardMode(CommandArgs args) - { - if (!TShock.Config.DisableHardmode) - WorldGen.StartHardmode(); - else - args.Player.SendMessage("Hardmode is disabled via config", Color.Red); - } + var npcs = TShock.Utils.GetNPCByIdOrName(args.Parameters[0]); + if (npcs.Count == 0) + { + args.Player.SendMessage("Invalid mob type!", Color.Red); + } + else if (npcs.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) mob matched!", npcs.Count), Color.Red); + } + else + { + var npc = npcs[0]; + if (npc.type >= 1 && npc.type < Main.maxNPCTypes && npc.type != 113) + //Do not allow WoF to spawn, in certain conditions may cause loops in client + { + TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY, 50, 20); + TShock.Utils.Broadcast(string.Format("{0} was spawned {1} time(s).", npc.name, amount)); + } + else if (npc.type == 113) + args.Player.SendMessage("Sorry, you can't spawn Wall of Flesh! Try /wof instead."); + // Maybe perhaps do something with WorldGen.SpawnWoF? + else + args.Player.SendMessage("Invalid mob type!", Color.Red); + } + } - private static void DisableHardMode(CommandArgs args) - { - Main.hardMode = false; - args.Player.SendMessage("Hardmode is now disabled", Color.Green); - } + private static void StartHardMode(CommandArgs args) + { + if (!TShock.Config.DisableHardmode) + WorldGen.StartHardmode(); + else + args.Player.SendMessage("Hardmode is disabled via config", Color.Red); + } + + private static void DisableHardMode(CommandArgs args) + { + Main.hardMode = false; + args.Player.SendMessage("Hardmode is now disabled", Color.Green); + } private static void ConvertCorruption(CommandArgs args) { From 55ae626131e37102da14647c6286ab31c8ec74e1 Mon Sep 17 00:00:00 2001 From: Deathmax Date: Wed, 30 May 2012 10:02:29 +0800 Subject: [PATCH 14/22] Remove unnecessary hypen in console title --- TShockAPI/TShock.cs | 6 ++++-- TShockAPI/postbuild.bat | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 758ad606..0a75e3c8 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -647,8 +647,10 @@ namespace TShockAPI private void SetConsoleTitle() { - Console.Title = string.Format("{0} - {1}/{2} @ {3}:{4} (TerrariaShock v{5})", Config.ServerName, Utils.ActivePlayers(), - Config.MaxSlots, Netplay.serverListenIP, Netplay.serverPort, Version); + Console.Title = string.Format("{0}{1}/{2} @ {3}:{4} (TerrariaShock v{5})", + !string.IsNullOrWhiteSpace(Config.ServerName) ? Config.ServerName + " - " : "", + Utils.ActivePlayers(), + Config.MaxSlots, Netplay.serverListenIP, Netplay.serverPort, Version); } private void OnHardUpdate( HardUpdateEventArgs args ) diff --git a/TShockAPI/postbuild.bat b/TShockAPI/postbuild.bat index 1ecae508..dda05b70 100644 --- a/TShockAPI/postbuild.bat +++ b/TShockAPI/postbuild.bat @@ -1,4 +1,4 @@ -set pluginspath=C:\Program Files (x86)\Steam\steamapps\common\terraria\serverplugins\ +set pluginspath=F:\Program Files (x86)\Steam\steamapps\common\terraria\serverplugins\ IF NOT EXIST "%pluginspath%" GOTO SkipCopy attrib -r "%pluginspath%TShockAPI.dll" attrib -r "%pluginspath%TShockAPI.pdb" From c803edd8a82db12edba7d753504f95a9c1dff6f3 Mon Sep 17 00:00:00 2001 From: Deathmax Date: Wed, 30 May 2012 10:05:19 +0800 Subject: [PATCH 15/22] Remove redundant servername config options --- TShockAPI/ConfigFile.cs | 2 -- TShockAPI/Rest/RestManager.cs | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 69c78720..6357bf26 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -132,8 +132,6 @@ namespace TShockAPI [Description("This will turn on a token requirement for the /status API endpoint.")] public bool EnableTokenEndpointAuthentication; - [Description("This is used when the API endpoint /status is queried.")] public string ServerNickname = "TShock Server"; - [Description("Enable/Disable the rest api.")] public bool RestApiEnabled; [Description("This is the port which the rest api will listen on.")] public int RestApiPort = 7878; diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs index 3e303777..160dad55 100644 --- a/TShockAPI/Rest/RestManager.cs +++ b/TShockAPI/Rest/RestManager.cs @@ -126,7 +126,7 @@ namespace TShockAPI var activeplayers = Main.player.Where(p => null != p && p.active).ToList(); return new RestObject() { - {"name", TShock.Config.ServerNickname}, + {"name", TShock.Config.ServerName}, {"port", Convert.ToString(Netplay.serverPort)}, {"playercount", Convert.ToString(activeplayers.Count())}, {"players", string.Join(", ", activeplayers.Select(p => p.name))}, @@ -140,7 +140,7 @@ namespace TShockAPI var ret = new RestObject() { - {"name", TShock.Config.ServerNickname}, + {"name", TShock.Config.ServerName}, {"port", TShock.Config.ServerPort}, {"playercount", Main.player.Where(p => null != p && p.active).Count()}, {"maxplayers", TShock.Config.MaxSlots}, From ca3edd12d7add768ee94e2dd025f5b782337d850 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 20:12:20 -0600 Subject: [PATCH 16/22] I swear I'm not going to correct all the bad grammar used throughout TShock --- TShockAPI/Commands.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index ec2783d7..2738af60 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1398,13 +1398,13 @@ namespace TShockAPI if (!TShock.Config.DisableHardmode) WorldGen.StartHardmode(); else - args.Player.SendMessage("Hardmode is disabled via config", Color.Red); + args.Player.SendMessage("Hardmode is disabled via config.", Color.Red); } private static void DisableHardMode(CommandArgs args) { Main.hardMode = false; - args.Player.SendMessage("Hardmode is now disabled", Color.Green); + args.Player.SendMessage("Hardmode is now disabled.", Color.Green); } private static void ConvertCorruption(CommandArgs args) From 22894580539f9a61e3f35d28d49b760128b6ed2e Mon Sep 17 00:00:00 2001 From: Deathmax Date: Wed, 30 May 2012 10:09:29 +0800 Subject: [PATCH 17/22] Shouldn't have commited that --- TShockAPI/postbuild.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/postbuild.bat b/TShockAPI/postbuild.bat index dda05b70..1ecae508 100644 --- a/TShockAPI/postbuild.bat +++ b/TShockAPI/postbuild.bat @@ -1,4 +1,4 @@ -set pluginspath=F:\Program Files (x86)\Steam\steamapps\common\terraria\serverplugins\ +set pluginspath=C:\Program Files (x86)\Steam\steamapps\common\terraria\serverplugins\ IF NOT EXIST "%pluginspath%" GOTO SkipCopy attrib -r "%pluginspath%TShockAPI.dll" attrib -r "%pluginspath%TShockAPI.pdb" From 4eaf64709bca87a2c35494c00ef97656d162417c Mon Sep 17 00:00:00 2001 From: Deathmax Date: Wed, 30 May 2012 10:18:44 +0800 Subject: [PATCH 18/22] Re-add ServerNickname and copies it to ServerName --- TShockAPI/ConfigFile.cs | 2 ++ TShockAPI/TShock.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 6357bf26..3113800e 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -132,6 +132,8 @@ namespace TShockAPI [Description("This will turn on a token requirement for the /status API endpoint.")] public bool EnableTokenEndpointAuthentication; + [Description("Deprecated. Use ServerName instead.")] public string ServerNickname = "TShock Server"; + [Description("Enable/Disable the rest api.")] public bool RestApiEnabled; [Description("This is the port which the rest api will listen on.")] public int RestApiPort = 7878; diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 0a75e3c8..4324c0a7 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -1590,6 +1590,8 @@ namespace TShockAPI RconHandler.ListenPort = file.RconPort; Utils.HashAlgo = file.HashAlgorithm; + + file.ServerName = file.ServerNickname; } } } From 7f389b20a101f42a3345c7a27cafcca26d54512a Mon Sep 17 00:00:00 2001 From: Deathmax Date: Wed, 30 May 2012 10:20:28 +0800 Subject: [PATCH 19/22] Make commands case-insensitive --- TShockAPI/Commands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 2738af60..775611c0 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -213,7 +213,7 @@ namespace TShockAPI if (args.Count < 1) return false; - string cmdName = args[0]; + string cmdName = args[0].ToLower(); args.RemoveAt(0); Command cmd = ChatCommands.FirstOrDefault(c => c.HasAlias(cmdName)); From 7f5ee044c97a7febfae72b63c7666ff69eeecd5f Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 20:20:24 -0600 Subject: [PATCH 20/22] Removed dumb comment by developer regarding the method Utils.ShowFileToUser not working because it works fine ffs --- TShockAPI/Commands.cs | 133 +++--------------------------------------- TShockAPI/Utils.cs | 1 - 2 files changed, 9 insertions(+), 125 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 775611c0..0dc8d053 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -122,6 +122,10 @@ namespace TShockAPI public static void InitCommands() { AddChatCommand add = (p, c, n) => ChatCommands.Add(new Command(p, c, n)); + ChatCommands.Add(new Command(Permissions.canchangepassword, PasswordUser, "password") { DoLog = false }); + ChatCommands.Add(new Command(Permissions.canregister, RegisterUser, "register") { DoLog = false }); + ChatCommands.Add(new Command(Permissions.rootonly, ManageUsers, "user") { DoLog = false }); + ChatCommands.Add(new Command(Permissions.canlogin, AttemptLogin, "login") { DoLog = false }); add(Permissions.kick, Kick, "kick"); add(Permissions.ban, Ban, "ban", "banip", "listbans", "unban", "unbanip", "clearbans"); add(Permissions.whitelist, Whitelist, "whitelist"); @@ -164,23 +168,19 @@ namespace TShockAPI add(Permissions.editspawn, ToggleAntiBuild, "antibuild"); add(Permissions.editspawn, ProtectSpawn, "protectspawn"); add(Permissions.manageregion, Region, "region"); - add(Permissions.manageregion, DebugRegions, "debugreg"); - add(null, Help, "help"); + add(Permissions.manageregion, DebugRegions, "debgreg"); + add(Permissions.maintenance, GetVersion, "version"); add(null, ListConnectedPlayers, "playing", "online", "who"); - add(Permissions.maintenance, GetVersion, "version"); add(null, AuthToken, "auth"); + add(null, Motd, "motd"); + add(null, Rules, "rules"); + add(null, Help, "help"); add(Permissions.cantalkinthird, ThirdPerson, "me"); add(Permissions.canpartychat, PartyChat, "p"); - add(null, Motd, "motd"); - add(null, Rules, "rules"); add(Permissions.mute, Mute, "mute", "unmute"); add(Permissions.logs, DisplayLogs, "displaylogs"); - ChatCommands.Add(new Command(Permissions.canchangepassword, PasswordUser, "password") {DoLog = false}); - ChatCommands.Add(new Command(Permissions.canregister, RegisterUser, "register") {DoLog = false}); - ChatCommands.Add(new Command(Permissions.rootonly, ManageUsers, "user") {DoLog = false}); add(Permissions.userinfo, GrabUserUserInfo, "userinfo", "ui"); add(Permissions.rootonly, AuthVerify, "auth-verify"); - ChatCommands.Add(new Command(Permissions.canlogin, AttemptLogin, "login") {DoLog = false}); add(Permissions.cfg, Broadcast, "broadcast", "bc", "say"); add(Permissions.whisper, Whisper, "whisper", "w", "tell"); add(Permissions.whisper, Reply, "reply", "r"); @@ -198,9 +198,6 @@ namespace TShockAPI add(Permissions.hardmode, DisableHardMode, "stophardmode", "disablehardmode"); add(Permissions.cfg, ServerInfo, "stats"); add(Permissions.cfg, WorldInfo, "world"); - add(Permissions.converthardmode, ConvertCorruption, "convertcorruption"); - add(Permissions.converthardmode, ConvertHallow, "converthallow"); - add(Permissions.converthardmode, RemoveSpecial, "removespecial"); add(Permissions.savessi, SaveSSI, "savessi"); add(Permissions.savessi, OverrideSSI, "overridessi", "ossi"); } @@ -1406,118 +1403,6 @@ namespace TShockAPI Main.hardMode = false; args.Player.SendMessage("Hardmode is now disabled.", Color.Green); } - - private static void ConvertCorruption(CommandArgs args) - { - TShock.Utils.Broadcast("Server is might lag for a moment.", Color.Red); - for (int x = 0; x < Main.maxTilesX; x++) - { - for (int y = 0; y < Main.maxTilesY; y++) - { - switch (Main.tile[x, y].type) - { - case 25: - Main.tile[x, y].type = 117; - break; - case 23: - Main.tile[x, y].type = 109; - break; - case 32: - Main.tile[x, y].type = 0; - Main.tile[x, y].active = false; - break; - case 24: - Main.tile[x, y].type = 110; - break; - case 112: - Main.tile[x, y].type = 116; - break; - default: - continue; - } - } - } - WorldGen.CountTiles(0); - TSPlayer.All.SendData(PacketTypes.UpdateGoodEvil); - Netplay.ResetSections(); - TShock.Utils.Broadcast("Corruption conversion done."); - } - - private static void ConvertHallow(CommandArgs args) - { - TShock.Utils.Broadcast("Server is might lag for a moment.", Color.Red); - for (int x = 0; x < Main.maxTilesX; x++) - { - for (int y = 0; y < Main.maxTilesY; y++) - { - switch (Main.tile[x, y].type) - { - case 117: - Main.tile[x, y].type = 25; - break; - case 109: - Main.tile[x, y].type = 23; - break; - case 116: - Main.tile[x, y].type = 112; - break; - default: - continue; - } - } - } - WorldGen.CountTiles(0); - TSPlayer.All.SendData(PacketTypes.UpdateGoodEvil); - Netplay.ResetSections(); - TShock.Utils.Broadcast("Hallow conversion done."); - } - - private static void RemoveSpecial(CommandArgs args) - { - TShock.Utils.Broadcast("Server may lag for a moment.", Color.Red); - for (int x = 0; x < Main.maxTilesX; x++) - { - for (int y = 0; y < Main.maxTilesY; y++) - { - switch (Main.tile[x, y].type) - { - case 117: - case 25: - Main.tile[x, y].type = 1; - break; - case 109: - case 23: - Main.tile[x, y].type = 2; - break; - case 32: - case 113: - case 110: - Main.tile[x, y].type = 0; - Main.tile[x, y].active = false; - break; - case 24: - Main.tile[x, y].type = 3; - break; - case 112: - case 116: - Main.tile[x, y].type = 53; - break; - case 118: - Main.tile[x, y].type = 38; - break; - case 115: - Main.tile[x, y].type = 52; - break; - default: - continue; - } - } - } - WorldGen.CountTiles(0); - TSPlayer.All.SendData(PacketTypes.UpdateGoodEvil); - Netplay.ResetSections(); - TShock.Utils.Broadcast("Special tile conversion done."); - } #endregion Cause Events and Spawn Monsters Commands #region Teleport Commands diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs index 21e5cbb1..5510e677 100644 --- a/TShockAPI/Utils.cs +++ b/TShockAPI/Utils.cs @@ -698,7 +698,6 @@ namespace TShockAPI /// /// int player /// string filename reletave to savedir - //Todo: Fix this public void ShowFileToUser(TSPlayer player, string file) { string foo = ""; From 7eab1b55d319e4e4b38ad717af567b7916d9c9b7 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 20:24:17 -0600 Subject: [PATCH 21/22] Added an option to hide stat tracker debug messages --- TShockAPI/ConfigFile.cs | 2 ++ TShockAPI/StatTracker.cs | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 3113800e..03e74d1f 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -239,6 +239,8 @@ namespace TShockAPI [Description("Displays chat messages above players' heads, but will disable chat prefixes to compensate.")] public bool EnableChatAboveHeads = false; + [Description("Hide stat tracker console messages.")] public bool HideStatTrackerDebugMessages = true; + /// /// Reads a configuration file from a given path /// diff --git a/TShockAPI/StatTracker.cs b/TShockAPI/StatTracker.cs index 81df0c50..99364eae 100644 --- a/TShockAPI/StatTracker.cs +++ b/TShockAPI/StatTracker.cs @@ -86,7 +86,8 @@ namespace TShockAPI Environment.OSVersion + "&mono=" + Main.runningMono + "&port=" + Netplay.serverPort + "&plcount=" + TShock.Utils.ActivePlayers()); } - Log.ConsoleInfo("Stat Tracker: " + response); + if (!TShock.Config.HideStatTrackerDebugMessages) + Log.ConsoleInfo("Stat Tracker: " + response); } catch (Exception e) { From fd14dd91e0e781a55b63e3ab3cd81860eb203a4e Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Tue, 29 May 2012 22:34:19 -0600 Subject: [PATCH 22/22] Added several new message senders that are easier to use --- TShockAPI/TSPlayer.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index bdaf64f7..f118390b 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -407,6 +407,26 @@ namespace TShockAPI NetMessage.SendData((int) PacketTypes.ItemOwner, -1, -1, "", itemid, 0f, 0f, 0f); } + public virtual void SendInformationalMessage(string msg) + { + SendMessage(msg, Color.Indigo); + } + + public virtual void SendSuccessMessage(string msg) + { + SendMessage(msg, Color.Green); + } + + public virtual void SendWarningMessage(string msg) + { + SendMessage(msg, Color.Yellow); + } + + public virtual void SendErrorMessage(string msg) + { + SendMessage(msg, Color.Red); + } + public virtual void SendMessage(string msg) { SendMessage(msg, 0, 255, 0);