diff --git a/TShockAPI/BackupManager.cs b/TShockAPI/BackupManager.cs
index 50f8e2cc..4cf79cff 100644
--- a/TShockAPI/BackupManager.cs
+++ b/TShockAPI/BackupManager.cs
@@ -24,81 +24,79 @@ using Terraria;
namespace TShockAPI
{
- public class BackupManager
- {
- public string BackupPath { get; set; }
- public int Interval { get; set; }
- public int KeepFor { get; set; }
+ public class BackupManager
+ {
+ public string BackupPath { get; set; }
+ public int Interval { get; set; }
+ public int KeepFor { get; set; }
- DateTime lastbackup = DateTime.UtcNow;
- public BackupManager(string path)
- {
- BackupPath = path;
- }
+ private DateTime lastbackup = DateTime.UtcNow;
- public bool IsBackupTime
- {
- get
- {
- return (Interval > 0) && ((DateTime.UtcNow - lastbackup).TotalMinutes >= Interval);
- }
- }
+ public BackupManager(string path)
+ {
+ BackupPath = path;
+ }
- public void Backup()
- {
- lastbackup = DateTime.UtcNow;
- ThreadPool.QueueUserWorkItem(DoBackup);
- ThreadPool.QueueUserWorkItem(DeleteOld);
- }
+ public bool IsBackupTime
+ {
+ get { return (Interval > 0) && ((DateTime.UtcNow - lastbackup).TotalMinutes >= Interval); }
+ }
- void DoBackup(object o)
- {
- try
- {
- string worldname = Main.worldPathName;
- string name = Path.GetFileName(worldname);
+ public void Backup()
+ {
+ lastbackup = DateTime.UtcNow;
+ ThreadPool.QueueUserWorkItem(DoBackup);
+ ThreadPool.QueueUserWorkItem(DeleteOld);
+ }
- Main.worldPathName = Path.Combine(BackupPath, string.Format("{0}.{1:dd.MM.yy-HH.mm.ss}.bak", name, DateTime.UtcNow));
+ private void DoBackup(object o)
+ {
+ try
+ {
+ string worldname = Main.worldPathName;
+ string name = Path.GetFileName(worldname);
- string worldpath = Path.GetDirectoryName(Main.worldPathName);
- if (worldpath != null && !Directory.Exists(worldpath))
- Directory.CreateDirectory(worldpath);
+ Main.worldPathName = Path.Combine(BackupPath, string.Format("{0}.{1:dd.MM.yy-HH.mm.ss}.bak", name, DateTime.UtcNow));
- TShock.Utils.Broadcast("Server map saving, potential lag spike");
- Console.WriteLine("Backing up world...");
+ string worldpath = Path.GetDirectoryName(Main.worldPathName);
+ if (worldpath != null && !Directory.Exists(worldpath))
+ Directory.CreateDirectory(worldpath);
- Thread SaveWorld = new Thread(TShock.Utils.SaveWorld);
- SaveWorld.Start();
+ TShock.Utils.Broadcast("Server map saving, potential lag spike");
+ Console.WriteLine("Backing up world...");
- while (SaveWorld.ThreadState == ThreadState.Running)
- Thread.Sleep(50);
- Console.WriteLine("World backed up");
- Console.ForegroundColor = ConsoleColor.Gray;
- Log.Info(string.Format("World backed up ({0})", Main.worldPathName));
+ Thread SaveWorld = new Thread(TShock.Utils.SaveWorld);
+ SaveWorld.Start();
- Main.worldPathName = worldname;
- }
- catch (Exception ex)
- {
- Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine("Backup failed");
- Console.ForegroundColor = ConsoleColor.Gray;
- Log.Error("Backup failed");
- Log.Error(ex.ToString());
- }
- }
+ while (SaveWorld.ThreadState == ThreadState.Running)
+ Thread.Sleep(50);
+ Console.WriteLine("World backed up");
+ Console.ForegroundColor = ConsoleColor.Gray;
+ Log.Info(string.Format("World backed up ({0})", Main.worldPathName));
- void DeleteOld(object o)
- {
- if (KeepFor <= 0)
- return;
- foreach (var fi in new DirectoryInfo(BackupPath).GetFiles("*.bak"))
- {
- if ((DateTime.UtcNow - fi.LastWriteTimeUtc).TotalMinutes > KeepFor)
- {
- fi.Delete();
- }
- }
- }
- }
-}
+ Main.worldPathName = worldname;
+ }
+ catch (Exception ex)
+ {
+ Console.ForegroundColor = ConsoleColor.Red;
+ Console.WriteLine("Backup failed");
+ Console.ForegroundColor = ConsoleColor.Gray;
+ Log.Error("Backup failed");
+ Log.Error(ex.ToString());
+ }
+ }
+
+ private void DeleteOld(object o)
+ {
+ if (KeepFor <= 0)
+ return;
+ foreach (var fi in new DirectoryInfo(BackupPath).GetFiles("*.bak"))
+ {
+ if ((DateTime.UtcNow - fi.LastWriteTimeUtc).TotalMinutes > KeepFor)
+ {
+ fi.Delete();
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs
index c06a18e9..90283e82 100644
--- a/TShockAPI/Commands.cs
+++ b/TShockAPI/Commands.cs
@@ -30,615 +30,628 @@ using TShockAPI.DB;
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 delegate void CommandDelegate(CommandArgs args);
- public Player TPlayer
- {
- get { return Player.TPlayer; }
- }
+ public class CommandArgs : EventArgs
+ {
+ public string Message { get; private set; }
+ public TSPlayer Player { get; private set; }
- 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;
+ ///
+ /// 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 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 Player TPlayer
+ {
+ get { return Player.TPlayer; }
+ }
- public bool Run(string msg, TSPlayer ply, List parms)
- {
- if (!ply.Group.HasPermission(Permission))
- return false;
+ public CommandArgs(string message, TSPlayer ply, List args)
+ {
+ Message = message;
+ Player = ply;
+ Parameters = args;
+ }
+ }
- try
- {
- command(new CommandArgs(msg, ply, parms));
- }
- catch (Exception e)
- {
- ply.SendMessage("Command failed, check logs for more details.");
- Log.Error(e.ToString());
- }
+ public class Command
+ {
+ public string Name
+ {
+ get { return Names[0]; }
+ }
- return true;
- }
+ public List Names { get; protected set; }
+ public bool DoLog { get; set; }
+ public string Permission { get; protected set; }
+ private CommandDelegate command;
- public bool HasAlias(string name)
- {
- return Names.Contains(name);
- }
+ public Command(string permissionneeded, CommandDelegate cmd, params string[] names)
+ : this(cmd, names)
+ {
+ Permission = permissionneeded;
+ }
- public bool CanRun(TSPlayer ply)
- {
- return ply.Group.HasPermission(Permission);
- }
- }
- public static class Commands
- {
- public static List ChatCommands = new List();
+ 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;
+ }
- delegate void AddChatCommand(string permission, CommandDelegate command, params string[] names);
- public static void InitCommands()
- {
- //When adding new perm in here, add new perm to CommandList in DBEditor
- 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, 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.manageitem, AddItem, "additem");
- add(Permissions.manageitem, DeleteItem, "delitem");
- 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, Playing, "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.rootonly, 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");
- add(Permissions.whisper, Whisper, "whisper", "w", "tell");
- add(Permissions.whisper, Reply, "reply", "r");
- add(Permissions.annoy, Annoy, "annoy");
- add(Permissions.cfg, ConvertWaR, "convert");
- add(Permissions.kill, Kill, "kill");
- add(Permissions.butcher, Butcher, "butcher");
- add(Permissions.item, Item, "item", "i");
- add(Permissions.item, Give, "give");
- add(Permissions.clearitems, ClearItems, "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.converthardmode, ConvertCorruption, "convertcorruption");
- add(Permissions.converthardmode, ConvertHallow, "converthallow");
- }
+ public bool Run(string msg, TSPlayer ply, List parms)
+ {
+ if (!ply.Group.HasPermission(Permission))
+ return false;
- public static bool HandleCommand(TSPlayer player, string text)
- {
- string cmdText = text.Remove(0, 1);
+ try
+ {
+ command(new CommandArgs(msg, ply, parms));
+ }
+ catch (Exception e)
+ {
+ ply.SendMessage("Command failed, check logs for more details.");
+ Log.Error(e.ToString());
+ }
- var args = ParseParameters(cmdText);
- if (args.Count < 1)
- return false;
+ return true;
+ }
- string cmdName = args[0];
- args.RemoveAt(0);
+ public bool HasAlias(string name)
+ {
+ return Names.Contains(name);
+ }
- Command cmd = ChatCommands.FirstOrDefault(c => c.HasAlias(cmdName));
+ public bool CanRun(TSPlayer ply)
+ {
+ return ply.Group.HasPermission(Permission);
+ }
+ }
- if (cmd == null)
- {
- player.SendMessage("Invalid Command Entered. Type /help for a list of valid Commands.", Color.Red);
- return true;
- }
+ public static class Commands
+ {
+ public static List ChatCommands = new List();
- 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;
- }
+ private delegate void AddChatCommand(string permission, CommandDelegate command, params string[] names);
- ///
- /// 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];
+ public static void InitCommands()
+ {
+ //When adding new perm in here, add new perm to CommandList in DBEditor
+ 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, 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.manageitem, AddItem, "additem");
+ add(Permissions.manageitem, DeleteItem, "delitem");
+ 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, Playing, "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.rootonly, 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");
+ add(Permissions.whisper, Whisper, "whisper", "w", "tell");
+ add(Permissions.whisper, Reply, "reply", "r");
+ add(Permissions.annoy, Annoy, "annoy");
+ add(Permissions.cfg, ConvertWaR, "convert");
+ add(Permissions.kill, Kill, "kill");
+ add(Permissions.butcher, Butcher, "butcher");
+ add(Permissions.item, Item, "item", "i");
+ add(Permissions.item, Give, "give");
+ add(Permissions.clearitems, ClearItems, "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.converthardmode, ConvertCorruption, "convertcorruption");
+ add(Permissions.converthardmode, ConvertHallow, "converthallow");
+ }
- 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());
+ public static bool HandleCommand(TSPlayer player, string text)
+ {
+ string cmdText = text.Remove(0, 1);
- return ret;
- }
+ var args = ParseParameters(cmdText);
+ if (args.Count < 1)
+ return false;
- private static char GetEscape(char c)
- {
- switch (c)
- {
- case '\\':
- return '\\';
- case '"':
- return '"';
- case 't':
- return '\t';
- default:
- return c;
- }
- }
+ string cmdName = args[0];
+ args.RemoveAt(0);
- private static bool IsWhiteSpace(char c)
- {
- return c == ' ' || c == '\t' || c == '\n';
- }
+ Command cmd = ChatCommands.FirstOrDefault(c => c.HasAlias(cmdName));
- #region Account commands
+ if (cmd == null)
+ {
+ player.SendMessage("Invalid Command Entered. Type /help for a list of valid Commands.", Color.Red);
+ return true;
+ }
- public static void AttemptLogin(CommandArgs args)
- {
+ 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;
+ }
- 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.");
- }
+ ///
+ /// 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 (args.Parameters.Count != 2)
- {
- args.Player.SendMessage("Syntax: /login [username] [password]");
- args.Player.SendMessage("If you forgot your password, there is no way to recover it.");
- return;
- }
- try
- {
- string encrPass = TShock.Utils.HashPassword(args.Parameters[1]);
- var user = TShock.Users.GetUserByName(args.Parameters[0]);
- 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(args.Parameters[0]));
+ 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());
- if (TShock.Config.ServerSideInventory)
- {
- if (args.Player.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;
- }
- }
+ return ret;
+ }
- if (args.Player.Group.HasPermission(Permissions.ignorestackhackdetection))
- args.Player.IgnoreActionsForCheating = "none";
+ private static char GetEscape(char c)
+ {
+ switch (c)
+ {
+ case '\\':
+ return '\\';
+ case '"':
+ return '"';
+ case 't':
+ return '\t';
+ default:
+ return c;
+ }
+ }
- if (args.Player.Group.HasPermission(Permissions.usebanneditem))
- args.Player.IgnoreActionsForDisabledArmor = "none";
-
- args.Player.Group = TShock.Utils.GetGroup(user.Group);
- args.Player.UserAccountName = args.Parameters[0];
- args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName);
- args.Player.IsLoggedIn = true;
- args.Player.IgnoreActionsForInventory = "none";
+ private static bool IsWhiteSpace(char c)
+ {
+ return c == ' ' || c == '\t' || c == '\n';
+ }
- args.Player.PlayerData.CopyInventory(args.Player);
- TShock.InventoryDB.InsertPlayerData(args.Player);
+ #region Account commands
- args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen);
- Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Parameters[0]);
- }
- else
- {
- args.Player.SendMessage("Incorrect password", Color.LimeGreen);
- Log.Warn(args.Player.IP + " failed to authenticate as user: " + args.Parameters[0]);
- args.Player.LoginAttempts++;
- }
- }
- catch (Exception ex)
- {
- args.Player.SendMessage("There was an error processing your request.", Color.Red);
- Log.Error(ex.ToString());
- }
+ 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.");
+ }
- }
+ if (args.Parameters.Count != 2)
+ {
+ args.Player.SendMessage("Syntax: /login [username] [password]");
+ args.Player.SendMessage("If you forgot your password, there is no way to recover it.");
+ return;
+ }
+ try
+ {
+ string encrPass = TShock.Utils.HashPassword(args.Parameters[1]);
+ var user = TShock.Users.GetUserByName(args.Parameters[0]);
+ 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(args.Parameters[0]));
- 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);
- }
- }
+ if (TShock.Config.ServerSideInventory)
+ {
+ if (args.Player.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;
+ }
+ }
- private static void RegisterUser(CommandArgs args)
- {
- try
- {
- var user = new User();
+ if (args.Player.Group.HasPermission(Permissions.ignorestackhackdetection))
+ args.Player.IgnoreActionsForCheating = "none";
- 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;
- }
+ if (args.Player.Group.HasPermission(Permissions.usebanneditem))
+ args.Player.IgnoreActionsForDisabledArmor = "none";
- user.Group = TShock.Config.DefaultRegistrationGroupName; // FIXME -- we should get this from the DB.
+ args.Player.Group = TShock.Utils.GetGroup(user.Group);
+ args.Player.UserAccountName = args.Parameters[0];
+ args.Player.UserID = TShock.Users.GetUserID(args.Player.UserAccountName);
+ args.Player.IsLoggedIn = true;
+ args.Player.IgnoreActionsForInventory = "none";
- 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);
- }
- }
+ args.Player.PlayerData.CopyInventory(args.Player);
+ TShock.InventoryDB.InsertPlayerData(args.Player);
- //Todo: Add separate help text for '/user add' and '/user del'. Also add '/user addip' and '/user delip'
+ args.Player.SendMessage("Authenticated as " + args.Parameters[0] + " successfully.", Color.LimeGreen);
+ Log.ConsoleInfo(args.Player.Name + " authenticated successfully as user: " + args.Parameters[0]);
+ }
+ else
+ {
+ args.Player.SendMessage("Incorrect password", Color.LimeGreen);
+ Log.Warn(args.Player.IP + " failed to authenticate as user: " + args.Parameters[0]);
+ 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 ManageUsers(CommandArgs args)
- {
- // This guy needs to go away for the help later on to take effect.
+ 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);
+ }
+ }
- //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;
- //}
+ private static void RegisterUser(CommandArgs args)
+ {
+ try
+ {
+ var user = new User();
- // 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;
- }
+ 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;
+ }
- string subcmd = args.Parameters[0];
+ user.Group = TShock.Config.DefaultRegistrationGroupName; // FIXME -- we should get this from the DB.
- // 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();
+ 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);
+ }
+ }
- 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].Contains("."))
- user.Address = args.Parameters[1];
- else
- user.Name = args.Parameters[1];
+ //Todo: Add separate help text for '/user add' and '/user del'. Also add '/user addip' and '/user delip'
- 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];
+ private static void ManageUsers(CommandArgs args)
+ {
+ // This guy needs to go away for the help later on to take effect.
- try
- {
+ //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;
+ //}
- 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].Contains("."))
- user.Address = args.Parameters[1];
- else
- user.Name = args.Parameters[1];
+ // 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;
+ }
- try
- {
+ string subcmd = args.Parameters[0];
- 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
+ // 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].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].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);
@@ -648,1498 +661,1509 @@ namespace TShockAPI
args.Player.SendMessage("Proc count: " + Environment.ProcessorCount);
args.Player.SendMessage("Machine name: " + Environment.MachineName);
}
+
#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)
- {
- args.Player.SendMessage("More than one player matched your query.", Color.Red);
- return;
- }
- try
- {
- args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName, 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)
- {
- args.Player.SendMessage("More than one player matched!", 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.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)
- {
- args.Player.SendMessage("More than one player matched!", 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.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.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 if (!TShock.Config.EnableBanOnUsernames)
- {
- ban = TShock.Bans.GetBanByIp(plStr);
-
- if (ban == null)
- args.Player.SendMessage(string.Format("Failed to unban {0}, not found.", args.Parameters[0]), Color.Red);
- else 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("Invalid player!", Color.Red);
- }
- }
-
- 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;
- }
-
- string plStr = args.Parameters[0];
- var ban = TShock.Bans.GetBanByIp(plStr);
- 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("Invalid player!", 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");
- }
-
- #endregion Player Management Commands
-
- #region Server Maintenence Commands
-
- public static void ConvertWaR(CommandArgs args)
- {
- if (args.Parameters.Count < 1)
- {
- args.Player.SendMessage("This command will dump all users from both Regions and Warps.");
- args.Player.SendMessage("This command will also change all Worlds to reference this WorldID.");
- args.Player.SendMessage("You must manually fix multi-world configurations.");
- args.Player.SendMessage("To confirm this: /convert yes");
- }
- else if (args.Parameters[0] == "yes")
- {
- TShock.Warps.ConvertDB();
- TShock.Regions.ConvertDB();
- args.Player.SendMessage("Convert complete. You need to re-allow users after they register.");
- }
- }
-
- 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)
- {
- TShock.Utils.ForceKickAll("Server shutting down!");
- WorldGen.saveWorld();
- Netplay.disconnect = true;
- }
-
- private static void OffNoSave(CommandArgs args)
- {
- TShock.Utils.ForceKickAll("Server shutting down!");
- Netplay.disconnect = true;
- }
-
- private static void CheckUpdates(CommandArgs args)
- {
- ThreadPool.QueueUserWorkItem(UpdateManager.CheckUpdate);
- }
-
- [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
- private static void UpdateNow(CommandArgs args)
- {
- Process TServer = Process.GetCurrentProcess();
-
- using (var sw = new StreamWriter("pid"))
- {
- sw.Write(TServer.Id);
- }
-
- using (var sw = new StreamWriter("pn"))
- {
- sw.Write(TServer.ProcessName + " " + Environment.CommandLine);
- }
-
- using (var client = new WebClient())
- {
- client.Headers.Add("user-agent", "TShock");
- byte[] updatefile = client.DownloadData("http://tsupdate.shankshock.com/UpdateTShock.exe");
-
- using (var bw = new BinaryWriter(new FileStream("UpdateTShock.exe", FileMode.Create)))
- {
- bw.Write(updatefile);
- }
- }
-
- Process.Start(new ProcessStartInfo("UpdateTShock.exe"));
-
- TShock.Utils.ForceKickAll("Server shutting down for update!");
- WorldGen.saveWorld();
- Netplay.disconnect = true;
- }
-
- #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;
- }
- }
-
- private static void Eater(CommandArgs args)
- {
- if (args.Parameters.Count > 1)
- {
- args.Player.SendMessage("Invalid syntax! Proper syntax: /eater [amount]", Color.Red);
- return;
- }
- int amount = 1;
- if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount))
- {
- args.Player.SendMessage("Invalid syntax! Proper syntax: /eater [amount]", Color.Red);
- return;
- }
- amount = Math.Min(amount, Main.maxNPCs);
- NPC eater = TShock.Utils.GetNPCById(13);
- TSPlayer.Server.SpawnNPC(eater.type, eater.name, amount, args.Player.TileX, args.Player.TileY);
- TShock.Utils.Broadcast(string.Format("{0} has spawned eater of worlds {1} times!", args.Player.Name, amount));
- }
-
- private static void 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));
- }
-
- 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));
- }
-
- 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));
- }
-
- 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));
- }
-
- 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));
- }
-
- 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));
- }
-
- 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));
- }
-
- 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)
- {
- WorldGen.StartHardmode();
- }
-
- private static void DisableHardMode(CommandArgs args)
- {
- Main.hardMode = false;
- }
-
- 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 22:
- 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.");
- }
-
- #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);
-
- if (com.Equals("add"))
- {
- String response = TShock.Groups.AddPermissions(groupname, args.Parameters);
- if (response.Length > 0)
- args.Player.SendMessage(response, Color.Green);
- return;
- }
- else if (com.Equals("del") || com.Equals("delete"))
- {
- String 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);
- }
-
- #endregion Group Management
-
- #region Item Management
-
- private static void AddItem(CommandArgs args)
- {
- if (args.Parameters.Count > 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)
- {
- 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 > 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)
- {
- 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);
- }
- }
-
- #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;
-
- TShock.Utils.Broadcast("Server map saving, potential lag spike");
- Thread SaveWorld = new Thread(TShock.Utils.SaveWorld);
- SaveWorld.Start();
- }
-
- private static void Reload(CommandArgs args)
- {
- FileTools.SetupConfig();
- 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)
- {
- TShock.Utils.Broadcast("Server map saving, potential lag spike");
- Thread SaveWorld = new Thread(TShock.Utils.SaveWorld);
- SaveWorld.Start();
- }
-
- 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);
- 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);
- 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;
+ {
+ 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)
+ {
+ args.Player.SendMessage("More than one player matched your query.", Color.Red);
+ return;
+ }
+ try
+ {
+ args.Player.SendMessage("IP Address: " + players[0].IP + " Logged In As: " + players[0].UserAccountName, 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)
+ {
+ args.Player.SendMessage("More than one player matched!", 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.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)
+ {
+ args.Player.SendMessage("More than one player matched!", 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.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.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 if (!TShock.Config.EnableBanOnUsernames)
+ {
+ ban = TShock.Bans.GetBanByIp(plStr);
+
+ if (ban == null)
+ args.Player.SendMessage(string.Format("Failed to unban {0}, not found.", args.Parameters[0]), Color.Red);
+ else 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("Invalid player!", 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;
+ }
+
+ string plStr = args.Parameters[0];
+ var ban = TShock.Bans.GetBanByIp(plStr);
+ 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("Invalid player!", 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");
+ }
+
+ #endregion Player Management Commands
+
+ #region Server Maintenence Commands
+
+ public static void ConvertWaR(CommandArgs args)
+ {
+ if (args.Parameters.Count < 1)
+ {
+ args.Player.SendMessage("This command will dump all users from both Regions and Warps.");
+ args.Player.SendMessage("This command will also change all Worlds to reference this WorldID.");
+ args.Player.SendMessage("You must manually fix multi-world configurations.");
+ args.Player.SendMessage("To confirm this: /convert yes");
+ }
+ else if (args.Parameters[0] == "yes")
+ {
+ TShock.Warps.ConvertDB();
+ TShock.Regions.ConvertDB();
+ args.Player.SendMessage("Convert complete. You need to re-allow users after they register.");
+ }
+ }
+
+ 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)
+ {
+ TShock.Utils.ForceKickAll("Server shutting down!");
+ WorldGen.saveWorld();
+ Netplay.disconnect = true;
+ }
+
+ private static void OffNoSave(CommandArgs args)
+ {
+ TShock.Utils.ForceKickAll("Server shutting down!");
+ Netplay.disconnect = true;
+ }
+
+ private static void CheckUpdates(CommandArgs args)
+ {
+ ThreadPool.QueueUserWorkItem(UpdateManager.CheckUpdate);
+ }
+
+ [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
+ private static void UpdateNow(CommandArgs args)
+ {
+ Process TServer = Process.GetCurrentProcess();
+
+ using (var sw = new StreamWriter("pid"))
+ {
+ sw.Write(TServer.Id);
+ }
+
+ using (var sw = new StreamWriter("pn"))
+ {
+ sw.Write(TServer.ProcessName + " " + Environment.CommandLine);
+ }
+
+ using (var client = new WebClient())
+ {
+ client.Headers.Add("user-agent", "TShock");
+ byte[] updatefile = client.DownloadData("http://tsupdate.shankshock.com/UpdateTShock.exe");
+
+ using (var bw = new BinaryWriter(new FileStream("UpdateTShock.exe", FileMode.Create)))
+ {
+ bw.Write(updatefile);
+ }
+ }
+
+ Process.Start(new ProcessStartInfo("UpdateTShock.exe"));
+
+ TShock.Utils.ForceKickAll("Server shutting down for update!");
+ WorldGen.saveWorld();
+ Netplay.disconnect = true;
+ }
+
+ #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;
+ }
+ }
+
+ private static void Eater(CommandArgs args)
+ {
+ if (args.Parameters.Count > 1)
+ {
+ args.Player.SendMessage("Invalid syntax! Proper syntax: /eater [amount]", Color.Red);
+ return;
+ }
+ int amount = 1;
+ if (args.Parameters.Count == 1 && !int.TryParse(args.Parameters[0], out amount))
+ {
+ args.Player.SendMessage("Invalid syntax! Proper syntax: /eater [amount]", Color.Red);
+ return;
+ }
+ amount = Math.Min(amount, Main.maxNPCs);
+ NPC eater = TShock.Utils.GetNPCById(13);
+ TSPlayer.Server.SpawnNPC(eater.type, eater.name, amount, args.Player.TileX, args.Player.TileY);
+ TShock.Utils.Broadcast(string.Format("{0} has spawned eater of worlds {1} times!", args.Player.Name, amount));
+ }
+
+ private static void 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));
+ }
+
+ 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));
+ }
+
+ 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));
+ }
+
+ 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));
+ }
+
+ 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));
+ }
+
+ 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));
+ }
+
+ 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));
+ }
+
+ 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)
+ {
+ WorldGen.StartHardmode();
+ }
+
+ private static void DisableHardMode(CommandArgs args)
+ {
+ Main.hardMode = false;
+ }
+
+ 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 22:
+ 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.");
+ }
+
+ #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);
+
+ if (com.Equals("add"))
+ {
+ String response = TShock.Groups.AddPermissions(groupname, args.Parameters);
+ if (response.Length > 0)
+ args.Player.SendMessage(response, Color.Green);
+ return;
+ }
+ else if (com.Equals("del") || com.Equals("delete"))
+ {
+ String 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);
+ }
+
+ #endregion Group Management
+
+ #region Item Management
+
+ private static void AddItem(CommandArgs args)
+ {
+ if (args.Parameters.Count > 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)
+ {
+ 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 > 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)
+ {
+ 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);
+ }
+ }
+
+ #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;
+
+ TShock.Utils.Broadcast("Server map saving, potential lag spike");
+ Thread SaveWorld = new Thread(TShock.Utils.SaveWorld);
+ SaveWorld.Start();
+ }
+
+ private static void Reload(CommandArgs args)
+ {
+ FileTools.SetupConfig();
+ 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)
+ {
+ TShock.Utils.Broadcast("Server map saving, potential lag spike");
+ Thread SaveWorld = new Thread(TShock.Utils.SaveWorld);
+ SaveWorld.Start();
+ }
+
+ 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);
+ 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);
+ 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)
@@ -2210,863 +2234,877 @@ namespace TShockAPI
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;
+ 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
- }
+ 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());
+ 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;
- }
+ // 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;
- }
+ //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);
+ //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);
- }
+ //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);
- }
+ //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);
- }
+ 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);
+ 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;
- }
+ 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);
- }
+ 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 "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;
- }
- }
- }
+ 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
+ #endregion World Protection Commands
- #region General 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 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 Playing(CommandArgs args)
- {
- args.Player.SendMessage(string.Format("Current players: {0}.", TShock.Utils.GetPlayers()), 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 Playing(CommandArgs args)
+ {
+ args.Player.SendMessage(string.Format("Current players: {0}.", TShock.Utils.GetPlayers()), 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;
- }
+ 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;
- }
+ 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.");
- }
+ 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;
- }
+ 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;
- }
+ 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;
- }
+ 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 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;
+ 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);
- }
+ 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;
- }
+ 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.");
-
- }
+ 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 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 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;
- }
+ 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;
- }
- }
+ 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 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);
+ 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);
- }
- }
+ 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
+ #endregion General Commands
- #region Cheat 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;
- }
+ 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));
- }
- }
+ 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 [killFriendly(true/false)]", Color.Red);
- return;
- }
+ private static void Butcher(CommandArgs args)
+ {
+ if (args.Parameters.Count > 1)
+ {
+ args.Player.SendMessage("Invalid syntax! Proper syntax: /butcher [killFriendly(true/false)]", Color.Red);
+ return;
+ }
- bool killFriendly = true;
- if (args.Parameters.Count == 1)
- bool.TryParse(args.Parameters[0], out killFriendly);
+ bool killFriendly = true;
+ if (args.Parameters.Count == 1)
+ bool.TryParse(args.Parameters[0], out killFriendly);
- 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 && (!Main.npc[i].friendly || killFriendly))
- {
- TSPlayer.Server.StrikeNPC(i, 99999, 90f, 1);
- killcount++;
- }
- }
- TShock.Utils.Broadcast(string.Format("Killed {0} NPCs.", killcount));
- }
+ 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 && (!Main.npc[i].friendly || killFriendly))
+ {
+ 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;
- args.Player.GiveItem(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("You don't have free slots!", Color.Red);
- }
- }
- else
- {
- args.Player.SendMessage("Invalid item type!", Color.Red);
- }
- }
- }
+ 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;
+ args.Player.GiveItem(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("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];
- }
+ 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;
- plr.GiveItem(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("Player does not have free slots!", Color.Red);
- }
- }
- }
- else
- {
- args.Player.SendMessage("Invalid item type!", Color.Red);
- }
- }
- }
+ 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;
+ plr.GiveItem(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("Player does not have free slots!", Color.Red);
+ }
+ }
+ }
+ else
+ {
+ args.Player.SendMessage("Invalid item type!", Color.Red);
+ }
+ }
+ }
- public static void ClearItems(CommandArgs args)
- {
+ 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.");
+ }
- 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; }
- }
+ 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;
+ }
- }
- 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.");
+ 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 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;
- }
+ 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);
+ }
+ }
- 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 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);
+ }
- 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
- }
-}
+ #endregion Cheat Comamnds
+ }
+}
\ No newline at end of file
diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs
index 898fd4bb..3f215257 100644
--- a/TShockAPI/ConfigFile.cs
+++ b/TShockAPI/ConfigFile.cs
@@ -24,274 +24,245 @@ using Newtonsoft.Json;
namespace TShockAPI
{
- public class ConfigFile
- {
- [Description("The equation for calculating invasion size is 100 + (multiplier * (number of active players with greater than 200 health))")]
- public int InvasionMultiplier = 1;
- [Description("The default maximum mobs that will spawn per wave. Higher means more mobs in that wave.")]
- public int DefaultMaximumSpawns = 5;
- [Description("The delay between waves. Shorter values lead to less mobs.")]
- public int DefaultSpawnRate = 600;
- [Description("The port the server runs on.")]
- public int ServerPort = 7777;
- [Description("Enable or disable the whitelist based on IP addresses in whitelist.txt")]
- public bool EnableWhitelist;
- [Description("Enable the ability for invaison size to never decrease. Make sure to run /invade, and note that this adds 2 million+ goblins to the spawn que for the map.")]
- public bool InfiniteInvasion;
- [Description("Set the server pvp mode. Vaild types are, \"normal\", \"always\", \"disabled\"")]
- public string PvPMode = "normal";
- [Description("Prevents tiles from being placed within SpawnProtectionRadius of the default spawn.")]
- public bool SpawnProtection = true;
- [Description("Radius from spawn tile for SpawnProtection.")]
- public int SpawnProtectionRadius = 10;
- [Description("Max slots for the server. If you want people to be kicked with \"Server is full\" set this to how many players you want max and then set Terraria max players to 2 higher.")]
- public int MaxSlots = 8;
- [Description("Global protection agent for any block distance based anti-grief check.")]
- public bool RangeChecks = true;
- [Description("Disables any building; placing of blocks")]
- public bool DisableBuild;
- [Description("#.#.#. = Red/Blue/Green - RGB Colors for the Admin Chat Color. Max value: 255")]
- public float[] SuperAdminChatRGB = { 255, 0, 0 };
- [Description("Super admin group chat prefix")]
- public string SuperAdminChatPrefix = "(Admin) ";
- [Description("Super admin group chat suffix")]
- public string SuperAdminChatSuffix = "";
- [Description("Backup frequency in minutes. So, a value of 60 = 60 minutes. Backups are stored in the \\tshock\\backups folder.")]
- public int BackupInterval;
- [Description("How long backups are kept in minutes. 2880 = 2 days.")]
- public int BackupKeepFor = 60;
+ public class ConfigFile
+ {
+ [Description(
+ "The equation for calculating invasion size is 100 + (multiplier * (number of active players with greater than 200 health))"
+ )] public int InvasionMultiplier = 1;
- [Description("Remembers where a player left off. It works by remembering the IP, NOT the character. \neg. When you try to disconnect, and reconnect to be automatically placed at spawn, you'll be at your last location. Note: Won't save after server restarts.")]
- public bool RememberLeavePos;
- [Description("Hardcore players ONLY. This means softcore players cannot join.")]
- public bool HardcoreOnly;
- [Description("Mediumcore players ONLY. This means softcore players cannot join.")]
- public bool MediumcoreOnly;
- [Description("Kicks a Hardcore player on death.")]
- public bool KickOnMediumcoreDeath;
- [Description("Bans a Hardcore player on death.")]
- public bool BanOnMediumcoreDeath;
+ [Description("The default maximum mobs that will spawn per wave. Higher means more mobs in that wave.")] public int
+ DefaultMaximumSpawns = 5;
- [Description("Enable/Disable Terrarias built in auto save")]
- public bool AutoSave = true;
+ [Description("The delay between waves. Shorter values lead to less mobs.")] public int DefaultSpawnRate = 600;
+ [Description("The port the server runs on.")] public int ServerPort = 7777;
+ [Description("Enable or disable the whitelist based on IP addresses in whitelist.txt")] public bool EnableWhitelist;
- [Description("Number of failed login attempts before kicking the player.")]
- public int MaximumLoginAttempts = 3;
+ [Description(
+ "Enable the ability for invaison size to never decrease. Make sure to run /invade, and note that this adds 2 million+ goblins to the spawn que for the map."
+ )] public bool InfiniteInvasion;
- [Description("Not implemented")]
- public string RconPassword = "";
- [Description("Not implemented")]
- public int RconPort = 7777;
+ [Description("Set the server pvp mode. Vaild types are, \"normal\", \"always\", \"disabled\"")] public string PvPMode
+ = "normal";
- [Description("Not implemented")]
- public string ServerName = "";
- [Description("Not implemented")]
- public string MasterServer = "127.0.0.1";
+ [Description("Prevents tiles from being placed within SpawnProtectionRadius of the default spawn.")] public bool
+ SpawnProtection = true;
- [Description("Valid types are \"sqlite\" and \"mysql\"")]
- public string StorageType = "sqlite";
+ [Description("Radius from spawn tile for SpawnProtection.")] public int SpawnProtectionRadius = 10;
- [Description("The MySQL Hostname and port to direct connections to")]
- public string MySqlHost = "localhost:3306";
- [Description("Database name to connect to")]
- public string MySqlDbName = "";
- [Description("Database username to connect with")]
- public string MySqlUsername = "";
- [Description("Database password to connect with")]
- public string MySqlPassword = "";
+ [Description(
+ "Max slots for the server. If you want people to be kicked with \"Server is full\" set this to how many players you want max and then set Terraria max players to 2 higher."
+ )] public int MaxSlots = 8;
- [Description("Bans a Mediumcore player on death.")]
- public string MediumcoreBanReason = "Death results in a ban";
- [Description("Kicks a Mediumcore player on death.")]
- public string MediumcoreKickReason = "Death results in a kick";
+ [Description("Global protection agent for any block distance based anti-grief check.")] public bool RangeChecks = true;
+ [Description("Disables any building; placing of blocks")] public bool DisableBuild;
- [Description("Enables DNS resolution of incoming connections with GetGroupForIPExpensive.")]
- public bool EnableDNSHostResolution;
+ [Description("#.#.#. = Red/Blue/Green - RGB Colors for the Admin Chat Color. Max value: 255")] public float[]
+ SuperAdminChatRGB = {255, 0, 0};
- [Description("Enables kicking of banned users by matching their IP Address")]
- public bool EnableIPBans = true;
+ [Description("Super admin group chat prefix")] public string SuperAdminChatPrefix = "(Admin) ";
+ [Description("Super admin group chat suffix")] public string SuperAdminChatSuffix = "";
- [Description("Enables kicking of banned users by matching their Character Name")]
- public bool EnableBanOnUsernames;
+ [Description(
+ "Backup frequency in minutes. So, a value of 60 = 60 minutes. Backups are stored in the \\tshock\\backups folder.")] public int BackupInterval;
- [Description("Drops excessive sync packets")]
- public bool EnableAntiLag = true;
-
- [Description("Selects the default group name to place new registrants under")]
- public string DefaultRegistrationGroupName = "default";
+ [Description("How long backups are kept in minutes. 2880 = 2 days.")] public int BackupKeepFor = 60;
- [Description("Selects the default group name to place non registered users under")]
- public string DefaultGuestGroupName = "guest";
+ [Description(
+ "Remembers where a player left off. It works by remembering the IP, NOT the character. \neg. When you try to disconnect, and reconnect to be automatically placed at spawn, you'll be at your last location. Note: Won't save after server restarts."
+ )] public bool RememberLeavePos;
- [Description("Force-Disable printing logs to players with the log permission")]
- public bool DisableSpewLogs = true;
+ [Description("Hardcore players ONLY. This means softcore players cannot join.")] public bool HardcoreOnly;
+ [Description("Mediumcore players ONLY. This means softcore players cannot join.")] public bool MediumcoreOnly;
+ [Description("Kicks a Hardcore player on death.")] public bool KickOnMediumcoreDeath;
+ [Description("Bans a Hardcore player on death.")] public bool BanOnMediumcoreDeath;
- [Description("Valid types are \"sha512\", \"sha256\", \"md5\", append with \"-xp\" for the xp supported algorithms")]
- public string HashAlgorithm = "sha512";
+ [Description("Enable/Disable Terrarias built in auto save")] public bool AutoSave = true;
- [Description("Buffers up the packets and sends them out at the end of each frame")]
- public bool BufferPackets = true;
+ [Description("Number of failed login attempts before kicking the player.")] public int MaximumLoginAttempts = 3;
- [Description("String that is used when kicking people when the server is full.")]
- public string ServerFullReason = "Server is full";
+ [Description("Not implemented")] public string RconPassword = "";
+ [Description("Not implemented")] public int RconPort = 7777;
- [Description("String that is used when kicking people when the server is full with no reserved slots.")]
- public string ServerFullNoReservedReason = "Server is full. No reserved slots open.";
+ [Description("Not implemented")] public string ServerName = "";
+ [Description("Not implemented")] public string MasterServer = "127.0.0.1";
- [Description("This will save the world if Terraria crashes from an unhandled exception.")]
- public bool SaveWorldOnCrash = true;
+ [Description("Valid types are \"sqlite\" and \"mysql\"")] public string StorageType = "sqlite";
- [Description("This will announce a player's location on join")]
- public bool EnableGeoIP;
+ [Description("The MySQL Hostname and port to direct connections to")] public string MySqlHost = "localhost:3306";
+ [Description("Database name to connect to")] public string MySqlDbName = "";
+ [Description("Database username to connect with")] public string MySqlUsername = "";
+ [Description("Database password to connect with")] public string MySqlPassword = "";
- [Description("This will turn on a token requirement for the /status API endpoint.")]
- public bool EnableTokenEndpointAuthentication;
+ [Description("Bans a Mediumcore player on death.")] public string MediumcoreBanReason = "Death results in a ban";
+ [Description("Kicks a Mediumcore player on death.")] public string MediumcoreKickReason = "Death results in a kick";
- [Description("This is used when the API endpoint /status is queried.")]
- public string ServerNickname = "TShock Server";
+ [Description("Enables DNS resolution of incoming connections with GetGroupForIPExpensive.")] public bool
+ EnableDNSHostResolution;
- [Description("Enable/Disable the rest api.")]
- public bool RestApiEnabled;
+ [Description("Enables kicking of banned users by matching their IP Address")] public bool EnableIPBans = true;
- [Description("This is the port which the rest api will listen on.")]
- public int RestApiPort = 7878;
+ [Description("Enables kicking of banned users by matching their Character Name")] public bool EnableBanOnUsernames;
- [Description("Disable tombstones for all players.")]
- public bool DisableTombstones = true;
+ [Description("Drops excessive sync packets")] public bool EnableAntiLag = true;
- [Description("Displays a player's IP on join to everyone who has the log permission")]
- public bool DisplayIPToAdmins;
-
- [Description("Some tiles are 'fixed' by not letting TShock handle them. Disabling this may break certain asthetic tiles.")]
- public bool EnableInsecureTileFixes = true;
+ [Description("Selects the default group name to place new registrants under")] public string
+ DefaultRegistrationGroupName = "default";
- [Description("Kicks users using a proxy as identified with the GeoIP database")]
- public bool KickProxyUsers = true;
+ [Description("Selects the default group name to place non registered users under")] public string
+ DefaultGuestGroupName = "guest";
- [Description("Disables hardmode, can't never be activated. Overrides /starthardmode")]
- public bool DisableHardmode;
+ [Description("Force-Disable printing logs to players with the log permission")] public bool DisableSpewLogs = true;
- [Description("Disables Dungeon Guardian from being spawned by player packets, this will instead force a respawn")]
- public bool DisableDungeonGuardian;
+ [Description("Valid types are \"sha512\", \"sha256\", \"md5\", append with \"-xp\" for the xp supported algorithms")] public string HashAlgorithm = "sha512";
- [Description("Enable Server Side Inventory checks, EXPERIMENTAL")]
- public bool ServerSideInventory;
+ [Description("Buffers up the packets and sends them out at the end of each frame")] public bool BufferPackets = true;
- [Description("Disables reporting of playercount to the stat system.")]
- public bool DisablePlayerCountReporting;
+ [Description("String that is used when kicking people when the server is full.")] public string ServerFullReason =
+ "Server is full";
- [Description("Disables clown bomb projectiles from spawning")]
- public bool DisableClownBombs;
+ [Description("String that is used when kicking people when the server is full with no reserved slots.")] public string
+ ServerFullNoReservedReason = "Server is full. No reserved slots open.";
- [Description("Disables snow ball projectiles from spawning")]
- public bool DisableSnowBalls;
+ [Description("This will save the world if Terraria crashes from an unhandled exception.")] public bool
+ SaveWorldOnCrash = true;
- [Description("Change ingame chat format, {0} = Group Name, {1} = Group Prefix, {2} = Player Name, {3} = Group Suffix, {4} = Chat Message")]
- public string ChatFormat = "{1}{2}{3}: {4}";
+ [Description("This will announce a player's location on join")] public bool EnableGeoIP;
- [Description("Force the world time to be normal, day, or night")]
- public string ForceTime = "normal";
+ [Description("This will turn on a token requirement for the /status API endpoint.")] public bool
+ EnableTokenEndpointAuthentication;
- [Description("Disable/Revert a player if they exceed this number of tile kills within 1 second.")]
- public int TileKillThreshold = 60;
+ [Description("This is used when the API endpoint /status is queried.")] public string ServerNickname = "TShock Server";
- [Description("Disable/Revert a player if they exceed this number of tile places within 1 second.")]
- public int TilePlaceThreshold = 20;
+ [Description("Enable/Disable the rest api.")] public bool RestApiEnabled;
- [Description("Disable a player if they exceed this number of liquid sets within 1 second.")]
- public int TileLiquidThreshold = 15;
+ [Description("This is the port which the rest api will listen on.")] public int RestApiPort = 7878;
- [Description("Disable a player if they exceed this number of projectile new within 1 second.")]
- public int ProjectileThreshold = 50;
+ [Description("Disable tombstones for all players.")] public bool DisableTombstones = true;
- [Description("Require all players to register or login before being allowed to play.")]
- public bool RequireLogin;
+ [Description("Displays a player's IP on join to everyone who has the log permission")] public bool DisplayIPToAdmins;
- [Description("Disables Invisibility potions from being used in PvP (Note, they can use them on the client, but the effect isn't sent to the rest of the server)")]
- public bool DisableInvisPvP;
+ [Description(
+ "Some tiles are 'fixed' by not letting TShock handle them. Disabling this may break certain asthetic tiles.")] public
+ bool EnableInsecureTileFixes = true;
- [Description("The maximum distance players disabled for various reasons can move from")]
- public int MaxRangeForDisabled = 10;
+ [Description("Kicks users using a proxy as identified with the GeoIP database")] public bool KickProxyUsers = true;
- [Description("Server password required to join server")]
- public string ServerPassword = "";
+ [Description("Disables hardmode, can't never be activated. Overrides /starthardmode")] public bool DisableHardmode;
- [Description("Protect chests with region and build permissions")]
- public bool RegionProtectChests;
+ [Description("Disables Dungeon Guardian from being spawned by player packets, this will instead force a respawn")] public bool DisableDungeonGuardian;
- [Description("Disable users from being able to login with account password when joining")]
- public bool DisableLoginBeforeJoin;
+ [Description("Enable Server Side Inventory checks, EXPERIMENTAL")] public bool ServerSideInventory;
+
+ [Description("Disables reporting of playercount to the stat system.")] public bool DisablePlayerCountReporting;
+
+ [Description("Disables clown bomb projectiles from spawning")] public bool DisableClownBombs;
+
+ [Description("Disables snow ball projectiles from spawning")] public bool DisableSnowBalls;
+
+ [Description(
+ "Change ingame chat format, {0} = Group Name, {1} = Group Prefix, {2} = Player Name, {3} = Group Suffix, {4} = Chat Message"
+ )] public string ChatFormat = "{1}{2}{3}: {4}";
+
+ [Description("Force the world time to be normal, day, or night")] public string ForceTime = "normal";
+
+ [Description("Disable/Revert a player if they exceed this number of tile kills within 1 second.")] public int
+ TileKillThreshold = 60;
+
+ [Description("Disable/Revert a player if they exceed this number of tile places within 1 second.")] public int
+ TilePlaceThreshold = 20;
+
+ [Description("Disable a player if they exceed this number of liquid sets within 1 second.")] public int
+ TileLiquidThreshold = 15;
+
+ [Description("Disable a player if they exceed this number of projectile new within 1 second.")] public int
+ ProjectileThreshold = 50;
+
+ [Description("Require all players to register or login before being allowed to play.")] public bool RequireLogin;
+
+ [Description(
+ "Disables Invisibility potions from being used in PvP (Note, they can use them on the client, but the effect isn't sent to the rest of the server)"
+ )] public bool DisableInvisPvP;
+
+ [Description("The maximum distance players disabled for various reasons can move from")] public int
+ MaxRangeForDisabled = 10;
+
+ [Description("Server password required to join server")] public string ServerPassword = "";
+
+ [Description("Protect chests with region and build permissions")] public bool RegionProtectChests;
+
+ [Description("Disable users from being able to login with account password when joining")] public bool
+ DisableLoginBeforeJoin;
+
+ [Description("Allows users to register any username with /register")] public bool AllowRegisterAnyUsername;
- [Description("Allows users to register any username with /register")]
- public bool AllowRegisterAnyUsername;
-
public static ConfigFile Read(string path)
- {
- if (!File.Exists(path))
- return new ConfigFile();
- using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
- {
- return Read(fs);
- }
- }
+ {
+ if (!File.Exists(path))
+ return new ConfigFile();
+ using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
+ {
+ return Read(fs);
+ }
+ }
- public static ConfigFile Read(Stream stream)
- {
- using (var sr = new StreamReader(stream))
- {
- var cf = JsonConvert.DeserializeObject(sr.ReadToEnd());
- if (ConfigRead != null)
- ConfigRead(cf);
- return cf;
- }
- }
+ public static ConfigFile Read(Stream stream)
+ {
+ using (var sr = new StreamReader(stream))
+ {
+ var cf = JsonConvert.DeserializeObject(sr.ReadToEnd());
+ if (ConfigRead != null)
+ ConfigRead(cf);
+ return cf;
+ }
+ }
- public void Write(string path)
- {
- using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write))
- {
- Write(fs);
- }
- }
+ public void Write(string path)
+ {
+ using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write))
+ {
+ Write(fs);
+ }
+ }
- public void Write(Stream stream)
- {
- var str = JsonConvert.SerializeObject(this, Formatting.Indented);
- using (var sw = new StreamWriter(stream))
- {
- sw.Write(str);
- }
- }
+ public void Write(Stream stream)
+ {
+ var str = JsonConvert.SerializeObject(this, Formatting.Indented);
+ using (var sw = new StreamWriter(stream))
+ {
+ sw.Write(str);
+ }
+ }
- public static Action ConfigRead;
+ public static Action ConfigRead;
- static void DumpDescriptions()
- {
- var sb = new StringBuilder();
- var defaults = new ConfigFile();
+ private static void DumpDescriptions()
+ {
+ var sb = new StringBuilder();
+ var defaults = new ConfigFile();
- foreach (var field in defaults.GetType().GetFields())
- {
- if (field.IsStatic)
- continue;
+ foreach (var field in defaults.GetType().GetFields())
+ {
+ if (field.IsStatic)
+ continue;
- var name = field.Name;
- var type = field.FieldType.Name;
+ var name = field.Name;
+ var type = field.FieldType.Name;
- var descattr = field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute;
- var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : "None";
+ var descattr =
+ field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute;
+ var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : "None";
- var def = field.GetValue(defaults);
+ var def = field.GetValue(defaults);
- sb.AppendLine("## {0} ".SFormat(name));
- sb.AppendLine("**Type:** {0} ".SFormat(type));
- sb.AppendLine("**Description:** {0} ".SFormat(desc));
- sb.AppendLine("**Default:** \"{0}\" ".SFormat(def));
- sb.AppendLine();
- }
+ sb.AppendLine("## {0} ".SFormat(name));
+ sb.AppendLine("**Type:** {0} ".SFormat(type));
+ sb.AppendLine("**Description:** {0} ".SFormat(desc));
+ sb.AppendLine("**Default:** \"{0}\" ".SFormat(def));
+ sb.AppendLine();
+ }
- File.WriteAllText("ConfigDescriptions.txt", sb.ToString());
- }
- }
+ File.WriteAllText("ConfigDescriptions.txt", sb.ToString());
+ }
+ }
}
\ No newline at end of file
diff --git a/TShockAPI/DB/BanManager.cs b/TShockAPI/DB/BanManager.cs
index e6c17b61..3630287e 100644
--- a/TShockAPI/DB/BanManager.cs
+++ b/TShockAPI/DB/BanManager.cs
@@ -23,150 +23,153 @@ using MySql.Data.MySqlClient;
namespace TShockAPI.DB
{
- public class BanManager
- {
- private IDbConnection database;
+ public class BanManager
+ {
+ private IDbConnection database;
- public BanManager(IDbConnection db)
- {
- database = db;
+ public BanManager(IDbConnection db)
+ {
+ database = db;
- var table = new SqlTable("Bans",
- new SqlColumn("IP", MySqlDbType.String, 16) { Primary = true },
- new SqlColumn("Name", MySqlDbType.Text),
- new SqlColumn("Reason", MySqlDbType.Text)
- );
- var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator());
- creator.EnsureExists(table);
+ var table = new SqlTable("Bans",
+ new SqlColumn("IP", MySqlDbType.String, 16) {Primary = true},
+ new SqlColumn("Name", MySqlDbType.Text),
+ new SqlColumn("Reason", MySqlDbType.Text)
+ );
+ var creator = new SqlTableCreator(db,
+ db.GetSqlType() == SqlType.Sqlite
+ ? (IQueryBuilder) new SqliteQueryCreator()
+ : new MysqlQueryCreator());
+ creator.EnsureExists(table);
- String file = Path.Combine(TShock.SavePath, "bans.txt");
- if (File.Exists(file))
- {
- using (StreamReader sr = new StreamReader(file))
- {
- String line;
- while ((line = sr.ReadLine()) != null)
- {
- String[] info = line.Split('|');
- string query;
- if (TShock.Config.StorageType.ToLower() == "sqlite")
- query = "INSERT OR IGNORE INTO Bans (IP, Name, Reason) VALUES (@0, @1, @2);";
- else
- query = "INSERT IGNORE INTO Bans SET IP=@0, Name=@1, Reason=@2;";
- db.Query(query, info[0].Trim(), info[1].Trim(), info[2].Trim());
- }
- }
- String path = Path.Combine(TShock.SavePath, "old_configs");
- String file2 = Path.Combine(path, "bans.txt");
- if (!Directory.Exists(path))
- Directory.CreateDirectory(path);
- if (File.Exists(file2))
- File.Delete(file2);
- File.Move(file, file2);
- }
- }
+ String file = Path.Combine(TShock.SavePath, "bans.txt");
+ if (File.Exists(file))
+ {
+ using (StreamReader sr = new StreamReader(file))
+ {
+ String line;
+ while ((line = sr.ReadLine()) != null)
+ {
+ String[] info = line.Split('|');
+ string query;
+ if (TShock.Config.StorageType.ToLower() == "sqlite")
+ query = "INSERT OR IGNORE INTO Bans (IP, Name, Reason) VALUES (@0, @1, @2);";
+ else
+ query = "INSERT IGNORE INTO Bans SET IP=@0, Name=@1, Reason=@2;";
+ db.Query(query, info[0].Trim(), info[1].Trim(), info[2].Trim());
+ }
+ }
+ String path = Path.Combine(TShock.SavePath, "old_configs");
+ String file2 = Path.Combine(path, "bans.txt");
+ if (!Directory.Exists(path))
+ Directory.CreateDirectory(path);
+ if (File.Exists(file2))
+ File.Delete(file2);
+ File.Move(file, file2);
+ }
+ }
- public Ban GetBanByIp(string ip)
- {
- try
- {
- using (var reader = database.QueryReader("SELECT * FROM Bans WHERE IP=@0", ip))
- {
- if (reader.Read())
- return new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason"));
- }
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- return null;
- }
+ public Ban GetBanByIp(string ip)
+ {
+ try
+ {
+ using (var reader = database.QueryReader("SELECT * FROM Bans WHERE IP=@0", ip))
+ {
+ if (reader.Read())
+ return new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason"));
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ return null;
+ }
- public Ban GetBanByName(string name, bool casesensitive = true)
- {
- if (!TShock.Config.EnableBanOnUsernames)
- {
- return null;
- }
- try
- {
- var namecol = casesensitive ? "Name" : "UPPER(Name)";
- if (!casesensitive)
- name = name.ToUpper();
- using (var reader = database.QueryReader("SELECT * FROM Bans WHERE " + namecol + "=@0", name))
- {
- if (reader.Read())
- return new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason"));
+ public Ban GetBanByName(string name, bool casesensitive = true)
+ {
+ if (!TShock.Config.EnableBanOnUsernames)
+ {
+ return null;
+ }
+ try
+ {
+ var namecol = casesensitive ? "Name" : "UPPER(Name)";
+ if (!casesensitive)
+ name = name.ToUpper();
+ using (var reader = database.QueryReader("SELECT * FROM Bans WHERE " + namecol + "=@0", name))
+ {
+ if (reader.Read())
+ return new Ban(reader.Get("IP"), reader.Get("Name"), reader.Get("Reason"));
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ return null;
+ }
- }
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- return null;
- }
+ public bool AddBan(string ip, string name = "", string reason = "")
+ {
+ try
+ {
+ return database.Query("INSERT INTO Bans (IP, Name, Reason) VALUES (@0, @1, @2);", ip, name, reason) != 0;
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ return false;
+ }
- public bool AddBan(string ip, string name = "", string reason = "")
- {
- try
- {
- return database.Query("INSERT INTO Bans (IP, Name, Reason) VALUES (@0, @1, @2);", ip, name, reason) != 0;
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- return false;
- }
+ public bool RemoveBan(string ip)
+ {
+ try
+ {
+ return database.Query("DELETE FROM Bans WHERE IP=@0", ip) != 0;
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ return false;
+ }
- public bool RemoveBan(string ip)
- {
- try
- {
- return database.Query("DELETE FROM Bans WHERE IP=@0", ip) != 0;
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- return false;
- }
- public bool ClearBans()
- {
- try
- {
- return database.Query("DELETE FROM Bans") != 0;
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- return false;
- }
- }
+ public bool ClearBans()
+ {
+ try
+ {
+ return database.Query("DELETE FROM Bans") != 0;
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ return false;
+ }
+ }
- public class Ban
- {
- public string IP { get; set; }
+ public class Ban
+ {
+ public string IP { get; set; }
- public string Name { get; set; }
+ public string Name { get; set; }
- public string Reason { get; set; }
+ public string Reason { get; set; }
- public Ban(string ip, string name, string reason)
- {
- IP = ip;
- Name = name;
- Reason = reason;
- }
+ public Ban(string ip, string name, string reason)
+ {
+ IP = ip;
+ Name = name;
+ Reason = reason;
+ }
- public Ban()
- {
- IP = string.Empty;
- Name = string.Empty;
- Reason = string.Empty;
- }
- }
+ public Ban()
+ {
+ IP = string.Empty;
+ Name = string.Empty;
+ Reason = string.Empty;
+ }
+ }
}
\ No newline at end of file
diff --git a/TShockAPI/DB/GroupManager.cs b/TShockAPI/DB/GroupManager.cs
index 42ac4294..763d4e29 100644
--- a/TShockAPI/DB/GroupManager.cs
+++ b/TShockAPI/DB/GroupManager.cs
@@ -7,254 +7,258 @@ using MySql.Data.MySqlClient;
namespace TShockAPI.DB
{
- public class GroupManager
- {
- private IDbConnection database;
+ public class GroupManager
+ {
+ private IDbConnection database;
- public List groups = new List();
+ public List groups = new List();
- public GroupManager(IDbConnection db)
- {
- database = db;
+ public GroupManager(IDbConnection db)
+ {
+ database = db;
- var table = new SqlTable("GroupList",
- new SqlColumn("GroupName", MySqlDbType.VarChar, 32) { Primary = true },
- new SqlColumn("Parent", MySqlDbType.VarChar, 32),
- new SqlColumn("Commands", MySqlDbType.Text),
- new SqlColumn("ChatColor", MySqlDbType.Text),
- new SqlColumn("Prefix", MySqlDbType.Text),
- new SqlColumn("Suffix", MySqlDbType.Text)
- );
- var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator());
- creator.EnsureExists(table);
+ var table = new SqlTable("GroupList",
+ new SqlColumn("GroupName", MySqlDbType.VarChar, 32) {Primary = true},
+ new SqlColumn("Parent", MySqlDbType.VarChar, 32),
+ new SqlColumn("Commands", MySqlDbType.Text),
+ new SqlColumn("ChatColor", MySqlDbType.Text),
+ new SqlColumn("Prefix", MySqlDbType.Text),
+ new SqlColumn("Suffix", MySqlDbType.Text)
+ );
+ var creator = new SqlTableCreator(db,
+ db.GetSqlType() == SqlType.Sqlite
+ ? (IQueryBuilder) new SqliteQueryCreator()
+ : new MysqlQueryCreator());
+ creator.EnsureExists(table);
- //Add default groups
- AddGroup("guest", "canbuild,canregister,canlogin,canpartychat,cantalkinthird");
- AddGroup("default", "guest", "warp,canchangepassword");
- AddGroup("newadmin", "default", "kick,editspawn,reservedslot");
- AddGroup("admin", "newadmin", "ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere");
- AddGroup("trustedadmin", "admin", "maintenance,cfg,butcher,item,heal,immunetoban,usebanneditem,manageusers");
- AddGroup("vip", "default", "reservedslot");
+ //Add default groups
+ AddGroup("guest", "canbuild,canregister,canlogin,canpartychat,cantalkinthird");
+ AddGroup("default", "guest", "warp,canchangepassword");
+ AddGroup("newadmin", "default", "kick,editspawn,reservedslot");
+ AddGroup("admin", "newadmin",
+ "ban,unban,whitelist,causeevents,spawnboss,spawnmob,managewarp,time,tp,pvpfun,kill,logs,immunetokick,tphere");
+ AddGroup("trustedadmin", "admin", "maintenance,cfg,butcher,item,heal,immunetoban,usebanneditem,manageusers");
+ AddGroup("vip", "default", "reservedslot");
- String file = Path.Combine(TShock.SavePath, "groups.txt");
- if (File.Exists(file))
- {
- using (StreamReader sr = new StreamReader(file))
- {
- String line;
- while ((line = sr.ReadLine()) != null)
- {
- if (!line.Equals("") && !line.Substring(0, 1).Equals("#"))
- {
- String[] info = line.Split(' ');
- String comms = "";
- int size = info.Length;
- for (int i = 1; i < size; i++)
- {
- if (!comms.Equals(""))
- comms = comms + ",";
- comms = comms + info[i].Trim();
- }
+ String file = Path.Combine(TShock.SavePath, "groups.txt");
+ if (File.Exists(file))
+ {
+ using (StreamReader sr = new StreamReader(file))
+ {
+ String line;
+ while ((line = sr.ReadLine()) != null)
+ {
+ if (!line.Equals("") && !line.Substring(0, 1).Equals("#"))
+ {
+ String[] info = line.Split(' ');
+ String comms = "";
+ int size = info.Length;
+ for (int i = 1; i < size; i++)
+ {
+ if (!comms.Equals(""))
+ comms = comms + ",";
+ comms = comms + info[i].Trim();
+ }
- string query = "";
- if (TShock.Config.StorageType.ToLower() == "sqlite")
- query = "INSERT OR IGNORE INTO GroupList (GroupName, Commands) VALUES (@0, @1);";
- else if (TShock.Config.StorageType.ToLower() == "mysql")
- query = "INSERT IGNORE INTO GroupList SET GroupName=@0, Commands=@1;";
+ string query = "";
+ if (TShock.Config.StorageType.ToLower() == "sqlite")
+ query = "INSERT OR IGNORE INTO GroupList (GroupName, Commands) VALUES (@0, @1);";
+ else if (TShock.Config.StorageType.ToLower() == "mysql")
+ query = "INSERT IGNORE INTO GroupList SET GroupName=@0, Commands=@1;";
- db.Query(query, info[0].Trim(), comms);
-
- }
- }
- }
- String path = Path.Combine(TShock.SavePath, "old_configs");
- String file2 = Path.Combine(path, "groups.txt");
- if (!Directory.Exists(path))
- Directory.CreateDirectory(path);
- if (File.Exists(file2))
- File.Delete(file2);
- File.Move(file, file2);
- }
-
- }
+ db.Query(query, info[0].Trim(), comms);
+ }
+ }
+ }
+ String path = Path.Combine(TShock.SavePath, "old_configs");
+ String file2 = Path.Combine(path, "groups.txt");
+ if (!Directory.Exists(path))
+ Directory.CreateDirectory(path);
+ if (File.Exists(file2))
+ File.Delete(file2);
+ File.Move(file, file2);
+ }
+ }
- public bool GroupExists(string group)
- {
- if (group == "superadmin")
- return true;
+ public bool GroupExists(string group)
+ {
+ if (group == "superadmin")
+ return true;
- return groups.Any(g => g.Name.Equals(group));
- }
+ return groups.Any(g => g.Name.Equals(group));
+ }
- ///
- /// Adds group with name and permissions if it does not exist.
- ///
- /// name of group
- /// parent of group
- /// permissions
- public String AddGroup(String name, string parentname, String permissions, String chatcolor)
- {
- String message = "";
- if (GroupExists(name))
- return "Error: Group already exists. Use /modGroup to change permissions.";
+ ///
+ /// Adds group with name and permissions if it does not exist.
+ ///
+ /// name of group
+ /// parent of group
+ /// permissions
+ public String AddGroup(String name, string parentname, String permissions, String chatcolor)
+ {
+ String message = "";
+ if (GroupExists(name))
+ return "Error: Group already exists. Use /modGroup to change permissions.";
- var group = new Group(name, null, chatcolor);
- group.permissions.Add(permissions);
- if (!string.IsNullOrWhiteSpace(parentname))
- {
- var parent = groups.FirstOrDefault(gp => gp.Name == parentname);
- if (parent == null)
- {
- var error = "Invalid parent {0} for group {1}".SFormat(group.Name, parentname);
- Log.ConsoleError(error);
- return error;
- }
- group.Parent = parent;
- }
+ var group = new Group(name, null, chatcolor);
+ group.permissions.Add(permissions);
+ if (!string.IsNullOrWhiteSpace(parentname))
+ {
+ var parent = groups.FirstOrDefault(gp => gp.Name == parentname);
+ if (parent == null)
+ {
+ var error = "Invalid parent {0} for group {1}".SFormat(group.Name, parentname);
+ Log.ConsoleError(error);
+ return error;
+ }
+ group.Parent = parent;
+ }
- string query = (TShock.Config.StorageType.ToLower() == "sqlite") ?
- "INSERT OR IGNORE INTO GroupList (GroupName, Parent, Commands, ChatColor) VALUES (@0, @1, @2, @3);" :
- "INSERT IGNORE INTO GroupList SET GroupName=@0, Parent=@1, Commands=@2, ChatColor=@3";
- if (database.Query(query, name, parentname, permissions, chatcolor) == 1)
- message = "Group " + name + " has been created successfully.";
+ string query = (TShock.Config.StorageType.ToLower() == "sqlite")
+ ? "INSERT OR IGNORE INTO GroupList (GroupName, Parent, Commands, ChatColor) VALUES (@0, @1, @2, @3);"
+ : "INSERT IGNORE INTO GroupList SET GroupName=@0, Parent=@1, Commands=@2, ChatColor=@3";
+ if (database.Query(query, name, parentname, permissions, chatcolor) == 1)
+ message = "Group " + name + " has been created successfully.";
- groups.Add(group);
+ groups.Add(group);
- return message;
- }
- public String AddGroup(String name, String permissions)
- {
- return AddGroup(name, "", permissions, "255,255,255");
- }
- public String AddGroup(String name, string parent, String permissions)
- {
- return AddGroup(name, parent, permissions, "255,255,255");
- }
+ return message;
+ }
- public String DeleteGroup(String name)
- {
- String message = "";
- if (!GroupExists(name))
- return "Error: Group doesn't exists.";
+ public String AddGroup(String name, String permissions)
+ {
+ return AddGroup(name, "", permissions, "255,255,255");
+ }
- if (database.Query("DELETE FROM GroupList WHERE GroupName=@0", name) == 1)
- message = "Group " + name + " has been deleted successfully.";
- groups.Remove(TShock.Utils.GetGroup(name));
+ public String AddGroup(String name, string parent, String permissions)
+ {
+ return AddGroup(name, parent, permissions, "255,255,255");
+ }
- return message;
- }
+ public String DeleteGroup(String name)
+ {
+ String message = "";
+ if (!GroupExists(name))
+ return "Error: Group doesn't exists.";
- public String AddPermissions(String name, List permissions)
- {
- String message = "";
- if (!GroupExists(name))
- return "Error: Group doesn't exists.";
+ if (database.Query("DELETE FROM GroupList WHERE GroupName=@0", name) == 1)
+ message = "Group " + name + " has been deleted successfully.";
+ groups.Remove(TShock.Utils.GetGroup(name));
- var group = TShock.Utils.GetGroup(name);
- //Add existing permissions (without duplicating)
- permissions.AddRange(group.permissions.Where(s => !permissions.Contains(s)));
+ return message;
+ }
- if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", String.Join(",", permissions), name) != 0)
- {
- message = "Group " + name + " has been modified successfully.";
- group.SetPermission( permissions );
- }
- return message;
- }
+ public String AddPermissions(String name, List permissions)
+ {
+ String message = "";
+ if (!GroupExists(name))
+ return "Error: Group doesn't exists.";
- public String DeletePermissions(String name, List permissions)
- {
- String message = "";
- if (!GroupExists(name))
- return "Error: Group doesn't exists.";
+ var group = TShock.Utils.GetGroup(name);
+ //Add existing permissions (without duplicating)
+ permissions.AddRange(group.permissions.Where(s => !permissions.Contains(s)));
- var group = TShock.Utils.GetGroup(name);
+ if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", String.Join(",", permissions), name) != 0)
+ {
+ message = "Group " + name + " has been modified successfully.";
+ group.SetPermission(permissions);
+ }
+ return message;
+ }
- //Only get permissions that exist in the group.
- var newperms = group.permissions.Except( permissions );
+ public String DeletePermissions(String name, List permissions)
+ {
+ String message = "";
+ if (!GroupExists(name))
+ return "Error: Group doesn't exists.";
- if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", String.Join(",", newperms), name) != 0)
- {
- message = "Group " + name + " has been modified successfully.";
- group.SetPermission( newperms.ToList() );
- }
- return message;
- }
+ var group = TShock.Utils.GetGroup(name);
- public void LoadPermisions()
- {
- //Create a temporary list so if there is an error it doesn't override the currently loaded groups with broken groups.
- var tempgroups = new List();
- tempgroups.Add(new SuperAdminGroup());
+ //Only get permissions that exist in the group.
+ var newperms = group.permissions.Except(permissions);
- if (groups == null || groups.Count < 2)
- groups = tempgroups;
+ if (database.Query("UPDATE GroupList SET Commands=@0 WHERE GroupName=@1", String.Join(",", newperms), name) != 0)
+ {
+ message = "Group " + name + " has been modified successfully.";
+ group.SetPermission(newperms.ToList());
+ }
+ return message;
+ }
- try
- {
- var groupsparents = new List>();
- using (var reader = database.QueryReader("SELECT * FROM GroupList"))
- {
- while (reader.Read())
- {
- string groupname = reader.Get("GroupName");
- var group = new Group(groupname);
+ public void LoadPermisions()
+ {
+ //Create a temporary list so if there is an error it doesn't override the currently loaded groups with broken groups.
+ var tempgroups = new List();
+ tempgroups.Add(new SuperAdminGroup());
- group.Prefix = reader.Get("Prefix");
- group.Suffix= reader.Get("Suffix");
+ if (groups == null || groups.Count < 2)
+ groups = tempgroups;
- //Inherit Given commands
- String[] commands = reader.Get("Commands").Split(',');
- foreach (var t in commands)
- {
- var str = t.Trim();
- if (str.StartsWith("!"))
- {
- group.NegatePermission(str.Substring(1));
- }
- else
- {
- group.AddPermission(str);
- }
- }
- String[] chatcolour = (reader.Get("ChatColor") ?? "").Split(',');
- if (chatcolour.Length == 3)
- {
- byte.TryParse(chatcolour[0], out group.R);
- byte.TryParse(chatcolour[1], out group.G);
- byte.TryParse(chatcolour[2], out group.B);
- }
+ try
+ {
+ var groupsparents = new List>();
+ using (var reader = database.QueryReader("SELECT * FROM GroupList"))
+ {
+ while (reader.Read())
+ {
+ string groupname = reader.Get("GroupName");
+ var group = new Group(groupname);
- groupsparents.Add(Tuple.Create(group, reader.Get("Parent")));
- }
- }
+ group.Prefix = reader.Get("Prefix");
+ group.Suffix = reader.Get("Suffix");
- foreach (var t in groupsparents)
- {
- var group = t.Item1;
- var parentname = t.Item2;
- if (!string.IsNullOrWhiteSpace(parentname))
- {
- var parent = groupsparents.FirstOrDefault(gp => gp.Item1.Name == parentname);
- if (parent == null)
- {
- Log.ConsoleError("Invalid parent {0} for group {1}".SFormat(group.Name, parentname));
- return;
- }
- group.Parent = parent.Item1;
- }
- tempgroups.Add(group);
- }
+ //Inherit Given commands
+ String[] commands = reader.Get("Commands").Split(',');
+ foreach (var t in commands)
+ {
+ var str = t.Trim();
+ if (str.StartsWith("!"))
+ {
+ group.NegatePermission(str.Substring(1));
+ }
+ else
+ {
+ group.AddPermission(str);
+ }
+ }
+ String[] chatcolour = (reader.Get("ChatColor") ?? "").Split(',');
+ if (chatcolour.Length == 3)
+ {
+ byte.TryParse(chatcolour[0], out group.R);
+ byte.TryParse(chatcolour[1], out group.G);
+ byte.TryParse(chatcolour[2], out group.B);
+ }
+
+ groupsparents.Add(Tuple.Create(group, reader.Get("Parent")));
+ }
+ }
+
+ foreach (var t in groupsparents)
+ {
+ var group = t.Item1;
+ var parentname = t.Item2;
+ if (!string.IsNullOrWhiteSpace(parentname))
+ {
+ var parent = groupsparents.FirstOrDefault(gp => gp.Item1.Name == parentname);
+ if (parent == null)
+ {
+ Log.ConsoleError("Invalid parent {0} for group {1}".SFormat(group.Name, parentname));
+ return;
+ }
+ group.Parent = parent.Item1;
+ }
+ tempgroups.Add(group);
+ }
- groups = tempgroups;
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- }
- }
-}
+ groups = tempgroups;
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/TShockAPI/DB/IQueryBuilder.cs b/TShockAPI/DB/IQueryBuilder.cs
index 3ca1d3de..e45a77e1 100644
--- a/TShockAPI/DB/IQueryBuilder.cs
+++ b/TShockAPI/DB/IQueryBuilder.cs
@@ -7,42 +7,55 @@ using TShockAPI.Extensions;
namespace TShockAPI.DB
{
- public interface IQueryBuilder
- {
- string CreateTable(SqlTable table);
- string AlterTable(SqlTable from, SqlTable to);
- string DbTypeToString(MySqlDbType type, int? length);
- string UpdateValue(string table, List values, List wheres);
- string InsertValues(string table, List values);
- string ReadColumn(string table, List wheres);
- string DeleteRow(string table, List wheres);
- }
+ public interface IQueryBuilder
+ {
+ string CreateTable(SqlTable table);
+ string AlterTable(SqlTable from, SqlTable to);
+ string DbTypeToString(MySqlDbType type, int? length);
+ string UpdateValue(string table, List values, List wheres);
+ string InsertValues(string table, List values);
+ string ReadColumn(string table, List wheres);
+ string DeleteRow(string table, List wheres);
+ }
- public class SqliteQueryCreator : IQueryBuilder
- {
- public string CreateTable(SqlTable table)
- {
- var columns = table.Columns.Select(c => "'{0}' {1} {2} {3} {4}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "", c.AutoIncrement ? "AUTOINCREMENT" : "", c.NotNull ? "NOT NULL" : "", c.Unique ? "UNIQUE" : ""));
- return "CREATE TABLE '{0}' ({1})".SFormat(table.Name, string.Join(", ", columns));
- }
- static Random rand = new Random();
- ///
- /// Alter a table from source to destination
- ///
- /// Must have name and column names. Column types are not required
- /// Must have column names and column types.
- ///
- public string AlterTable(SqlTable from, SqlTable to)
- {
- var rstr = rand.NextString(20);
- var alter = "ALTER TABLE '{0}' RENAME TO '{1}_{0}'".SFormat(from.Name, rstr);
- var create = CreateTable(to);
- //combine all columns in the 'from' variable excluding ones that aren't in the 'to' variable.
- //exclude the ones that aren't in 'to' variable because if the column is deleted, why try to import the data?
- var insert = "INSERT INTO '{0}' ({1}) SELECT {1} FROM {2}_{0}".SFormat(from.Name, string.Join(", ", from.Columns.Where(c => to.Columns.Any(c2 => c2.Name == c.Name)).Select(c => c.Name)), rstr);
- var drop = "DROP TABLE '{0}_{1}'".SFormat(rstr, from.Name);
- return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop);
- /*
+ public class SqliteQueryCreator : IQueryBuilder
+ {
+ public string CreateTable(SqlTable table)
+ {
+ var columns =
+ table.Columns.Select(
+ c =>
+ "'{0}' {1} {2} {3} {4}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "",
+ c.AutoIncrement ? "AUTOINCREMENT" : "", c.NotNull ? "NOT NULL" : "",
+ c.Unique ? "UNIQUE" : ""));
+ return "CREATE TABLE '{0}' ({1})".SFormat(table.Name, string.Join(", ", columns));
+ }
+
+ private static Random rand = new Random();
+
+ ///
+ /// Alter a table from source to destination
+ ///
+ /// Must have name and column names. Column types are not required
+ /// Must have column names and column types.
+ ///
+ public string AlterTable(SqlTable from, SqlTable to)
+ {
+ var rstr = rand.NextString(20);
+ var alter = "ALTER TABLE '{0}' RENAME TO '{1}_{0}'".SFormat(from.Name, rstr);
+ var create = CreateTable(to);
+ //combine all columns in the 'from' variable excluding ones that aren't in the 'to' variable.
+ //exclude the ones that aren't in 'to' variable because if the column is deleted, why try to import the data?
+ var insert = "INSERT INTO '{0}' ({1}) SELECT {1} FROM {2}_{0}".SFormat(from.Name,
+ string.Join(", ",
+ from.Columns.Where(
+ c =>
+ to.Columns.Any(
+ c2 => c2.Name == c.Name)).Select
+ (c => c.Name)), rstr);
+ var drop = "DROP TABLE '{0}_{1}'".SFormat(rstr, from.Name);
+ return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop);
+ /*
ALTER TABLE "main"."Bans" RENAME TO "oXHFcGcd04oXHFcGcd04_Bans"
CREATE TABLE "main"."Bans" ("IP" TEXT PRIMARY KEY ,"Name" TEXT)
INSERT INTO "main"."Bans" SELECT "IP","Name" FROM "main"."oXHFcGcd04oXHFcGcd04_Bans"
@@ -50,238 +63,264 @@ namespace TShockAPI.DB
*
* Twitchy - Oh. I get it!
*/
- }
- public string DeleteRow(string table, List wheres)
- {
- var sbwheres = new StringBuilder();
- int count = 0;
- foreach (SqlValue where in wheres)
- {
- sbwheres.Append(where.Name + "=" + where.Value);
- if (count != wheres.Count - 1)
- sbwheres.Append(" AND ");
- count++;
- }
- if (wheres.Count > 0)
- return "DELETE FROM '{0}' WHERE {1} ".SFormat(table, sbwheres.ToString());
- else
- return "DELETE FROM '{0}'".SFormat(table, sbwheres.ToString());
- }
- public string UpdateValue(string table, List values, List wheres)
- {
- var sbvalues = new StringBuilder();
- var sbwheres = new StringBuilder();
- int count = 0;
- foreach (SqlValue value in values)
- {
- sbvalues.Append(value.Name + "=" + value.Value);
- if (count != values.Count - 1)
- sbvalues.Append(",");
- count++;
- }
- count = 0;
- foreach (SqlValue where in wheres)
- {
- sbwheres.Append(where.Name + "=" + where.Value);
- if (count != wheres.Count - 1)
- sbwheres.Append(" AND ");
- count++;
- }
+ }
- if (wheres.Count > 0)
- return "UPDATE '{0}' SET {1} WHERE {2}".SFormat(table, sbvalues.ToString(), sbwheres.ToString());
- else
- return "UPDATE '{0}' SET {1}".SFormat(table, sbvalues.ToString());
- }
- public string InsertValues(string table, List values)
- {
- var sbnames = new StringBuilder();
- var sbvalues = new StringBuilder();
- int count = 0;
+ public string DeleteRow(string table, List wheres)
+ {
+ var sbwheres = new StringBuilder();
+ int count = 0;
+ foreach (SqlValue where in wheres)
+ {
+ sbwheres.Append(where.Name + "=" + where.Value);
+ if (count != wheres.Count - 1)
+ sbwheres.Append(" AND ");
+ count++;
+ }
+ if (wheres.Count > 0)
+ return "DELETE FROM '{0}' WHERE {1} ".SFormat(table, sbwheres.ToString());
+ else
+ return "DELETE FROM '{0}'".SFormat(table, sbwheres.ToString());
+ }
- foreach (SqlValue name in values)
- {
- sbnames.Append(name.Name);
+ public string UpdateValue(string table, List values, List wheres)
+ {
+ var sbvalues = new StringBuilder();
+ var sbwheres = new StringBuilder();
+ int count = 0;
+ foreach (SqlValue value in values)
+ {
+ sbvalues.Append(value.Name + "=" + value.Value);
+ if (count != values.Count - 1)
+ sbvalues.Append(",");
+ count++;
+ }
+ count = 0;
+ foreach (SqlValue where in wheres)
+ {
+ sbwheres.Append(where.Name + "=" + where.Value);
+ if (count != wheres.Count - 1)
+ sbwheres.Append(" AND ");
+ count++;
+ }
- if (count != values.Count - 1)
- sbnames.Append(", ");
- count++;
- }
- count = 0;
- foreach (SqlValue value in values)
- {
- sbvalues.Append(value.Value.ToString());
- if (count != values.Count - 1)
- sbvalues.Append(", ");
- count++;
- }
- return "INSERT INTO '{0}' ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString());
- }
- public string ReadColumn(string table, List wheres)
- {
- var sbwheres = new StringBuilder();
- int count = 0;
+ if (wheres.Count > 0)
+ return "UPDATE '{0}' SET {1} WHERE {2}".SFormat(table, sbvalues.ToString(), sbwheres.ToString());
+ else
+ return "UPDATE '{0}' SET {1}".SFormat(table, sbvalues.ToString());
+ }
- foreach (SqlValue where in wheres)
- {
- sbwheres.Append(where.Name + "=" + where.Value);
- if (count != wheres.Count - 1)
- sbwheres.Append(" AND ");
- count++;
- }
+ public string InsertValues(string table, List values)
+ {
+ var sbnames = new StringBuilder();
+ var sbvalues = new StringBuilder();
+ int count = 0;
- if(wheres.Count > 0)
- return "SELECT * FROM {0} WHERE {1}".SFormat(table, sbwheres.ToString());
- else
- return "SELECT * FROM {0}".SFormat(table);
- }
+ foreach (SqlValue name in values)
+ {
+ sbnames.Append(name.Name);
- static readonly Dictionary TypesAsStrings = new Dictionary
- {
- {MySqlDbType.VarChar, "TEXT"},
- {MySqlDbType.String, "TEXT"},
- {MySqlDbType.Text, "TEXT"},
- {MySqlDbType.TinyText, "TEXT"},
- {MySqlDbType.MediumText, "TEXT"},
- {MySqlDbType.LongText, "TEXT"},
- {MySqlDbType.Int32, "INTEGER"},
- };
- public string DbTypeToString(MySqlDbType type, int? length)
- {
- string ret;
- if (TypesAsStrings.TryGetValue(type, out ret))
- return ret;
- throw new NotImplementedException(Enum.GetName(typeof(MySqlDbType), type));
- }
- }
- public class MysqlQueryCreator : IQueryBuilder
- {
- public string CreateTable(SqlTable table)
- {
- var columns = table.Columns.Select(c => "{0} {1} {2} {3}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "", c.AutoIncrement ? "AUTO_INCREMENT" : "", c.NotNull ? "NOT NULL" : ""));
- var uniques = table.Columns.Where(c => c.Unique).Select(c => c.Name);
- return "CREATE TABLE {0} ({1} {2})".SFormat(table.Name, string.Join(", ", columns), uniques.Count() > 0 ? ", UNIQUE({0})".SFormat(string.Join(", ", uniques)) : "");
- }
- static Random rand = new Random();
- ///
- /// Alter a table from source to destination
- ///
- /// Must have name and column names. Column types are not required
- /// Must have column names and column types.
- ///
- public string AlterTable(SqlTable from, SqlTable to)
- {
- var rstr = rand.NextString(20);
- var alter = "RENAME TABLE {0} TO {1}_{0}".SFormat(from.Name, rstr);
- var create = CreateTable(to);
- //combine all columns in the 'from' variable excluding ones that aren't in the 'to' variable.
- //exclude the ones that aren't in 'to' variable because if the column is deleted, why try to import the data?
- var insert = "INSERT INTO {0} ({1}) SELECT {1} FROM {2}_{0}".SFormat(from.Name, string.Join(", ", from.Columns.Where(c => to.Columns.Any(c2 => c2.Name == c.Name)).Select(c => c.Name)), rstr);
- var drop = "DROP TABLE {0}_{1}".SFormat(rstr, from.Name);
- return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop);
- }
- public string DeleteRow(string table, List wheres)
- {
- var sbwheres = new StringBuilder();
- int count = 0;
- foreach (SqlValue where in wheres)
- {
- sbwheres.Append(where.Name + "=" + where.Value);
- if (count != wheres.Count - 1)
- sbwheres.Append(" AND ");
- count++;
- }
- if (wheres.Count > 0)
- return "DELETE FROM {0} WHERE {1} ".SFormat(table, sbwheres.ToString());
- else
- return "DELETE FROM {0}".SFormat(table, sbwheres.ToString());
- }
- public string UpdateValue(string table, List values, List wheres)
- {
- var sbvalues = new StringBuilder();
- var sbwheres = new StringBuilder();
- int count = 0;
- foreach (SqlValue value in values)
- {
- sbvalues.Append(value.Name + "=" + value.Value);
- if (count != values.Count - 1)
- sbvalues.Append("AND");
- count++;
- }
- count = 0;
- foreach (SqlValue where in wheres)
- {
- sbwheres.Append(where.Name + "=" + where.Value);
- if (count != wheres.Count - 1)
- sbwheres.Append(" AND ");
- count++;
- }
+ if (count != values.Count - 1)
+ sbnames.Append(", ");
+ count++;
+ }
+ count = 0;
+ foreach (SqlValue value in values)
+ {
+ sbvalues.Append(value.Value.ToString());
+ if (count != values.Count - 1)
+ sbvalues.Append(", ");
+ count++;
+ }
+ return "INSERT INTO '{0}' ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString());
+ }
- if (wheres.Count > 0)
- return "UPDATE {0} SET {1} WHERE {2}".SFormat(table, sbvalues.ToString(), sbwheres.ToString());
- else
- return "UPDATE {0} SET {1}".SFormat(table, sbvalues.ToString());
- }
- public string InsertValues(string table, List values)
- {
- var sbnames = new StringBuilder();
- var sbvalues = new StringBuilder();
- int count = 0;
+ public string ReadColumn(string table, List wheres)
+ {
+ var sbwheres = new StringBuilder();
+ int count = 0;
- foreach (SqlValue name in values)
- {
- sbnames.Append(name.Name);
+ foreach (SqlValue where in wheres)
+ {
+ sbwheres.Append(where.Name + "=" + where.Value);
+ if (count != wheres.Count - 1)
+ sbwheres.Append(" AND ");
+ count++;
+ }
- if (count != values.Count - 1)
- sbnames.Append(", ");
- count++;
- }
- count = 0;
- foreach (SqlValue value in values)
- {
- sbvalues.Append(value.Value.ToString());
- if (count != values.Count - 1)
- sbvalues.Append(", ");
- count++;
- }
+ if (wheres.Count > 0)
+ return "SELECT * FROM {0} WHERE {1}".SFormat(table, sbwheres.ToString());
+ else
+ return "SELECT * FROM {0}".SFormat(table);
+ }
- return "INSERT INTO {0} ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString());
- }
- public string ReadColumn(string table, List wheres)
- {
- var sbwheres = new StringBuilder();
- int count = 0;
+ private static readonly Dictionary TypesAsStrings = new Dictionary
+ {
+ {MySqlDbType.VarChar, "TEXT"},
+ {MySqlDbType.String, "TEXT"},
+ {MySqlDbType.Text, "TEXT"},
+ {MySqlDbType.TinyText, "TEXT"},
+ {MySqlDbType.MediumText, "TEXT"},
+ {MySqlDbType.LongText, "TEXT"},
+ {MySqlDbType.Int32, "INTEGER"},
+ };
- foreach (SqlValue where in wheres)
- {
- sbwheres.Append(where.Name + "=" + where.Value);
- if (count != wheres.Count - 1)
- sbwheres.Append(" AND ");
- count++;
- }
+ public string DbTypeToString(MySqlDbType type, int? length)
+ {
+ string ret;
+ if (TypesAsStrings.TryGetValue(type, out ret))
+ return ret;
+ throw new NotImplementedException(Enum.GetName(typeof (MySqlDbType), type));
+ }
+ }
- if (wheres.Count > 0)
- return "SELECT * FROM {0} WHERE {1}".SFormat(table, sbwheres.ToString());
- else
- return "SELECT * FROM {0}".SFormat(table);
- }
+ public class MysqlQueryCreator : IQueryBuilder
+ {
+ public string CreateTable(SqlTable table)
+ {
+ var columns =
+ table.Columns.Select(
+ c =>
+ "{0} {1} {2} {3}".SFormat(c.Name, DbTypeToString(c.Type, c.Length), c.Primary ? "PRIMARY KEY" : "",
+ c.AutoIncrement ? "AUTO_INCREMENT" : "", c.NotNull ? "NOT NULL" : ""));
+ var uniques = table.Columns.Where(c => c.Unique).Select(c => c.Name);
+ return "CREATE TABLE {0} ({1} {2})".SFormat(table.Name, string.Join(", ", columns),
+ uniques.Count() > 0
+ ? ", UNIQUE({0})".SFormat(string.Join(", ", uniques))
+ : "");
+ }
- static readonly Dictionary TypesAsStrings = new Dictionary
- {
- {MySqlDbType.VarChar, "VARCHAR"},
- {MySqlDbType.String, "CHAR"},
- {MySqlDbType.Text, "TEXT"},
- {MySqlDbType.TinyText, "TINYTEXT"},
- {MySqlDbType.MediumText, "MEDIUMTEXT"},
- {MySqlDbType.LongText, "LONGTEXT"},
- {MySqlDbType.Int32, "INT"},
- };
- public string DbTypeToString(MySqlDbType type, int? length)
- {
- string ret;
- if (TypesAsStrings.TryGetValue(type, out ret))
- return ret + (length != null ? "({0})".SFormat((int)length) : "");
- throw new NotImplementedException(Enum.GetName(typeof(MySqlDbType), type));
- }
- }
-}
+ private static Random rand = new Random();
+
+ ///
+ /// Alter a table from source to destination
+ ///
+ /// Must have name and column names. Column types are not required
+ /// Must have column names and column types.
+ ///
+ public string AlterTable(SqlTable from, SqlTable to)
+ {
+ var rstr = rand.NextString(20);
+ var alter = "RENAME TABLE {0} TO {1}_{0}".SFormat(from.Name, rstr);
+ var create = CreateTable(to);
+ //combine all columns in the 'from' variable excluding ones that aren't in the 'to' variable.
+ //exclude the ones that aren't in 'to' variable because if the column is deleted, why try to import the data?
+ var insert = "INSERT INTO {0} ({1}) SELECT {1} FROM {2}_{0}".SFormat(from.Name,
+ string.Join(", ",
+ from.Columns.Where(
+ c =>
+ to.Columns.Any(
+ c2 => c2.Name == c.Name)).Select(
+ c => c.Name)), rstr);
+ var drop = "DROP TABLE {0}_{1}".SFormat(rstr, from.Name);
+ return "{0}; {1}; {2}; {3};".SFormat(alter, create, insert, drop);
+ }
+
+ public string DeleteRow(string table, List wheres)
+ {
+ var sbwheres = new StringBuilder();
+ int count = 0;
+ foreach (SqlValue where in wheres)
+ {
+ sbwheres.Append(where.Name + "=" + where.Value);
+ if (count != wheres.Count - 1)
+ sbwheres.Append(" AND ");
+ count++;
+ }
+ if (wheres.Count > 0)
+ return "DELETE FROM {0} WHERE {1} ".SFormat(table, sbwheres.ToString());
+ else
+ return "DELETE FROM {0}".SFormat(table, sbwheres.ToString());
+ }
+
+ public string UpdateValue(string table, List values, List wheres)
+ {
+ var sbvalues = new StringBuilder();
+ var sbwheres = new StringBuilder();
+ int count = 0;
+ foreach (SqlValue value in values)
+ {
+ sbvalues.Append(value.Name + "=" + value.Value);
+ if (count != values.Count - 1)
+ sbvalues.Append("AND");
+ count++;
+ }
+ count = 0;
+ foreach (SqlValue where in wheres)
+ {
+ sbwheres.Append(where.Name + "=" + where.Value);
+ if (count != wheres.Count - 1)
+ sbwheres.Append(" AND ");
+ count++;
+ }
+
+ if (wheres.Count > 0)
+ return "UPDATE {0} SET {1} WHERE {2}".SFormat(table, sbvalues.ToString(), sbwheres.ToString());
+ else
+ return "UPDATE {0} SET {1}".SFormat(table, sbvalues.ToString());
+ }
+
+ public string InsertValues(string table, List values)
+ {
+ var sbnames = new StringBuilder();
+ var sbvalues = new StringBuilder();
+ int count = 0;
+
+ foreach (SqlValue name in values)
+ {
+ sbnames.Append(name.Name);
+
+ if (count != values.Count - 1)
+ sbnames.Append(", ");
+ count++;
+ }
+ count = 0;
+ foreach (SqlValue value in values)
+ {
+ sbvalues.Append(value.Value.ToString());
+ if (count != values.Count - 1)
+ sbvalues.Append(", ");
+ count++;
+ }
+
+ return "INSERT INTO {0} ({1}) VALUES ({2})".SFormat(table, sbnames.ToString(), sbvalues.ToString());
+ }
+
+ public string ReadColumn(string table, List wheres)
+ {
+ var sbwheres = new StringBuilder();
+ int count = 0;
+
+ foreach (SqlValue where in wheres)
+ {
+ sbwheres.Append(where.Name + "=" + where.Value);
+ if (count != wheres.Count - 1)
+ sbwheres.Append(" AND ");
+ count++;
+ }
+
+ if (wheres.Count > 0)
+ return "SELECT * FROM {0} WHERE {1}".SFormat(table, sbwheres.ToString());
+ else
+ return "SELECT * FROM {0}".SFormat(table);
+ }
+
+ private static readonly Dictionary TypesAsStrings = new Dictionary
+ {
+ {MySqlDbType.VarChar, "VARCHAR"},
+ {MySqlDbType.String, "CHAR"},
+ {MySqlDbType.Text, "TEXT"},
+ {MySqlDbType.TinyText, "TINYTEXT"},
+ {MySqlDbType.MediumText, "MEDIUMTEXT"},
+ {MySqlDbType.LongText, "LONGTEXT"},
+ {MySqlDbType.Int32, "INT"},
+ };
+
+ public string DbTypeToString(MySqlDbType type, int? length)
+ {
+ string ret;
+ if (TypesAsStrings.TryGetValue(type, out ret))
+ return ret + (length != null ? "({0})".SFormat((int) length) : "");
+ throw new NotImplementedException(Enum.GetName(typeof (MySqlDbType), type));
+ }
+ }
+}
\ No newline at end of file
diff --git a/TShockAPI/DB/InventoryManager.cs b/TShockAPI/DB/InventoryManager.cs
index 97feb6b4..623e9834 100644
--- a/TShockAPI/DB/InventoryManager.cs
+++ b/TShockAPI/DB/InventoryManager.cs
@@ -22,81 +22,86 @@ using MySql.Data.MySqlClient;
namespace TShockAPI.DB
{
- public class InventoryManager
- {
- public IDbConnection database;
+ public class InventoryManager
+ {
+ public IDbConnection database;
- public InventoryManager(IDbConnection db)
- {
- database = db;
+ public InventoryManager(IDbConnection db)
+ {
+ database = db;
- var table = new SqlTable("Inventory",
- new SqlColumn("Account", MySqlDbType.Int32) { Primary = true },
- new SqlColumn("MaxHealth", MySqlDbType.Int32),
- new SqlColumn("MaxMana", MySqlDbType.Int32),
- new SqlColumn("Inventory", MySqlDbType.Text)
- );
- var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator());
- creator.EnsureExists(table);
- }
+ var table = new SqlTable("Inventory",
+ new SqlColumn("Account", MySqlDbType.Int32) {Primary = true},
+ new SqlColumn("MaxHealth", MySqlDbType.Int32),
+ new SqlColumn("MaxMana", MySqlDbType.Int32),
+ new SqlColumn("Inventory", MySqlDbType.Text)
+ );
+ var creator = new SqlTableCreator(db,
+ db.GetSqlType() == SqlType.Sqlite
+ ? (IQueryBuilder) new SqliteQueryCreator()
+ : new MysqlQueryCreator());
+ creator.EnsureExists(table);
+ }
- public PlayerData GetPlayerData(TSPlayer player, int acctid)
- {
- PlayerData playerData = new PlayerData(player);
+ public PlayerData GetPlayerData(TSPlayer player, int acctid)
+ {
+ PlayerData playerData = new PlayerData(player);
- try
- {
- using (var reader = database.QueryReader("SELECT * FROM Inventory WHERE Account=@0", acctid))
- {
- if (reader.Read())
- {
- playerData.exists = true;
- playerData.maxHealth = reader.Get("MaxHealth");
- playerData.inventory = NetItem.Parse(reader.Get("Inventory"));
- return playerData;
- }
- }
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
+ try
+ {
+ using (var reader = database.QueryReader("SELECT * FROM Inventory WHERE Account=@0", acctid))
+ {
+ if (reader.Read())
+ {
+ playerData.exists = true;
+ playerData.maxHealth = reader.Get("MaxHealth");
+ playerData.inventory = NetItem.Parse(reader.Get("Inventory"));
+ return playerData;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
- return playerData;
- }
+ return playerData;
+ }
- public bool InsertPlayerData(TSPlayer player)
- {
- PlayerData playerData = player.PlayerData;
+ public bool InsertPlayerData(TSPlayer player)
+ {
+ PlayerData playerData = player.PlayerData;
- if (!player.IsLoggedIn)
- return false;
+ if (!player.IsLoggedIn)
+ return false;
- if (!GetPlayerData(player, player.UserID).exists)
- {
- try
- {
- database.Query("INSERT INTO Inventory (Account, MaxHealth, Inventory) VALUES (@0, @1, @2);", player.UserID, playerData.maxHealth, NetItem.ToString(playerData.inventory));
- return true;
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- }
- else
- {
- try
- {
- database.Query("UPDATE Inventory SET MaxHealth = @0, Inventory = @1 WHERE Account = @2;", playerData.maxHealth, NetItem.ToString(playerData.inventory), player.UserID);
- return true;
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- }
- return false;
- }
- }
-}
+ if (!GetPlayerData(player, player.UserID).exists)
+ {
+ try
+ {
+ database.Query("INSERT INTO Inventory (Account, MaxHealth, Inventory) VALUES (@0, @1, @2);", player.UserID,
+ playerData.maxHealth, NetItem.ToString(playerData.inventory));
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ }
+ else
+ {
+ try
+ {
+ database.Query("UPDATE Inventory SET MaxHealth = @0, Inventory = @1 WHERE Account = @2;", playerData.maxHealth,
+ NetItem.ToString(playerData.inventory), player.UserID);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ }
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs
index 4827c4a3..f1ef8d67 100644
--- a/TShockAPI/DB/ItemManager.cs
+++ b/TShockAPI/DB/ItemManager.cs
@@ -7,119 +7,122 @@ using MySql.Data.MySqlClient;
namespace TShockAPI.DB
{
- public class ItemManager
- {
- private IDbConnection database;
+ public class ItemManager
+ {
+ private IDbConnection database;
public List ItemBans = new List();
- public ItemManager(IDbConnection db)
- {
- database = db;
+ public ItemManager(IDbConnection db)
+ {
+ database = db;
- var table = new SqlTable("ItemBans",
- new SqlColumn("ItemName", MySqlDbType.VarChar, 50) { Primary = true },
- new SqlColumn("AllowedGroups", MySqlDbType.Text )
- );
- var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator());
- creator.EnsureExists(table);
+ var table = new SqlTable("ItemBans",
+ new SqlColumn("ItemName", MySqlDbType.VarChar, 50) {Primary = true},
+ new SqlColumn("AllowedGroups", MySqlDbType.Text)
+ );
+ var creator = new SqlTableCreator(db,
+ db.GetSqlType() == SqlType.Sqlite
+ ? (IQueryBuilder) new SqliteQueryCreator()
+ : new MysqlQueryCreator());
+ creator.EnsureExists(table);
- String file = Path.Combine(TShock.SavePath, "itembans.txt");
- if (File.Exists(file))
- {
- using (StreamReader sr = new StreamReader(file))
- {
- String line;
- while ((line = sr.ReadLine()) != null)
- {
- if (!line.Equals("") && !line.Substring(0, 1).Equals("#"))
- {
+ String file = Path.Combine(TShock.SavePath, "itembans.txt");
+ if (File.Exists(file))
+ {
+ using (StreamReader sr = new StreamReader(file))
+ {
+ String line;
+ while ((line = sr.ReadLine()) != null)
+ {
+ if (!line.Equals("") && !line.Substring(0, 1).Equals("#"))
+ {
+ string query = (TShock.Config.StorageType.ToLower() == "sqlite")
+ ? "INSERT OR IGNORE INTO 'ItemBans' (ItemName, AllowedGroups) VALUES (@0, @1);"
+ : "INSERT IGNORE INTO ItemBans SET ItemName=@0,AllowedGroups=@1 ;";
- string query = (TShock.Config.StorageType.ToLower() == "sqlite") ?
- "INSERT OR IGNORE INTO 'ItemBans' (ItemName, AllowedGroups) VALUES (@0, @1);" :
- "INSERT IGNORE INTO ItemBans SET ItemName=@0,AllowedGroups=@1 ;";
+ int id = 0;
+ int.TryParse(line, out id);
- int id = 0;
- int.TryParse(line, out id);
+ database.Query(query, TShock.Utils.GetItemById(id).name, "");
+ }
+ }
+ }
- database.Query(query, TShock.Utils.GetItemById(id).name, "");
- }
- }
- }
+ String path = Path.Combine(TShock.SavePath, "old_configs");
+ String file2 = Path.Combine(path, "itembans.txt");
+ if (!Directory.Exists(path))
+ Directory.CreateDirectory(path);
+ if (File.Exists(file2))
+ File.Delete(file2);
+ File.Move(file, file2);
+ }
- String path = Path.Combine(TShock.SavePath, "old_configs");
- String file2 = Path.Combine(path, "itembans.txt");
- if (!Directory.Exists(path))
- Directory.CreateDirectory(path);
- if (File.Exists(file2))
- File.Delete(file2);
- File.Move(file, file2);
- }
+ UpdateItemBans();
+ }
- UpdateItemBans();
- }
+ public void UpdateItemBans()
+ {
+ ItemBans.Clear();
- public void UpdateItemBans()
- {
- ItemBans.Clear();
-
- using (var reader = database.QueryReader("SELECT * FROM ItemBans"))
- {
- while (reader != null && reader.Read())
- {
+ using (var reader = database.QueryReader("SELECT * FROM ItemBans"))
+ {
+ while (reader != null && reader.Read())
+ {
ItemBan ban = new ItemBan(reader.Get("ItemName"));
- ban.SetAllowedGroups( reader.Get("AllowedGroups") );
+ ban.SetAllowedGroups(reader.Get("AllowedGroups"));
ItemBans.Add(ban);
- }
- }
- }
+ }
+ }
+ }
- public void AddNewBan(string itemname = "")
- {
- try
- {
- database.Query("INSERT INTO ItemBans (ItemName, AllowedGroups) VALUES (@0, @1);", TShock.Utils.GetItemByName(itemname)[0].name, "");
- if (!ItemIsBanned(itemname, null))
- ItemBans.Add( new ItemBan(itemname) );
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- }
+ public void AddNewBan(string itemname = "")
+ {
+ try
+ {
+ database.Query("INSERT INTO ItemBans (ItemName, AllowedGroups) VALUES (@0, @1);",
+ TShock.Utils.GetItemByName(itemname)[0].name, "");
+ if (!ItemIsBanned(itemname, null))
+ ItemBans.Add(new ItemBan(itemname));
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ }
- public void RemoveBan(string itemname)
- {
- if (!ItemIsBanned(itemname, null))
- return;
- try
- {
- database.Query("Delete FROM 'ItemBans' WHERE ItemName=@0;", TShock.Utils.GetItemByName(itemname)[0].name);
- ItemBans.Remove( new ItemBan(itemname) );
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- }
+ public void RemoveBan(string itemname)
+ {
+ if (!ItemIsBanned(itemname, null))
+ return;
+ try
+ {
+ database.Query("Delete FROM 'ItemBans' WHERE ItemName=@0;", TShock.Utils.GetItemByName(itemname)[0].name);
+ ItemBans.Remove(new ItemBan(itemname));
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ }
- public bool ItemIsBanned(string name)
- {
- if (ItemBans.Contains(new ItemBan(name)))
- {
- return true;
- }
- return false;
- }
+ public bool ItemIsBanned(string name)
+ {
+ if (ItemBans.Contains(new ItemBan(name)))
+ {
+ return true;
+ }
+ return false;
+ }
- public bool ItemIsBanned(string name, TSPlayer ply)
- {
- if (ItemBans.Contains( new ItemBan(name) ) )
+ public bool ItemIsBanned(string name, TSPlayer ply)
+ {
+ if (ItemBans.Contains(new ItemBan(name)))
{
ItemBan b = GetItemBanByName(name);
return !b.HasPermissionToUseItem(ply);
}
return false;
- }
+ }
public bool AllowGroup(string item, string name)
{
@@ -134,7 +137,7 @@ namespace TShockAPI.DB
b.SetAllowedGroups(groupsNew);
int q = database.Query("UPDATE ItemBans SET AllowedGroups=@0 WHERE ItemName=@1", groupsNew,
- item);
+ item);
return q > 0;
}
@@ -150,7 +153,7 @@ namespace TShockAPI.DB
b.RemoveGroup(group);
string groups = string.Join(",", b.AllowedGroups);
int q = database.Query("UPDATE ItemBans SET AllowedGroups=@0 WHERE ItemName=@1", groups,
- item);
+ item);
if (q > 0)
return true;
}
@@ -168,58 +171,58 @@ namespace TShockAPI.DB
}
return null;
}
- }
+ }
public class ItemBan : IEquatable
- {
- public string Name { get; set; }
+ {
+ public string Name { get; set; }
public List AllowedGroups { get; set; }
- public ItemBan(string name)
- : this()
- {
- Name = name;
+ public ItemBan(string name)
+ : this()
+ {
+ Name = name;
AllowedGroups = new List();
- }
+ }
- public ItemBan()
- {
- Name = "";
+ public ItemBan()
+ {
+ Name = "";
AllowedGroups = new List();
- }
+ }
public bool Equals(ItemBan other)
{
return Name == other.Name;
}
- public bool HasPermissionToUseItem(TSPlayer ply)
- {
+ public bool HasPermissionToUseItem(TSPlayer ply)
+ {
if (ply == null)
return false;
- return AllowedGroups.Contains(ply.Group.Name); // could add in the other permissions in this class instead of a giant if switch.
- }
-
- public void SetAllowedGroups( String groups )
- {
- // prevent null pointer exceptions
- if (!string.IsNullOrEmpty(groups))
- {
- List groupArr = groups.Split(',').ToList();
-
- for (int i = 0; i < groupArr.Count; i++)
- {
- groupArr[i] = groupArr[i].Trim();
- Console.WriteLine(groupArr[i]);
- }
- AllowedGroups = groupArr;
- }
+ return AllowedGroups.Contains(ply.Group.Name);
+ // could add in the other permissions in this class instead of a giant if switch.
}
- public bool RemoveGroup(string groupName)
+ public void SetAllowedGroups(String groups)
+ {
+ // prevent null pointer exceptions
+ if (!string.IsNullOrEmpty(groups))
+ {
+ List groupArr = groups.Split(',').ToList();
+
+ for (int i = 0; i < groupArr.Count; i++)
+ {
+ groupArr[i] = groupArr[i].Trim();
+ Console.WriteLine(groupArr[i]);
+ }
+ AllowedGroups = groupArr;
+ }
+ }
+
+ public bool RemoveGroup(string groupName)
{
return AllowedGroups.Remove(groupName);
}
- }
-
-}
+ }
+}
\ No newline at end of file
diff --git a/TShockAPI/DB/RegionManager.cs b/TShockAPI/DB/RegionManager.cs
index 37bc2e78..63befa4a 100644
--- a/TShockAPI/DB/RegionManager.cs
+++ b/TShockAPI/DB/RegionManager.cs
@@ -28,527 +28,538 @@ using Terraria;
namespace TShockAPI.DB
{
- public class RegionManager
- {
- public List Regions = new List();
+ public class RegionManager
+ {
+ public List Regions = new List();
- private IDbConnection database;
+ private IDbConnection database;
- public RegionManager(IDbConnection db)
- {
- database = db;
- var table = new SqlTable("Regions",
- new SqlColumn("X1", MySqlDbType.Int32),
- new SqlColumn("Y1", MySqlDbType.Int32),
- new SqlColumn("width", MySqlDbType.Int32),
- new SqlColumn("height", MySqlDbType.Int32),
- new SqlColumn("RegionName", MySqlDbType.VarChar, 50) { Primary = true },
- new SqlColumn("WorldID", MySqlDbType.Text),
- new SqlColumn("UserIds", MySqlDbType.Text),
- new SqlColumn("Protected", MySqlDbType.Int32),
- new SqlColumn("Groups", MySqlDbType.Text),
- new SqlColumn("Owner", MySqlDbType.VarChar, 50)
+ public RegionManager(IDbConnection db)
+ {
+ database = db;
+ var table = new SqlTable("Regions",
+ new SqlColumn("X1", MySqlDbType.Int32),
+ new SqlColumn("Y1", MySqlDbType.Int32),
+ new SqlColumn("width", MySqlDbType.Int32),
+ new SqlColumn("height", MySqlDbType.Int32),
+ new SqlColumn("RegionName", MySqlDbType.VarChar, 50) {Primary = true},
+ new SqlColumn("WorldID", MySqlDbType.Text),
+ new SqlColumn("UserIds", MySqlDbType.Text),
+ new SqlColumn("Protected", MySqlDbType.Int32),
+ new SqlColumn("Groups", MySqlDbType.Text),
+ new SqlColumn("Owner", MySqlDbType.VarChar, 50)
+ );
+ var creator = new SqlTableCreator(db,
+ db.GetSqlType() == SqlType.Sqlite
+ ? (IQueryBuilder) new SqliteQueryCreator()
+ : new MysqlQueryCreator());
+ creator.EnsureExists(table);
- );
- var creator = new SqlTableCreator(db, db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator());
- creator.EnsureExists(table);
+ ImportOld();
+ ReloadAllRegions();
+ }
- ImportOld();
- ReloadAllRegions();
+ [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
+ public void ImportOld()
+ {
+ String file = Path.Combine(TShock.SavePath, "regions.xml");
+ if (!File.Exists(file))
+ return;
- }
+ Region region;
+ Rectangle rect;
- [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
- public void ImportOld()
- {
- String file = Path.Combine(TShock.SavePath, "regions.xml");
- if (!File.Exists(file))
- return;
+ using (var reader = XmlReader.Create(new StreamReader(file), new XmlReaderSettings {CloseInput = true}))
+ {
+ // Parse the file and display each of the nodes.
+ while (reader.Read())
+ {
+ if (reader.NodeType != XmlNodeType.Element || reader.Name != "ProtectedRegion")
+ continue;
- Region region;
- Rectangle rect;
+ region = new Region();
+ rect = new Rectangle();
- using (var reader = XmlReader.Create(new StreamReader(file), new XmlReaderSettings { CloseInput = true }))
- {
- // Parse the file and display each of the nodes.
- while (reader.Read())
- {
- if (reader.NodeType != XmlNodeType.Element || reader.Name != "ProtectedRegion")
- continue;
+ bool endregion = false;
+ while (reader.Read() && !endregion)
+ {
+ if (reader.NodeType != XmlNodeType.Element)
+ continue;
- region = new Region();
- rect = new Rectangle();
+ string name = reader.Name;
- bool endregion = false;
- while (reader.Read() && !endregion)
- {
- if (reader.NodeType != XmlNodeType.Element)
- continue;
+ while (reader.Read() && reader.NodeType != XmlNodeType.Text) ;
- string name = reader.Name;
+ int t = 0;
- while (reader.Read() && reader.NodeType != XmlNodeType.Text) ;
+ switch (name)
+ {
+ case "RegionName":
+ region.Name = reader.Value;
+ break;
+ case "Point1X":
+ int.TryParse(reader.Value, out t);
+ rect.X = t;
+ break;
+ case "Point1Y":
+ int.TryParse(reader.Value, out t);
+ rect.Y = t;
+ break;
+ case "Point2X":
+ int.TryParse(reader.Value, out t);
+ rect.Width = t;
+ break;
+ case "Point2Y":
+ int.TryParse(reader.Value, out t);
+ rect.Height = t;
+ break;
+ case "Protected":
+ region.DisableBuild = reader.Value.ToLower().Equals("true");
+ break;
+ case "WorldName":
+ region.WorldID = reader.Value;
+ break;
+ case "AllowedUserCount":
+ break;
+ case "IP":
+ region.AllowedIDs.Add(int.Parse(reader.Value));
+ break;
+ default:
+ endregion = true;
+ break;
+ }
+ }
- int t = 0;
+ region.Area = rect;
+ string query = (TShock.Config.StorageType.ToLower() == "sqlite")
+ ? "INSERT OR IGNORE INTO Regions VALUES (@0, @1, @2, @3, @4, @5, @6, @7);"
+ : "INSERT IGNORE INTO Regions SET X1=@0, Y1=@1, height=@2, width=@3, RegionName=@4, WorldID=@5, UserIds=@6, Protected=@7;";
+ database.Query(query, region.Area.X, region.Area.Y, region.Area.Width, region.Area.Height, region.Name,
+ region.WorldID, "", region.DisableBuild);
- switch (name)
- {
- case "RegionName":
- region.Name = reader.Value;
- break;
- case "Point1X":
- int.TryParse(reader.Value, out t);
- rect.X = t;
- break;
- case "Point1Y":
- int.TryParse(reader.Value, out t);
- rect.Y = t;
- break;
- case "Point2X":
- int.TryParse(reader.Value, out t);
- rect.Width = t;
- break;
- case "Point2Y":
- int.TryParse(reader.Value, out t);
- rect.Height = t;
- break;
- case "Protected":
- region.DisableBuild = reader.Value.ToLower().Equals("true");
- break;
- case "WorldName":
- region.WorldID = reader.Value;
- break;
- case "AllowedUserCount":
- break;
- case "IP":
- region.AllowedIDs.Add(int.Parse(reader.Value));
- break;
- default:
- endregion = true;
- break;
- }
- }
+ //Todo: What should this be? We don't really have a way to go from ips to userids
+ /*string.Join(",", region.AllowedIDs)*/
+ }
+ }
- region.Area = rect;
- string query = (TShock.Config.StorageType.ToLower() == "sqlite") ?
- "INSERT OR IGNORE INTO Regions VALUES (@0, @1, @2, @3, @4, @5, @6, @7);" :
- "INSERT IGNORE INTO Regions SET X1=@0, Y1=@1, height=@2, width=@3, RegionName=@4, WorldID=@5, UserIds=@6, Protected=@7;";
- database.Query(query, region.Area.X, region.Area.Y, region.Area.Width, region.Area.Height, region.Name, region.WorldID, "", region.DisableBuild);
+ String path = Path.Combine(TShock.SavePath, "old_configs");
+ String file2 = Path.Combine(path, "regions.xml");
+ if (!Directory.Exists(path))
+ Directory.CreateDirectory(path);
+ if (File.Exists(file2))
+ File.Delete(file2);
+ File.Move(file, file2);
- //Todo: What should this be? We don't really have a way to go from ips to userids
- /*string.Join(",", region.AllowedIDs)*/
+ ReloadAllRegions();
+ }
- }
- }
+ public void ConvertDB()
+ {
+ try
+ {
+ database.Query("UPDATE Regions SET WorldID=@0, UserIds=''", Main.worldID.ToString());
+ ReloadAllRegions();
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.ToString());
+ }
+ }
- String path = Path.Combine(TShock.SavePath, "old_configs");
- String file2 = Path.Combine(path, "regions.xml");
- if (!Directory.Exists(path))
- Directory.CreateDirectory(path);
- if (File.Exists(file2))
- File.Delete(file2);
- File.Move(file, file2);
-
- ReloadAllRegions();
- }
-
- public void ConvertDB()
- {
- try
- {
- database.Query("UPDATE Regions SET WorldID=@0, UserIds=''", Main.worldID.ToString());
- ReloadAllRegions();
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- }
- }
-
- public void ReloadAllRegions()
- {
- try
- {
- using (var reader = database.QueryReader("SELECT * FROM Regions WHERE WorldID=@0", Main.worldID.ToString()))
- {
- Regions.Clear();
- while (reader.Read())
- {
- int X1 = reader.Get("X1");
- int Y1 = reader.Get("Y1");
- int height = reader.Get("height");
- int width = reader.Get("width");
- int Protected = reader.Get("Protected");
- string mergedids = reader.Get("UserIds");
- string name = reader.Get("RegionName");
+ public void ReloadAllRegions()
+ {
+ try
+ {
+ using (var reader = database.QueryReader("SELECT * FROM Regions WHERE WorldID=@0", Main.worldID.ToString()))
+ {
+ Regions.Clear();
+ while (reader.Read())
+ {
+ int X1 = reader.Get("X1");
+ int Y1 = reader.Get("Y1");
+ int height = reader.Get("height");
+ int width = reader.Get("width");
+ int Protected = reader.Get("Protected");
+ string mergedids = reader.Get("UserIds");
+ string name = reader.Get("RegionName");
string owner = reader.Get("Owner");
string groups = reader.Get