From 60e5e4374337ce0145e667f15e5600503b830a72 Mon Sep 17 00:00:00 2001 From: Lucas Nicodemus Date: Sat, 26 May 2012 17:04:09 -0600 Subject: [PATCH] This is a VCS, we don't need to comment out code --- TShockAPI/Commands.cs | 7065 ++++++++++++++++++++--------------------- 1 file changed, 3528 insertions(+), 3537 deletions(-) diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 8c7a1df8..af2ec4c6 100644 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -1,3537 +1,3528 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011-2012 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.IO; -using System.Linq; -using System.Net; -using System.Text; -using System.Threading; -using Terraria; -using TShockAPI.DB; -using System.Reflection; - -namespace TShockAPI -{ - public delegate void CommandDelegate(CommandArgs args); - - public class CommandArgs : EventArgs - { - public string Message { get; private set; } - public TSPlayer Player { get; private set; } - - /// - /// Parameters passed to the arguement. Does not include the command name. - /// IE '/kick "jerk face"' will only have 1 argument - /// - public List Parameters { get; private set; } - - public Player TPlayer - { - get { return Player.TPlayer; } - } - - public CommandArgs(string message, TSPlayer ply, List args) - { - Message = message; - Player = ply; - Parameters = args; - } - } - - public class Command - { - public string Name - { - get { return Names[0]; } - } - - public List Names { get; protected set; } - public bool DoLog { get; set; } - public string Permission { get; protected set; } - private CommandDelegate command; - - public Command(string permissionneeded, CommandDelegate cmd, params string[] names) - : this(cmd, names) - { - Permission = permissionneeded; - } - - public Command(CommandDelegate cmd, params string[] names) - { - if (names == null || names.Length < 1) - throw new NotSupportedException(); - Permission = null; - Names = new List(names); - command = cmd; - DoLog = true; - } - - public bool Run(string msg, TSPlayer ply, List parms) - { - if (!ply.Group.HasPermission(Permission)) - return false; - - try - { - command(new CommandArgs(msg, ply, parms)); - } - catch (Exception e) - { - ply.SendMessage("Command failed, check logs for more details."); - Log.Error(e.ToString()); - } - - return true; - } - - public bool HasAlias(string name) - { - return Names.Contains(name); - } - - public bool CanRun(TSPlayer ply) - { - return ply.Group.HasPermission(Permission); - } - } - - public static class Commands - { - public static List ChatCommands = new List(); - - private delegate void AddChatCommand(string permission, CommandDelegate command, params string[] names); - - public static void InitCommands() - { - 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.maintenance, ClearBans, "clearbans"); - add(Permissions.whitelist, Whitelist, "whitelist"); - add(Permissions.maintenance, Off, "off", "exit"); - 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"); - add(Permissions.causeevents, Star, "star"); - 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.spawnmob, SpawnMob, "spawnmob", "sm"); - add(Permissions.tp, Home, "home"); - 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.managegroup, AddGroup, "addgroup"); - add(Permissions.managegroup, DeleteGroup, "delgroup"); - add(Permissions.managegroup, ModifyGroup, "modgroup"); - add(Permissions.managegroup, ViewGroups, "group"); - add(Permissions.manageitem, AddItem, "additem", "banitem"); - add(Permissions.manageitem, DeleteItem, "delitem", "unbanitem"); - add(Permissions.manageitem, ListItems, "listitems", "listbanneditems"); - add(Permissions.manageitem, AddItemGroup, "additemgroup"); - add(Permissions.manageitem, DeleteItemGroup, "delitemgroup"); - add(Permissions.cfg, SetSpawn, "setspawn"); - add(Permissions.cfg, Reload, "reload"); - add(Permissions.cfg, ServerPassword, "serverpassword"); - add(Permissions.cfg, Save, "save"); - add(Permissions.cfg, Settle, "settle"); - add(Permissions.cfg, MaxSpawns, "maxspawns"); - add(Permissions.cfg, SpawnRate, "spawnrate"); - add(Permissions.time, Time, "time"); - add(Permissions.pvpfun, Slap, "slap"); - 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(null, ListConnectedPlayers, "playing", "online", "who", "version"); - add(null, AuthToken, "auth"); - 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"); - add(Permissions.annoy, Annoy, "annoy"); - add(Permissions.kill, Kill, "kill"); - add(Permissions.butcher, Butcher, "butcher"); - add(Permissions.item, Item, "item", "i"); - add(Permissions.item, Give, "give", "g"); - add(Permissions.clearitems, ClearItems, "clear", "clearitems"); - add(Permissions.heal, Heal, "heal"); - add(Permissions.buff, Buff, "buff"); - add(Permissions.buffplayer, GBuff, "gbuff", "buffplayer"); - add(Permissions.grow, Grow, "grow"); - add(Permissions.hardmode, StartHardMode, "hardmode"); - 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"); - } - - public static bool HandleCommand(TSPlayer player, string text) - { - string cmdText = text.Remove(0, 1); - - var args = ParseParameters(cmdText); - if (args.Count < 1) - return false; - - string cmdName = args[0]; - args.RemoveAt(0); - - Command cmd = ChatCommands.FirstOrDefault(c => c.HasAlias(cmdName)); - - if (cmd == null) - { - player.SendMessage("Invalid Command Entered. Type /help for a list of valid Commands.", Color.Red); - return true; - } - - if (!cmd.CanRun(player)) - { - TShock.Utils.SendLogs(string.Format("{0} tried to execute {1}", player.Name, cmd.Name), Color.Red); - player.SendMessage("You do not have access to that command.", Color.Red); - } - else - { - if (cmd.DoLog) - TShock.Utils.SendLogs(string.Format("{0} executed: /{1}", player.Name, cmdText), Color.Red); - cmd.Run(cmdText, player, args); - } - return true; - } - - /// - /// Parses a string of parameters into a list. Handles quotes. - /// - /// - /// - private static List ParseParameters(string str) - { - var ret = new List(); - var sb = new StringBuilder(); - bool instr = false; - for (int i = 0; i < str.Length; i++) - { - char c = str[i]; - - if (instr) - { - if (c == '\\') - { - if (i + 1 >= str.Length) - break; - c = GetEscape(str[++i]); - } - else if (c == '"') - { - ret.Add(sb.ToString()); - sb.Clear(); - instr = false; - continue; - } - sb.Append(c); - } - else - { - if (IsWhiteSpace(c)) - { - if (sb.Length > 0) - { - ret.Add(sb.ToString()); - sb.Clear(); - } - } - else if (c == '"') - { - if (sb.Length > 0) - { - ret.Add(sb.ToString()); - sb.Clear(); - } - instr = true; - } - else - { - sb.Append(c); - } - } - } - if (sb.Length > 0) - ret.Add(sb.ToString()); - - return ret; - } - - private static char GetEscape(char c) - { - switch (c) - { - case '\\': - return '\\'; - case '"': - return '"'; - case 't': - return '\t'; - default: - return c; - } - } - - private static bool IsWhiteSpace(char c) - { - return c == ' ' || c == '\t' || c == '\n'; - } - - #region Account commands - - public static void AttemptLogin(CommandArgs args) - { - if (args.Player.LoginAttempts > TShock.Config.MaximumLoginAttempts && (TShock.Config.MaximumLoginAttempts != -1)) - { - Log.Warn(args.Player.IP + "(" + args.Player.Name + ") had " + TShock.Config.MaximumLoginAttempts + - " or more invalid login attempts and was kicked automatically."); - TShock.Utils.Kick(args.Player, "Too many invalid login attempts."); - } - - var user = TShock.Users.GetUserByName(args.Player.Name); - string encrPass = ""; - - if (args.Parameters.Count == 1) - { - user = TShock.Users.GetUserByName(args.Player.Name); - encrPass = TShock.Utils.HashPassword(args.Parameters[0]); - } - else if (args.Parameters.Count == 2 && TShock.Config.AllowLoginAnyUsername) - { - user = TShock.Users.GetUserByName(args.Parameters[0]); - encrPass = TShock.Utils.HashPassword(args.Parameters[1]); - } - else - { - args.Player.SendMessage("Syntax: /login [password]"); - args.Player.SendMessage("If you forgot your password, there is no way to recover it."); - return; - } - try - { - if (user == null) - { - args.Player.SendMessage("User by that name does not exist"); - } - else if (user.Password.ToUpper() == encrPass.ToUpper()) - { - args.Player.PlayerData = TShock.InventoryDB.GetPlayerData(args.Player, TShock.Users.GetUserID(user.Name)); - - var group = TShock.Utils.GetGroup(user.Group); - - if (TShock.Config.ServerSideInventory) - { - if (group.HasPermission(Permissions.bypassinventorychecks)) - { - args.Player.IgnoreActionsForClearingTrashCan = false; - } - else if (!TShock.CheckInventory(args.Player)) - { - args.Player.SendMessage("Login Failed, Please fix the above errors then /login again.", Color.Cyan); - args.Player.IgnoreActionsForClearingTrashCan = true; - return; - } - } - - if (group.HasPermission(Permissions.ignorestackhackdetection)) - args.Player.IgnoreActionsForCheating = "none"; - - if (group.HasPermission(Permissions.usebanneditem)) - args.Player.IgnoreActionsForDisabledArmor = "none"; - - args.Player.Group = group; - args.Player.UserAccountName = user.Name; - args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName); - 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); - - Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + user.Name); - if ((args.Player.LoginHarassed) && (TShock.Config.RememberLeavePos)){ - if (TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP) != Vector2.Zero) - { - Vector2 pos = TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP); - - args.Player.Teleport((int) pos.X, (int) pos.Y + 3); - } - args.Player.LoginHarassed = false; - - }} - else - { - args.Player.SendMessage("Incorrect password", Color.LimeGreen); - Log.Warn(args.Player.IP + " failed to authenticate as user: " + user.Name); - args.Player.LoginAttempts++; - } - } - catch (Exception ex) - { - args.Player.SendMessage("There was an error processing your request.", Color.Red); - Log.Error(ex.ToString()); - } - } - - private static void PasswordUser(CommandArgs args) - { - try - { - if (args.Player.IsLoggedIn && args.Parameters.Count == 2) - { - var user = TShock.Users.GetUserByName(args.Player.UserAccountName); - string encrPass = TShock.Utils.HashPassword(args.Parameters[0]); - if (user.Password.ToUpper() == encrPass.ToUpper()) - { - args.Player.SendMessage("You changed your password!", Color.Green); - TShock.Users.SetUserPassword(user, args.Parameters[1]); // SetUserPassword will hash it for you. - Log.ConsoleInfo(args.Player.IP + " named " + args.Player.Name + " changed the password of Account " + user.Name); - } - else - { - args.Player.SendMessage("You failed to change your password!", Color.Red); - Log.ConsoleError(args.Player.IP + " named " + args.Player.Name + " failed to change password for Account: " + - user.Name); - } - } - else - { - args.Player.SendMessage("Not Logged in or Invalid syntax! Proper syntax: /password ", - Color.Red); - } - } - catch (UserManagerException ex) - { - args.Player.SendMessage("Sorry, an error occured: " + ex.Message, Color.Green); - Log.ConsoleError("RegisterUser returned an error: " + ex); - } - } - - private static void RegisterUser(CommandArgs args) - { - try - { - var user = new User(); - - if (args.Parameters.Count == 1) - { - user.Name = args.Player.Name; - user.Password = args.Parameters[0]; - } - else if (args.Parameters.Count == 2 && TShock.Config.AllowRegisterAnyUsername) - { - user.Name = args.Parameters[0]; - user.Password = args.Parameters[1]; - } - else - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /register ", Color.Red); - return; - } - - user.Group = TShock.Config.DefaultRegistrationGroupName; // FIXME -- we should get this from the DB. - - if (TShock.Users.GetUserByName(user.Name) == null) // Cheap way of checking for existance of a user - { - args.Player.SendMessage("Account " + user.Name + " has been registered.", Color.Green); - args.Player.SendMessage("Your password is " + user.Password); - TShock.Users.AddUser(user); - Log.ConsoleInfo(args.Player.Name + " registered an Account: " + user.Name); - } - else - { - args.Player.SendMessage("Account " + user.Name + " has already been registered.", Color.Green); - Log.ConsoleInfo(args.Player.Name + " failed to register an existing Account: " + user.Name); - } - } - catch (UserManagerException ex) - { - args.Player.SendMessage("Sorry, an error occured: " + ex.Message, Color.Green); - Log.ConsoleError("RegisterUser returned an error: " + ex); - } - } - - //Todo: Add separate help text for '/user add' and '/user del'. Also add '/user addip' and '/user delip' - - private static void ManageUsers(CommandArgs args) - { - // This guy needs to go away for the help later on to take effect. - - //if (args.Parameters.Count < 2) - //{ - // args.Player.SendMessage("Syntax: /user [group]"); - // args.Player.SendMessage("Note: Passwords are stored with SHA512 hashing. To reset a user's password, remove and re-add them."); - // return; - //} - - // This guy needs to be here so that people don't get exceptions when they type /user - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid user syntax. Try /user help.", Color.Red); - return; - } - - string subcmd = args.Parameters[0]; - - // Add requires a username:password pair/ip address and a group specified. - if (subcmd == "add") - { - var namepass = args.Parameters[1].Split(':'); - var user = new User(); - - try - { - if (args.Parameters.Count > 2) - { - if (namepass.Length == 2) - { - user.Name = namepass[0]; - user.Password = namepass[1]; - user.Group = args.Parameters[2]; - } - else if (namepass.Length == 1) - { - user.Address = namepass[0]; - user.Group = args.Parameters[2]; - user.Name = user.Address; - } - if (!string.IsNullOrEmpty(user.Address)) - { - args.Player.SendMessage("IP address admin added. If they're logged in, tell them to rejoin.", Color.Green); - args.Player.SendMessage("WARNING: This is insecure! It would be better to use a user account instead.", Color.Red); - TShock.Users.AddUser(user); - Log.ConsoleInfo(args.Player.Name + " added IP " + user.Address + " to group " + user.Group); - } - else - { - args.Player.SendMessage("Account " + user.Name + " has been added to group " + user.Group + "!", Color.Green); - TShock.Users.AddUser(user); - Log.ConsoleInfo(args.Player.Name + " added Account " + user.Name + " to group " + user.Group); - } - } - else - { - args.Player.SendMessage("Invalid syntax. Try /user help.", Color.Red); - } - } - catch (UserManagerException ex) - { - args.Player.SendMessage(ex.Message, Color.Green); - Log.ConsoleError(ex.ToString()); - } - } - // User deletion requires a username - else if (subcmd == "del" && args.Parameters.Count == 2) - { - var user = new User(); - if (args.Parameters[1].Split('.').Count() ==4) - - // changed to support dot character in usernames - // if (args.Parameters[1].Contains(".")) - user.Address = args.Parameters[1]; - else - user.Name = args.Parameters[1]; - - try - { - TShock.Users.RemoveUser(user); - args.Player.SendMessage("Account removed successfully.", Color.Green); - Log.ConsoleInfo(args.Player.Name + " successfully deleted account: " + args.Parameters[1]); - } - catch (UserManagerException ex) - { - args.Player.SendMessage(ex.Message, Color.Red); - Log.ConsoleError(ex.ToString()); - } - } - // Password changing requires a username, and a new password to set - else if (subcmd == "password") - { - var user = new User(); - user.Name = args.Parameters[1]; - - try - { - if (args.Parameters.Count == 3) - { - args.Player.SendMessage("Changed the password of " + user.Name + "!", Color.Green); - TShock.Users.SetUserPassword(user, args.Parameters[2]); - Log.ConsoleInfo(args.Player.Name + " changed the password of Account " + user.Name); - } - else - { - args.Player.SendMessage("Invalid user password syntax. Try /user help.", Color.Red); - } - } - catch (UserManagerException ex) - { - args.Player.SendMessage(ex.Message, Color.Green); - Log.ConsoleError(ex.ToString()); - } - } - // Group changing requires a username or IP address, and a new group to set - else if (subcmd == "group") - { - var user = new User(); - if (args.Parameters[1].Split('.').Count()==4) - - //changed to support dot character in usernames - //if (args.Parameters[1].Contains(".")) - - user.Address = args.Parameters[1]; - else - user.Name = args.Parameters[1]; - - try - { - if (args.Parameters.Count == 3) - { - if (!string.IsNullOrEmpty(user.Address)) - { - args.Player.SendMessage("IP Address " + user.Address + " has been changed to group " + args.Parameters[2] + "!", - Color.Green); - TShock.Users.SetUserGroup(user, args.Parameters[2]); - Log.ConsoleInfo(args.Player.Name + " changed IP Address " + user.Address + " to group " + args.Parameters[2]); - } - else - { - args.Player.SendMessage("Account " + user.Name + " has been changed to group " + args.Parameters[2] + "!", - Color.Green); - TShock.Users.SetUserGroup(user, args.Parameters[2]); - Log.ConsoleInfo(args.Player.Name + " changed Account " + user.Name + " to group " + args.Parameters[2]); - } - } - else - { - args.Player.SendMessage("Invalid user group syntax. Try /user help.", Color.Red); - } - } - catch (UserManagerException ex) - { - args.Player.SendMessage(ex.Message, Color.Green); - Log.ConsoleError(ex.ToString()); - } - } - else if (subcmd == "help") - { - args.Player.SendMessage("Help for user subcommands:"); - args.Player.SendMessage("/user add username:password group -- Adds a specified user"); - args.Player.SendMessage("/user del username -- Removes a specified user"); - args.Player.SendMessage("/user password username newpassword -- Changes a user's password"); - args.Player.SendMessage("/user group username newgroup -- Changes a user's group"); - } - else - { - args.Player.SendMessage("Invalid user syntax. Try /user help.", Color.Red); - } - } - - #endregion - - #region Stupid commands - - public static void ServerInfo(CommandArgs args) - { - args.Player.SendMessage("Memory usage: " + Process.GetCurrentProcess().WorkingSet64); - args.Player.SendMessage("Allocated memory: " + Process.GetCurrentProcess().VirtualMemorySize64); - args.Player.SendMessage("Total processor time: " + Process.GetCurrentProcess().TotalProcessorTime); - args.Player.SendMessage("Ver: " + Environment.OSVersion); - args.Player.SendMessage("Proc count: " + Environment.ProcessorCount); - 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); - } - - #endregion - - #region Player Management Commands - - private static void GrabUserUserInfo(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /userinfo ", Color.Red); - return; - } - - 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); - return; - } - try - { - args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName + " Group: " + players[0].Group.Name, Color.Green); - } - catch (Exception) - { - args.Player.SendMessage("Invalid player.", Color.Red); - } - } - - private static void Kick(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /kick [reason]", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing player name", Color.Red); - return; - } - - 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 (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 - ? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)) - : "Misbehaviour."; - if (!TShock.Utils.Kick(players[0], reason, !args.Player.RealPlayer, false, args.Player.Name)) - { - args.Player.SendMessage("You can't kick another admin!", Color.Red); - } - } - } - - 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; - } - - 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 (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 - ? 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 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); - } - - 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); - 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) - { - using (var tw = new StreamWriter(FileTools.WhitelistPath, true)) - { - tw.WriteLine(args.Parameters[0]); - } - args.Player.SendMessage("Added " + args.Parameters[0] + " to the whitelist."); - } - } - - public static void DisplayLogs(CommandArgs args) - { - args.Player.DisplayLogs = (!args.Player.DisplayLogs); - 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 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]); - } - } - } - - #endregion Player Management Commands - - #region Server Maintenence Commands - - private static void Broadcast(CommandArgs args) - { - string message = ""; - - for (int i = 0; i < args.Parameters.Count; i++) - { - message += " " + args.Parameters[i]; - } - - TShock.Utils.Broadcast("(Server Broadcast)" + message, Color.Red); - return; - } - - private static void Off(CommandArgs args) - { - - if (TShock.Config.ServerSideInventory) - { - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) - { - player.SaveServerInventory(); - } - } - } - - string reason = ((args.Parameters.Count > 0) ? "Server shutting down: " + String.Join(" ", args.Parameters) : "Server shutting down!"); - TShock.Utils.StopServer(true, reason); - } - //Added restart command - private static void Restart(CommandArgs args) - { - if (Main.runningMono) - { - Log.ConsoleInfo("Sorry, this command has not yet been implemented in Mono"); - } - else - { - if (TShock.Config.ServerSideInventory) - { - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) - { - TShock.InventoryDB.InsertPlayerData(player); - } - } - } - - 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); - } - } - - 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); - } - - private static void CheckUpdates(CommandArgs args) - { - ThreadPool.QueueUserWorkItem(UpdateManager.CheckUpdate); - } - - #endregion Server Maintenence Commands - - #region Cause Events and Spawn Monsters Commands - - private static void DropMeteor(CommandArgs args) - { - WorldGen.spawnMeteor = false; - WorldGen.dropMeteor(); - } - - private static void Star(CommandArgs args) - { - int penis56 = 12; - int penis57 = Main.rand.Next(Main.maxTilesX - 50) + 100; - penis57 *= 0x10; - int penis58 = Main.rand.Next((int) (Main.maxTilesY*0.05))*0x10; - Vector2 vector = new Vector2(penis57, penis58); - float speedX = Main.rand.Next(-100, 0x65); - float speedY = Main.rand.Next(200) + 100; - float penis61 = (float) Math.Sqrt(((speedX*speedX) + (speedY*speedY))); - penis61 = (penis56)/penis61; - speedX *= penis61; - speedY *= penis61; - Projectile.NewProjectile(vector.X, vector.Y, speedX, speedY, 12, 0x3e8, 10f, Main.myPlayer); - } - - private static void Fullmoon(CommandArgs args) - { - TSPlayer.Server.SetFullMoon(true); - TShock.Utils.Broadcast(string.Format("{0} turned on full moon.", args.Player.Name)); - } - - private static void Bloodmoon(CommandArgs args) - { - TSPlayer.Server.SetBloodMoon(true); - TShock.Utils.Broadcast(string.Format("{0} turned on blood moon.", args.Player.Name)); - } - - private static void Invade(CommandArgs args) - { - if (Main.invasionSize <= 0) - { - TShock.Utils.Broadcast(string.Format("{0} has started an invasion.", args.Player.Name)); - TShock.StartInvasion(); - } - else - { - TShock.Utils.Broadcast(string.Format("{0} has ended an invasion.", args.Player.Name)); - Main.invasionSize = 0; - } - } - - [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)); - } - - [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)); - } - - [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)); - } - - [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)); - } - - [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)); - } - - [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)); - } - - [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)); - } - - [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)); - } - - [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)); - } - - 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; - } - - amount = Math.Min(amount, Main.maxNPCs); - - 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 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) - { - 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 - - private static void Home(CommandArgs args) - { - if (!args.Player.RealPlayer) - { - args.Player.SendMessage("You cannot use teleport commands!"); - return; - } - - args.Player.Spawn(); - args.Player.SendMessage("Teleported to your spawnpoint."); - } - - private static void Spawn(CommandArgs args) - { - if (!args.Player.RealPlayer) - { - args.Player.SendMessage("You cannot use teleport commands!"); - return; - } - - if (args.Player.Teleport(Main.spawnTileX, Main.spawnTileY)) - args.Player.SendMessage("Teleported to the map's spawnpoint."); - } - - private static void TP(CommandArgs args) - { - if (!args.Player.RealPlayer) - { - args.Player.SendMessage("You cannot use teleport commands!"); - return; - } - - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /tp ", Color.Red); - return; - } - - string plStr = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - args.Player.SendMessage("Invalid player!", Color.Red); - else if (players.Count > 1) - args.Player.SendMessage("More than one player matched!", Color.Red); - else if (!players[0].TPAllow && !args.Player.Group.HasPermission(Permissions.tpall)) - { - var plr = players[0]; - args.Player.SendMessage(plr.Name + " Has Selected For Users Not To Teleport To Them"); - plr.SendMessage(args.Player.Name + " Attempted To Teleport To You"); - } - else - { - var plr = players[0]; - if (args.Player.Teleport(plr.TileX, plr.TileY + 3)) - { - args.Player.SendMessage(string.Format("Teleported to {0}", plr.Name)); - if (!args.Player.Group.HasPermission(Permissions.tphide)) - plr.SendMessage(args.Player.Name + " Teleported To You"); - } - } - } - - private static void TPHere(CommandArgs args) - { - if (!args.Player.RealPlayer) - { - args.Player.SendMessage("You cannot use teleport commands!"); - return; - } - - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /tphere ", Color.Red); - return; - } - - string plStr = String.Join(" ", args.Parameters); - - if (plStr == "all" || plStr == "*") - { - args.Player.SendMessage(string.Format("You brought all players here.")); - for (int i = 0; i < Main.maxPlayers; i++) - { - if (Main.player[i].active && (Main.player[i] != args.TPlayer)) - { - if (TShock.Players[i].Teleport(args.Player.TileX, args.Player.TileY + 3)) - TShock.Players[i].SendMessage(string.Format("You were teleported to {0}.", args.Player.Name)); - } - } - return; - } - - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - } - else if (players.Count > 1) - { - args.Player.SendMessage("More than one player matched!", Color.Red); - } - else - { - var plr = players[0]; - if (plr.Teleport(args.Player.TileX, args.Player.TileY + 3)) - { - plr.SendMessage(string.Format("You were teleported to {0}.", args.Player.Name)); - args.Player.SendMessage(string.Format("You brought {0} here.", plr.Name)); - } - } - } - - private static void TPAllow(CommandArgs args) - { - if (!args.Player.TPAllow) - args.Player.SendMessage("Other Players Can Now Teleport To You"); - if (args.Player.TPAllow) - args.Player.SendMessage("Other Players Can No Longer Teleport To You"); - 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 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; - } - - if (args.Parameters[0].Equals("list")) - { - //How many warps per page - const int pagelimit = 15; - //How many warps per line - const int perline = 5; - //Pages start at 0 but are displayed and parsed at 1 - int page = 0; - - - if (args.Parameters.Count > 1) - { - if (!int.TryParse(args.Parameters[1], 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 warps = TShock.Warps.ListAllPublicWarps(Main.worldID.ToString()); - - //Check if they are trying to access a page that doesn't exist. - int pagecount = warps.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("Current Warps ({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 < warps.Count; i++) - { - nameslist.Add(warps[i].WarpName); - } - - //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 /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); - } - } - } - - #endregion Teleport Commands - - #region Group Management - - private static void AddGroup(CommandArgs args) - { - if (args.Parameters.Count > 0) - { - String groupname = args.Parameters[0]; - args.Parameters.RemoveAt(0); - String permissions = String.Join(",", args.Parameters); - - String response = TShock.Groups.AddGroup(groupname, permissions); - if (response.Length > 0) - args.Player.SendMessage(response, Color.Green); - } - else - { - args.Player.SendMessage("Incorrect format: /addGroup [optional permissions]", Color.Red); - } - } - - private static void DeleteGroup(CommandArgs args) - { - if (args.Parameters.Count > 0) - { - String groupname = args.Parameters[0]; - - String response = TShock.Groups.DeleteGroup(groupname); - if (response.Length > 0) - args.Player.SendMessage(response, Color.Green); - } - else - { - args.Player.SendMessage("Incorrect format: /delGroup ", Color.Red); - } - } - - private static void ModifyGroup(CommandArgs args) - { - if (args.Parameters.Count > 2) - { - String com = args.Parameters[0]; - args.Parameters.RemoveAt(0); - - String groupname = args.Parameters[0]; - args.Parameters.RemoveAt(0); - - 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; - } - 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 (response.Length > 0) - args.Player.SendMessage(response, Color.Green); - return; - } - } - 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]; - - 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.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 (ret != "") - { - ret += ", "; - } - - 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); - } - - #endregion Group Management - - #region Item Management - - private static void AddItem(CommandArgs args) - { - if (args.Parameters.Count == 1) - { - var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); - if (items.Count == 0) - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - else if (items.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); - } - else - { - var item = items[0]; - if (item.type >= 1) - { - TShock.Itembans.AddNewBan(item.name); - args.Player.SendMessage(item.name + " has been banned.", Color.Green); - } - else - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - } - } - else - { - args.Player.SendMessage("Invalid use: /additem \"item name\" or /additem ##", Color.Red); - } - } - - private static void DeleteItem(CommandArgs args) - { - if (args.Parameters.Count == 1) - { - var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); - if (items.Count == 0) - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - else if (items.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); - } - else - { - var item = items[0]; - if (item.type >= 1) - { - TShock.Itembans.RemoveBan(item.name); - args.Player.SendMessage(item.name + " has been unbanned.", Color.Green); - } - else - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - } - } - else - { - args.Player.SendMessage("Invalid use: /delitem \"item name\" or /delitem ##", Color.Red); - } - } - - private static void ListItems(CommandArgs args) - { - args.Player.SendMessage("The banned items are: " + String.Join(",", TShock.Itembans.ItemBans), Color.Yellow); - } - - private static void AddItemGroup(CommandArgs args) - { - if (args.Parameters.Count == 2) - { - var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); - if (items.Count == 0) - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - else if (items.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); - } - else - { - var item = items[0]; - if (item.type >= 1) - { - if(TShock.Groups.GroupExists(args.Parameters[1])) - { - ItemBan ban = TShock.Itembans.GetItemBanByName(item.name); - - if(!ban.AllowedGroups.Contains(args.Parameters[1])) - { - TShock.Itembans.AllowGroup(item.name, args.Parameters[1]); - args.Player.SendMessage("Banned item " + item.name + " has been allowed for group " + args.Parameters[1] + ".", Color.Green); - } - else - { - args.Player.SendMessage("Banned item " + item.name + " is already allowed for group " + args.Parameters[1] + "!", Color.OrangeRed); - } - } - else - { - args.Player.SendMessage("Group " + args.Parameters[1] + " not found!", Color.Red); - } - } - else - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - } - } - else - { - args.Player.SendMessage("Invalid use: /additemgroup \"item name\" \"group name\"", Color.Red); - } - } - - private static void DeleteItemGroup(CommandArgs args) - { - if (args.Parameters.Count == 2) - { - var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); - if (items.Count == 0) - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - else if (items.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); - } - else - { - var item = items[0]; - if (item.type >= 1) - { - if(TShock.Groups.GroupExists(args.Parameters[1])) - { - ItemBan ban = TShock.Itembans.GetItemBanByName(item.name); - - if(ban.AllowedGroups.Contains(args.Parameters[1])) - { - TShock.Itembans.RemoveGroup(item.name, args.Parameters[1]); - args.Player.SendMessage("Removed access for group " + args.Parameters[1] + " to banned item " + item.name + ".", Color.Green); - } - else - { - args.Player.SendMessage("Group " + args.Parameters[1] + " has not access to banned item " + item.name + "!", Color.Red); - } - } - else - { - args.Player.SendMessage("Group " + args.Parameters[1] + " not found!", Color.Red); - } - } - else - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - } - } - else - { - args.Player.SendMessage("Invalid use: /delitemgroup \"item name\" \"group name\"", Color.Red); - } - } - - #endregion Item Management - - #region Server Config Commands - - private static void SetSpawn(CommandArgs args) - { - Main.spawnTileX = args.Player.TileX + 1; - Main.spawnTileY = args.Player.TileY + 3; - SaveManager.Instance.SaveWorld(false); - } - - private static void Reload(CommandArgs args) - { - FileTools.SetupConfig(); - TShock.HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); - TShock.Groups.LoadPermisions(); - TShock.Regions.ReloadAllRegions(); - args.Player.SendMessage( - "Configuration, Permissions, and Regions reload complete. Some changes may require server restart."); - } - - private static void ServerPassword(CommandArgs args) - { - if (args.Parameters.Count != 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /password \"\"", Color.Red); - return; - } - string passwd = args.Parameters[0]; - TShock.Config.ServerPassword = passwd; - args.Player.SendMessage(string.Format("Server password changed to: {0}", passwd)); - } - - private static void Save(CommandArgs args) - { - SaveManager.Instance.SaveWorld(false); - foreach (TSPlayer tsply in TShock.Players) - { - tsply.SaveServerInventory(); - } - } - - private static void Settle(CommandArgs args) - { - if (Liquid.panicMode) - { - args.Player.SendMessage("Liquid is already settling!", Color.Red); - return; - } - Liquid.StartPanic(); - TShock.Utils.Broadcast("Settling all liquids..."); - } - - private static void MaxSpawns(CommandArgs args) - { - 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); - 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); - NPC.defaultMaxSpawns = amount; - TShock.Config.DefaultMaximumSpawns = amount; - TShock.Utils.Broadcast(string.Format("{0} changed the maximum spawns to: {1}", args.Player.Name, amount)); - } - - private static void SpawnRate(CommandArgs args) - { - 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); - 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; - } - - int amount = Convert.ToInt32(args.Parameters[0]); - int.TryParse(args.Parameters[0], out amount); - NPC.defaultSpawnRate = amount; - TShock.Config.DefaultSpawnRate = amount; - TShock.Utils.Broadcast(string.Format("{0} changed the spawn rate to: {1}", args.Player.Name, amount)); - } - - #endregion Server Config Commands - - #region Time/PvpFun Commands - - private static void Time(CommandArgs args) - { - if (args.Parameters.Count != 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /time ", Color.Red); - return; - } - - switch (args.Parameters[0]) - { - case "day": - TSPlayer.Server.SetTime(true, 150.0); - TShock.Utils.Broadcast(string.Format("{0} set time to day.", args.Player.Name)); - break; - case "night": - TSPlayer.Server.SetTime(false, 0.0); - TShock.Utils.Broadcast(string.Format("{0} set time to night.", args.Player.Name)); - break; - case "dusk": - TSPlayer.Server.SetTime(false, 0.0); - TShock.Utils.Broadcast(string.Format("{0} set time to dusk.", args.Player.Name)); - break; - case "noon": - TSPlayer.Server.SetTime(true, 27000.0); - TShock.Utils.Broadcast(string.Format("{0} set time to noon.", args.Player.Name)); - break; - case "midnight": - TSPlayer.Server.SetTime(false, 16200.0); - TShock.Utils.Broadcast(string.Format("{0} set time to midnight.", args.Player.Name)); - break; - default: - args.Player.SendMessage("Invalid syntax! Proper syntax: /time ", Color.Red); - break; - } - } - - private static void Slap(CommandArgs args) - { - if (args.Parameters.Count < 1 || args.Parameters.Count > 2) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /slap [dmg]", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing player name", Color.Red); - return; - } - - 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) - { - args.Player.SendMessage("More than one player matched!", Color.Red); - } - else - { - var plr = players[0]; - int damage = 5; - if (args.Parameters.Count == 2) - { - int.TryParse(args.Parameters[1], out damage); - } - if (!args.Player.Group.HasPermission(Permissions.kill)) - { - damage = TShock.Utils.Clamp(damage, 15, 0); - } - plr.DamagePlayer(damage); - TShock.Utils.Broadcast(string.Format("{0} slapped {1} for {2} damage.", - args.Player.Name, plr.Name, damage)); - Log.Info(args.Player.Name + " slapped " + plr.Name + " with " + damage + " damage."); - } - } - - #endregion Time/PvpFun Commands - - #region World Protection Commands - - private static void ToggleAntiBuild(CommandArgs args) - { - TShock.Config.DisableBuild = (TShock.Config.DisableBuild == false); - TShock.Utils.Broadcast(string.Format("Anti-build is now {0}.", (TShock.Config.DisableBuild ? "on" : "off"))); - } - - private static void ProtectSpawn(CommandArgs args) - { - TShock.Config.SpawnProtection = (TShock.Config.SpawnProtection == false); - TShock.Utils.Broadcast(string.Format("Spawn is now {0}.", (TShock.Config.SpawnProtection ? "protected" : "open"))); - } - - private static void DebugRegions(CommandArgs args) - { - foreach (Region r in TShock.Regions.Regions) - { - args.Player.SendMessage(r.Name + ": P: " + r.DisableBuild + " X: " + r.Area.X + " Y: " + r.Area.Y + " W: " + - r.Area.Width + " H: " + r.Area.Height); - foreach (int s in r.AllowedIDs) - { - args.Player.SendMessage(r.Name + ": " + s); - } - } - } - - private static void Region(CommandArgs args) - { - string cmd = "help"; - if (args.Parameters.Count > 0) - { - cmd = args.Parameters[0].ToLower(); - } - switch (cmd) - { - case "name": - { - { - args.Player.SendMessage("Hit a block to get the name of the region", Color.Yellow); - args.Player.AwaitingName = true; - } - break; - } - case "set": - { - int choice = 0; - if (args.Parameters.Count == 2 && - int.TryParse(args.Parameters[1], out choice) && - choice >= 1 && choice <= 2) - { - args.Player.SendMessage("Hit a block to Set Point " + choice, Color.Yellow); - args.Player.AwaitingTempPoint = choice; - } - else - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /region set [1/2]", Color.Red); - } - break; - } - case "define": - { - if (args.Parameters.Count > 1) - { - if (!args.Player.TempPoints.Any(p => p == Point.Zero)) - { - string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); - var x = Math.Min(args.Player.TempPoints[0].X, args.Player.TempPoints[1].X); - var y = Math.Min(args.Player.TempPoints[0].Y, args.Player.TempPoints[1].Y); - var width = Math.Abs(args.Player.TempPoints[0].X - args.Player.TempPoints[1].X); - var height = Math.Abs(args.Player.TempPoints[0].Y - args.Player.TempPoints[1].Y); - - if (TShock.Regions.AddRegion(x, y, width, height, regionName, args.Player.UserAccountName, - Main.worldID.ToString())) - { - args.Player.TempPoints[0] = Point.Zero; - args.Player.TempPoints[1] = Point.Zero; - args.Player.SendMessage("Set region " + regionName, Color.Yellow); - } - else - { - args.Player.SendMessage("Region " + regionName + " already exists", Color.Red); - } - } - else - { - args.Player.SendMessage("Points not set up yet", Color.Red); - } - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region define [name]", Color.Red); - break; - } - case "protect": - { - if (args.Parameters.Count == 3) - { - string regionName = args.Parameters[1]; - if (args.Parameters[2].ToLower() == "true") - { - if (TShock.Regions.SetRegionState(regionName, true)) - args.Player.SendMessage("Protected region " + regionName, Color.Yellow); - else - args.Player.SendMessage("Could not find specified region", Color.Red); - } - else if (args.Parameters[2].ToLower() == "false") - { - if (TShock.Regions.SetRegionState(regionName, false)) - args.Player.SendMessage("Unprotected region " + regionName, Color.Yellow); - else - args.Player.SendMessage("Could not find specified region", Color.Red); - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region protect [name] [true/false]", Color.Red); - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region protect [name] [true/false]", Color.Red); - break; - } - case "delete": - { - if (args.Parameters.Count > 1) - { - string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); - if (TShock.Regions.DeleteRegion(regionName)) - args.Player.SendMessage("Deleted region " + regionName, Color.Yellow); - else - args.Player.SendMessage("Could not find specified region", Color.Red); - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red); - break; - } - case "clear": - { - args.Player.TempPoints[0] = Point.Zero; - args.Player.TempPoints[1] = Point.Zero; - args.Player.SendMessage("Cleared temp area", Color.Yellow); - args.Player.AwaitingTempPoint = 0; - break; - } - case "allow": - { - if (args.Parameters.Count > 2) - { - string playerName = args.Parameters[1]; - string regionName = ""; - - for (int i = 2; i < args.Parameters.Count; i++) - { - if (regionName == "") - { - regionName = args.Parameters[2]; - } - else - { - regionName = regionName + " " + args.Parameters[i]; - } - } - if (TShock.Users.GetUserByName(playerName) != null) - { - if (TShock.Regions.AddNewUser(regionName, playerName)) - { - args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); - } - else - args.Player.SendMessage("Region " + regionName + " not found", Color.Red); - } - else - { - args.Player.SendMessage("Player " + playerName + " not found", Color.Red); - } - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red); - break; - } - case "remove": - if (args.Parameters.Count > 2) - { - string playerName = args.Parameters[1]; - string regionName = ""; - - for (int i = 2; i < args.Parameters.Count; i++) - { - if (regionName == "") - { - regionName = args.Parameters[2]; - } - else - { - regionName = regionName + " " + args.Parameters[i]; - } - } - if (TShock.Users.GetUserByName(playerName) != null) - { - if (TShock.Regions.RemoveUser(regionName, playerName)) - { - args.Player.SendMessage("Removed user " + playerName + " from " + regionName, Color.Yellow); - } - else - args.Player.SendMessage("Region " + regionName + " not found", Color.Red); - } - else - { - args.Player.SendMessage("Player " + playerName + " not found", Color.Red); - } - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region remove [name] [region]", Color.Red); - break; - case "allowg": - { - if (args.Parameters.Count > 2) - { - string group = args.Parameters[1]; - string regionName = ""; - - for (int i = 2; i < args.Parameters.Count; i++) - { - if (regionName == "") - { - regionName = args.Parameters[2]; - } - else - { - regionName = regionName + " " + args.Parameters[i]; - } - } - if (TShock.Groups.GroupExists(group)) - { - if (TShock.Regions.AllowGroup(regionName, group)) - { - args.Player.SendMessage("Added group " + group + " to " + regionName, Color.Yellow); - } - else - args.Player.SendMessage("Region " + regionName + " not found", Color.Red); - } - else - { - args.Player.SendMessage("Group " + group + " not found", Color.Red); - } - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [group] [region]", Color.Red); - break; - } - case "removeg": - if (args.Parameters.Count > 2) - { - string group = args.Parameters[1]; - string regionName = ""; - - for (int i = 2; i < args.Parameters.Count; i++) - { - if (regionName == "") - { - regionName = args.Parameters[2]; - } - else - { - regionName = regionName + " " + args.Parameters[i]; - } - } - if (TShock.Groups.GroupExists(group)) - { - if (TShock.Regions.RemoveGroup(regionName, group)) - { - args.Player.SendMessage("Removed group " + group + " from " + regionName, Color.Yellow); - } - else - args.Player.SendMessage("Region " + regionName + " not found", Color.Red); - } - else - { - args.Player.SendMessage("Group " + group + " not found", Color.Red); - } - } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region removeg [group] [region]", Color.Red); - break; - case "list": - { - //How many regions per page - const int pagelimit = 15; - //How many regions per line - const int perline = 5; - //Pages start at 0 but are displayed and parsed at 1 - int page = 0; - - - if (args.Parameters.Count > 1) - { - if (!int.TryParse(args.Parameters[1], 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 regions = TShock.Regions.ListAllRegions(Main.worldID.ToString()); - - // Are there even any regions to display? - if (regions.Count == 0) - { - args.Player.SendMessage("There are currently no regions defined.", Color.Red); - return; - } - - //Check if they are trying to access a page that doesn't exist. - int pagecount = regions.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("Current Regions ({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 < regions.Count; i++) - { - nameslist.Add(regions[i].Name); - } - - //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 /region list {0} for more regions.", (page + 2)), Color.Yellow); - } - - break; - } - case "info": - { - if (args.Parameters.Count > 1) - { - string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); - Region r = TShock.Regions.GetRegionByName(regionName); - - if (r == null) - { - args.Player.SendMessage("Region {0} does not exist"); - break; - } - - args.Player.SendMessage(r.Name + ": P: " + r.DisableBuild + " X: " + r.Area.X + " Y: " + r.Area.Y + " W: " + - r.Area.Width + " H: " + r.Area.Height); - foreach (int s in r.AllowedIDs) - { - var user = TShock.Users.GetUserByID(s); - args.Player.SendMessage(r.Name + ": " + (user != null ? user.Name : "Unknown")); - } - } - else - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /region info [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": - { - if (args.Parameters.Count == 4) - { - int direction; - switch (args.Parameters[2]) - { - case "u": - case "up": - { - direction = 0; - break; - } - case "r": - case "right": - { - direction = 1; - break; - } - case "d": - case "down": - { - direction = 2; - break; - } - case "l": - case "left": - { - direction = 3; - break; - } - default: - { - direction = -1; - break; - } - } - int addAmount; - int.TryParse(args.Parameters[3], out addAmount); - if (TShock.Regions.resizeRegion(args.Parameters[1], addAmount, direction)) - { - args.Player.SendMessage("Region Resized Successfully!", Color.Yellow); - TShock.Regions.ReloadAllRegions(); - } - else - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize [regionname] [u/d/l/r] [amount]", - Color.Red); - } - } - else - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize [regionname] [u/d/l/r] [amount]1", - Color.Red); - } - break; - } - case "help": - default: - { - args.Player.SendMessage("Avialable region commands:", Color.Green); - args.Player.SendMessage("/region set [1/2] /region define [name] /region protect [name] [true/false]", - Color.Yellow); - args.Player.SendMessage("/region name (provides region name)", Color.Yellow); - args.Player.SendMessage("/region delete [name] /region clear (temporary region)", Color.Yellow); - args.Player.SendMessage("/region allow [name] [regionname]", Color.Yellow); - args.Player.SendMessage("/region resize [regionname] [u/d/l/r] [amount]", Color.Yellow); - break; - } - } - } - - #endregion World Protection Commands - - #region General Commands - - private static void Help(CommandArgs args) - { - args.Player.SendMessage("TShock Commands:"); - int page = 1; - if (args.Parameters.Count > 0) - int.TryParse(args.Parameters[0], out page); - var cmdlist = new List(); - for (int j = 0; j < ChatCommands.Count; j++) - { - if (ChatCommands[j].CanRun(args.Player)) - { - cmdlist.Add(ChatCommands[j]); - } - } - var sb = new StringBuilder(); - if (cmdlist.Count > (15*(page - 1))) - { - for (int j = (15*(page - 1)); j < (15*page); j++) - { - if (sb.Length != 0) - sb.Append(", "); - sb.Append("/").Append(cmdlist[j].Name); - if (j == cmdlist.Count - 1) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - break; - } - if ((j + 1)%5 == 0) - { - args.Player.SendMessage(sb.ToString(), Color.Yellow); - sb.Clear(); - } - } - } - if (cmdlist.Count > (15*page)) - { - args.Player.SendMessage(string.Format("Type /help {0} for more commands.", (page + 1)), Color.Yellow); - } - } - - 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 AuthToken(CommandArgs args) - { - if (TShock.AuthToken == 0) - { - args.Player.SendMessage("Auth is disabled. This incident has been logged.", Color.Red); - Log.Warn(args.Player.IP + " attempted to use /auth even though it's disabled."); - return; - } - int givenCode = Convert.ToInt32(args.Parameters[0]); - if (givenCode == TShock.AuthToken && args.Player.Group.Name != "superadmin") - { - try - { - TShock.Users.AddUser(new User(args.Player.IP, "", "", "superadmin")); - args.Player.Group = TShock.Utils.GetGroup("superadmin"); - args.Player.SendMessage("This IP address is now superadmin. Please perform the following command:"); - args.Player.SendMessage("/user add : superadmin"); - args.Player.SendMessage("Creates: with the password as part of the superadmin group."); - args.Player.SendMessage("Please use /login to login from now on."); - args.Player.SendMessage("If you understand, please /login now, and type /auth-verify"); - } - catch (UserManagerException ex) - { - Log.ConsoleError(ex.ToString()); - args.Player.SendMessage(ex.Message); - } - return; - } - - if (args.Player.Group.Name == "superadmin") - { - args.Player.SendMessage("Please disable the auth system! If you need help, consult the forums. http://tshock.co/"); - args.Player.SendMessage("This IP address is now superadmin. Please perform the following command:"); - args.Player.SendMessage("/user add : superadmin"); - args.Player.SendMessage("Creates: with the password as part of the superadmin group."); - args.Player.SendMessage("Please use /login to login from now on."); - args.Player.SendMessage("If you understand, please /login now, and type /auth-verify"); - return; - } - - args.Player.SendMessage("Incorrect auth code. This incident has been logged."); - Log.Warn(args.Player.IP + " attempted to use an incorrect auth code."); - } - - private static void AuthVerify(CommandArgs args) - { - if (TShock.AuthToken == 0) - { - args.Player.SendMessage("It appears that you have already turned off the auth token."); - args.Player.SendMessage("If this is a mistake, delete auth.lck."); - return; - } - - if (!args.Player.IsLoggedIn) - { - args.Player.SendMessage("You must be logged in to disable the auth system."); - args.Player.SendMessage("This is a security measure designed to prevent insecure administration setups."); - args.Player.SendMessage("Please re-run /auth and read the instructions!"); - args.Player.SendMessage("If you're still confused, consult the forums. http://tshock.co/"); - return; - } - - args.Player.SendMessage("Your new account has been verified, and the /auth system has been turned off."); - args.Player.SendMessage("You can always use the /user command to manage players. Don't just delete the auth.lck."); - args.Player.SendMessage("Thankyou for using TShock! http://tshock.co/ & http://github.com/TShock/TShock"); - FileTools.CreateFile(Path.Combine(TShock.SavePath, "auth.lck")); - File.Delete(Path.Combine(TShock.SavePath, "authcode.txt")); - TShock.AuthToken = 0; - } - - private static void ThirdPerson(CommandArgs args) - { - if (args.Parameters.Count == 0) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /me ", Color.Red); - return; - } - if (args.Player.mute) - args.Player.SendMessage("You are muted."); - else - TShock.Utils.Broadcast(string.Format("*{0} {1}", args.Player.Name, String.Join(" ", args.Parameters)), 205, 133, 63); - } - - private static void PartyChat(CommandArgs args) - { - if (args.Parameters.Count == 0) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /p ", Color.Red); - return; - } - int playerTeam = args.Player.Team; - - if (args.Player.mute) - args.Player.SendMessage("You are muted."); - else if (playerTeam != 0) - { - string msg = string.Format("<{0}> {1}", args.Player.Name, String.Join(" ", args.Parameters)); - foreach (TSPlayer player in TShock.Players) - { - if (player != null && player.Active && player.Team == playerTeam) - player.SendMessage(msg, Main.teamColor[playerTeam].R, Main.teamColor[playerTeam].G, Main.teamColor[playerTeam].B); - } - } - else - args.Player.SendMessage("You are not in a party!", 255, 240, 20); - } - - private static void Mute(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /mute ", Color.Red); - return; - } - - string plStr = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - args.Player.SendMessage("Invalid player!", Color.Red); - else if (players.Count > 1) - args.Player.SendMessage("More than one player matched!", Color.Red); - else if (players[0].mute && !players[0].Group.HasPermission(Permissions.mute)) - { - var plr = players[0]; - plr.mute = false; - plr.SendMessage("You have been unmuted."); - TShock.Utils.Broadcast(plr.Name + " has been unmuted by " + args.Player.Name, Color.Yellow); - } - else if (!players[0].Group.HasPermission(Permissions.mute)) - { - var plr = players[0]; - plr.mute = true; - plr.SendMessage("You have been muted."); - TShock.Utils.Broadcast(plr.Name + " has been muted by " + args.Player.Name, Color.Yellow); - } - else - args.Player.SendMessage("You cannot mute this player."); - } - - private static void Motd(CommandArgs args) - { - TShock.Utils.ShowFileToUser(args.Player, "motd.txt"); - } - - private static void Rules(CommandArgs args) - { - TShock.Utils.ShowFileToUser(args.Player, "rules.txt"); - } - - private static void Whisper(CommandArgs args) - { - if (args.Parameters.Count < 2) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /whisper ", Color.Red); - return; - } - - var players = TShock.Utils.FindPlayer(args.Parameters[0]); - if (players.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - } - else if (players.Count > 1) - { - args.Player.SendMessage("More than one player matched!", Color.Red); - } - else if (args.Player.mute) - args.Player.SendMessage("You are muted."); - else - { - var plr = players[0]; - var msg = string.Join(" ", args.Parameters.ToArray(), 1, args.Parameters.Count - 1); - plr.SendMessage("(Whisper From)" + "<" + args.Player.Name + ">" + msg, Color.MediumPurple); - args.Player.SendMessage("(Whisper To)" + "<" + plr.Name + ">" + msg, Color.MediumPurple); - plr.LastWhisper = args.Player; - args.Player.LastWhisper = plr; - } - } - - private static void Reply(CommandArgs args) - { - if (args.Player.mute) - args.Player.SendMessage("You are muted."); - else if (args.Player.LastWhisper != null) - { - var msg = string.Join(" ", args.Parameters); - args.Player.LastWhisper.SendMessage("(Whisper From)" + "<" + args.Player.Name + ">" + msg, Color.MediumPurple); - args.Player.SendMessage("(Whisper To)" + "<" + args.Player.LastWhisper.Name + ">" + msg, Color.MediumPurple); - } - else - args.Player.SendMessage( - "You haven't previously received any whispers. Please use /whisper to whisper to other people.", Color.Red); - } - - private static void Annoy(CommandArgs args) - { - if (args.Parameters.Count != 2) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /annoy ", Color.Red); - return; - } - int annoy = 5; - int.TryParse(args.Parameters[1], out annoy); - - var players = TShock.Utils.FindPlayer(args.Parameters[0]); - if (players.Count == 0) - args.Player.SendMessage("Invalid player!", Color.Red); - else if (players.Count > 1) - args.Player.SendMessage("More than one player matched!", Color.Red); - else - { - var ply = players[0]; - args.Player.SendMessage("Annoying " + ply.Name + " for " + annoy + " seconds."); - (new Thread(ply.Whoopie)).Start(annoy); - } - } - - #endregion General Commands - - #region Cheat Commands - - private static void Kill(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /kill ", Color.Red); - return; - } - - string plStr = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - } - else if (players.Count > 1) - { - args.Player.SendMessage("More than one player matched!", Color.Red); - } - else - { - var plr = players[0]; - plr.DamagePlayer(999999); - args.Player.SendMessage(string.Format("You just killed {0}!", plr.Name)); - plr.SendMessage(string.Format("{0} just killed you!", args.Player.Name)); - } - } - - private static void Butcher(CommandArgs args) - { - if (args.Parameters.Count > 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /butcher [killTownNPCs(true/false)]", Color.Red); - return; - } - - 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++) - { - if (Main.npc[i].active && Main.npc[i].type != 0 && (!Main.npc[i].townNPC || killTownNPCs)) - { - TSPlayer.Server.StrikeNPC(i, 99999, 90f, 1); - killcount++; - } - } - TShock.Utils.Broadcast(string.Format("Killed {0} NPCs.", killcount)); - } - - private static void Item(CommandArgs args) - { - if (args.Parameters.Count < 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /item [item amount] [prefix id/name]", - Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing item name/id", Color.Red); - return; - } - int itemAmount = 0; - int prefix = 0; - if (args.Parameters.Count == 2) - int.TryParse(args.Parameters[1], out itemAmount); - else if (args.Parameters.Count == 3) - { - int.TryParse(args.Parameters[1], out itemAmount); - var found = TShock.Utils.GetPrefixByIdOrName(args.Parameters[2]); - if (found.Count == 1) - prefix = found[0]; - } - var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); - if (items.Count == 0) - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - else if (items.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); - } - else - { - var item = items[0]; - if (item.type >= 1 && item.type < Main.maxItemTypes) - { - if (args.Player.InventorySlotAvailable || item.name.Contains("Coin")) - { - 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); - } - } - else - { - args.Player.SendMessage("You don't have free slots!", Color.Red); - } - } - else - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - } - } - - private static void Give(CommandArgs args) - { - if (args.Parameters.Count < 2) - { - args.Player.SendMessage( - "Invalid syntax! Proper syntax: /give [item amount] [prefix id/name]", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing item name/id", Color.Red); - return; - } - if (args.Parameters[1].Length == 0) - { - args.Player.SendMessage("Missing player name", Color.Red); - return; - } - int itemAmount = 0; - int prefix = 0; - var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); - args.Parameters.RemoveAt(0); - string plStr = args.Parameters[0]; - args.Parameters.RemoveAt(0); - if (args.Parameters.Count == 1) - int.TryParse(args.Parameters[0], out itemAmount); - else if (args.Parameters.Count == 2) - { - int.TryParse(args.Parameters[0], out itemAmount); - var found = TShock.Utils.GetPrefixByIdOrName(args.Parameters[1]); - if (found.Count == 1) - prefix = found[0]; - } - - if (items.Count == 0) - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - else if (items.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); - } - else - { - var item = items[0]; - if (item.type >= 1 && item.type < Main.maxItemTypes) - { - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - } - else if (players.Count > 1) - { - args.Player.SendMessage("More than one player matched!", Color.Red); - } - else - { - var plr = players[0]; - if (plr.InventorySlotAvailable || item.name.Contains("Coin")) - { - 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); - } - - } - else - { - args.Player.SendMessage("Player does not have free slots!", Color.Red); - } - } - } - else - { - args.Player.SendMessage("Invalid item type!", Color.Red); - } - } - } - - public static void ClearItems(CommandArgs args) - { - int radius = 50; - if (args.Parameters.Count > 0) - { - if (args.Parameters[0].ToLower() == "all") - { - radius = Int32.MaxValue/16; - } - else - { - try - { - radius = Convert.ToInt32(args.Parameters[0]); - } - catch (Exception) - { - args.Player.SendMessage( - "Please either enter the keyword \"all\", or the block radius you wish to delete all items from.", Color.Red); - return; - } - } - } - int count = 0; - for (int i = 0; i < 200; i++) - { - if ( - (Math.Sqrt(Math.Pow(Main.item[i].position.X - args.Player.X, 2) + - Math.Pow(Main.item[i].position.Y - args.Player.Y, 2)) < radius*16) && (Main.item[i].active)) - { - Main.item[i].active = false; - NetMessage.SendData(0x15, -1, -1, "", i, 0f, 0f, 0f, 0); - count++; - } - } - args.Player.SendMessage("All " + count + " items within a radius of " + radius + " have been deleted."); - } - - private static void Heal(CommandArgs args) - { - TSPlayer playerToHeal; - if (args.Parameters.Count > 0) - { - string plStr = String.Join(" ", args.Parameters); - var players = TShock.Utils.FindPlayer(plStr); - if (players.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - return; - } - else if (players.Count > 1) - { - args.Player.SendMessage("More than one player matched!", Color.Red); - return; - } - else - { - playerToHeal = players[0]; - } - } - else if (!args.Player.RealPlayer) - { - args.Player.SendMessage("You cant heal yourself!"); - return; - } - else - { - playerToHeal = args.Player; - } - - Item heart = TShock.Utils.GetItemById(58); - Item star = TShock.Utils.GetItemById(184); - for (int i = 0; i < 20; i++) - playerToHeal.GiveItem(heart.type, heart.name, heart.width, heart.height, heart.maxStack); - for (int i = 0; i < 10; i++) - playerToHeal.GiveItem(star.type, star.name, star.width, star.height, star.maxStack); - if (playerToHeal == args.Player) - { - args.Player.SendMessage("You just got healed!"); - } - else - { - args.Player.SendMessage(string.Format("You just healed {0}", playerToHeal.Name)); - playerToHeal.SendMessage(string.Format("{0} just healed you!", args.Player.Name)); - } - } - - private static void Buff(CommandArgs args) - { - if (args.Parameters.Count < 1 || args.Parameters.Count > 2) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /buff [time(seconds)]", Color.Red); - return; - } - int id = 0; - int time = 60; - if (!int.TryParse(args.Parameters[0], out id)) - { - var found = TShock.Utils.GetBuffByName(args.Parameters[0]); - if (found.Count == 0) - { - args.Player.SendMessage("Invalid buff name!", Color.Red); - return; - } - else if (found.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) buff matched!", found.Count), Color.Red); - return; - } - id = found[0]; - } - if (args.Parameters.Count == 2) - int.TryParse(args.Parameters[1], out time); - if (id > 0 && id < Main.maxBuffs) - { - if (time < 0 || time > short.MaxValue) - time = 60; - args.Player.SetBuff(id, time*60); - args.Player.SendMessage(string.Format("You have buffed yourself with {0}({1}) for {2} seconds!", - TShock.Utils.GetBuffName(id), TShock.Utils.GetBuffDescription(id), (time)), - Color.Green); - } - else - args.Player.SendMessage("Invalid buff ID!", Color.Red); - } - - private static void GBuff(CommandArgs args) - { - if (args.Parameters.Count < 2 || args.Parameters.Count > 3) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /gbuff [time(seconds)]", Color.Red); - return; - } - int id = 0; - int time = 60; - 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; - } - else - { - if (!int.TryParse(args.Parameters[1], out id)) - { - var found = TShock.Utils.GetBuffByName(args.Parameters[1]); - if (found.Count == 0) - { - args.Player.SendMessage("Invalid buff name!", Color.Red); - return; - } - else if (found.Count > 1) - { - args.Player.SendMessage(string.Format("More than one ({0}) buff matched!", found.Count), Color.Red); - return; - } - id = found[0]; - } - if (args.Parameters.Count == 3) - int.TryParse(args.Parameters[2], out time); - if (id > 0 && id < Main.maxBuffs) - { - if (time < 0 || time > short.MaxValue) - time = 60; - foundplr[0].SetBuff(id, time*60); - args.Player.SendMessage(string.Format("You have buffed {0} with {1}({2}) for {3} seconds!", - foundplr[0].Name, TShock.Utils.GetBuffName(id), - TShock.Utils.GetBuffDescription(id), (time)), Color.Green); - foundplr[0].SendMessage(string.Format("{0} has buffed you with {1}({2}) for {3} seconds!", - args.Player.Name, TShock.Utils.GetBuffName(id), - TShock.Utils.GetBuffDescription(id), (time)), Color.Green); - } - else - args.Player.SendMessage("Invalid buff ID!", Color.Red); - } - } - - private static void Grow(CommandArgs args) - { - if (args.Parameters.Count != 1) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /grow [tree/epictree/mushroom/cactus/herb]", Color.Red); - return; - } - var name = "Fail"; - var x = args.Player.TileX; - var y = args.Player.TileY + 3; - switch (args.Parameters[0].ToLower()) - { - case "tree": - for (int i = x - 1; i < x + 2; i++) - { - Main.tile[i, y].active = true; - Main.tile[i, y].type = 2; - Main.tile[i, y].wall = 0; - } - Main.tile[x, y - 1].wall = 0; - WorldGen.GrowTree(x, y); - name = "Tree"; - break; - case "epictree": - for (int i = x - 1; i < x + 2; i++) - { - Main.tile[i, y].active = true; - Main.tile[i, y].type = 2; - Main.tile[i, y].wall = 0; - } - Main.tile[x, y - 1].wall = 0; - Main.tile[x, y - 1].liquid = 0; - Main.tile[x, y - 1].active = true; - WorldGen.GrowEpicTree(x, y); - name = "Epic Tree"; - break; - case "mushroom": - for (int i = x - 1; i < x + 2; i++) - { - Main.tile[i, y].active = true; - Main.tile[i, y].type = 70; - Main.tile[i, y].wall = 0; - } - Main.tile[x, y - 1].wall = 0; - WorldGen.GrowShroom(x, y); - name = "Mushroom"; - break; - case "cactus": - Main.tile[x, y].type = 53; - WorldGen.GrowCactus(x, y); - name = "Cactus"; - break; - case "herb": - Main.tile[x, y].active = true; - Main.tile[x, y].frameX = 36; - Main.tile[x, y].type = 83; - WorldGen.GrowAlch(x, y); - name = "Herb"; - break; - default: - args.Player.SendMessage("Unknown plant!", Color.Red); - return; - } - args.Player.SendTileSquare(x, y); - args.Player.SendMessage("Tried to grow a " + name, Color.Green); - } - - #endregion Cheat Comamnds - } -} +/* +TShock, a server mod for Terraria +Copyright (C) 2011-2012 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using Terraria; +using TShockAPI.DB; +using System.Reflection; + +namespace TShockAPI +{ + public delegate void CommandDelegate(CommandArgs args); + + public class CommandArgs : EventArgs + { + public string Message { get; private set; } + public TSPlayer Player { get; private set; } + + /// + /// Parameters passed to the arguement. Does not include the command name. + /// IE '/kick "jerk face"' will only have 1 argument + /// + public List Parameters { get; private set; } + + public Player TPlayer + { + get { return Player.TPlayer; } + } + + public CommandArgs(string message, TSPlayer ply, List args) + { + Message = message; + Player = ply; + Parameters = args; + } + } + + public class Command + { + public string Name + { + get { return Names[0]; } + } + + public List Names { get; protected set; } + public bool DoLog { get; set; } + public string Permission { get; protected set; } + private CommandDelegate command; + + public Command(string permissionneeded, CommandDelegate cmd, params string[] names) + : this(cmd, names) + { + Permission = permissionneeded; + } + + public Command(CommandDelegate cmd, params string[] names) + { + if (names == null || names.Length < 1) + throw new NotSupportedException(); + Permission = null; + Names = new List(names); + command = cmd; + DoLog = true; + } + + public bool Run(string msg, TSPlayer ply, List parms) + { + if (!ply.Group.HasPermission(Permission)) + return false; + + try + { + command(new CommandArgs(msg, ply, parms)); + } + catch (Exception e) + { + ply.SendMessage("Command failed, check logs for more details."); + Log.Error(e.ToString()); + } + + return true; + } + + public bool HasAlias(string name) + { + return Names.Contains(name); + } + + public bool CanRun(TSPlayer ply) + { + return ply.Group.HasPermission(Permission); + } + } + + public static class Commands + { + public static List ChatCommands = new List(); + + private delegate void AddChatCommand(string permission, CommandDelegate command, params string[] names); + + public static void InitCommands() + { + 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.maintenance, ClearBans, "clearbans"); + add(Permissions.whitelist, Whitelist, "whitelist"); + add(Permissions.maintenance, Off, "off", "exit"); + 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"); + add(Permissions.causeevents, Star, "star"); + 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.spawnmob, SpawnMob, "spawnmob", "sm"); + add(Permissions.tp, Home, "home"); + 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.managegroup, AddGroup, "addgroup"); + add(Permissions.managegroup, DeleteGroup, "delgroup"); + add(Permissions.managegroup, ModifyGroup, "modgroup"); + add(Permissions.managegroup, ViewGroups, "group"); + add(Permissions.manageitem, AddItem, "additem", "banitem"); + add(Permissions.manageitem, DeleteItem, "delitem", "unbanitem"); + add(Permissions.manageitem, ListItems, "listitems", "listbanneditems"); + add(Permissions.manageitem, AddItemGroup, "additemgroup"); + add(Permissions.manageitem, DeleteItemGroup, "delitemgroup"); + add(Permissions.cfg, SetSpawn, "setspawn"); + add(Permissions.cfg, Reload, "reload"); + add(Permissions.cfg, ServerPassword, "serverpassword"); + add(Permissions.cfg, Save, "save"); + add(Permissions.cfg, Settle, "settle"); + add(Permissions.cfg, MaxSpawns, "maxspawns"); + add(Permissions.cfg, SpawnRate, "spawnrate"); + add(Permissions.time, Time, "time"); + add(Permissions.pvpfun, Slap, "slap"); + 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(null, ListConnectedPlayers, "playing", "online", "who", "version"); + add(null, AuthToken, "auth"); + 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"); + add(Permissions.annoy, Annoy, "annoy"); + add(Permissions.kill, Kill, "kill"); + add(Permissions.butcher, Butcher, "butcher"); + add(Permissions.item, Item, "item", "i"); + add(Permissions.item, Give, "give", "g"); + add(Permissions.clearitems, ClearItems, "clear", "clearitems"); + add(Permissions.heal, Heal, "heal"); + add(Permissions.buff, Buff, "buff"); + add(Permissions.buffplayer, GBuff, "gbuff", "buffplayer"); + add(Permissions.grow, Grow, "grow"); + add(Permissions.hardmode, StartHardMode, "hardmode"); + 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"); + } + + public static bool HandleCommand(TSPlayer player, string text) + { + string cmdText = text.Remove(0, 1); + + var args = ParseParameters(cmdText); + if (args.Count < 1) + return false; + + string cmdName = args[0]; + args.RemoveAt(0); + + Command cmd = ChatCommands.FirstOrDefault(c => c.HasAlias(cmdName)); + + if (cmd == null) + { + player.SendMessage("Invalid Command Entered. Type /help for a list of valid Commands.", Color.Red); + return true; + } + + if (!cmd.CanRun(player)) + { + TShock.Utils.SendLogs(string.Format("{0} tried to execute {1}", player.Name, cmd.Name), Color.Red); + player.SendMessage("You do not have access to that command.", Color.Red); + } + else + { + if (cmd.DoLog) + TShock.Utils.SendLogs(string.Format("{0} executed: /{1}", player.Name, cmdText), Color.Red); + cmd.Run(cmdText, player, args); + } + return true; + } + + /// + /// Parses a string of parameters into a list. Handles quotes. + /// + /// + /// + private static List ParseParameters(string str) + { + var ret = new List(); + var sb = new StringBuilder(); + bool instr = false; + for (int i = 0; i < str.Length; i++) + { + char c = str[i]; + + if (instr) + { + if (c == '\\') + { + if (i + 1 >= str.Length) + break; + c = GetEscape(str[++i]); + } + else if (c == '"') + { + ret.Add(sb.ToString()); + sb.Clear(); + instr = false; + continue; + } + sb.Append(c); + } + else + { + if (IsWhiteSpace(c)) + { + if (sb.Length > 0) + { + ret.Add(sb.ToString()); + sb.Clear(); + } + } + else if (c == '"') + { + if (sb.Length > 0) + { + ret.Add(sb.ToString()); + sb.Clear(); + } + instr = true; + } + else + { + sb.Append(c); + } + } + } + if (sb.Length > 0) + ret.Add(sb.ToString()); + + return ret; + } + + private static char GetEscape(char c) + { + switch (c) + { + case '\\': + return '\\'; + case '"': + return '"'; + case 't': + return '\t'; + default: + return c; + } + } + + private static bool IsWhiteSpace(char c) + { + return c == ' ' || c == '\t' || c == '\n'; + } + + #region Account commands + + public static void AttemptLogin(CommandArgs args) + { + if (args.Player.LoginAttempts > TShock.Config.MaximumLoginAttempts && (TShock.Config.MaximumLoginAttempts != -1)) + { + Log.Warn(args.Player.IP + "(" + args.Player.Name + ") had " + TShock.Config.MaximumLoginAttempts + + " or more invalid login attempts and was kicked automatically."); + TShock.Utils.Kick(args.Player, "Too many invalid login attempts."); + } + + var user = TShock.Users.GetUserByName(args.Player.Name); + string encrPass = ""; + + if (args.Parameters.Count == 1) + { + user = TShock.Users.GetUserByName(args.Player.Name); + encrPass = TShock.Utils.HashPassword(args.Parameters[0]); + } + else if (args.Parameters.Count == 2 && TShock.Config.AllowLoginAnyUsername) + { + user = TShock.Users.GetUserByName(args.Parameters[0]); + encrPass = TShock.Utils.HashPassword(args.Parameters[1]); + } + else + { + args.Player.SendMessage("Syntax: /login [password]"); + args.Player.SendMessage("If you forgot your password, there is no way to recover it."); + return; + } + try + { + if (user == null) + { + args.Player.SendMessage("User by that name does not exist"); + } + else if (user.Password.ToUpper() == encrPass.ToUpper()) + { + args.Player.PlayerData = TShock.InventoryDB.GetPlayerData(args.Player, TShock.Users.GetUserID(user.Name)); + + var group = TShock.Utils.GetGroup(user.Group); + + if (TShock.Config.ServerSideInventory) + { + if (group.HasPermission(Permissions.bypassinventorychecks)) + { + args.Player.IgnoreActionsForClearingTrashCan = false; + } + else if (!TShock.CheckInventory(args.Player)) + { + args.Player.SendMessage("Login Failed, Please fix the above errors then /login again.", Color.Cyan); + args.Player.IgnoreActionsForClearingTrashCan = true; + return; + } + } + + if (group.HasPermission(Permissions.ignorestackhackdetection)) + args.Player.IgnoreActionsForCheating = "none"; + + if (group.HasPermission(Permissions.usebanneditem)) + args.Player.IgnoreActionsForDisabledArmor = "none"; + + args.Player.Group = group; + args.Player.UserAccountName = user.Name; + args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName); + 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); + + Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + user.Name); + if ((args.Player.LoginHarassed) && (TShock.Config.RememberLeavePos)){ + if (TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP) != Vector2.Zero) + { + Vector2 pos = TShock.RememberedPos.GetLeavePos(args.Player.Name, args.Player.IP); + + args.Player.Teleport((int) pos.X, (int) pos.Y + 3); + } + args.Player.LoginHarassed = false; + + }} + else + { + args.Player.SendMessage("Incorrect password", Color.LimeGreen); + Log.Warn(args.Player.IP + " failed to authenticate as user: " + user.Name); + args.Player.LoginAttempts++; + } + } + catch (Exception ex) + { + args.Player.SendMessage("There was an error processing your request.", Color.Red); + Log.Error(ex.ToString()); + } + } + + private static void PasswordUser(CommandArgs args) + { + try + { + if (args.Player.IsLoggedIn && args.Parameters.Count == 2) + { + var user = TShock.Users.GetUserByName(args.Player.UserAccountName); + string encrPass = TShock.Utils.HashPassword(args.Parameters[0]); + if (user.Password.ToUpper() == encrPass.ToUpper()) + { + args.Player.SendMessage("You changed your password!", Color.Green); + TShock.Users.SetUserPassword(user, args.Parameters[1]); // SetUserPassword will hash it for you. + Log.ConsoleInfo(args.Player.IP + " named " + args.Player.Name + " changed the password of Account " + user.Name); + } + else + { + args.Player.SendMessage("You failed to change your password!", Color.Red); + Log.ConsoleError(args.Player.IP + " named " + args.Player.Name + " failed to change password for Account: " + + user.Name); + } + } + else + { + args.Player.SendMessage("Not Logged in or Invalid syntax! Proper syntax: /password ", + Color.Red); + } + } + catch (UserManagerException ex) + { + args.Player.SendMessage("Sorry, an error occured: " + ex.Message, Color.Green); + Log.ConsoleError("RegisterUser returned an error: " + ex); + } + } + + private static void RegisterUser(CommandArgs args) + { + try + { + var user = new User(); + + if (args.Parameters.Count == 1) + { + user.Name = args.Player.Name; + user.Password = args.Parameters[0]; + } + else if (args.Parameters.Count == 2 && TShock.Config.AllowRegisterAnyUsername) + { + user.Name = args.Parameters[0]; + user.Password = args.Parameters[1]; + } + else + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /register ", Color.Red); + return; + } + + user.Group = TShock.Config.DefaultRegistrationGroupName; // FIXME -- we should get this from the DB. --Why? + + if (TShock.Users.GetUserByName(user.Name) == null) // Cheap way of checking for existance of a user + { + args.Player.SendMessage("Account " + user.Name + " has been registered.", Color.Green); + args.Player.SendMessage("Your password is " + user.Password); + TShock.Users.AddUser(user); + Log.ConsoleInfo(args.Player.Name + " registered an Account: " + user.Name); + } + else + { + args.Player.SendMessage("Account " + user.Name + " has already been registered.", Color.Green); + Log.ConsoleInfo(args.Player.Name + " failed to register an existing Account: " + user.Name); + } + } + catch (UserManagerException ex) + { + args.Player.SendMessage("Sorry, an error occured: " + ex.Message, Color.Green); + Log.ConsoleError("RegisterUser returned an error: " + ex); + } + } + + //Todo: Add separate help text for '/user add' and '/user del'. Also add '/user addip' and '/user delip' + + private static void ManageUsers(CommandArgs args) + { + // This guy needs to be here so that people don't get exceptions when they type /user + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid user syntax. Try /user help.", Color.Red); + return; + } + + string subcmd = args.Parameters[0]; + + // Add requires a username:password pair/ip address and a group specified. + if (subcmd == "add") + { + var namepass = args.Parameters[1].Split(':'); + var user = new User(); + + try + { + if (args.Parameters.Count > 2) + { + if (namepass.Length == 2) + { + user.Name = namepass[0]; + user.Password = namepass[1]; + user.Group = args.Parameters[2]; + } + else if (namepass.Length == 1) + { + user.Address = namepass[0]; + user.Group = args.Parameters[2]; + user.Name = user.Address; + } + if (!string.IsNullOrEmpty(user.Address)) + { + args.Player.SendMessage("IP address admin added. If they're logged in, tell them to rejoin.", Color.Green); + args.Player.SendMessage("WARNING: This is insecure! It would be better to use a user account instead.", Color.Red); + TShock.Users.AddUser(user); + Log.ConsoleInfo(args.Player.Name + " added IP " + user.Address + " to group " + user.Group); + } + else + { + args.Player.SendMessage("Account " + user.Name + " has been added to group " + user.Group + "!", Color.Green); + TShock.Users.AddUser(user); + Log.ConsoleInfo(args.Player.Name + " added Account " + user.Name + " to group " + user.Group); + } + } + else + { + args.Player.SendMessage("Invalid syntax. Try /user help.", Color.Red); + } + } + catch (UserManagerException ex) + { + args.Player.SendMessage(ex.Message, Color.Green); + Log.ConsoleError(ex.ToString()); + } + } + // User deletion requires a username + else if (subcmd == "del" && args.Parameters.Count == 2) + { + var user = new User(); + if (args.Parameters[1].Split('.').Count() ==4) + + // changed to support dot character in usernames + // if (args.Parameters[1].Contains(".")) + user.Address = args.Parameters[1]; + else + user.Name = args.Parameters[1]; + + try + { + TShock.Users.RemoveUser(user); + args.Player.SendMessage("Account removed successfully.", Color.Green); + Log.ConsoleInfo(args.Player.Name + " successfully deleted account: " + args.Parameters[1]); + } + catch (UserManagerException ex) + { + args.Player.SendMessage(ex.Message, Color.Red); + Log.ConsoleError(ex.ToString()); + } + } + // Password changing requires a username, and a new password to set + else if (subcmd == "password") + { + var user = new User(); + user.Name = args.Parameters[1]; + + try + { + if (args.Parameters.Count == 3) + { + args.Player.SendMessage("Changed the password of " + user.Name + "!", Color.Green); + TShock.Users.SetUserPassword(user, args.Parameters[2]); + Log.ConsoleInfo(args.Player.Name + " changed the password of Account " + user.Name); + } + else + { + args.Player.SendMessage("Invalid user password syntax. Try /user help.", Color.Red); + } + } + catch (UserManagerException ex) + { + args.Player.SendMessage(ex.Message, Color.Green); + Log.ConsoleError(ex.ToString()); + } + } + // Group changing requires a username or IP address, and a new group to set + else if (subcmd == "group") + { + var user = new User(); + if (args.Parameters[1].Split('.').Count()==4) + + //changed to support dot character in usernames + //if (args.Parameters[1].Contains(".")) + + user.Address = args.Parameters[1]; + else + user.Name = args.Parameters[1]; + + try + { + if (args.Parameters.Count == 3) + { + if (!string.IsNullOrEmpty(user.Address)) + { + args.Player.SendMessage("IP Address " + user.Address + " has been changed to group " + args.Parameters[2] + "!", + Color.Green); + TShock.Users.SetUserGroup(user, args.Parameters[2]); + Log.ConsoleInfo(args.Player.Name + " changed IP Address " + user.Address + " to group " + args.Parameters[2]); + } + else + { + args.Player.SendMessage("Account " + user.Name + " has been changed to group " + args.Parameters[2] + "!", + Color.Green); + TShock.Users.SetUserGroup(user, args.Parameters[2]); + Log.ConsoleInfo(args.Player.Name + " changed Account " + user.Name + " to group " + args.Parameters[2]); + } + } + else + { + args.Player.SendMessage("Invalid user group syntax. Try /user help.", Color.Red); + } + } + catch (UserManagerException ex) + { + args.Player.SendMessage(ex.Message, Color.Green); + Log.ConsoleError(ex.ToString()); + } + } + else if (subcmd == "help") + { + args.Player.SendMessage("Help for user subcommands:"); + args.Player.SendMessage("/user add username:password group -- Adds a specified user"); + args.Player.SendMessage("/user del username -- Removes a specified user"); + args.Player.SendMessage("/user password username newpassword -- Changes a user's password"); + args.Player.SendMessage("/user group username newgroup -- Changes a user's group"); + } + else + { + args.Player.SendMessage("Invalid user syntax. Try /user help.", Color.Red); + } + } + + #endregion + + #region Stupid commands + + public static void ServerInfo(CommandArgs args) + { + args.Player.SendMessage("Memory usage: " + Process.GetCurrentProcess().WorkingSet64); + args.Player.SendMessage("Allocated memory: " + Process.GetCurrentProcess().VirtualMemorySize64); + args.Player.SendMessage("Total processor time: " + Process.GetCurrentProcess().TotalProcessorTime); + args.Player.SendMessage("Ver: " + Environment.OSVersion); + args.Player.SendMessage("Proc count: " + Environment.ProcessorCount); + 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); + } + + #endregion + + #region Player Management Commands + + private static void GrabUserUserInfo(CommandArgs args) + { + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /userinfo ", Color.Red); + return; + } + + 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); + return; + } + try + { + args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName + " Group: " + players[0].Group.Name, Color.Green); + } + catch (Exception) + { + args.Player.SendMessage("Invalid player.", Color.Red); + } + } + + private static void Kick(CommandArgs args) + { + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /kick [reason]", Color.Red); + return; + } + if (args.Parameters[0].Length == 0) + { + args.Player.SendMessage("Missing player name", Color.Red); + return; + } + + 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 (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 + ? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)) + : "Misbehaviour."; + if (!TShock.Utils.Kick(players[0], reason, !args.Player.RealPlayer, false, args.Player.Name)) + { + args.Player.SendMessage("You can't kick another admin!", Color.Red); + } + } + } + + 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; + } + + 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 (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 + ? 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 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); + } + + 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); + 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) + { + using (var tw = new StreamWriter(FileTools.WhitelistPath, true)) + { + tw.WriteLine(args.Parameters[0]); + } + args.Player.SendMessage("Added " + args.Parameters[0] + " to the whitelist."); + } + } + + public static void DisplayLogs(CommandArgs args) + { + args.Player.DisplayLogs = (!args.Player.DisplayLogs); + 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 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]); + } + } + } + + #endregion Player Management Commands + + #region Server Maintenence Commands + + private static void Broadcast(CommandArgs args) + { + string message = ""; + + for (int i = 0; i < args.Parameters.Count; i++) + { + message += " " + args.Parameters[i]; + } + + TShock.Utils.Broadcast("(Server Broadcast)" + message, Color.Red); + return; + } + + private static void Off(CommandArgs args) + { + + if (TShock.Config.ServerSideInventory) + { + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) + { + player.SaveServerInventory(); + } + } + } + + string reason = ((args.Parameters.Count > 0) ? "Server shutting down: " + String.Join(" ", args.Parameters) : "Server shutting down!"); + TShock.Utils.StopServer(true, reason); + } + //Added restart command + private static void Restart(CommandArgs args) + { + if (Main.runningMono) + { + Log.ConsoleInfo("Sorry, this command has not yet been implemented in Mono"); + } + else + { + if (TShock.Config.ServerSideInventory) + { + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) + { + TShock.InventoryDB.InsertPlayerData(player); + } + } + } + + 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); + } + } + + 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); + } + + private static void CheckUpdates(CommandArgs args) + { + ThreadPool.QueueUserWorkItem(UpdateManager.CheckUpdate); + } + + #endregion Server Maintenence Commands + + #region Cause Events and Spawn Monsters Commands + + private static void DropMeteor(CommandArgs args) + { + WorldGen.spawnMeteor = false; + WorldGen.dropMeteor(); + } + + private static void Star(CommandArgs args) + { + int penis56 = 12; + int penis57 = Main.rand.Next(Main.maxTilesX - 50) + 100; + penis57 *= 0x10; + int penis58 = Main.rand.Next((int) (Main.maxTilesY*0.05))*0x10; + Vector2 vector = new Vector2(penis57, penis58); + float speedX = Main.rand.Next(-100, 0x65); + float speedY = Main.rand.Next(200) + 100; + float penis61 = (float) Math.Sqrt(((speedX*speedX) + (speedY*speedY))); + penis61 = (penis56)/penis61; + speedX *= penis61; + speedY *= penis61; + Projectile.NewProjectile(vector.X, vector.Y, speedX, speedY, 12, 0x3e8, 10f, Main.myPlayer); + } + + private static void Fullmoon(CommandArgs args) + { + TSPlayer.Server.SetFullMoon(true); + TShock.Utils.Broadcast(string.Format("{0} turned on full moon.", args.Player.Name)); + } + + private static void Bloodmoon(CommandArgs args) + { + TSPlayer.Server.SetBloodMoon(true); + TShock.Utils.Broadcast(string.Format("{0} turned on blood moon.", args.Player.Name)); + } + + private static void Invade(CommandArgs args) + { + if (Main.invasionSize <= 0) + { + TShock.Utils.Broadcast(string.Format("{0} has started an invasion.", args.Player.Name)); + TShock.StartInvasion(); + } + else + { + TShock.Utils.Broadcast(string.Format("{0} has ended an invasion.", args.Player.Name)); + Main.invasionSize = 0; + } + } + + [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)); + } + + [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)); + } + + [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)); + } + + [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)); + } + + [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)); + } + + [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)); + } + + [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)); + } + + [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)); + } + + [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)); + } + + 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; + } + + amount = Math.Min(amount, Main.maxNPCs); + + 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 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) + { + 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 + + private static void Home(CommandArgs args) + { + if (!args.Player.RealPlayer) + { + args.Player.SendMessage("You cannot use teleport commands!"); + return; + } + + args.Player.Spawn(); + args.Player.SendMessage("Teleported to your spawnpoint."); + } + + private static void Spawn(CommandArgs args) + { + if (!args.Player.RealPlayer) + { + args.Player.SendMessage("You cannot use teleport commands!"); + return; + } + + if (args.Player.Teleport(Main.spawnTileX, Main.spawnTileY)) + args.Player.SendMessage("Teleported to the map's spawnpoint."); + } + + private static void TP(CommandArgs args) + { + if (!args.Player.RealPlayer) + { + args.Player.SendMessage("You cannot use teleport commands!"); + return; + } + + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /tp ", Color.Red); + return; + } + + string plStr = String.Join(" ", args.Parameters); + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + args.Player.SendMessage("Invalid player!", Color.Red); + else if (players.Count > 1) + args.Player.SendMessage("More than one player matched!", Color.Red); + else if (!players[0].TPAllow && !args.Player.Group.HasPermission(Permissions.tpall)) + { + var plr = players[0]; + args.Player.SendMessage(plr.Name + " Has Selected For Users Not To Teleport To Them"); + plr.SendMessage(args.Player.Name + " Attempted To Teleport To You"); + } + else + { + var plr = players[0]; + if (args.Player.Teleport(plr.TileX, plr.TileY + 3)) + { + args.Player.SendMessage(string.Format("Teleported to {0}", plr.Name)); + if (!args.Player.Group.HasPermission(Permissions.tphide)) + plr.SendMessage(args.Player.Name + " Teleported To You"); + } + } + } + + private static void TPHere(CommandArgs args) + { + if (!args.Player.RealPlayer) + { + args.Player.SendMessage("You cannot use teleport commands!"); + return; + } + + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /tphere ", Color.Red); + return; + } + + string plStr = String.Join(" ", args.Parameters); + + if (plStr == "all" || plStr == "*") + { + args.Player.SendMessage(string.Format("You brought all players here.")); + for (int i = 0; i < Main.maxPlayers; i++) + { + if (Main.player[i].active && (Main.player[i] != args.TPlayer)) + { + if (TShock.Players[i].Teleport(args.Player.TileX, args.Player.TileY + 3)) + TShock.Players[i].SendMessage(string.Format("You were teleported to {0}.", args.Player.Name)); + } + } + return; + } + + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + } + else if (players.Count > 1) + { + args.Player.SendMessage("More than one player matched!", Color.Red); + } + else + { + var plr = players[0]; + if (plr.Teleport(args.Player.TileX, args.Player.TileY + 3)) + { + plr.SendMessage(string.Format("You were teleported to {0}.", args.Player.Name)); + args.Player.SendMessage(string.Format("You brought {0} here.", plr.Name)); + } + } + } + + private static void TPAllow(CommandArgs args) + { + if (!args.Player.TPAllow) + args.Player.SendMessage("Other Players Can Now Teleport To You"); + if (args.Player.TPAllow) + args.Player.SendMessage("Other Players Can No Longer Teleport To You"); + 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 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; + } + + if (args.Parameters[0].Equals("list")) + { + //How many warps per page + const int pagelimit = 15; + //How many warps per line + const int perline = 5; + //Pages start at 0 but are displayed and parsed at 1 + int page = 0; + + + if (args.Parameters.Count > 1) + { + if (!int.TryParse(args.Parameters[1], 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 warps = TShock.Warps.ListAllPublicWarps(Main.worldID.ToString()); + + //Check if they are trying to access a page that doesn't exist. + int pagecount = warps.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("Current Warps ({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 < warps.Count; i++) + { + nameslist.Add(warps[i].WarpName); + } + + //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 /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); + } + } + } + + #endregion Teleport Commands + + #region Group Management + + private static void AddGroup(CommandArgs args) + { + if (args.Parameters.Count > 0) + { + String groupname = args.Parameters[0]; + args.Parameters.RemoveAt(0); + String permissions = String.Join(",", args.Parameters); + + String response = TShock.Groups.AddGroup(groupname, permissions); + if (response.Length > 0) + args.Player.SendMessage(response, Color.Green); + } + else + { + args.Player.SendMessage("Incorrect format: /addGroup [optional permissions]", Color.Red); + } + } + + private static void DeleteGroup(CommandArgs args) + { + if (args.Parameters.Count > 0) + { + String groupname = args.Parameters[0]; + + String response = TShock.Groups.DeleteGroup(groupname); + if (response.Length > 0) + args.Player.SendMessage(response, Color.Green); + } + else + { + args.Player.SendMessage("Incorrect format: /delGroup ", Color.Red); + } + } + + private static void ModifyGroup(CommandArgs args) + { + if (args.Parameters.Count > 2) + { + String com = args.Parameters[0]; + args.Parameters.RemoveAt(0); + + String groupname = args.Parameters[0]; + args.Parameters.RemoveAt(0); + + 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; + } + 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 (response.Length > 0) + args.Player.SendMessage(response, Color.Green); + return; + } + } + 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]; + + 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.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 (ret != "") + { + ret += ", "; + } + + 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); + } + + #endregion Group Management + + #region Item Management + + private static void AddItem(CommandArgs args) + { + if (args.Parameters.Count == 1) + { + var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); + if (items.Count == 0) + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + else if (items.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); + } + else + { + var item = items[0]; + if (item.type >= 1) + { + TShock.Itembans.AddNewBan(item.name); + args.Player.SendMessage(item.name + " has been banned.", Color.Green); + } + else + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + } + } + else + { + args.Player.SendMessage("Invalid use: /additem \"item name\" or /additem ##", Color.Red); + } + } + + private static void DeleteItem(CommandArgs args) + { + if (args.Parameters.Count == 1) + { + var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); + if (items.Count == 0) + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + else if (items.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); + } + else + { + var item = items[0]; + if (item.type >= 1) + { + TShock.Itembans.RemoveBan(item.name); + args.Player.SendMessage(item.name + " has been unbanned.", Color.Green); + } + else + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + } + } + else + { + args.Player.SendMessage("Invalid use: /delitem \"item name\" or /delitem ##", Color.Red); + } + } + + private static void ListItems(CommandArgs args) + { + args.Player.SendMessage("The banned items are: " + String.Join(",", TShock.Itembans.ItemBans), Color.Yellow); + } + + private static void AddItemGroup(CommandArgs args) + { + if (args.Parameters.Count == 2) + { + var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); + if (items.Count == 0) + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + else if (items.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); + } + else + { + var item = items[0]; + if (item.type >= 1) + { + if(TShock.Groups.GroupExists(args.Parameters[1])) + { + ItemBan ban = TShock.Itembans.GetItemBanByName(item.name); + + if(!ban.AllowedGroups.Contains(args.Parameters[1])) + { + TShock.Itembans.AllowGroup(item.name, args.Parameters[1]); + args.Player.SendMessage("Banned item " + item.name + " has been allowed for group " + args.Parameters[1] + ".", Color.Green); + } + else + { + args.Player.SendMessage("Banned item " + item.name + " is already allowed for group " + args.Parameters[1] + "!", Color.OrangeRed); + } + } + else + { + args.Player.SendMessage("Group " + args.Parameters[1] + " not found!", Color.Red); + } + } + else + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + } + } + else + { + args.Player.SendMessage("Invalid use: /additemgroup \"item name\" \"group name\"", Color.Red); + } + } + + private static void DeleteItemGroup(CommandArgs args) + { + if (args.Parameters.Count == 2) + { + var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); + if (items.Count == 0) + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + else if (items.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); + } + else + { + var item = items[0]; + if (item.type >= 1) + { + if(TShock.Groups.GroupExists(args.Parameters[1])) + { + ItemBan ban = TShock.Itembans.GetItemBanByName(item.name); + + if(ban.AllowedGroups.Contains(args.Parameters[1])) + { + TShock.Itembans.RemoveGroup(item.name, args.Parameters[1]); + args.Player.SendMessage("Removed access for group " + args.Parameters[1] + " to banned item " + item.name + ".", Color.Green); + } + else + { + args.Player.SendMessage("Group " + args.Parameters[1] + " has not access to banned item " + item.name + "!", Color.Red); + } + } + else + { + args.Player.SendMessage("Group " + args.Parameters[1] + " not found!", Color.Red); + } + } + else + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + } + } + else + { + args.Player.SendMessage("Invalid use: /delitemgroup \"item name\" \"group name\"", Color.Red); + } + } + + #endregion Item Management + + #region Server Config Commands + + private static void SetSpawn(CommandArgs args) + { + Main.spawnTileX = args.Player.TileX + 1; + Main.spawnTileY = args.Player.TileY + 3; + SaveManager.Instance.SaveWorld(false); + } + + private static void Reload(CommandArgs args) + { + FileTools.SetupConfig(); + TShock.HandleCommandLinePostConfigLoad(Environment.GetCommandLineArgs()); + TShock.Groups.LoadPermisions(); + TShock.Regions.ReloadAllRegions(); + args.Player.SendMessage( + "Configuration, Permissions, and Regions reload complete. Some changes may require server restart."); + } + + private static void ServerPassword(CommandArgs args) + { + if (args.Parameters.Count != 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /password \"\"", Color.Red); + return; + } + string passwd = args.Parameters[0]; + TShock.Config.ServerPassword = passwd; + args.Player.SendMessage(string.Format("Server password changed to: {0}", passwd)); + } + + private static void Save(CommandArgs args) + { + SaveManager.Instance.SaveWorld(false); + foreach (TSPlayer tsply in TShock.Players) + { + tsply.SaveServerInventory(); + } + } + + private static void Settle(CommandArgs args) + { + if (Liquid.panicMode) + { + args.Player.SendMessage("Liquid is already settling!", Color.Red); + return; + } + Liquid.StartPanic(); + TShock.Utils.Broadcast("Settling all liquids..."); + } + + private static void MaxSpawns(CommandArgs args) + { + 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); + 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); + NPC.defaultMaxSpawns = amount; + TShock.Config.DefaultMaximumSpawns = amount; + TShock.Utils.Broadcast(string.Format("{0} changed the maximum spawns to: {1}", args.Player.Name, amount)); + } + + private static void SpawnRate(CommandArgs args) + { + 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); + 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; + } + + int amount = Convert.ToInt32(args.Parameters[0]); + int.TryParse(args.Parameters[0], out amount); + NPC.defaultSpawnRate = amount; + TShock.Config.DefaultSpawnRate = amount; + TShock.Utils.Broadcast(string.Format("{0} changed the spawn rate to: {1}", args.Player.Name, amount)); + } + + #endregion Server Config Commands + + #region Time/PvpFun Commands + + private static void Time(CommandArgs args) + { + if (args.Parameters.Count != 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /time ", Color.Red); + return; + } + + switch (args.Parameters[0]) + { + case "day": + TSPlayer.Server.SetTime(true, 150.0); + TShock.Utils.Broadcast(string.Format("{0} set time to day.", args.Player.Name)); + break; + case "night": + TSPlayer.Server.SetTime(false, 0.0); + TShock.Utils.Broadcast(string.Format("{0} set time to night.", args.Player.Name)); + break; + case "dusk": + TSPlayer.Server.SetTime(false, 0.0); + TShock.Utils.Broadcast(string.Format("{0} set time to dusk.", args.Player.Name)); + break; + case "noon": + TSPlayer.Server.SetTime(true, 27000.0); + TShock.Utils.Broadcast(string.Format("{0} set time to noon.", args.Player.Name)); + break; + case "midnight": + TSPlayer.Server.SetTime(false, 16200.0); + TShock.Utils.Broadcast(string.Format("{0} set time to midnight.", args.Player.Name)); + break; + default: + args.Player.SendMessage("Invalid syntax! Proper syntax: /time ", Color.Red); + break; + } + } + + private static void Slap(CommandArgs args) + { + if (args.Parameters.Count < 1 || args.Parameters.Count > 2) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /slap [dmg]", Color.Red); + return; + } + if (args.Parameters[0].Length == 0) + { + args.Player.SendMessage("Missing player name", Color.Red); + return; + } + + 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) + { + args.Player.SendMessage("More than one player matched!", Color.Red); + } + else + { + var plr = players[0]; + int damage = 5; + if (args.Parameters.Count == 2) + { + int.TryParse(args.Parameters[1], out damage); + } + if (!args.Player.Group.HasPermission(Permissions.kill)) + { + damage = TShock.Utils.Clamp(damage, 15, 0); + } + plr.DamagePlayer(damage); + TShock.Utils.Broadcast(string.Format("{0} slapped {1} for {2} damage.", + args.Player.Name, plr.Name, damage)); + Log.Info(args.Player.Name + " slapped " + plr.Name + " with " + damage + " damage."); + } + } + + #endregion Time/PvpFun Commands + + #region World Protection Commands + + private static void ToggleAntiBuild(CommandArgs args) + { + TShock.Config.DisableBuild = (TShock.Config.DisableBuild == false); + TShock.Utils.Broadcast(string.Format("Anti-build is now {0}.", (TShock.Config.DisableBuild ? "on" : "off"))); + } + + private static void ProtectSpawn(CommandArgs args) + { + TShock.Config.SpawnProtection = (TShock.Config.SpawnProtection == false); + TShock.Utils.Broadcast(string.Format("Spawn is now {0}.", (TShock.Config.SpawnProtection ? "protected" : "open"))); + } + + private static void DebugRegions(CommandArgs args) + { + foreach (Region r in TShock.Regions.Regions) + { + args.Player.SendMessage(r.Name + ": P: " + r.DisableBuild + " X: " + r.Area.X + " Y: " + r.Area.Y + " W: " + + r.Area.Width + " H: " + r.Area.Height); + foreach (int s in r.AllowedIDs) + { + args.Player.SendMessage(r.Name + ": " + s); + } + } + } + + private static void Region(CommandArgs args) + { + string cmd = "help"; + if (args.Parameters.Count > 0) + { + cmd = args.Parameters[0].ToLower(); + } + switch (cmd) + { + case "name": + { + { + args.Player.SendMessage("Hit a block to get the name of the region", Color.Yellow); + args.Player.AwaitingName = true; + } + break; + } + case "set": + { + int choice = 0; + if (args.Parameters.Count == 2 && + int.TryParse(args.Parameters[1], out choice) && + choice >= 1 && choice <= 2) + { + args.Player.SendMessage("Hit a block to Set Point " + choice, Color.Yellow); + args.Player.AwaitingTempPoint = choice; + } + else + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /region set [1/2]", Color.Red); + } + break; + } + case "define": + { + if (args.Parameters.Count > 1) + { + if (!args.Player.TempPoints.Any(p => p == Point.Zero)) + { + string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); + var x = Math.Min(args.Player.TempPoints[0].X, args.Player.TempPoints[1].X); + var y = Math.Min(args.Player.TempPoints[0].Y, args.Player.TempPoints[1].Y); + var width = Math.Abs(args.Player.TempPoints[0].X - args.Player.TempPoints[1].X); + var height = Math.Abs(args.Player.TempPoints[0].Y - args.Player.TempPoints[1].Y); + + if (TShock.Regions.AddRegion(x, y, width, height, regionName, args.Player.UserAccountName, + Main.worldID.ToString())) + { + args.Player.TempPoints[0] = Point.Zero; + args.Player.TempPoints[1] = Point.Zero; + args.Player.SendMessage("Set region " + regionName, Color.Yellow); + } + else + { + args.Player.SendMessage("Region " + regionName + " already exists", Color.Red); + } + } + else + { + args.Player.SendMessage("Points not set up yet", Color.Red); + } + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region define [name]", Color.Red); + break; + } + case "protect": + { + if (args.Parameters.Count == 3) + { + string regionName = args.Parameters[1]; + if (args.Parameters[2].ToLower() == "true") + { + if (TShock.Regions.SetRegionState(regionName, true)) + args.Player.SendMessage("Protected region " + regionName, Color.Yellow); + else + args.Player.SendMessage("Could not find specified region", Color.Red); + } + else if (args.Parameters[2].ToLower() == "false") + { + if (TShock.Regions.SetRegionState(regionName, false)) + args.Player.SendMessage("Unprotected region " + regionName, Color.Yellow); + else + args.Player.SendMessage("Could not find specified region", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region protect [name] [true/false]", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region protect [name] [true/false]", Color.Red); + break; + } + case "delete": + { + if (args.Parameters.Count > 1) + { + string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); + if (TShock.Regions.DeleteRegion(regionName)) + args.Player.SendMessage("Deleted region " + regionName, Color.Yellow); + else + args.Player.SendMessage("Could not find specified region", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red); + break; + } + case "clear": + { + args.Player.TempPoints[0] = Point.Zero; + args.Player.TempPoints[1] = Point.Zero; + args.Player.SendMessage("Cleared temp area", Color.Yellow); + args.Player.AwaitingTempPoint = 0; + break; + } + case "allow": + { + if (args.Parameters.Count > 2) + { + string playerName = args.Parameters[1]; + string regionName = ""; + + for (int i = 2; i < args.Parameters.Count; i++) + { + if (regionName == "") + { + regionName = args.Parameters[2]; + } + else + { + regionName = regionName + " " + args.Parameters[i]; + } + } + if (TShock.Users.GetUserByName(playerName) != null) + { + if (TShock.Regions.AddNewUser(regionName, playerName)) + { + args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); + } + else + args.Player.SendMessage("Region " + regionName + " not found", Color.Red); + } + else + { + args.Player.SendMessage("Player " + playerName + " not found", Color.Red); + } + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red); + break; + } + case "remove": + if (args.Parameters.Count > 2) + { + string playerName = args.Parameters[1]; + string regionName = ""; + + for (int i = 2; i < args.Parameters.Count; i++) + { + if (regionName == "") + { + regionName = args.Parameters[2]; + } + else + { + regionName = regionName + " " + args.Parameters[i]; + } + } + if (TShock.Users.GetUserByName(playerName) != null) + { + if (TShock.Regions.RemoveUser(regionName, playerName)) + { + args.Player.SendMessage("Removed user " + playerName + " from " + regionName, Color.Yellow); + } + else + args.Player.SendMessage("Region " + regionName + " not found", Color.Red); + } + else + { + args.Player.SendMessage("Player " + playerName + " not found", Color.Red); + } + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region remove [name] [region]", Color.Red); + break; + case "allowg": + { + if (args.Parameters.Count > 2) + { + string group = args.Parameters[1]; + string regionName = ""; + + for (int i = 2; i < args.Parameters.Count; i++) + { + if (regionName == "") + { + regionName = args.Parameters[2]; + } + else + { + regionName = regionName + " " + args.Parameters[i]; + } + } + if (TShock.Groups.GroupExists(group)) + { + if (TShock.Regions.AllowGroup(regionName, group)) + { + args.Player.SendMessage("Added group " + group + " to " + regionName, Color.Yellow); + } + else + args.Player.SendMessage("Region " + regionName + " not found", Color.Red); + } + else + { + args.Player.SendMessage("Group " + group + " not found", Color.Red); + } + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [group] [region]", Color.Red); + break; + } + case "removeg": + if (args.Parameters.Count > 2) + { + string group = args.Parameters[1]; + string regionName = ""; + + for (int i = 2; i < args.Parameters.Count; i++) + { + if (regionName == "") + { + regionName = args.Parameters[2]; + } + else + { + regionName = regionName + " " + args.Parameters[i]; + } + } + if (TShock.Groups.GroupExists(group)) + { + if (TShock.Regions.RemoveGroup(regionName, group)) + { + args.Player.SendMessage("Removed group " + group + " from " + regionName, Color.Yellow); + } + else + args.Player.SendMessage("Region " + regionName + " not found", Color.Red); + } + else + { + args.Player.SendMessage("Group " + group + " not found", Color.Red); + } + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region removeg [group] [region]", Color.Red); + break; + case "list": + { + //How many regions per page + const int pagelimit = 15; + //How many regions per line + const int perline = 5; + //Pages start at 0 but are displayed and parsed at 1 + int page = 0; + + + if (args.Parameters.Count > 1) + { + if (!int.TryParse(args.Parameters[1], 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 regions = TShock.Regions.ListAllRegions(Main.worldID.ToString()); + + // Are there even any regions to display? + if (regions.Count == 0) + { + args.Player.SendMessage("There are currently no regions defined.", Color.Red); + return; + } + + //Check if they are trying to access a page that doesn't exist. + int pagecount = regions.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("Current Regions ({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 < regions.Count; i++) + { + nameslist.Add(regions[i].Name); + } + + //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 /region list {0} for more regions.", (page + 2)), Color.Yellow); + } + + break; + } + case "info": + { + if (args.Parameters.Count > 1) + { + string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); + Region r = TShock.Regions.GetRegionByName(regionName); + + if (r == null) + { + args.Player.SendMessage("Region {0} does not exist"); + break; + } + + args.Player.SendMessage(r.Name + ": P: " + r.DisableBuild + " X: " + r.Area.X + " Y: " + r.Area.Y + " W: " + + r.Area.Width + " H: " + r.Area.Height); + foreach (int s in r.AllowedIDs) + { + var user = TShock.Users.GetUserByID(s); + args.Player.SendMessage(r.Name + ": " + (user != null ? user.Name : "Unknown")); + } + } + else + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /region info [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": + { + if (args.Parameters.Count == 4) + { + int direction; + switch (args.Parameters[2]) + { + case "u": + case "up": + { + direction = 0; + break; + } + case "r": + case "right": + { + direction = 1; + break; + } + case "d": + case "down": + { + direction = 2; + break; + } + case "l": + case "left": + { + direction = 3; + break; + } + default: + { + direction = -1; + break; + } + } + int addAmount; + int.TryParse(args.Parameters[3], out addAmount); + if (TShock.Regions.resizeRegion(args.Parameters[1], addAmount, direction)) + { + args.Player.SendMessage("Region Resized Successfully!", Color.Yellow); + TShock.Regions.ReloadAllRegions(); + } + else + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize [regionname] [u/d/l/r] [amount]", + Color.Red); + } + } + else + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /region resize [regionname] [u/d/l/r] [amount]1", + Color.Red); + } + break; + } + case "help": + default: + { + args.Player.SendMessage("Avialable region commands:", Color.Green); + args.Player.SendMessage("/region set [1/2] /region define [name] /region protect [name] [true/false]", + Color.Yellow); + args.Player.SendMessage("/region name (provides region name)", Color.Yellow); + args.Player.SendMessage("/region delete [name] /region clear (temporary region)", Color.Yellow); + args.Player.SendMessage("/region allow [name] [regionname]", Color.Yellow); + args.Player.SendMessage("/region resize [regionname] [u/d/l/r] [amount]", Color.Yellow); + break; + } + } + } + + #endregion World Protection Commands + + #region General Commands + + private static void Help(CommandArgs args) + { + args.Player.SendMessage("TShock Commands:"); + int page = 1; + if (args.Parameters.Count > 0) + int.TryParse(args.Parameters[0], out page); + var cmdlist = new List(); + for (int j = 0; j < ChatCommands.Count; j++) + { + if (ChatCommands[j].CanRun(args.Player)) + { + cmdlist.Add(ChatCommands[j]); + } + } + var sb = new StringBuilder(); + if (cmdlist.Count > (15*(page - 1))) + { + for (int j = (15*(page - 1)); j < (15*page); j++) + { + if (sb.Length != 0) + sb.Append(", "); + sb.Append("/").Append(cmdlist[j].Name); + if (j == cmdlist.Count - 1) + { + args.Player.SendMessage(sb.ToString(), Color.Yellow); + break; + } + if ((j + 1)%5 == 0) + { + args.Player.SendMessage(sb.ToString(), Color.Yellow); + sb.Clear(); + } + } + } + if (cmdlist.Count > (15*page)) + { + args.Player.SendMessage(string.Format("Type /help {0} for more commands.", (page + 1)), Color.Yellow); + } + } + + 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 AuthToken(CommandArgs args) + { + if (TShock.AuthToken == 0) + { + args.Player.SendMessage("Auth is disabled. This incident has been logged.", Color.Red); + Log.Warn(args.Player.IP + " attempted to use /auth even though it's disabled."); + return; + } + int givenCode = Convert.ToInt32(args.Parameters[0]); + if (givenCode == TShock.AuthToken && args.Player.Group.Name != "superadmin") + { + try + { + TShock.Users.AddUser(new User(args.Player.IP, "", "", "superadmin")); + args.Player.Group = TShock.Utils.GetGroup("superadmin"); + args.Player.SendMessage("This IP address is now superadmin. Please perform the following command:"); + args.Player.SendMessage("/user add : superadmin"); + args.Player.SendMessage("Creates: with the password as part of the superadmin group."); + args.Player.SendMessage("Please use /login to login from now on."); + args.Player.SendMessage("If you understand, please /login now, and type /auth-verify"); + } + catch (UserManagerException ex) + { + Log.ConsoleError(ex.ToString()); + args.Player.SendMessage(ex.Message); + } + return; + } + + if (args.Player.Group.Name == "superadmin") + { + args.Player.SendMessage("Please disable the auth system! If you need help, consult the forums. http://tshock.co/"); + args.Player.SendMessage("This IP address is now superadmin. Please perform the following command:"); + args.Player.SendMessage("/user add : superadmin"); + args.Player.SendMessage("Creates: with the password as part of the superadmin group."); + args.Player.SendMessage("Please use /login to login from now on."); + args.Player.SendMessage("If you understand, please /login now, and type /auth-verify"); + return; + } + + args.Player.SendMessage("Incorrect auth code. This incident has been logged."); + Log.Warn(args.Player.IP + " attempted to use an incorrect auth code."); + } + + private static void AuthVerify(CommandArgs args) + { + if (TShock.AuthToken == 0) + { + args.Player.SendMessage("It appears that you have already turned off the auth token."); + args.Player.SendMessage("If this is a mistake, delete auth.lck."); + return; + } + + if (!args.Player.IsLoggedIn) + { + args.Player.SendMessage("You must be logged in to disable the auth system."); + args.Player.SendMessage("This is a security measure designed to prevent insecure administration setups."); + args.Player.SendMessage("Please re-run /auth and read the instructions!"); + args.Player.SendMessage("If you're still confused, consult the forums. http://tshock.co/"); + return; + } + + args.Player.SendMessage("Your new account has been verified, and the /auth system has been turned off."); + args.Player.SendMessage("You can always use the /user command to manage players. Don't just delete the auth.lck."); + args.Player.SendMessage("Thankyou for using TShock! http://tshock.co/ & http://github.com/TShock/TShock"); + FileTools.CreateFile(Path.Combine(TShock.SavePath, "auth.lck")); + File.Delete(Path.Combine(TShock.SavePath, "authcode.txt")); + TShock.AuthToken = 0; + } + + private static void ThirdPerson(CommandArgs args) + { + if (args.Parameters.Count == 0) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /me ", Color.Red); + return; + } + if (args.Player.mute) + args.Player.SendMessage("You are muted."); + else + TShock.Utils.Broadcast(string.Format("*{0} {1}", args.Player.Name, String.Join(" ", args.Parameters)), 205, 133, 63); + } + + private static void PartyChat(CommandArgs args) + { + if (args.Parameters.Count == 0) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /p ", Color.Red); + return; + } + int playerTeam = args.Player.Team; + + if (args.Player.mute) + args.Player.SendMessage("You are muted."); + else if (playerTeam != 0) + { + string msg = string.Format("<{0}> {1}", args.Player.Name, String.Join(" ", args.Parameters)); + foreach (TSPlayer player in TShock.Players) + { + if (player != null && player.Active && player.Team == playerTeam) + player.SendMessage(msg, Main.teamColor[playerTeam].R, Main.teamColor[playerTeam].G, Main.teamColor[playerTeam].B); + } + } + else + args.Player.SendMessage("You are not in a party!", 255, 240, 20); + } + + private static void Mute(CommandArgs args) + { + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /mute ", Color.Red); + return; + } + + string plStr = String.Join(" ", args.Parameters); + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + args.Player.SendMessage("Invalid player!", Color.Red); + else if (players.Count > 1) + args.Player.SendMessage("More than one player matched!", Color.Red); + else if (players[0].mute && !players[0].Group.HasPermission(Permissions.mute)) + { + var plr = players[0]; + plr.mute = false; + plr.SendMessage("You have been unmuted."); + TShock.Utils.Broadcast(plr.Name + " has been unmuted by " + args.Player.Name, Color.Yellow); + } + else if (!players[0].Group.HasPermission(Permissions.mute)) + { + var plr = players[0]; + plr.mute = true; + plr.SendMessage("You have been muted."); + TShock.Utils.Broadcast(plr.Name + " has been muted by " + args.Player.Name, Color.Yellow); + } + else + args.Player.SendMessage("You cannot mute this player."); + } + + private static void Motd(CommandArgs args) + { + TShock.Utils.ShowFileToUser(args.Player, "motd.txt"); + } + + private static void Rules(CommandArgs args) + { + TShock.Utils.ShowFileToUser(args.Player, "rules.txt"); + } + + private static void Whisper(CommandArgs args) + { + if (args.Parameters.Count < 2) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /whisper ", Color.Red); + return; + } + + var players = TShock.Utils.FindPlayer(args.Parameters[0]); + if (players.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + } + else if (players.Count > 1) + { + args.Player.SendMessage("More than one player matched!", Color.Red); + } + else if (args.Player.mute) + args.Player.SendMessage("You are muted."); + else + { + var plr = players[0]; + var msg = string.Join(" ", args.Parameters.ToArray(), 1, args.Parameters.Count - 1); + plr.SendMessage("(Whisper From)" + "<" + args.Player.Name + ">" + msg, Color.MediumPurple); + args.Player.SendMessage("(Whisper To)" + "<" + plr.Name + ">" + msg, Color.MediumPurple); + plr.LastWhisper = args.Player; + args.Player.LastWhisper = plr; + } + } + + private static void Reply(CommandArgs args) + { + if (args.Player.mute) + args.Player.SendMessage("You are muted."); + else if (args.Player.LastWhisper != null) + { + var msg = string.Join(" ", args.Parameters); + args.Player.LastWhisper.SendMessage("(Whisper From)" + "<" + args.Player.Name + ">" + msg, Color.MediumPurple); + args.Player.SendMessage("(Whisper To)" + "<" + args.Player.LastWhisper.Name + ">" + msg, Color.MediumPurple); + } + else + args.Player.SendMessage( + "You haven't previously received any whispers. Please use /whisper to whisper to other people.", Color.Red); + } + + private static void Annoy(CommandArgs args) + { + if (args.Parameters.Count != 2) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /annoy ", Color.Red); + return; + } + int annoy = 5; + int.TryParse(args.Parameters[1], out annoy); + + var players = TShock.Utils.FindPlayer(args.Parameters[0]); + if (players.Count == 0) + args.Player.SendMessage("Invalid player!", Color.Red); + else if (players.Count > 1) + args.Player.SendMessage("More than one player matched!", Color.Red); + else + { + var ply = players[0]; + args.Player.SendMessage("Annoying " + ply.Name + " for " + annoy + " seconds."); + (new Thread(ply.Whoopie)).Start(annoy); + } + } + + #endregion General Commands + + #region Cheat Commands + + private static void Kill(CommandArgs args) + { + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /kill ", Color.Red); + return; + } + + string plStr = String.Join(" ", args.Parameters); + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + } + else if (players.Count > 1) + { + args.Player.SendMessage("More than one player matched!", Color.Red); + } + else + { + var plr = players[0]; + plr.DamagePlayer(999999); + args.Player.SendMessage(string.Format("You just killed {0}!", plr.Name)); + plr.SendMessage(string.Format("{0} just killed you!", args.Player.Name)); + } + } + + private static void Butcher(CommandArgs args) + { + if (args.Parameters.Count > 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /butcher [killTownNPCs(true/false)]", Color.Red); + return; + } + + 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++) + { + if (Main.npc[i].active && Main.npc[i].type != 0 && (!Main.npc[i].townNPC || killTownNPCs)) + { + TSPlayer.Server.StrikeNPC(i, 99999, 90f, 1); + killcount++; + } + } + TShock.Utils.Broadcast(string.Format("Killed {0} NPCs.", killcount)); + } + + private static void Item(CommandArgs args) + { + if (args.Parameters.Count < 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /item [item amount] [prefix id/name]", + Color.Red); + return; + } + if (args.Parameters[0].Length == 0) + { + args.Player.SendMessage("Missing item name/id", Color.Red); + return; + } + int itemAmount = 0; + int prefix = 0; + if (args.Parameters.Count == 2) + int.TryParse(args.Parameters[1], out itemAmount); + else if (args.Parameters.Count == 3) + { + int.TryParse(args.Parameters[1], out itemAmount); + var found = TShock.Utils.GetPrefixByIdOrName(args.Parameters[2]); + if (found.Count == 1) + prefix = found[0]; + } + var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); + if (items.Count == 0) + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + else if (items.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); + } + else + { + var item = items[0]; + if (item.type >= 1 && item.type < Main.maxItemTypes) + { + if (args.Player.InventorySlotAvailable || item.name.Contains("Coin")) + { + 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); + } + } + else + { + args.Player.SendMessage("You don't have free slots!", Color.Red); + } + } + else + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + } + } + + private static void Give(CommandArgs args) + { + if (args.Parameters.Count < 2) + { + args.Player.SendMessage( + "Invalid syntax! Proper syntax: /give [item amount] [prefix id/name]", Color.Red); + return; + } + if (args.Parameters[0].Length == 0) + { + args.Player.SendMessage("Missing item name/id", Color.Red); + return; + } + if (args.Parameters[1].Length == 0) + { + args.Player.SendMessage("Missing player name", Color.Red); + return; + } + int itemAmount = 0; + int prefix = 0; + var items = TShock.Utils.GetItemByIdOrName(args.Parameters[0]); + args.Parameters.RemoveAt(0); + string plStr = args.Parameters[0]; + args.Parameters.RemoveAt(0); + if (args.Parameters.Count == 1) + int.TryParse(args.Parameters[0], out itemAmount); + else if (args.Parameters.Count == 2) + { + int.TryParse(args.Parameters[0], out itemAmount); + var found = TShock.Utils.GetPrefixByIdOrName(args.Parameters[1]); + if (found.Count == 1) + prefix = found[0]; + } + + if (items.Count == 0) + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + else if (items.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) item matched!", items.Count), Color.Red); + } + else + { + var item = items[0]; + if (item.type >= 1 && item.type < Main.maxItemTypes) + { + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + } + else if (players.Count > 1) + { + args.Player.SendMessage("More than one player matched!", Color.Red); + } + else + { + var plr = players[0]; + if (plr.InventorySlotAvailable || item.name.Contains("Coin")) + { + 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); + } + + } + else + { + args.Player.SendMessage("Player does not have free slots!", Color.Red); + } + } + } + else + { + args.Player.SendMessage("Invalid item type!", Color.Red); + } + } + } + + public static void ClearItems(CommandArgs args) + { + int radius = 50; + if (args.Parameters.Count > 0) + { + if (args.Parameters[0].ToLower() == "all") + { + radius = Int32.MaxValue/16; + } + else + { + try + { + radius = Convert.ToInt32(args.Parameters[0]); + } + catch (Exception) + { + args.Player.SendMessage( + "Please either enter the keyword \"all\", or the block radius you wish to delete all items from.", Color.Red); + return; + } + } + } + int count = 0; + for (int i = 0; i < 200; i++) + { + if ( + (Math.Sqrt(Math.Pow(Main.item[i].position.X - args.Player.X, 2) + + Math.Pow(Main.item[i].position.Y - args.Player.Y, 2)) < radius*16) && (Main.item[i].active)) + { + Main.item[i].active = false; + NetMessage.SendData(0x15, -1, -1, "", i, 0f, 0f, 0f, 0); + count++; + } + } + args.Player.SendMessage("All " + count + " items within a radius of " + radius + " have been deleted."); + } + + private static void Heal(CommandArgs args) + { + TSPlayer playerToHeal; + if (args.Parameters.Count > 0) + { + string plStr = String.Join(" ", args.Parameters); + var players = TShock.Utils.FindPlayer(plStr); + if (players.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + return; + } + else if (players.Count > 1) + { + args.Player.SendMessage("More than one player matched!", Color.Red); + return; + } + else + { + playerToHeal = players[0]; + } + } + else if (!args.Player.RealPlayer) + { + args.Player.SendMessage("You cant heal yourself!"); + return; + } + else + { + playerToHeal = args.Player; + } + + Item heart = TShock.Utils.GetItemById(58); + Item star = TShock.Utils.GetItemById(184); + for (int i = 0; i < 20; i++) + playerToHeal.GiveItem(heart.type, heart.name, heart.width, heart.height, heart.maxStack); + for (int i = 0; i < 10; i++) + playerToHeal.GiveItem(star.type, star.name, star.width, star.height, star.maxStack); + if (playerToHeal == args.Player) + { + args.Player.SendMessage("You just got healed!"); + } + else + { + args.Player.SendMessage(string.Format("You just healed {0}", playerToHeal.Name)); + playerToHeal.SendMessage(string.Format("{0} just healed you!", args.Player.Name)); + } + } + + private static void Buff(CommandArgs args) + { + if (args.Parameters.Count < 1 || args.Parameters.Count > 2) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /buff [time(seconds)]", Color.Red); + return; + } + int id = 0; + int time = 60; + if (!int.TryParse(args.Parameters[0], out id)) + { + var found = TShock.Utils.GetBuffByName(args.Parameters[0]); + if (found.Count == 0) + { + args.Player.SendMessage("Invalid buff name!", Color.Red); + return; + } + else if (found.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) buff matched!", found.Count), Color.Red); + return; + } + id = found[0]; + } + if (args.Parameters.Count == 2) + int.TryParse(args.Parameters[1], out time); + if (id > 0 && id < Main.maxBuffs) + { + if (time < 0 || time > short.MaxValue) + time = 60; + args.Player.SetBuff(id, time*60); + args.Player.SendMessage(string.Format("You have buffed yourself with {0}({1}) for {2} seconds!", + TShock.Utils.GetBuffName(id), TShock.Utils.GetBuffDescription(id), (time)), + Color.Green); + } + else + args.Player.SendMessage("Invalid buff ID!", Color.Red); + } + + private static void GBuff(CommandArgs args) + { + if (args.Parameters.Count < 2 || args.Parameters.Count > 3) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /gbuff [time(seconds)]", Color.Red); + return; + } + int id = 0; + int time = 60; + 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; + } + else + { + if (!int.TryParse(args.Parameters[1], out id)) + { + var found = TShock.Utils.GetBuffByName(args.Parameters[1]); + if (found.Count == 0) + { + args.Player.SendMessage("Invalid buff name!", Color.Red); + return; + } + else if (found.Count > 1) + { + args.Player.SendMessage(string.Format("More than one ({0}) buff matched!", found.Count), Color.Red); + return; + } + id = found[0]; + } + if (args.Parameters.Count == 3) + int.TryParse(args.Parameters[2], out time); + if (id > 0 && id < Main.maxBuffs) + { + if (time < 0 || time > short.MaxValue) + time = 60; + foundplr[0].SetBuff(id, time*60); + args.Player.SendMessage(string.Format("You have buffed {0} with {1}({2}) for {3} seconds!", + foundplr[0].Name, TShock.Utils.GetBuffName(id), + TShock.Utils.GetBuffDescription(id), (time)), Color.Green); + foundplr[0].SendMessage(string.Format("{0} has buffed you with {1}({2}) for {3} seconds!", + args.Player.Name, TShock.Utils.GetBuffName(id), + TShock.Utils.GetBuffDescription(id), (time)), Color.Green); + } + else + args.Player.SendMessage("Invalid buff ID!", Color.Red); + } + } + + private static void Grow(CommandArgs args) + { + if (args.Parameters.Count != 1) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /grow [tree/epictree/mushroom/cactus/herb]", Color.Red); + return; + } + var name = "Fail"; + var x = args.Player.TileX; + var y = args.Player.TileY + 3; + switch (args.Parameters[0].ToLower()) + { + case "tree": + for (int i = x - 1; i < x + 2; i++) + { + Main.tile[i, y].active = true; + Main.tile[i, y].type = 2; + Main.tile[i, y].wall = 0; + } + Main.tile[x, y - 1].wall = 0; + WorldGen.GrowTree(x, y); + name = "Tree"; + break; + case "epictree": + for (int i = x - 1; i < x + 2; i++) + { + Main.tile[i, y].active = true; + Main.tile[i, y].type = 2; + Main.tile[i, y].wall = 0; + } + Main.tile[x, y - 1].wall = 0; + Main.tile[x, y - 1].liquid = 0; + Main.tile[x, y - 1].active = true; + WorldGen.GrowEpicTree(x, y); + name = "Epic Tree"; + break; + case "mushroom": + for (int i = x - 1; i < x + 2; i++) + { + Main.tile[i, y].active = true; + Main.tile[i, y].type = 70; + Main.tile[i, y].wall = 0; + } + Main.tile[x, y - 1].wall = 0; + WorldGen.GrowShroom(x, y); + name = "Mushroom"; + break; + case "cactus": + Main.tile[x, y].type = 53; + WorldGen.GrowCactus(x, y); + name = "Cactus"; + break; + case "herb": + Main.tile[x, y].active = true; + Main.tile[x, y].frameX = 36; + Main.tile[x, y].type = 83; + WorldGen.GrowAlch(x, y); + name = "Herb"; + break; + default: + args.Player.SendMessage("Unknown plant!", Color.Red); + return; + } + args.Player.SendTileSquare(x, y); + args.Player.SendMessage("Tried to grow a " + name, Color.Green); + } + + #endregion Cheat Comamnds + } +}