diff --git a/Build/Essentials.dll b/Build/Essentials.dll index 512a5c1..08d6359 100644 Binary files a/Build/Essentials.dll and b/Build/Essentials.dll differ diff --git a/Build/SignCommands.dll b/Build/SignCommands.dll index a25d61e..2a18726 100644 Binary files a/Build/SignCommands.dll and b/Build/SignCommands.dll differ diff --git a/Essentials and Sign Commands.sln b/Essentials and Sign Commands.sln index dac18be..02db5ad 100644 --- a/Essentials and Sign Commands.sln +++ b/Essentials and Sign Commands.sln @@ -1,6 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio Express 2013 for Windows Desktop +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials", "Essentials\Essentials.csproj", "{85F20ADC-C2D1-416D-B7FF-9433C75A8F01}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SignCommands", "SignCommands\SignCommands.csproj", "{AC6A21C4-6EFB-414B-BCE3-6B8F99F65165}" @@ -11,8 +13,8 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {85F20ADC-C2D1-416D-B7FF-9433C75A8F01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85F20ADC-C2D1-416D-B7FF-9433C75A8F01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85F20ADC-C2D1-416D-B7FF-9433C75A8F01}.Debug|Any CPU.ActiveCfg = Release|Any CPU + {85F20ADC-C2D1-416D-B7FF-9433C75A8F01}.Debug|Any CPU.Build.0 = Release|Any CPU {85F20ADC-C2D1-416D-B7FF-9433C75A8F01}.Release|Any CPU.ActiveCfg = Release|Any CPU {85F20ADC-C2D1-416D-B7FF-9433C75A8F01}.Release|Any CPU.Build.0 = Release|Any CPU {AC6A21C4-6EFB-414B-BCE3-6B8F99F65165}.Debug|Any CPU.ActiveCfg = Debug|Any CPU diff --git a/Essentials/Properties/AssemblyInfo.cs b/Essentials/Properties/AssemblyInfo.cs index 8dba805..75ac6cd 100644 --- a/Essentials/Properties/AssemblyInfo.cs +++ b/Essentials/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.5.3")] -[assembly: AssemblyFileVersion("1.5.3")] +[assembly: AssemblyVersion("1.6.0")] +[assembly: AssemblyFileVersion("1.6.0")] diff --git a/Essentials/esConfig.cs b/Essentials/esConfig.cs index 71dcbc9..0b25c40 100644 --- a/Essentials/esConfig.cs +++ b/Essentials/esConfig.cs @@ -1,12 +1,10 @@ -using System; -using System.IO; +using System.IO; using Newtonsoft.Json; using System.Collections.Generic; -using TShockAPI; namespace Essentials { - public class esConfig + public class EsConfig { public bool ShowBackMessageOnDeath = true; public string PrefixNicknamesWith = "~"; @@ -25,73 +23,16 @@ public class esConfig public List DisableSetHomeInRegions = new List(); public int BackCooldown = 0; - public static string ConfigPath = string.Empty; - public esConfig Write(string path) - { - File.WriteAllText(path, JsonConvert.SerializeObject(this, Formatting.Indented)); - return this; - } - public static esConfig Read(string path) - { - if (!File.Exists(path)) - { - WriteExample(path); - } - return JsonConvert.DeserializeObject(File.ReadAllText(path)); - } - public static void WriteExample(string path) - { - File.WriteAllText(path, @"{ - ""ShowBackMessageOnDeath"": true, - ""PrefixNicknamesWith"": ""~"", - ""LockRedTeam"": false, - ""RedTeamPassword"": """", - ""RedTeamPermission"": ""essentials.team.red"", - ""LockGreenTeam"": false, - ""GreenTeamPassword"": """", - ""GreenTeamPermission"": ""essentials.team.green"", - ""LockBlueTeam"": false, - ""BlueTeamPassword"": """", - ""BlueTeamPermission"": ""essentials.team.blue"", - ""LockYellowTeam"": false, - ""YellowTeamPassword"": """", - ""YellowTeamPermission"": ""essentials.team.yellow"", - ""DisableSetHomeInRegions"": [ - ""example"" - ], - ""BackCooldown"": 0 -}"); - } + public void Write(string path) + { + File.WriteAllText(path, JsonConvert.SerializeObject(this, Formatting.Indented)); + } - public static void LoadConfig() - { - try - { - ConfigPath = Path.Combine(Essentials.SavePath, "EssentialsConfig.json"); - Essentials.Config = esConfig.Read(ConfigPath).Write(ConfigPath); - } - catch (Exception ex) - { - Log.ConsoleError("[Essentials] Config Exception. Check logs for more details."); - Log.Error(ex.ToString()); - } - } - public static void ReloadConfig(CommandArgs args) - { - try - { - if (!Directory.Exists(Essentials.SavePath)) - { - Directory.CreateDirectory(Essentials.SavePath); - } - Essentials.Config = esConfig.Read(ConfigPath).Write(ConfigPath); - args.Player.SendSuccessMessage("[Essentials] Config reloaded successfully."); - } - catch (Exception ex) - { - args.Player.SendSuccessMessage("[Essnetials] Reload failed. Check logs for more details."); - Log.Error(string.Concat("[Essentials] Config Exception:\n", ex.ToString())); - } - } + public static EsConfig Read(string path) + { + return !File.Exists(path) + ? new EsConfig() + : JsonConvert.DeserializeObject(File.ReadAllText(path)); + } } } diff --git a/Essentials/esMain.cs b/Essentials/esMain.cs index de730d0..5e8ffdd 100644 --- a/Essentials/esMain.cs +++ b/Essentials/esMain.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; -using System.Reflection; using System.Text; using Terraria; using TerrariaApi.Server; @@ -11,30 +11,30 @@ namespace Essentials { - [ApiVersion(1, 14)] + [ApiVersion(1, 16)] public class Essentials : TerrariaPlugin { public override string Name { get { return "Essentials"; } } public override string Author { get { return "Scavenger"; } } public override string Description { get { return "Some Essential commands for TShock!"; } } - public override Version Version { get { return Assembly.GetExecutingAssembly().GetName().Version; } } + public override Version Version { get { return new Version(1, 6, 0); } } - public Dictionary Disabled = new Dictionary(); - public esPlayer[] esPlayers = new esPlayer[256]; - public DateTime LastCheck = DateTime.UtcNow; - public static esConfig Config = new esConfig(); - public static string SavePath = string.Empty; + private readonly Dictionary _disabled = new Dictionary(); + private readonly List _players = new List(); + private DateTime _lastCheck = DateTime.UtcNow; + private static EsConfig _config = new EsConfig(); + private static string _savePath = string.Empty; public Essentials(Main game) : base(game) { - base.Order = 5; + Order = 4; } public override void Initialize() { ServerApi.Hooks.GameInitialize.Register(this, OnInitialize); - ServerApi.Hooks.ServerJoin.Register(this, OnJoin); + ServerApi.Hooks.NetGreetPlayer.Register(this, OnGreet); ServerApi.Hooks.ServerLeave.Register(this, OnLeave); ServerApi.Hooks.ServerChat.Register(this, OnChat); PlayerHooks.PlayerCommand += OnPlayerCommand; @@ -43,12 +43,12 @@ public override void Initialize() ServerApi.Hooks.GameUpdate.Register(this, OnUpdate); } - protected override void Dispose(bool Disposing) + protected override void Dispose(bool disposing) { - if (Disposing) + if (disposing) { ServerApi.Hooks.GameInitialize.Deregister(this, OnInitialize); - ServerApi.Hooks.ServerJoin.Deregister(this, OnJoin); + ServerApi.Hooks.NetGreetPlayer.Deregister(this, OnGreet); ServerApi.Hooks.ServerLeave.Deregister(this, OnLeave); ServerApi.Hooks.ServerChat.Deregister(this, OnChat); PlayerHooks.PlayerCommand -= OnPlayerCommand; @@ -56,202 +56,214 @@ protected override void Dispose(bool Disposing) ServerApi.Hooks.NetSendBytes.Deregister(this, OnSendBytes); ServerApi.Hooks.GameUpdate.Deregister(this, OnUpdate); } - base.Dispose(Disposing); + base.Dispose(disposing); } - public void OnInitialize(EventArgs args) + private void OnInitialize(EventArgs args) { #region Add Commands - Commands.ChatCommands.Add(new Command("essentials.more", CMDmore, "more")); - Commands.ChatCommands.Add(new Command(new List { "essentials.position.get", "essentials.position.getother" }, CMDpos, "pos", "getpos")); - Commands.ChatCommands.Add(new Command("essentials.position.tp", CMDtppos, "tppos")); - Commands.ChatCommands.Add(new Command("essentials.position.ruler", CMDruler, "ruler")); - Commands.ChatCommands.Add(new Command("essentials.helpop.ask", CMDhelpop, "helpop")); - Commands.ChatCommands.Add(new Command("essentials.suicide", CMDsuicide, "suicide", "die")); - Commands.ChatCommands.Add(new Command("essentials.pvp.burn", CMDburn, "burn")); - Commands.ChatCommands.Add(new Command("essentials.kickall.kick", CMDkickall, "kickall")); - Commands.ChatCommands.Add(new Command("essentials.moon", CMDmoon, "moon")); - Commands.ChatCommands.Add(new Command(new List { "essentials.back.tp", "essentials.back.death" }, CMDback, "b")); - Commands.ChatCommands.Add(new Command("essentials.ids.search", CMDsitems, "sitem", "si", "searchitem")); - Commands.ChatCommands.Add(new Command("essentials.ids.search", CMDspage, "spage", "sp")); - Commands.ChatCommands.Add(new Command("essentials.ids.search", CMDsnpcs, "snpc", "sn", "searchnpc")); - Commands.ChatCommands.Add(new Command("essentials.home", CMDsethome, "sethome")); - Commands.ChatCommands.Add(new Command("essentials.home", CMDmyhome, "myhome")); - Commands.ChatCommands.Add(new Command("essentials.home", CMDdelhome, "delhome")); - Commands.ChatCommands.Add(new Command("essentials.essentials", CMDessentials, "essentials")); - Commands.ChatCommands.Add(new Command(/*no permission*/ CMDteamunlock, "teamunlock")); - Commands.ChatCommands.Add(new Command("essentials.lastcommand", CMDequals, "=") { DoLog = false }); - Commands.ChatCommands.Add(new Command("essentials.pvp.killr", CMDkillr, "killr")); - Commands.ChatCommands.Add(new Command("essentials.disable", CMDdisable, "disable")); - Commands.ChatCommands.Add(new Command("essentials.level.top", CMDtop, "top")); - Commands.ChatCommands.Add(new Command("essentials.level.up", CMDup, "up")); - Commands.ChatCommands.Add(new Command("essentials.level.down", CMDdown, "down")); - Commands.ChatCommands.Add(new Command("essentials.level.side", CMDleft, "left")); - Commands.ChatCommands.Add(new Command("essentials.level.side", CMDright, "right")); - Commands.ChatCommands.Add(new Command(new List { "essentials.playertime.set", "essentials.playertime.setother" }, CMDptime, "ptime")); - Commands.ChatCommands.Add(new Command("essentials.ping", CMDping, "ping", "pong", "echo")); - Commands.ChatCommands.Add(new Command("essentials.sudo", CMDsudo, "sudo")); - Commands.ChatCommands.Add(new Command("essentials.socialspy", CMDsocialspy, "socialspy")); - Commands.ChatCommands.Add(new Command("essentials.near", CMDnear, "near")); - Commands.ChatCommands.Add(new Command(new List { "essentials.nick.set", "essentials.nick.setother" }, CMDnick, "nick")); - Commands.ChatCommands.Add(new Command("essentials.realname", CMDrealname, "realname")); - Commands.ChatCommands.Add(new Command("essentials.exacttime", CMDetime, "etime", "exacttime")); - Commands.ChatCommands.Add(new Command("essentials.forcelogin", CMDforcelogin, "forcelogin")); - Commands.ChatCommands.Add(new Command("essentials.inventory.see", CMDinvsee, "invsee")); - Commands.ChatCommands.Add(new Command("essentials.whois", CMDwhois, "whois")); + Commands.ChatCommands.Add(new Command("essentials.more", CmdMore, "more")); + + Commands.ChatCommands.Add(new Command( + new List { "essentials.position.get", "essentials.position.getother" }, + CmdPos, "pos", "getpos")); + + Commands.ChatCommands.Add(new Command("essentials.position.tp", CmdTpPos, "tppos")); + Commands.ChatCommands.Add(new Command("essentials.position.ruler", CmdRuler, "ruler")); + Commands.ChatCommands.Add(new Command("essentials.helpop.ask", CmdHelpOp, "helpop")); + Commands.ChatCommands.Add(new Command("essentials.suicide", CmdSuicide, "suicide", "die")); + Commands.ChatCommands.Add(new Command("essentials.pvp.burn", CmdBurn, "burn")); + Commands.ChatCommands.Add(new Command("essentials.kickall.kick", CmdKickAll, "kickall")); + Commands.ChatCommands.Add(new Command("essentials.moon", CmdMoon, "moon")); + + Commands.ChatCommands.Add(new Command( + new List { "essentials.back.tp", "essentials.back.death" }, CmdBack, "b")); + + Commands.ChatCommands.Add(new Command("essentials.ids.search", CmdItemSearch, "sitem", "si", "searchitem")); + Commands.ChatCommands.Add(new Command("essentials.ids.search", CmdPageSearch, "spage", "sp")); + Commands.ChatCommands.Add(new Command("essentials.ids.search", CmdNpcSearch, "snpc", "sn", "searchnpc")); + Commands.ChatCommands.Add(new Command("essentials.home", CmdSetHome, "sethome")); + Commands.ChatCommands.Add(new Command("essentials.home", CmdMyHome, "myhome")); + Commands.ChatCommands.Add(new Command("essentials.home", CmdDeleteHome, "delhome")); + Commands.ChatCommands.Add(new Command("essentials.essentials", CmdReload, "essentials")); + Commands.ChatCommands.Add(new Command(CmdTeamUnlock, "teamunlock")); + Commands.ChatCommands.Add(new Command("essentials.lastcommand", CmdRepeatCommand, "=") { DoLog = false }); + Commands.ChatCommands.Add(new Command("essentials.pvp.killr", CmdKillReason, "killr")); + Commands.ChatCommands.Add(new Command("essentials.disable", CmdDisable, "disable")); + Commands.ChatCommands.Add(new Command("essentials.level.top", CmdTop, "top")); + Commands.ChatCommands.Add(new Command("essentials.level.up", CmdUp, "up")); + Commands.ChatCommands.Add(new Command("essentials.level.down", CmdDown, "down")); + Commands.ChatCommands.Add(new Command("essentials.level.side", CmdLeft, "left")); + Commands.ChatCommands.Add(new Command("essentials.level.side", CmdRight, "right")); + + Commands.ChatCommands.Add(new Command( + new List { "essentials.playertime.set", "essentials.playertime.setother" }, + CmdPTime, "ptime")); + + Commands.ChatCommands.Add(new Command("essentials.ping", CmdPing, "ping", "pong", "echo")); + Commands.ChatCommands.Add(new Command("essentials.sudo", CmdSudo, "sudo")); + Commands.ChatCommands.Add(new Command("essentials.socialspy", CmdSocialSpy, "socialspy")); + Commands.ChatCommands.Add(new Command("essentials.near", CmdNear, "near")); + + Commands.ChatCommands.Add(new Command( + new List { "essentials.nick.set", "essentials.nick.setother" }, CmdNick, "nick")); + + Commands.ChatCommands.Add(new Command("essentials.realname", CmdRealName, "realname")); + Commands.ChatCommands.Add(new Command("essentials.forcelogin", CmdForceLogin, "forcelogin")); + Commands.ChatCommands.Add(new Command("essentials.inventory.see", CmdInvSee, "invsee")); + Commands.ChatCommands.Add(new Command("essentials.whois", CmdWhoIs, "whois")); #endregion - SavePath = Path.Combine(TShock.SavePath, "Essentials"); - if (!Directory.Exists(SavePath)) - { - Directory.CreateDirectory(SavePath); - } + _savePath = Path.Combine(TShock.SavePath, "Essentials"); + if (!Directory.Exists(_savePath)) + Directory.CreateDirectory(_savePath); - esSQL.SetupDB(); - esConfig.LoadConfig(); + EsSql.SetupDb(); + var configPath = Path.Combine(_savePath, "esConfig.json"); + (_config = EsConfig.Read(configPath)).Write(configPath); } #region esPlayer Join / Leave - public void OnJoin(JoinEventArgs args) + + private void OnGreet(GreetPlayerEventArgs args) { - esPlayers[args.Who] = new esPlayer(args.Who); + var ePly = _players.AddObj(new EsPlayer(args.Who)); - if (Disabled.ContainsKey(TShock.Players[args.Who].Name)) - { - var ePly = esPlayers[args.Who]; - ePly.DisabledX = Disabled[TShock.Players[args.Who].Name][0]; - ePly.DisabledY = Disabled[TShock.Players[args.Who].Name][1]; - ePly.TSPlayer.Teleport(ePly.DisabledX * 16F, ePly.DisabledY * 16F); - ePly.Disabled = true; - ePly.Disable(); - ePly.LastDisabledCheck = DateTime.UtcNow; - ePly.TSPlayer.SendErrorMessage("You are still disabled."); - } + if (ePly == null || TShock.Players[args.Who] == null) return; - string nickname; - if (esSQL.GetNickname(TShock.Players[args.Who].Name, out nickname)) - { - var ePly = esPlayers[args.Who]; - ePly.HasNickName = true; - ePly.OriginalName = ePly.TSPlayer.Name; - ePly.Nickname = nickname; - } - } - public void OnLeave(LeaveEventArgs args) - { - if (esPlayers[args.Who].InvSee != null) - { - esPlayers[args.Who].InvSee.RestoreCharacter(TShock.Players[args.Who]); - } - esPlayers[args.Who] = null; + if (_disabled.ContainsKey(TShock.Players[args.Who].Name)) + { + if (_disabled[TShock.Players[args.Who].Name].Length != 2) return; + + ePly.DisabledX = _disabled[TShock.Players[args.Who].Name][0]; + ePly.DisabledY = _disabled[TShock.Players[args.Who].Name][1]; + ePly.TSPlayer.Teleport(ePly.DisabledX * 16F, ePly.DisabledY * 16F); + ePly.Disabled = true; + ePly.Disable(); + ePly.LastDisabledCheck = DateTime.UtcNow; + ePly.TSPlayer.SendErrorMessage("You are still disabled."); + } + + string nickname; + if (!EsSql.GetNickname(TShock.Players[args.Who].Name, out nickname)) return; + ePly.HasNickName = true; + ePly.OriginalName = ePly.TSPlayer.Name; + ePly.Nickname = nickname; } - #endregion + + private void OnLeave(LeaveEventArgs args) + { + var ply = FindPlayer(args.Who); + + if (TShock.Players[args.Who] == null || ply == null) + return; + + if (ply.InvSee == null) return; + ply.InvSee.RestoreCharacter(TShock.Players[args.Who]); + ply.InvSee = null; + + _players.RemoveAll(p => p.Index == args.Who); + } + + #endregion #region Chat / Command - public void OnChat(ServerChatEventArgs e) + + private void OnChat(ServerChatEventArgs e) { if (e.Handled) { return; } - if (e.Text == "/") - { - e.Handled = true; - return; - } - var ePly = esPlayers[e.Who]; + var ePly = FindPlayer(e.Who); var tPly = TShock.Players[e.Who]; - if (ePly.HasNickName && !e.Text.StartsWith("/") && !tPly.mute) - { - e.Handled = true; - string nick = Config.PrefixNicknamesWith + ePly.Nickname; - TShock.Utils.Broadcast(String.Format(TShock.Config.ChatFormat, tPly.Group.Name, tPly.Group.Prefix, nick, tPly.Group.Suffix, e.Text), - tPly.Group.R, tPly.Group.G, tPly.Group.B); - } - else if (ePly.HasNickName && e.Text.StartsWith("/me ") && !tPly.mute) - { - e.Handled = true; - string nick = Config.PrefixNicknamesWith + ePly.Nickname; - TShock.Utils.Broadcast(string.Format("*{0} {1}", nick, e.Text.Remove(0, 4)), 205, 133, 63); - } + if (ePly == null || tPly == null) + return; + + if (!ePly.TSPlayer.Active || !tPly.Active) return; + + if (ePly.HasNickName && !e.Text.StartsWith("/") && !tPly.mute) + { + e.Handled = true; + var nick = _config.PrefixNicknamesWith + ePly.Nickname; + TSPlayer.All.SendMessage(String.Format(TShock.Config.ChatFormat, tPly.Group.Name, tPly.Group.Prefix, nick, tPly.Group.Suffix, e.Text), + tPly.Group.R, tPly.Group.G, tPly.Group.B); + } + else if (ePly.HasNickName && e.Text.StartsWith("/me ") && !tPly.mute) + { + e.Handled = true; + var nick = _config.PrefixNicknamesWith + ePly.Nickname; + TSPlayer.All.SendMessage(string.Format("*{0} {1}", nick, e.Text.Remove(0, 4)), 205, 133, 63); + } } - public void OnPlayerCommand(PlayerCommandEventArgs e) + + private void OnPlayerCommand(PlayerCommandEventArgs e) { if (e.Handled) - { return; - } - if (e.Player.Index >= 0 && e.Player.Index <= 255) - { - if (e.CommandName != "=") - { - esPlayers[e.Player.Index].LastCMD = string.Concat("/", e.CommandText); - } + var ply = FindPlayer(e.Player.Index); - if ((e.CommandName == "tp" && e.Player.Group.HasPermission(Permissions.tp)) || - (e.CommandName == "home" && e.Player.Group.HasPermission(Permissions.home)) || - (e.CommandName == "spawn" && e.Player.Group.HasPermission(Permissions.spawn)) || - (e.CommandName == "warp" && e.Player.Group.HasPermission(Permissions.warp))) - { - var ePly = esPlayers[e.Player.Index]; - ePly.LastBackX = e.Player.TileX; - ePly.LastBackY = e.Player.TileY; - ePly.LastBackAction = BackAction.TP; - } - } - else if (e.CommandName == "whisper" || e.CommandName == "w" || e.CommandName == "tell" || - e.CommandName == "reply" || e.CommandName == "r") - { - if (!e.Player.Group.HasPermission(Permissions.whisper)) - { - return; - } - foreach (var player in esPlayers) - { - if (player == null || !player.SocialSpy || player.Index == e.Player.Index) - { - continue; - } - if ((e.CommandName == "reply" || e.CommandName == "r") && e.Player.LastWhisper != null) - { - player.TSPlayer.SendMessage(string.Format("[SocialSpy] from {0} to {1}: /{2}", e.Player.Name, e.Player.LastWhisper.Name, e.CommandText), Color.Gray); - } - else - { - player.TSPlayer.SendMessage(string.Format("[SocialSpy] {0}: /{1}", e.Player.Name, e.CommandText), Color.Gray); - } - } - } + if (ply == null) + return; + + if (e.CommandName != "=") + ply.LastCmd = string.Concat("/", e.CommandText); + + if ((e.CommandName != "tp" || !e.Player.Group.HasPermission(Permissions.tp)) && + (e.CommandName != "home" || !e.Player.Group.HasPermission(Permissions.home)) && + (e.CommandName != "spawn" || !e.Player.Group.HasPermission(Permissions.spawn)) && + (e.CommandName != "warp" || !e.Player.Group.HasPermission(Permissions.warp))) return; + + ply.LastBackX = e.Player.TileX; + ply.LastBackY = e.Player.TileY; + ply.LastBackAction = BackAction.Tp; + + if (e.CommandName != "whisper" && e.CommandName != "w" && e.CommandName != "tell" + && e.CommandName != "reply" && e.CommandName != "r") return; + + if (!e.Player.Group.HasPermission(Permissions.whisper)) + return; + + foreach (var player in _players) + { + if (player == null || !player.SocialSpy || player.Index == e.Player.Index) + continue; + if ((e.CommandName == "reply" || e.CommandName == "r") && e.Player.LastWhisper != null) + player.TSPlayer.SendMessage(string.Format("[SocialSpy] from {0} to {1}: /{2}", + e.Player.Name, e.Player.LastWhisper.Name, e.CommandText), Color.Gray); + else + player.TSPlayer.SendMessage(string.Format("[SocialSpy] {0}: /{1}", + e.Player.Name, e.CommandText), Color.Gray); + } } #endregion #region Get Data - public void OnGetData(GetDataEventArgs e) + private void OnGetData(GetDataEventArgs e) { - if (e.MsgID != PacketTypes.PlayerTeam || !(Config.LockRedTeam || Config.LockGreenTeam || Config.LockBlueTeam || Config.LockYellowTeam)) - { + if (e.MsgID != PacketTypes.PlayerTeam || !(_config.LockRedTeam || _config.LockGreenTeam || _config.LockBlueTeam || _config.LockYellowTeam)) return; - } var who = e.Msg.readBuffer[e.Index]; var team = e.Msg.readBuffer[e.Index + 1]; - var ePly = esPlayers[who]; + var ePly = FindPlayer(who); var tPly = TShock.Players[who]; - if (ePly == null || tPly == null) return; + if (ePly == null || tPly == null) + return; switch (team) { #region Red case 1: - if (Config.LockRedTeam && !tPly.Group.HasPermission(Config.RedTeamPermission) && (ePly.RedPassword != Config.RedTeamPassword || ePly.RedPassword == "")) + if (_config.LockRedTeam && !tPly.Group.HasPermission(_config.RedTeamPermission) && (ePly.RedPassword != _config.RedTeamPassword || ePly.RedPassword == "")) { e.Handled = true; tPly.SetTeam(tPly.Team); - if (Config.RedTeamPassword == "") + if (_config.RedTeamPassword == "") tPly.SendErrorMessage("You do not have permission to join that team."); else tPly.SendErrorMessage("That team is locked, use \'/teamunlock red \' to access it."); @@ -262,11 +274,11 @@ public void OnGetData(GetDataEventArgs e) #region Green case 2: - if (Config.LockGreenTeam && !tPly.Group.HasPermission(Config.GreenTeamPermission) && (ePly.GreenPassword != Config.GreenTeamPassword || ePly.GreenPassword == "")) + if (_config.LockGreenTeam && !tPly.Group.HasPermission(_config.GreenTeamPermission) && (ePly.GreenPassword != _config.GreenTeamPassword || ePly.GreenPassword == "")) { e.Handled = true; tPly.SetTeam(tPly.Team); - if (Config.GreenTeamPassword == "") + if (_config.GreenTeamPassword == "") tPly.SendErrorMessage("You do not have permission to join that team."); else tPly.SendErrorMessage("That team is locked, use \'/teamunlock green \' to access it."); @@ -277,11 +289,11 @@ public void OnGetData(GetDataEventArgs e) #region Blue case 3: - if (Config.LockBlueTeam && !tPly.Group.HasPermission(Config.BlueTeamPermission) && (ePly.BluePassword != Config.BlueTeamPassword || ePly.BluePassword == "")) + if (_config.LockBlueTeam && !tPly.Group.HasPermission(_config.BlueTeamPermission) && (ePly.BluePassword != _config.BlueTeamPassword || ePly.BluePassword == "")) { e.Handled = true; tPly.SetTeam(tPly.Team); - if (Config.BlueTeamPassword == "") + if (_config.BlueTeamPassword == "") tPly.SendErrorMessage("You do not have permission to join that team."); else tPly.SendErrorMessage("That team is locked, use \'/teamunlock blue \' to access it."); @@ -292,11 +304,11 @@ public void OnGetData(GetDataEventArgs e) #region Yellow case 4: - if (Config.LockYellowTeam && !tPly.Group.HasPermission(Config.YellowTeamPermission) && (ePly.YellowPassword != Config.YellowTeamPassword || ePly.YellowPassword == "")) + if (_config.LockYellowTeam && !tPly.Group.HasPermission(_config.YellowTeamPermission) && (ePly.YellowPassword != _config.YellowTeamPassword || ePly.YellowPassword == "")) { e.Handled = true; tPly.SetTeam(tPly.Team); - if (Config.YellowTeamPassword == "") + if (_config.YellowTeamPassword == "") tPly.SendErrorMessage("You do not have permission to join that team."); else tPly.SendErrorMessage("That team is locked, use \'/teamunlock yellow \' to access it."); @@ -311,36 +323,38 @@ public void OnGetData(GetDataEventArgs e) #region Send Bytes void OnSendBytes(SendBytesEventArgs args) { - if ((args.Buffer[4] != 7 && args.Buffer[4] != 18) || args.Socket.whoAmI < 0 || args.Socket.whoAmI > 255 || esPlayers[args.Socket.whoAmI].ptTime < 0.0) - { + var ply = FindPlayer(args.Socket.whoAmI); + if (ply == null) + return; + + if ((args.Buffer[4] != 7 && args.Buffer[4] != 18) || args.Socket.whoAmI < 0 || args.Socket.whoAmI > 255 || ply.PtTime < 0.0) return; - } + + switch (args.Buffer[4]) { case 7: - Buffer.BlockCopy(BitConverter.GetBytes((int)esPlayers[args.Socket.whoAmI].ptTime), 0, args.Buffer, 5, 4); - args.Buffer[9] = (byte)(esPlayers[args.Socket.whoAmI].ptDay ? 1 : 0); + Buffer.BlockCopy(BitConverter.GetBytes((int)ply.PtTime), 0, args.Buffer, 5, 4); + args.Buffer[9] = (byte)(ply.PtDay ? 1 : 0); break; case 18: - args.Buffer[5] = (byte)(esPlayers[args.Socket.whoAmI].ptDay ? 1 : 0); - Buffer.BlockCopy(BitConverter.GetBytes((int)esPlayers[args.Socket.whoAmI].ptTime), 0, args.Buffer, 6, 4); + args.Buffer[5] = (byte)(ply.PtDay ? 1 : 0); + Buffer.BlockCopy(BitConverter.GetBytes((int)ply.PtTime), 0, args.Buffer, 6, 4); break; } } #endregion - #region Timer - public void OnUpdate(EventArgs args) + #region On Update + private void OnUpdate(EventArgs args) { - if ((DateTime.UtcNow - LastCheck).TotalMilliseconds >= 1000) + if ((DateTime.UtcNow - _lastCheck).TotalMilliseconds >= 1000) { - LastCheck = DateTime.UtcNow; - foreach (var ePly in esPlayers) + _lastCheck = DateTime.UtcNow; + foreach (var ePly in _players) { - if (ePly == null) - { - continue; - } + if (ePly == null || ePly.TSPlayer == null) + continue; if (!ePly.SavedBackAction && ePly.TSPlayer.Dead) { @@ -350,7 +364,7 @@ public void OnUpdate(EventArgs args) ePly.LastBackY = ePly.TSPlayer.TileY; ePly.LastBackAction = BackAction.Death; ePly.SavedBackAction = true; - if (Config.ShowBackMessageOnDeath) + if (_config.ShowBackMessageOnDeath) ePly.TSPlayer.SendSuccessMessage("Type \"/b\" to return to your position before you died."); } } @@ -360,17 +374,14 @@ public void OnUpdate(EventArgs args) if (ePly.BackCooldown > 0) ePly.BackCooldown--; - if (ePly.ptTime > -1.0) + if (ePly.PtTime > -1.0) { - ePly.ptTime += 60.0; - if (!ePly.ptDay && ePly.ptTime > 32400.0) - { - ePly.ptDay = true; ePly.ptTime = 0.0; - } - else if (ePly.ptDay && ePly.ptTime > 54000.0) - { - ePly.ptDay = false; ePly.ptTime = 0.0; - } + ePly.PtTime += 60.0; + if (!ePly.PtDay && ePly.PtTime > 32400.0) + ePly.PtDay = true; ePly.PtTime = 0.0; + + if (ePly.PtDay && ePly.PtTime > 54000.0) + ePly.PtDay = false; ePly.PtTime = 0.0; } if (ePly.Disabled && ((DateTime.UtcNow - ePly.LastDisabledCheck).TotalMilliseconds) > 3000) @@ -378,9 +389,7 @@ public void OnUpdate(EventArgs args) ePly.LastDisabledCheck = DateTime.UtcNow; ePly.Disable(); if ((ePly.TSPlayer.TileX > ePly.DisabledX + 5 || ePly.TSPlayer.TileX < ePly.DisabledX - 5) || (ePly.TSPlayer.TileY > ePly.DisabledY + 5 || ePly.TSPlayer.TileY < ePly.DisabledY - 5)) - { ePly.TSPlayer.Teleport(ePly.DisabledX * 16F, ePly.DisabledY * 16F); - } } } } @@ -390,22 +399,20 @@ public void OnUpdate(EventArgs args) /* Commands: */ #region More - private void CMDmore(CommandArgs args) + private static void CmdMore(CommandArgs args) { if (args.Parameters.Count > 0 && args.Parameters[0].ToLower() == "all") { - bool full = true; - int i = 0; - foreach (Item item in args.TPlayer.inventory) + var full = true; + foreach (var item in args.TPlayer.inventory) { if (item == null || item.stack == 0) continue; - int amtToAdd = item.maxStack - item.stack; + var amtToAdd = item.maxStack - item.stack; if (item.stack > 0 && amtToAdd > 0 && !item.name.ToLower().Contains("coin")) { full = false; args.Player.GiveItem(item.type, item.name, item.width, item.height, amtToAdd); } - i++; } if (!full) args.Player.SendSuccessMessage("Filled all your items."); @@ -414,8 +421,8 @@ private void CMDmore(CommandArgs args) } else { - Item holding = args.Player.TPlayer.inventory[args.TPlayer.selectedItem]; - int amtToAdd = holding.maxStack - holding.stack; + var holding = args.Player.TPlayer.inventory[args.TPlayer.selectedItem]; + var amtToAdd = holding.maxStack - holding.stack; if (holding.stack > 0 && amtToAdd > 0) args.Player.GiveItem(holding.type, holding.name, holding.width, holding.height, amtToAdd); if (amtToAdd == 0) @@ -427,23 +434,23 @@ private void CMDmore(CommandArgs args) #endregion #region Position Commands - private void CMDpos(CommandArgs args) + private static void CmdPos(CommandArgs args) { if (args.Player.Group.HasPermission("essentials.position.getother") && args.Parameters.Count > 0) { - var PlayersFound = TShock.Utils.FindPlayer(string.Join(" ", args.Parameters)); - if (PlayersFound.Count != 1) + var found = TShock.Utils.FindPlayer(string.Join(" ", args.Parameters)); + if (found.Count != 1) { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No players matched." : "More than one player matched."); - return; + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); + return; } - args.Player.SendSuccessMessage("Position for {0}: X Tile: {1} - Y Tile: {2}", PlayersFound[0].Name, PlayersFound[0].TileX, PlayersFound[0].TileY); + args.Player.SendSuccessMessage("Position for {0}: X Tile: {1} - Y Tile: {2}", found[0].Name, found[0].TileX, found[0].TileY); return; } args.Player.SendSuccessMessage("X Tile: {0} - Y Tile: {1}", args.Player.TileX, args.Player.TileY); } - private void CMDtppos(CommandArgs args) + private void CmdTpPos(CommandArgs args) { if (args.Parameters.Count < 1 || args.Parameters.Count > 2) { @@ -451,32 +458,32 @@ private void CMDtppos(CommandArgs args) return; } - int X = 0, Y = 0; - if (!int.TryParse(args.Parameters[0], out X) || (args.Parameters.Count == 2 && !int.TryParse(args.Parameters[1], out Y))) + int x, y = 0; + if (!int.TryParse(args.Parameters[0], out x) + || (args.Parameters.Count == 2 && !int.TryParse(args.Parameters[1], out y))) { args.Player.SendErrorMessage("Usage: /tppos [Y]"); return; } if (args.Parameters.Count == 1) - Y = esUtils.GetTop(X); + y = esUtils.GetTop(x); - var ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (ePly != null) { ePly.LastBackX = args.Player.TileX; ePly.LastBackY = args.Player.TileY; - ePly.LastBackAction = BackAction.TP; + ePly.LastBackAction = BackAction.Tp; } - args.Player.Teleport(X * 16F, Y * 16F); - args.Player.SendSuccessMessage("Teleported you to X: {0} - Y: {1}", X, Y); + args.Player.Teleport(x * 16F, y * 16F); + args.Player.SendSuccessMessage("Teleported you to X: {0} - Y: {1}", x, y); } - private void CMDruler(CommandArgs args) + private static void CmdRuler(CommandArgs args) { - int choice = 0; - + int choice; if (args.Parameters.Count == 1 && int.TryParse(args.Parameters[0], out choice) && choice >= 1 && choice <= 2) @@ -500,7 +507,7 @@ private void CMDruler(CommandArgs args) #endregion #region HelpOp - private void CMDhelpop(CommandArgs args) + private void CmdHelpOp(CommandArgs args) { if (args.Parameters.Count < 1) { @@ -508,28 +515,30 @@ private void CMDhelpop(CommandArgs args) return; } - string text = string.Join(" ", args.Parameters); + var text = string.Join(" ", args.Parameters); - List online = new List(); + var online = new List(); - foreach (var ePly in esPlayers) + foreach (var ePly in _players.Where(ePly => ePly != null + && ePly.TSPlayer.Group.HasPermission("essentials.helpop.receive"))) { - if (ePly == null || !ePly.TSPlayer.Group.HasPermission("essentials.helpop.receive")) continue; - online.Add(ePly.TSPlayer.Name); - ePly.TSPlayer.SendMessage(string.Format("[HelpOp] {0}: {1}", args.Player.Name, text), Color.MediumPurple); + online.Add(ePly.TSPlayer.Name); + ePly.TSPlayer.SendMessage(string.Format("[HelpOp] {0}: {1}", args.Player.Name, text), + Color.MediumPurple); } - if (online.Count < 1) - args.Player.SendMessage("[HelpOp] There are no operators online to receive your message.", Color.MediumPurple); + if (online.Count == 0) + args.Player.SendMessage("[HelpOp] There are no operators online to receive your message.", + Color.MediumPurple); else { - string to = string.Join(", ", online); - args.Player.SendMessage(string.Format("[HelpOp] Your message has been received by the operator(s): {0}", to), Color.MediumPurple); + args.Player.SendMessage(string.Format("[HelpOp] Your message has been received by {0} operator{1}", + online.Count, online.Count == 1 ? "" : "s"), Color.MediumPurple); } } #endregion #region Suicide - private void CMDsuicide(CommandArgs args) + private static void CmdSuicide(CommandArgs args) { if (!args.Player.RealPlayer) return; @@ -538,7 +547,7 @@ private void CMDsuicide(CommandArgs args) #endregion #region Burn - private void CMDburn(CommandArgs args) + private static void CmdBurn(CommandArgs args) { if (args.Parameters.Count < 1 || args.Parameters.Count > 2) { @@ -546,39 +555,44 @@ private void CMDburn(CommandArgs args) return; } - int duration = 30; + var duration = 30; if (args.Parameters.Count == 2 && !int.TryParse(args.Parameters[1], out duration)) duration = 30; - duration *= 60; - var PlayersFound = TShock.Utils.FindPlayer(args.Parameters[0]); - if (PlayersFound.Count != 1) - { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No players matched." : "More than one player matched."); - return; - } - PlayersFound[0].SetBuff(24, duration); - args.Player.SendSuccessMessage("{0} Has been set on fire for {1} second(s).", PlayersFound[0].Name, duration); + //duration *= 60; + var found = TShock.Utils.FindPlayer(args.Parameters[0]); + if (found.Count == 0) + { + args.Player.SendErrorMessage("Invalid player"); + return; + } + if (found.Count > 1) + { + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); + return; + } + found[0].SetBuff(24, duration); + args.Player.SendSuccessMessage("{0} Has been set on fire for {1} second(s).", found[0].Name, duration); } #endregion #region KickAll - private void CMDkickall(CommandArgs args) + private void CmdKickAll(CommandArgs args) { - string Reason = string.Empty; + var reason = string.Empty; if (args.Parameters.Count > 0) - Reason = " (" + string.Join(" ", args.Parameters) + ")"; + reason = " (" + string.Join(" ", args.Parameters) + ")"; - foreach (var ePly in esPlayers) + foreach (var ePly in _players.Where(ePly => ePly != null + && !ePly.TSPlayer.Group.HasPermission("essentials.kickall.immune"))) { - if (ePly == null || ePly.TSPlayer.Group.HasPermission("essentials.kickall.immune")) continue; - ePly.TSPlayer.Disconnect(string.Format("Everyone has been kicked{0}", Reason)); + ePly.TSPlayer.Disconnect(string.Format("Everyone has been kicked{0}", reason)); } - TShock.Utils.Broadcast("Everyone has been kicked from the server.", Color.MediumSeaGreen); + TSPlayer.All.SendMessage("Everyone has been kicked from the server.", Color.MediumSeaGreen); } #endregion #region Moon - private void CMDmoon(CommandArgs args) + private static void CmdMoon(CommandArgs args) { if (args.Parameters.Count < 1) { @@ -586,7 +600,7 @@ private void CMDmoon(CommandArgs args) return; } - string subcmd = args.Parameters[0].ToLower(); + var subcmd = args.Parameters[0].ToLower(); switch (subcmd) { @@ -615,12 +629,12 @@ private void CMDmoon(CommandArgs args) #endregion #region Back - private void CMDback(CommandArgs args) + private void CmdBack(CommandArgs args) { - var ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (ePly.TSPlayer.Dead) { - args.Player.SendErrorMessage("Please wait till you respawn."); + args.Player.SendErrorMessage("Please wait until you respawn."); return; } if (ePly.BackCooldown > 0) @@ -629,33 +643,37 @@ private void CMDback(CommandArgs args) return; } - if (ePly.LastBackAction == BackAction.None) - args.Player.SendErrorMessage("You do not have a /b position stored."); - else if (ePly.LastBackAction == BackAction.TP) - { - if (Config.BackCooldown > 0 && !args.Player.Group.HasPermission("essentials.back.nocooldown")) - { - ePly.BackCooldown = Config.BackCooldown; - } - args.Player.Teleport(ePly.LastBackX * 16F, ePly.LastBackY * 16F); - args.Player.SendSuccessMessage("Moved you to your position before you last teleported."); + switch (ePly.LastBackAction) + { + case BackAction.None: + args.Player.SendErrorMessage("You do not have a /b position stored."); + break; + case BackAction.Tp: + if (_config.BackCooldown > 0 && !args.Player.Group.HasPermission("essentials.back.nocooldown")) + { + ePly.BackCooldown = _config.BackCooldown; + } + args.Player.Teleport(ePly.LastBackX * 16F, ePly.LastBackY * 16F); + args.Player.SendSuccessMessage("Moved you to your position before you last teleported."); + break; + case BackAction.Death: + if (args.Player.Group.HasPermission("essentials.back.death")) + { + if (_config.BackCooldown > 0 && !args.Player.Group.HasPermission("essentials.back.nocooldown")) + ePly.BackCooldown = _config.BackCooldown; + + args.Player.Teleport(ePly.LastBackX * 16F, ePly.LastBackY * 16F); + args.Player.SendSuccessMessage("Moved you to your position before you last died."); + } + else + args.Player.SendErrorMessage("You do not have permission to /b after death."); + break; } - else if (ePly.LastBackAction == BackAction.Death && args.Player.Group.HasPermission("essentials.back.death")) - { - if (Config.BackCooldown > 0 && !args.Player.Group.HasPermission("essentials.back.nocooldown")) - { - ePly.BackCooldown = Config.BackCooldown; - } - args.Player.Teleport(ePly.LastBackX * 16F, ePly.LastBackY * 16F); - args.Player.SendSuccessMessage("Moved you to your position before you last died."); - } - else - args.Player.SendErrorMessage("You do not have permission to /b after death."); } #endregion - #region Seach IDs - private void CMDspage(CommandArgs args) + #region Search IDs + private void CmdPageSearch(CommandArgs args) { if (args.Parameters.Count != 1) { @@ -663,19 +681,19 @@ private void CMDspage(CommandArgs args) return; } - int Page = 1; - if (!int.TryParse(args.Parameters[0], out Page)) + int page; + if (!int.TryParse(args.Parameters[0], out page)) { args.Player.SendErrorMessage(string.Format("Specified page ({0}) invalid.", args.Parameters[0])); return; } - var ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); - esUtils.DisplaySearchResults(args.Player, ePly.LastSearchResults, Page); + esUtils.DisplaySearchResults(args.Player, ePly.LastSearchResults, page); } - private void CMDsitems(CommandArgs args) + private void CmdItemSearch(CommandArgs args) { if (args.Parameters.Count < 1) { @@ -683,22 +701,22 @@ private void CMDsitems(CommandArgs args) return; } - string Search = string.Join(" ", args.Parameters); - List Results = esUtils.ItemIdSearch(Search); + var search = string.Join(" ", args.Parameters); + var results = esUtils.ItemIdSearch(search); - if (Results.Count < 1) + if (results.Count < 1) { args.Player.SendErrorMessage("Could not find any matching Items."); return; } - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); - ePly.LastSearchResults = Results; - esUtils.DisplaySearchResults(args.Player, Results, 1); + ePly.LastSearchResults = results; + esUtils.DisplaySearchResults(args.Player, results, 1); } - private void CMDsnpcs(CommandArgs args) + private void CmdNpcSearch(CommandArgs args) { if (args.Parameters.Count < 1) { @@ -706,24 +724,24 @@ private void CMDsnpcs(CommandArgs args) return; } - string Search = string.Join(" ", args.Parameters); - List Results = esUtils.NPCIdSearch(Search); + var search = string.Join(" ", args.Parameters); + var results = esUtils.NPCIdSearch(search); - if (Results.Count < 1) + if (results.Count < 1) { args.Player.SendErrorMessage("Could not find any matching NPCs."); return; } - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); - ePly.LastSearchResults = Results; - esUtils.DisplaySearchResults(args.Player, Results, 1); + ePly.LastSearchResults = results; + esUtils.DisplaySearchResults(args.Player, results, 1); } #endregion #region MyHome - private void CMDsethome(CommandArgs args) + private void CmdSetHome(CommandArgs args) { /* Chek if the player is a real player */ if (!args.Player.RealPlayer) @@ -740,39 +758,37 @@ private void CMDsethome(CommandArgs args) /* Make sure the player isn't in a SetHome Disabled region */ if (!args.Player.Group.HasPermission("essentials.home.bypassdisabled")) { - foreach (string r in Config.DisableSetHomeInRegions) + if (_config.DisableSetHomeInRegions.Select(r => + TShock.Regions.GetRegionByName(r)).Where(region => + region != null).Any(region => + region.InArea(args.Player.TileX, args.Player.TileY))) { - var region = TShock.Regions.GetRegionByName(r); - if (region == null) continue; - if (region.InArea(args.Player.TileX, args.Player.TileY)) - { - args.Player.SendErrorMessage("You cannot set your home in this region."); - return; - } + args.Player.SendErrorMessage("You cannot set your home in this region."); + return; } } /* get a list of the player's homes */ - List homes = esSQL.GetNames(args.Player.UserID, Main.worldID); + var homes = EsSql.GetNames(args.Player.UserID, Main.worldID); /* how many homes is the user allowed to set */ - int CanSet = esUtils.NoOfHomesCanSet(args.Player); + var canSet = esUtils.NoOfHomesCanSet(args.Player); if (homes.Count < 1) { /* the player doesn't have a home, Create one! */ - if (args.Parameters.Count < 1 || (args.Parameters.Count > 0 && CanSet == 1)) + if (args.Parameters.Count < 1 || (args.Parameters.Count > 0 && canSet == 1)) { /* they dont specify a name OR they specify a name but they only have permission to set 1, use a default name */ - if (esSQL.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, "1", Main.worldID)) + if (EsSql.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, "1", Main.worldID)) args.Player.SendSuccessMessage("Set home."); else args.Player.SendErrorMessage("An error occurred while setting your home."); } - else if (args.Parameters.Count == 1 && !args.Parameters[0].Contains(" ") && (CanSet == -1 || CanSet > 1)) + else if (args.Parameters.Count == 1 && !args.Parameters[0].Contains(" ") && (canSet == -1 || canSet > 1)) { /* they specify a name And have permission to specify more than 1 */ - string name = args.Parameters[0].ToLower(); - if (esSQL.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, name, Main.worldID)) + var name = args.Parameters[0].ToLower(); + if (EsSql.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, name, Main.worldID)) args.Player.SendSuccessMessage("Set home {0}.", name); else args.Player.SendErrorMessage("An error occurred while setting your home."); @@ -786,14 +802,14 @@ private void CMDsethome(CommandArgs args) else if (homes.Count == 1) { /* If they only have 1 home */ - if (args.Parameters.Count == 1 && !args.Parameters[0].Contains(" ") && (1 < CanSet || CanSet == -1)) + if (args.Parameters.Count == 1 && !args.Parameters[0].Contains(" ") && (1 < canSet || canSet == -1)) { /* They Specify a name and can set more than 1 */ - string name = args.Parameters[0].ToLower(); + var name = args.Parameters[0].ToLower(); if (homes.Contains(name)) { /* They want to update a home */ - if (esSQL.UpdateHome(args.Player.TileX, args.Player.TileY, args.Player.UserID, name, Main.worldID)) + if (EsSql.UpdateHome(args.Player.TileX, args.Player.TileY, args.Player.UserID, name, Main.worldID)) args.Player.SendSuccessMessage("Updated home {0}.", name); else args.Player.SendErrorMessage("An error occurred while updating your home."); @@ -801,24 +817,24 @@ private void CMDsethome(CommandArgs args) else { /* They want to add a new home */ - if (esSQL.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, name, Main.worldID)) + if (EsSql.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, name, Main.worldID)) args.Player.SendSuccessMessage("Set home {0}.", name); else args.Player.SendErrorMessage("An error occurred while setting your home."); } } - else if (args.Parameters.Count < 1 && (1 < CanSet || CanSet == -1)) + else if (args.Parameters.Count < 1 && (1 < canSet || canSet == -1)) { /* if they dont specify a name & can set more than 1 - add a new home*/ - if (esSQL.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, esUtils.NextHome(homes), Main.worldID)) + if (EsSql.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, esUtils.NextHome(homes), Main.worldID)) args.Player.SendSuccessMessage("Set home."); else args.Player.SendErrorMessage("An error occurred while setting your home."); } - else if (args.Parameters.Count > 0 && CanSet == 1) + else if (args.Parameters.Count > 0 && canSet == 1) { /* They specify a name but can only set 1 home, update their current home */ - if (esSQL.UpdateHome(args.Player.TileX, args.Player.TileY, args.Player.UserID, homes[0], Main.worldID)) + if (EsSql.UpdateHome(args.Player.TileX, args.Player.TileY, args.Player.UserID, homes[0], Main.worldID)) args.Player.SendSuccessMessage("Updated home."); else args.Player.SendErrorMessage("An error occurred while updating your home."); @@ -835,10 +851,10 @@ private void CMDsethome(CommandArgs args) if (args.Parameters.Count < 1) { /* they didnt specify a name */ - if (homes.Count < CanSet || CanSet == -1) + if (homes.Count < canSet || canSet == -1) { /* They can set more homes */ - if (esSQL.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, esUtils.NextHome(homes), Main.worldID)) + if (EsSql.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, esUtils.NextHome(homes), Main.worldID)) args.Player.SendSuccessMessage("Set home."); else args.Player.SendErrorMessage("An error occurred while setting your home."); @@ -846,18 +862,18 @@ private void CMDsethome(CommandArgs args) else { /* they cant set any more homes */ - args.Player.SendErrorMessage("You are only allowed to set {0} homes.", CanSet.ToString()); + args.Player.SendErrorMessage("You are only allowed to set {0} homes.", canSet.ToString()); args.Player.SendErrorMessage("Homes: {0}", string.Join(", ", homes)); } } else if (args.Parameters.Count == 1 && !args.Parameters[0].Contains(" ")) { /* they want to set / update another home and specified a name */ - string name = args.Parameters[0].ToLower(); + var name = args.Parameters[0].ToLower(); if (homes.Contains(name)) { /* they want to update a home */ - if (esSQL.UpdateHome(args.Player.TileX, args.Player.TileY, args.Player.UserID, name, Main.worldID)) + if (EsSql.UpdateHome(args.Player.TileX, args.Player.TileY, args.Player.UserID, name, Main.worldID)) args.Player.SendSuccessMessage("Updated home."); else args.Player.SendErrorMessage("An error occurred while updating your home."); @@ -865,10 +881,10 @@ private void CMDsethome(CommandArgs args) else { /* they want to add a new home */ - if (homes.Count < CanSet || CanSet == -1) + if (homes.Count < canSet || canSet == -1) { /* they can set more homes */ - if (esSQL.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, name, Main.worldID)) + if (EsSql.AddHome(args.Player.UserID, args.Player.TileX, args.Player.TileY, name, Main.worldID)) args.Player.SendSuccessMessage("Set home {0}.", name); else args.Player.SendErrorMessage("An error occurred while setting your home."); @@ -876,7 +892,7 @@ private void CMDsethome(CommandArgs args) else { /* they cant set any more homes */ - args.Player.SendErrorMessage("You are only allowed to set {0} homes.", CanSet.ToString()); + args.Player.SendErrorMessage("You are only allowed to set {0} homes.", canSet.ToString()); args.Player.SendErrorMessage("Homes: {0}", string.Join(", ", homes)); } } @@ -889,7 +905,7 @@ private void CMDsethome(CommandArgs args) } } - private void CMDmyhome(CommandArgs args) + private void CmdMyHome(CommandArgs args) { /* Chek if the player is a real player */ if (!args.Player.RealPlayer) @@ -905,9 +921,9 @@ private void CMDmyhome(CommandArgs args) } /* get a list of the player's homes */ - List homes = esSQL.GetNames(args.Player.UserID, Main.worldID); + var homes = EsSql.GetNames(args.Player.UserID, Main.worldID); /* Set home position variable */ - Point homePos = Point.Zero; + var homePos = Point.Zero; if (homes.Count < 1) { @@ -915,10 +931,10 @@ private void CMDmyhome(CommandArgs args) args.Player.SendErrorMessage("You have not set a home. type /sethome to set one."); return; } - else if (homes.Count == 1) + if (homes.Count == 1) { /* they have 1 home */ - homePos = esSQL.GetHome(args.Player.UserID, homes[0], Main.worldID); + homePos = EsSql.GetHome(args.Player.UserID, homes[0], Main.worldID); } else if (homes.Count > 1) { @@ -930,12 +946,12 @@ private void CMDmyhome(CommandArgs args) args.Player.SendErrorMessage("Homes: {0}", string.Join(", ", homes)); return; } - else if (args.Parameters.Count == 1 && !args.Parameters[0].Contains(" ")) + if (args.Parameters.Count == 1 && !args.Parameters[0].Contains(" ")) { - string name = args.Parameters[0].ToLower(); + var name = args.Parameters[0].ToLower(); if (homes.Contains(name)) { - homePos = esSQL.GetHome(args.Player.UserID, name, Main.worldID); + homePos = EsSql.GetHome(args.Player.UserID, name, Main.worldID); } else { @@ -961,19 +977,19 @@ private void CMDmyhome(CommandArgs args) return; } - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (ePly != null) { ePly.LastBackX = args.Player.TileX; ePly.LastBackY = args.Player.TileY; - ePly.LastBackAction = BackAction.TP; + ePly.LastBackAction = BackAction.Tp; } args.Player.Teleport(homePos.X * 16F, homePos.Y * 16F); args.Player.SendSuccessMessage("Teleported home."); } - private void CMDdelhome(CommandArgs args) + private void CmdDeleteHome(CommandArgs args) { /* Chek if the player is a real player */ if (!args.Player.RealPlayer) @@ -989,7 +1005,7 @@ private void CMDdelhome(CommandArgs args) } /* get a list of the player's homes */ - List homes = esSQL.GetNames(args.Player.UserID, Main.worldID); + var homes = EsSql.GetNames(args.Player.UserID, Main.worldID); if (homes.Count < 1) { @@ -999,7 +1015,7 @@ private void CMDdelhome(CommandArgs args) else if (homes.Count == 1) { /* they have 1 home */ - if (esSQL.RemoveHome(args.Player.UserID, homes[0], Main.worldID)) + if (EsSql.RemoveHome(args.Player.UserID, homes[0], Main.worldID)) args.Player.SendSuccessMessage("Removed home."); else args.Player.SendErrorMessage("An error occurred while removing your home."); @@ -1015,10 +1031,10 @@ private void CMDdelhome(CommandArgs args) } else if (args.Parameters.Count == 1 && !args.Parameters[0].Contains(" ")) { - string name = args.Parameters[0].ToLower(); + var name = args.Parameters[0].ToLower(); if (homes.Contains(name)) { - if (esSQL.RemoveHome(args.Player.UserID, name, Main.worldID)) + if (EsSql.RemoveHome(args.Player.UserID, name, Main.worldID)) args.Player.SendSuccessMessage("Removed home {0}.", name); else args.Player.SendErrorMessage("An error occurred while removing your home."); @@ -1040,17 +1056,17 @@ private void CMDdelhome(CommandArgs args) } #endregion - #region essentials - private void CMDessentials(CommandArgs args) + #region Reload + private void CmdReload(CommandArgs args) { - esConfig.ReloadConfig(args); + //reload config } #endregion #region Team Unlock - private void CMDteamunlock(CommandArgs args) + private void CmdTeamUnlock(CommandArgs args) { - if (!Config.LockRedTeam && !Config.LockGreenTeam && !Config.LockBlueTeam && !Config.LockYellowTeam) + if (!_config.LockRedTeam && !_config.LockGreenTeam && !_config.LockBlueTeam && !_config.LockYellowTeam) { args.Player.SendErrorMessage("Teams are not locked."); return; @@ -1062,23 +1078,23 @@ private void CMDteamunlock(CommandArgs args) return; } - string team = args.Parameters[0].ToLower(); + var team = args.Parameters[0].ToLower(); args.Parameters.RemoveAt(0); - string Password = string.Join(" ", args.Parameters); + var password = string.Join(" ", args.Parameters); - var ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); switch (team) { case "red": { - if (Config.LockRedTeam) + if (_config.LockRedTeam) { - if (Password == Config.RedTeamPassword && Config.RedTeamPassword != "") + if (password == _config.RedTeamPassword && _config.RedTeamPassword != "") { args.Player.SendSuccessMessage("You can now join red team."); - ePly.RedPassword = Password; + ePly.RedPassword = password; } else args.Player.SendErrorMessage("Incorrect Password."); @@ -1089,12 +1105,12 @@ private void CMDteamunlock(CommandArgs args) break; case "green": { - if (Config.LockGreenTeam) + if (_config.LockGreenTeam) { - if (Password == Config.GreenTeamPassword && Config.GreenTeamPassword != "") + if (password == _config.GreenTeamPassword && _config.GreenTeamPassword != "") { args.Player.SendSuccessMessage("You can now join green team."); - ePly.GreenPassword = Password; + ePly.GreenPassword = password; } else args.Player.SendErrorMessage("Incorrect Password."); @@ -1105,12 +1121,12 @@ private void CMDteamunlock(CommandArgs args) break; case "blue": { - if (Config.LockBlueTeam) + if (_config.LockBlueTeam) { - if (Password == Config.BlueTeamPassword && Config.BlueTeamPassword != "") + if (password == _config.BlueTeamPassword && _config.BlueTeamPassword != "") { args.Player.SendSuccessMessage("You can now join blue team."); - ePly.BluePassword = Password; + ePly.BluePassword = password; } else args.Player.SendErrorMessage("Incorrect Password."); @@ -1121,12 +1137,12 @@ private void CMDteamunlock(CommandArgs args) break; case "yellow": { - if (Config.LockYellowTeam) + if (_config.LockYellowTeam) { - if (Password == Config.YellowTeamPassword && Config.YellowTeamPassword != "") + if (password == _config.YellowTeamPassword && _config.YellowTeamPassword != "") { args.Player.SendSuccessMessage("You can now join yellow team."); - ePly.YellowPassword = Password; + ePly.YellowPassword = password; } else args.Player.SendErrorMessage("Incorrect Password."); @@ -1143,25 +1159,25 @@ private void CMDteamunlock(CommandArgs args) #endregion #region Last Command - private void CMDequals(CommandArgs args) + private void CmdRepeatCommand(CommandArgs args) { - var ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); - if (ePly.LastCMD == "/=" || ePly.LastCMD.StartsWith("/= ")) + if (ePly.LastCmd == "/=" || ePly.LastCmd.StartsWith("/= ")) { args.Player.SendErrorMessage("Error with last command."); return; } - if (ePly.LastCMD == string.Empty) + if (ePly.LastCmd == string.Empty) args.Player.SendErrorMessage("You have not entered a command yet."); else - TShockAPI.Commands.HandleCommand(args.Player, ePly.LastCMD); + Commands.HandleCommand(args.Player, ePly.LastCmd); } #endregion #region Kill Reason - private void CMDkillr(CommandArgs args) + private static void CmdKillReason(CommandArgs args) { if (args.Parameters.Count < 1) { @@ -1169,24 +1185,28 @@ private void CMDkillr(CommandArgs args) return; } - var PlayersFound = TShock.Utils.FindPlayer(args.Parameters[0]); - if (PlayersFound.Count != 1) - { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No players matched." : "More than one player matched."); - return; - } + var found = TShock.Utils.FindPlayer(args.Parameters[0]); + if (found.Count > 1) + { + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); + return; + } + if (found.Count == 0) + { + args.Player.SendErrorMessage("No matches found"); + } - var Ply = PlayersFound[0]; + var ply = found[0]; args.Parameters.RemoveAt(0); //remove player name string reason = " " + string.Join(" ", args.Parameters); - NetMessage.SendData(26, -1, -1, reason, Ply.Index, 0f, 15000); - args.Player.SendSuccessMessage("You just killed {0}.", Ply.Name); + NetMessage.SendData(26, -1, -1, reason, ply.Index, 0f, 15000); + args.Player.SendSuccessMessage("You just killed {0}.", ply.Name); } #endregion #region Disable - private void CMDdisable(CommandArgs args) + private void CmdDisable(CommandArgs args) { if (args.Parameters.Count < 1) { @@ -1196,59 +1216,59 @@ private void CMDdisable(CommandArgs args) if (args.Parameters[0].ToLower() == "-list") { - List Names = new List(Disabled.Keys); - if (Disabled.Count < 1) + var names = new List(_disabled.Keys); + if (_disabled.Count < 1) args.Player.SendSuccessMessage("There are currently no players disabled.", Color.MediumSeaGreen); else - args.Player.SendSuccessMessage("Disabled Players: {0}", string.Join(", ", Names)); + args.Player.SendSuccessMessage("Disabled Players: {0}", string.Join(", ", names)); return; } - var PlayersFound = TShock.Utils.FindPlayer(args.Parameters[0]); - if (PlayersFound.Count < 1) + var found = TShock.Utils.FindPlayer(args.Parameters[0]); + if (found.Count < 1) { - foreach (var pair in Disabled) - { - if (pair.Key.ToLower().Contains(args.Parameters[0].ToLower())) - { - Disabled.Remove(pair.Key); - args.Player.SendSuccessMessage("{0} is no longer disabled (even though they aren't online).", pair.Key); - return; - } - } - args.Player.SendErrorMessage("No players matched."); + foreach (var pair in _disabled.Where(pair => + pair.Key.ToLower().Contains(args.Parameters[0].ToLower()))) + { + _disabled.Remove(pair.Key); + args.Player.SendSuccessMessage("{0} is no longer disabled (even though they aren't online).", + pair.Key); + return; + } + args.Player.SendErrorMessage("No players matched."); + return; } - else if (PlayersFound.Count > 1) + if (found.Count > 1) { - args.Player.SendErrorMessage("More than one player matched."); - return; + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); + return; } - var tPly = PlayersFound[0]; - var ePly = esPlayers[tPly.Index]; + var tPly = found[0]; + var ePly = FindPlayer(tPly.Index); - if (!Disabled.ContainsKey(tPly.Name)) + if (!_disabled.ContainsKey(tPly.Name)) { - string Reason = string.Empty; + var reason = string.Empty; if (args.Parameters.Count > 1) { args.Parameters.RemoveAt(0); - Reason = string.Join(" ", args.Parameters); + reason = string.Join(" ", args.Parameters); } ePly.DisabledX = tPly.TileX; ePly.DisabledY = tPly.TileY; ePly.Disabled = true; ePly.Disable(); ePly.LastDisabledCheck = DateTime.UtcNow; - int[] pos = new int[2]; + var pos = new int[2]; pos[0] = ePly.DisabledX; pos[1] = ePly.DisabledY; - Disabled.Add(tPly.Name, pos); + _disabled.Add(tPly.Name, pos); args.Player.SendSuccessMessage("You disabled {0}, They can not be enabled until you type \"/disable {0}\".", tPly.Name); - if (Reason == string.Empty) + if (reason == string.Empty) tPly.SendSuccessMessage("You have been disabled by {0}.", args.Player.Name); else - tPly.SendSuccessMessage("You have been disabled by {0} for {1}.", args.Player.Name, Reason); + tPly.SendSuccessMessage("You have been disabled by {0} for {1}.", args.Player.Name, reason); } else { @@ -1256,7 +1276,7 @@ private void CMDdisable(CommandArgs args) ePly.DisabledX = -1; ePly.DisabledY = -1; - Disabled.Remove(tPly.Name); + _disabled.Remove(tPly.Name); args.Player.SendSuccessMessage("{0} is no longer disabled.", tPly.Name); tPly.SendSuccessMessage("You are no longer disabled."); @@ -1265,267 +1285,278 @@ private void CMDdisable(CommandArgs args) #endregion #region Top, Up and Down - private void CMDtop(CommandArgs args) + + private void CmdTop(CommandArgs args) { - int Y = esUtils.GetTop(args.Player.TileX); - if (Y == -1) + var y = esUtils.GetTop(args.Player.TileX); + if (y == -1) { args.Player.SendErrorMessage("You are already on the top."); return; } - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (ePly != null) { ePly.LastBackX = args.Player.TileX; ePly.LastBackY = args.Player.TileY; - ePly.LastBackAction = BackAction.TP; + ePly.LastBackAction = BackAction.Tp; } - args.Player.Teleport(args.Player.TileX * 16F, Y * 16F); + args.Player.Teleport(args.Player.TileX * 16F, y * 16F); args.Player.SendSuccessMessage("Teleported you to the top."); } - private void CMDup(CommandArgs args) + private void CmdUp(CommandArgs args) { - int levels = 1; + var levels = 1; if (args.Parameters.Count > 0 && !int.TryParse(args.Parameters[0], out levels)) { args.Player.SendErrorMessage("Usage: /up [No. levels]"); return; } - int Y = esUtils.GetUp(args.Player.TileX, args.Player.TileY); - if (Y == -1) + var y = esUtils.GetUp(args.Player.TileX, args.Player.TileY); + if (y == -1) { args.Player.SendErrorMessage("You are already on the top."); return; } - bool limit = false; - for (int i = 1; i < levels; i++) + var limit = false; + for (var i = 1; i < levels; i++) { - int newY = esUtils.GetUp(args.Player.TileX, Y); + var newY = esUtils.GetUp(args.Player.TileX, y); if (newY == -1) { levels = i; limit = true; break; } - Y = newY; + y = newY; } - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (ePly != null) { ePly.LastBackX = args.Player.TileX; ePly.LastBackY = args.Player.TileY; - ePly.LastBackAction = BackAction.TP; + ePly.LastBackAction = BackAction.Tp; } - args.Player.Teleport(args.Player.TileX * 16F, Y * 16F); + args.Player.Teleport(args.Player.TileX * 16F, y * 16F); args.Player.SendSuccessMessage("Teleported you up {0} level(s).{1}", levels, limit ? " You cant go up any further." : string.Empty); } - private void CMDdown(CommandArgs args) + + private void CmdDown(CommandArgs args) { - int levels = 1; + var levels = 1; if (args.Parameters.Count > 0 && !int.TryParse(args.Parameters[0], out levels)) { args.Player.SendErrorMessage("Usage: /down [No. levels]"); return; } - int Y = esUtils.GetDown(args.Player.TileX, args.Player.TileY); - if (Y == -1) + var y = esUtils.GetDown(args.Player.TileX, args.Player.TileY); + if (y == -1) { args.Player.SendErrorMessage("You are already on the bottom."); return; } - bool limit = false; - for (int i = 1; i < levels; i++) + var limit = false; + for (var i = 1; i < levels; i++) { - int newY = esUtils.GetDown(args.Player.TileX, Y); + var newY = esUtils.GetDown(args.Player.TileX, y); if (newY == -1) { levels = i; limit = true; break; } - Y = newY; + y = newY; } - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (ePly != null) { ePly.LastBackX = args.Player.TileX; ePly.LastBackY = args.Player.TileY; - ePly.LastBackAction = BackAction.TP; + ePly.LastBackAction = BackAction.Tp; } - args.Player.Teleport(args.Player.TileX * 16F, Y * 16F); + args.Player.Teleport(args.Player.TileX * 16F, y * 16F); args.Player.SendSuccessMessage("Teleported you down {0} level(s).{1}", levels, limit ? " You can't go down any further." : string.Empty); } #endregion #region Left & Right - private void CMDleft(CommandArgs args) + private void CmdLeft(CommandArgs args) { - int levels = 1; + var levels = 1; if (args.Parameters.Count > 0 && !int.TryParse(args.Parameters[0], out levels)) { args.Player.SendErrorMessage("Usage: /left [No. times]"); return; } - int X = esUtils.GetLeft(args.Player.TileX, args.Player.TileY); - if (X == -1) + var x = esUtils.GetLeft(args.Player.TileX, args.Player.TileY); + if (x == -1) { args.Player.SendErrorMessage("You cannot go any further left."); return; } - bool limit = false; - for (int i = 1; i < levels; i++) + var limit = false; + for (var i = 1; i < levels; i++) { - int newX = esUtils.GetLeft(X, args.Player.TileY); + var newX = esUtils.GetLeft(x, args.Player.TileY); if (newX == -1) { levels = i; limit = true; break; } - X = newX; + x = newX; } - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (ePly != null) { ePly.LastBackX = args.Player.TileX; ePly.LastBackY = args.Player.TileY; - ePly.LastBackAction = BackAction.TP; + ePly.LastBackAction = BackAction.Tp; } - args.Player.Teleport(X * 16F, args.Player.TileY * 16F); + args.Player.Teleport(x * 16F, args.Player.TileY * 16F); args.Player.SendSuccessMessage("Teleported you to the left {0} time(s).{1}", levels, limit ? " You can't go any further." : string.Empty); } - private void CMDright(CommandArgs args) + private void CmdRight(CommandArgs args) { - int levels = 1; + var levels = 1; if (args.Parameters.Count > 0 && !int.TryParse(args.Parameters[0], out levels)) { args.Player.SendErrorMessage("Usage: /right [No. times]"); return; } - int X = esUtils.GetRight(args.Player.TileX, args.Player.TileY); - if (X == -1) + var x = esUtils.GetRight(args.Player.TileX, args.Player.TileY); + if (x == -1) { args.Player.SendErrorMessage("You cannot go any further right."); return; } - bool limit = false; - for (int i = 1; i < levels; i++) + var limit = false; + for (var i = 1; i < levels; i++) { - int newX = esUtils.GetRight(X, args.Player.TileY); + var newX = esUtils.GetRight(x, args.Player.TileY); if (newX == -1) { levels = i; limit = true; break; } - X = newX; + x = newX; } - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (ePly != null) { ePly.LastBackX = args.Player.TileX; ePly.LastBackY = args.Player.TileY; - ePly.LastBackAction = BackAction.TP; + ePly.LastBackAction = BackAction.Tp; } - args.Player.Teleport(X * 16F, args.Player.TileY * 16F); + args.Player.Teleport(x * 16F, args.Player.TileY * 16F); args.Player.SendSuccessMessage("Teleported you to the right {0} time(s).{1}", levels, limit ? " You can't go any further." : string.Empty); } #endregion #region ptime - private void CMDptime(CommandArgs args) + private void CmdPTime(CommandArgs args) { if (!args.Player.Group.HasPermission("essentials.playertime.setother") && args.Parameters.Count != 1) { args.Player.SendErrorMessage("Usage: /ptime "); return; } - else if (args.Parameters.Count < 1 || args.Parameters.Count > 2) + if (args.Parameters.Count < 1 || args.Parameters.Count > 2) { args.Player.SendErrorMessage("Usage: /ptime [player]"); return; } - var Ply = args.Player; + var ply = args.Player; if (args.Player.Group.HasPermission("essentials.playertime.setother") && args.Parameters.Count == 2) { - var PlayersFound = TShock.Utils.FindPlayer(args.Parameters[1]); - if (PlayersFound.Count != 1) - { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No players matched." : "More than one player matched."); - return; - } - Ply = PlayersFound[0]; + var found = TShock.Utils.FindPlayer(args.Parameters[1]); + + if (found.Count > 1) + { + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); + return; + } + if (found.Count == 0) + { + args.Player.SendErrorMessage("No players matched"); + } + + ply = found[0]; } - esPlayer ePly = esPlayers[Ply.Index]; - string Time = args.Parameters[0].ToLower(); - switch (Time) + var ePly = FindPlayer(args.Player.Index); + var time = args.Parameters[0].ToLower(); + + switch (time) { case "day": { - ePly.ptDay = true; - ePly.ptTime = 150.0; - Ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); + ePly.PtDay = true; + ePly.PtTime = 150.0; + ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); } break; case "night": { - ePly.ptDay = false; - ePly.ptTime = 0.0; - Ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); + ePly.PtDay = false; + ePly.PtTime = 0.0; + ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); } break; case "noon": { - ePly.ptDay = true; - ePly.ptTime = 27000.0; - Ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); + ePly.PtDay = true; + ePly.PtTime = 27000.0; + ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); } break; case "midnight": { - ePly.ptDay = false; - ePly.ptTime = 16200.0; - Ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); + ePly.PtDay = false; + ePly.PtTime = 16200.0; + ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); } break; case "reset": { - ePly.ptTime = -1.0; - Ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); - args.Player.SendSuccessMessage("{0} time is the same as the server.", Ply == args.Player ? "Your" : string.Concat(Ply.Name, "'s")); - if (Ply != args.Player) - Ply.SendSuccessMessage("{0} Set your time to the server time.", args.Player.Name); + ePly.PtTime = -1.0; + ply.SendData(PacketTypes.TimeSet, "", 0, Main.sunModY, Main.moonModY); + args.Player.SendSuccessMessage("{0} time is the same as the server.", + ply == args.Player ? "Your" : string.Concat(ply.Name, "'s")); + if (ply != args.Player) + ply.SendSuccessMessage("{0} Set your time to the server time.", args.Player.Name); } return; default: args.Player.SendErrorMessage("Usage: /ptime [player]"); return; } - args.Player.SendSuccessMessage("Set {0} time to {1}.", args.Player == Ply ? "your" : string.Concat(Ply.Name, "'s"), Time); - if (Ply != args.Player) - Ply.SendSuccessMessage("{0} set your time to {1}.", args.Player.Name, Time); + args.Player.SendSuccessMessage("Set {0} time to {1}.", + args.Player == ply ? "your" : string.Concat(ply.Name, "'s"), time); + if (ply != args.Player) + ply.SendSuccessMessage("{0} set your time to {1}.", args.Player.Name, time); } #endregion #region Ping - private void CMDping(CommandArgs args) + private static void CmdPing(CommandArgs args) { args.Player.SendMessage("pong.", Color.White); } #endregion - #region sudo - private void CMDsudo(CommandArgs args) + #region Sudo + private void CmdSudo(CommandArgs args) { if (args.Parameters.Count < 2) { @@ -1533,43 +1564,48 @@ private void CMDsudo(CommandArgs args) return; } - var PlayersFound = TShock.Utils.FindPlayer(args.Parameters[0]); - if (PlayersFound.Count != 1) + var found = TShock.Utils.FindPlayer(args.Parameters[0]); + if (found.Count == 0) { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No Players matched." : "More than one player matched."); + args.Player.SendErrorMessage("No players found"); return; } + if (found.Count > 1) + { + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); + return; + } - var Ply = PlayersFound[0]; - if (Ply.Group.HasPermission("essentials.sudo.immune")) + var ply = found[0]; + if (ply.Group.HasPermission("essentials.sudo.immune")) { - args.Player.SendErrorMessage("You cannot force {0} to do a command.", Ply.Name); + args.Player.SendErrorMessage("You cannot force {0} to do a command.", ply.Name); return; } - Group OldGroup = null; + Group oldGroup = null; if (args.Player.Group.HasPermission("essentials.sudo.super")) { - OldGroup = Ply.Group; - Ply.Group = new SuperAdminGroup(); + oldGroup = ply.Group; + ply.Group = new SuperAdminGroup(); } args.Parameters.RemoveAt(0); - string command = string.Join(" ", args.Parameters); + var command = string.Join(" ", args.Parameters); if (!command.StartsWith("/")) command = string.Concat("/", command); - Commands.HandleCommand(Ply, command); - args.Player.SendSuccessMessage("Forced {0} to execute: {1}", Ply.Name, command); + Commands.HandleCommand(ply, command); + args.Player.SendSuccessMessage("Forced {0} to execute: {1}", ply.Name, command); - if (OldGroup != null) - Ply.Group = OldGroup; + if (oldGroup != null) + ply.Group = oldGroup; } #endregion #region SocialSpy - private void CMDsocialspy(CommandArgs args) + private void CmdSocialSpy(CommandArgs args) { - esPlayer ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); ePly.SocialSpy = !ePly.SocialSpy; args.Player.SendSuccessMessage("Socialspy {0}abled.", ePly.SocialSpy ? "En" : "Dis"); @@ -1577,58 +1613,55 @@ private void CMDsocialspy(CommandArgs args) #endregion #region Near - private void CMDnear(CommandArgs args) + private void CmdNear(CommandArgs args) { - var Players = new Dictionary(); - foreach (var ePly in esPlayers) + var plys = new Dictionary(); + foreach (var ePly in _players) { if (ePly == null || ePly.Index == args.Player.Index) continue; - int x = Math.Abs(args.Player.TileX - ePly.TSPlayer.TileX); - int y = Math.Abs(args.Player.TileY - ePly.TSPlayer.TileY); - int h = (int)Math.Sqrt((double)(Math.Pow(x, 2) + Math.Pow(y, 2))); - Players.Add(ePly.TSPlayer.Name, h); + var x = Math.Abs(args.Player.TileX - ePly.TSPlayer.TileX); + var y = Math.Abs(args.Player.TileY - ePly.TSPlayer.TileY); + var h = (int)Math.Sqrt((Math.Pow(x, 2) + Math.Pow(y, 2))); + plys.Add(ePly.TSPlayer.Name, h); } - if (Players.Count == 0) + if (plys.Count == 0) { args.Player.SendSuccessMessage("No players found."); return; } - List Names = new List(); - Players.OrderBy(pair => pair.Value).ForEach(pair => Names.Add(pair.Key)); - List Results = new List(); - var Line = new StringBuilder(); - int Added = 0; - for (int i = 0; i < Names.Count; i++) + var names = new List(); + plys.OrderBy(pair => pair.Value).ForEach(pair => names.Add(pair.Key)); + var results = new List(); + var line = new StringBuilder(); + var added = 0; + foreach (var n in names) { - if (Line.Length == 0) - Line.Append(string.Format("{0}({1}m)", Names[i], Players[Names[i]])); - else - Line.Append(string.Format(", {0}({1}m)", Names[i], Players[Names[i]])); - Added++; - if (Added == 5) - { - Results.Add(Line.ToString()); - Line.Clear(); - Added = 0; - } + line.Append(line.Length == 0 + ? string.Format("{0}({1}m)", n, plys[n]) + : string.Format(", {0}({1}m)", n, plys[n])); + added++; + if (added != 5) continue; + results.Add(line.ToString()); + line.Clear(); + added = 0; } - if (Results.Count <= 6) + if (results.Count <= 6) { args.Player.SendInfoMessage("Nearby Players:"); - foreach (var Result in Results) + foreach (var res in results) { - args.Player.SendSuccessMessage(Result); + args.Player.SendSuccessMessage(res); } } else { - int page = 1; + var page = 1; if (args.Parameters.Count > 0 && !int.TryParse(args.Parameters[0], out page)) page = 1; page--; const int pagelimit = 6; - int pagecount = Results.Count / pagelimit; + var pagecount = results.Count / pagelimit; if (page > pagecount) { args.Player.SendErrorMessage("Page number exceeds pages ({0}/{1}).", page + 1, pagecount + 1); @@ -1636,221 +1669,142 @@ private void CMDnear(CommandArgs args) } args.Player.SendInfoMessage("Nearby Players - Page {0} of {1} | /near [page]", page + 1, pagecount + 1); - for (int i = (page * pagelimit); (i < ((page * pagelimit) + pagelimit)) && i < Results.Count; i++) - args.Player.SendSuccessMessage(Results[i]); + for (var i = (page * pagelimit); (i < ((page * pagelimit) + pagelimit)) && i < results.Count; i++) + args.Player.SendSuccessMessage(results[i]); } } #endregion #region Nick - private void CMDnick(CommandArgs args) + private void CmdNick(CommandArgs args) { if (args.Parameters.Count != 1 && !args.Player.Group.HasPermission("essentials.nick.setother")) { args.Player.SendErrorMessage("Usage: /nick "); return; } - else if ((args.Parameters.Count < 1 || args.Parameters.Count > 2) && args.Player.Group.HasPermission("essentials.nick.setother")) + if ((args.Parameters.Count < 1 || args.Parameters.Count > 2) && args.Player.Group.HasPermission("essentials.nick.setother")) { args.Player.SendErrorMessage("Usage: /nick [player] "); return; } - TSPlayer NickPly = args.Player; + var ply = args.Player; if (args.Parameters.Count > 1 && args.Player.Group.HasPermission("essentials.nick.setother")) { - var PlayersFound = TShock.Utils.FindPlayer(args.Parameters[0]); - if (PlayersFound.Count != 1) + var found = TShock.Utils.FindPlayer(args.Parameters[0]); + if (found.Count == 0) { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No players matched." : "More than one player matched."); + args.Player.SendErrorMessage("No players matched."); return; } - NickPly = PlayersFound[0]; + if (found.Count > 1) + { + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); + } + ply = found[0]; } - esPlayer eNickPly = esPlayers[NickPly.Index]; + var eNickPly = FindPlayer(args.Player.Index); - bool self = NickPly == args.Player; + var self = ply == args.Player; - string nickname = args.Parameters[args.Parameters.Count - 1]; + var nickname = args.Parameters[args.Parameters.Count - 1]; if (nickname.ToLower() == "off") { if (eNickPly.HasNickName) { - esSQL.RemoveNickname(NickPly.Name); + EsSql.RemoveNickname(ply.Name); eNickPly.HasNickName = false; eNickPly.Nickname = string.Empty; - args.Player.SendSuccessMessage("Removed {0} nickname.", self ? "your" : string.Concat(NickPly.Name, "'s")); + args.Player.SendSuccessMessage("Removed {0} nickname.", + self ? "your" : string.Concat(ply.Name, "'s")); if (!self) - NickPly.SendSuccessMessage("Your nickname was removed by {0}.", args.Player.Name); + ply.SendSuccessMessage("Your nickname was removed by {0}.", args.Player.Name); } else { - args.Player.SendErrorMessage("{0} not have a nickname to remove.", self ? "You do" : string.Concat(NickPly.Name, " does")); + args.Player.SendErrorMessage("{0} not have a nickname to remove.", + self ? "You do" : string.Concat(ply.Name, " does")); } return; } - /*System.Text.RegularExpressions.Regex alphanumeric = new System.Text.RegularExpressions.Regex("^[a-zA-Z0-9_ ]*$"); - if (!alphanumeric.Match(nickname).Success) - { - args.Player.SendErrorMessage("Nicknames must be Alphanumeric."); - return; - }*/ - if (!eNickPly.HasNickName) { - eNickPly.OriginalName = NickPly.Name; + eNickPly.OriginalName = ply.Name; eNickPly.HasNickName = true; } eNickPly.Nickname = nickname; string curNickname; - if (esSQL.GetNickname(NickPly.Name, out curNickname)) - esSQL.UpdateNickname(NickPly.Name, nickname); + if (EsSql.GetNickname(ply.Name, out curNickname)) + EsSql.UpdateNickname(ply.Name, nickname); else - esSQL.AddNickname(NickPly.Name, nickname); + EsSql.AddNickname(ply.Name, nickname); - args.Player.SendSuccessMessage("Set {0} nickname to '{1}'.", self ? "your" : string.Concat(eNickPly.OriginalName), nickname); + args.Player.SendSuccessMessage("Set {0} nickname to '{1}'.", + self ? "your" : eNickPly.OriginalName, nickname); if (!self) - NickPly.SendSuccessMessage("{0} set your nickname to '{1}'.", args.Player.Name, nickname); + ply.SendSuccessMessage("{0} set your nickname to '{1}'.", args.Player.Name, nickname); } #endregion - #region realname - private void CMDrealname(CommandArgs args) + #region RealName + private void CmdRealName(CommandArgs args) { if (args.Parameters.Count < 1) { args.Player.SendErrorMessage("Usage: /realname "); return; } - string search = args.Parameters[0].ToLower(); + var search = args.Parameters[0].ToLower(); if (search == "-all") { - List Nicks = new List(); - foreach (var player in esPlayers) - { - if (player == null || !player.HasNickName) continue; - Nicks.Add(string.Concat(Config.PrefixNicknamesWith, player.Nickname, "(", player.OriginalName, ")")); - } + var nicks = (from player in _players where player != null + && player.HasNickName + select string.Concat(_config.PrefixNicknamesWith, player.Nickname, + "(", player.OriginalName, ")")).ToList(); - if (Nicks.Count < 1) + if (nicks.Count < 1) args.Player.SendErrorMessage("No players online have nicknames."); else - args.Player.SendSuccessMessage(string.Join(", ", Nicks)); + args.Player.SendSuccessMessage(string.Join(", ", nicks)); return; } - if (search.StartsWith(Config.PrefixNicknamesWith)) - search = search.Remove(0, Config.PrefixNicknamesWith.Length); + if (search.StartsWith(_config.PrefixNicknamesWith)) + search = search.Remove(0, _config.PrefixNicknamesWith.Length); - List PlayersFound = new List(); - foreach (var player in esPlayers) + var found = new List(); + foreach (var player in _players.Where(player => player != null && player.HasNickName)) { - if (player == null || !player.HasNickName) continue; - if (player.Nickname.ToLower() == search) - { - PlayersFound = new List { player }; - break; - } - else if (player.Nickname.ToLower().Contains(search)) - PlayersFound.Add(player); + if (player.Nickname.ToLower() == search) + { + found = new List { player }; + break; + } + if (player.Nickname.ToLower().Contains(search)) + found.Add(player); } - if (PlayersFound.Count != 1) + if (found.Count > 1) { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No players matched." : "More than one player matched."); - return; + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.TSPlayer.Name)); + return; } - esPlayer ply = PlayersFound[0]; + var ply = found[0]; args.Player.SendSuccessMessage("The user '{0}' has the nickname '{1}'.", ply.OriginalName, ply.Nickname); } #endregion - #region Exact Time - private void CMDetime(CommandArgs args) - { - if (args.Parameters.Count != 1 || !args.Parameters[0].Contains(':')) - { - args.Player.SendErrorMessage("Usage: /etime :"); - return; - } - - string[] split = args.Parameters[0].Split(':'); - string sHours = split[0]; - string sMinutes = split[1]; - - bool PM = false; - int Hours = -1; - int Minutes = -1; - if (!int.TryParse(sHours, out Hours) || !int.TryParse(sMinutes, out Minutes)) - { - args.Player.SendErrorMessage("Usage: /etime :"); - return; - } - if (Hours < 0 || Hours > 24) - { - args.Player.SendErrorMessage("Hours is out of range."); - return; - } - if (Minutes < 0 || Minutes > 59) - { - args.Player.SendErrorMessage("Minutes is out of range."); - return; - } - - int TFHour = Hours; - - if (TFHour == 24 || TFHour == 0) - { - Hours = 12; - } - if (TFHour >= 12 && TFHour < 24) - { - PM = true; - if (Hours > 12) - Hours -= 12; - } - - int THour = Hours; - - Hours = TFHour; - if (Hours == 24) - Hours = 0; - - double TimeMinutes = Minutes / 60.0; - double MainTime = TimeMinutes + Hours; - - if (MainTime >= 4.5 && MainTime < 24) - MainTime -= 24.0; - - MainTime = MainTime + 19.5; - MainTime = MainTime / 24.0 * 86400.0; - - bool Day = false; - if ((!PM && ((THour > 4 || (THour == 4 && Minutes >= 30))) && THour < 12) || (PM && ((THour < 7 || (THour == 7 && Minutes < 30)) || THour == 12))) - Day = true; - - if (!Day) - MainTime -= 54000.0; - - TSPlayer.Server.SetTime(Day, MainTime); - - string min = Minutes.ToString(); - if (Minutes < 10) - min = "0" + Minutes.ToString(); - TSPlayer.All.SendSuccessMessage("{0} set time to {1}:{2} {3}.", args.Player.Name, THour, min, PM ? "PM" : "AM"); - } - #endregion - #region Force Login - private void CMDforcelogin(CommandArgs args) + private void CmdForceLogin(CommandArgs args) { if (args.Parameters.Count < 1 || args.Parameters.Count > 2) { @@ -1865,35 +1819,40 @@ private void CMDforcelogin(CommandArgs args) } var group = TShock.Utils.GetGroup(user.Group); - var PlayersFound = new List() { args.Player }; + var found = new List { args.Player }; if (args.Parameters.Count == 2) { - PlayersFound = TShock.Utils.FindPlayer(args.Parameters[1]); - if (PlayersFound.Count != 1) - { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No players matched." : "More than one player matched."); - return; - } - } - - var Player = PlayersFound[0]; - Player.Group = group; - Player.UserAccountName = user.Name; - Player.UserID = TShock.Users.GetUserID(Player.UserAccountName); - Player.IsLoggedIn = true; - Player.IgnoreActionsForInventory = "none"; - - Player.SendSuccessMessage("{0} in as {1}.", Player != args.Player ? string.Concat(args.Player.Name, " Logged you") : "Logged", user.Name); - if (Player != args.Player) - args.Player.SendSuccessMessage("Logged {0} in as {1}.", Player.Name, user.Name); - Log.ConsoleInfo(string.Format("{0} forced logged in {1}as user: {2}.", args.Player.Name, args.Player != Player ? string.Concat(Player.Name, " ") : string.Empty, user.Name)); + found = TShock.Utils.FindPlayer(args.Parameters[1]); + if (found.Count > 1) + { + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); + return; + } + if (found.Count == 0) + { + args.Player.SendErrorMessage("No players found"); + return; + } + } + + var player = found[0]; + player.Group = group; + player.UserAccountName = user.Name; + player.UserID = TShock.Users.GetUserID(player.UserAccountName); + player.IsLoggedIn = true; + player.IgnoreActionsForInventory = "none"; + + player.SendSuccessMessage("{0} in as {1}.", player != args.Player ? string.Concat(args.Player.Name, " Logged you") : "Logged", user.Name); + if (player != args.Player) + args.Player.SendSuccessMessage("Logged {0} in as {1}.", player.Name, user.Name); + Log.ConsoleInfo(string.Format("{0} forced logged in {1}as user: {2}.", args.Player.Name, args.Player != player ? string.Concat(player.Name, " ") : string.Empty, user.Name)); } #endregion #region Invsee - private void CMDinvsee(CommandArgs args) + private void CmdInvSee(CommandArgs args) { - if (!TShock.Config.ServerSideCharacter) + if (!Main.ServerSideCharacter) { args.Player.SendErrorMessage("Server Side Character must be enabled."); return; @@ -1903,7 +1862,7 @@ private void CMDinvsee(CommandArgs args) args.Player.SendErrorMessage("Usage: /invsee "); return; } - var ePly = esPlayers[args.Player.Index]; + var ePly = FindPlayer(args.Player.Index); if (args.Parameters.Count == 1 && args.Parameters[0].ToLower() == "-restore") { if (ePly.InvSee == null) @@ -1916,36 +1875,39 @@ private void CMDinvsee(CommandArgs args) args.Player.SendSuccessMessage("Restored your inventory."); return; } - var PlayersFound = TShock.Utils.FindPlayer(string.Join(" ", args.Parameters)); - if (PlayersFound.Count != 1) + var found = TShock.Utils.FindPlayer(string.Join(" ", args.Parameters)); + if (found.Count > 1) { - args.Player.SendErrorMessage(PlayersFound.Count < 1 ? "No Players matched." : "More than one player matched."); + TShock.Utils.SendMultipleMatchError(args.Player, found.Select(p => p.Name)); return; } + if (found.Count == 0) + { + args.Player.SendErrorMessage("No players matched"); + return; + } - var PlayerChar = new PlayerData(args.Player); - PlayerChar.CopyCharacter(args.Player); + var playerChar = new PlayerData(args.Player); + playerChar.CopyCharacter(args.Player); if (ePly.InvSee == null) - { - ePly.InvSee = PlayerChar; - } - - var CopyChar = new PlayerData(PlayersFound[0]); - CopyChar.CopyCharacter(PlayersFound[0]); - CopyChar.health = PlayerChar.health; - CopyChar.maxHealth = PlayerChar.maxHealth; - CopyChar.mana = PlayerChar.mana; - CopyChar.maxMana = PlayerChar.maxMana; - CopyChar.spawnX = PlayerChar.spawnX; - CopyChar.spawnY = PlayerChar.spawnY; - CopyChar.RestoreCharacter(args.Player); - - args.Player.SendSuccessMessage("Copied {0}'s inventory", PlayersFound[0].Name); + ePly.InvSee = playerChar; + + var copyChar = new PlayerData(found[0]); + copyChar.CopyCharacter(found[0]); + copyChar.health = playerChar.health; + copyChar.maxHealth = playerChar.maxHealth; + copyChar.mana = playerChar.mana; + copyChar.maxMana = playerChar.maxMana; + copyChar.spawnX = playerChar.spawnX; + copyChar.spawnY = playerChar.spawnY; + copyChar.RestoreCharacter(args.Player); + + args.Player.SendSuccessMessage("Copied {0}'s inventory", found[0].Name); } #endregion #region Whois - private void CMDwhois(CommandArgs args) + private void CmdWhoIs(CommandArgs args) { if (args.Parameters.Count < 1) { @@ -1956,85 +1918,126 @@ private void CMDwhois(CommandArgs args) args.Player.SendErrorMessage("-i IP address search"); return; } - string Type = "\b"; - string Query = string.Empty; - List Results = new List(); + var type = "\b"; + string query; + var results = new List(); switch (args.Parameters[0].ToUpper()) { case "-E": { - Type = "Exact name"; + type = "Exact name"; args.Parameters.RemoveAt(0); - Query = string.Join(" ", args.Parameters); - foreach (var tPly in TShock.Players) - { - if (tPly.Name == Query) - { - Results.Add(tPly); - } - } + query = string.Join(" ", args.Parameters); + var user = TShock.Users.GetUserByName(query); + results.Add(new UserObj(-1, user.Name, user.KnownIps.Split(',')[0])); } break; case "-U": { - Type = "User ID"; - Query = args.Parameters[1]; + type = "User ID"; + query = args.Parameters[1]; int id; - if (!int.TryParse(Query, out id)) + if (!int.TryParse(query, out id)) { - args.Player.SendWarningMessage("id must be an integer."); + args.Player.SendWarningMessage("ID must be an integer."); return; } - foreach (var tPly in TShock.Players) - { - if (tPly.UserID == id) - { - Results.Add(tPly); - } - } + results.AddRange(from tPly in TShock.Players + where tPly.UserID == id select new UserObj(id, tPly.Name, tPly.IP)); } break; case "-I": { - Type = "IP"; - Query = args.Parameters[1]; - foreach (var tPly in TShock.Players) - { - if (tPly.IP == Query) - { - Results.Add(tPly); - } - } + type = "IP"; + query = args.Parameters[1]; + var ipUser = TShock.Users.GetUsers().Find(user => user.KnownIps.Contains(query)); + results.Add(new UserObj(-1, ipUser.Name, ipUser.KnownIps.Split(',')[0])); } break; default: { - Query = string.Join(" ", args.Parameters); - Results = TShock.Utils.FindPlayer(Query); + query = string.Join(" ", args.Parameters); + //Results = TShock.Utils.FindPlayer(Query); } break; } - if (Results.Count < 1) + if (results.Count < 1) { - args.Player.SendErrorMessage("No matches for {0}", Query); + args.Player.SendErrorMessage("No matches for {0}", query); + return; } - else if (Results.Count == 1) + if (results.Count == 1) { - args.Player.SendInfoMessage("Details of {0} search: {0}", Type, Query); - args.Player.SendSuccessMessage("UserID: {0}, Registered Name: {1}", Results[0].UserID, Results[0].UserAccountName); - if (esPlayers[Results[0].Index].HasNickName) - args.Player.SendSuccessMessage("Nickname: {0}{1}", Config.PrefixNicknamesWith, esPlayers[Results[0].Index].Nickname); - args.Player.SendSuccessMessage("IP: {0}", Results[0].IP); + args.Player.SendInfoMessage("Details of {0} search: {0}", type, query); + + if (TShock.Players.Contains(TShock.Utils.FindPlayer(results[0].name)[0])) + { + var ply = TShock.Utils.FindPlayer(results[0].name)[0]; + var ePly = FindPlayer(ply.Index); + args.Player.SendSuccessMessage("UserID: {0}, Registered Name: {1}", + results[0].userId, results[0].name); + + if (ePly.HasNickName) + args.Player.SendSuccessMessage("Nickname: {0}{1}", _config.PrefixNicknamesWith, + ePly.Nickname); + + args.Player.SendSuccessMessage("IP: {0}", results[0].ip); + } + + else + { + args.Player.SendSuccessMessage("Registered Name: {0}", results[0].name); + args.Player.SendSuccessMessage("IP: {0}", results[0].ip); + } + } else { - args.Player.SendInfoMessage("Listing matches ({0}):", Results.Count); - foreach (var tPly in Results) - { - args.Player.SendSuccessMessage("({0}){1} (IP:{3})", tPly.UserID, tPly.UserAccountName, tPly.IP); - } + args.Player.SendWarningMessage("Matches: ({0}):", results.Count); + + results.ForEach(r => + { + TShock.Players.ForEach(pl => + { + if (r.name != pl.Name) return; + args.Player.SendInfoMessage("Online matches:"); + args.Player.SendSuccessMessage("({0}){1} (IP:{3})", pl.UserID, pl.Name, pl.IP); + results.RemoveAll(result => result == r); + }); + + args.Player.SendInfoMessage("Offline matches:"); + args.Player.SendSuccessMessage("{1} (IP:{3})", r.name, r.ip); + }); } } #endregion + + private EsPlayer FindPlayer(int index) + { + return _players.Find(p => p.Index == index); + } } + + public static class Extensions + { + public static T AddObj(this List list, T generic) + { + list.Add(generic); + return generic; + } + } + + public class UserObj + { + public readonly int userId; + public readonly string name; + public readonly string ip; + + public UserObj(int u, string n, string i) + { + userId = u; + name = n; + ip = i; + } + } } diff --git a/Essentials/esPlayer.cs b/Essentials/esPlayer.cs index b4812f1..c042379 100644 --- a/Essentials/esPlayer.cs +++ b/Essentials/esPlayer.cs @@ -4,7 +4,7 @@ namespace Essentials { - public class esPlayer + public class EsPlayer { public int Index { get; set; } public TSPlayer TSPlayer { get { return TShock.Players[Index]; } } @@ -18,7 +18,7 @@ public class esPlayer public string GreenPassword { get; set; } public string BluePassword { get; set; } public string YellowPassword { get; set; } - public string LastCMD { get; set; } + public string LastCmd { get; set; } public bool Disabled { get; set; } public int DisabledX { get; set; } public int DisabledY { get; set; } @@ -27,49 +27,50 @@ public class esPlayer public bool HasNickName { get; set; } public string Nickname { get; set; } public string OriginalName { get; set; } - public double ptTime { get; set; } - public bool ptDay { get; set; } + public double PtTime { get; set; } + public bool PtDay { get; set; } public PlayerData InvSee { get; set; } - public esPlayer(int index) + public EsPlayer(int index) { - this.Index = index; - this.LastBackX = -1; - this.LastBackY = -1; - this.LastBackAction = BackAction.None; - this.SavedBackAction = false; - this.BackCooldown = 0; - this.LastSearchResults = new List(); - this.RedPassword = string.Empty; - this.GreenPassword = string.Empty; - this.BluePassword = string.Empty; - this.YellowPassword = string.Empty; - this.LastCMD = string.Empty; - this.Disabled = false; - this.DisabledX = -1; - this.DisabledY = -1; - this.LastDisabledCheck = DateTime.UtcNow; - this.SocialSpy = false; - this.HasNickName = false; - this.Nickname = string.Empty; - this.OriginalName = string.Empty; - this.ptTime = -1.0; - this.ptDay = true; - this.InvSee = null; + Index = index; + LastBackX = -1; + LastBackY = -1; + LastBackAction = BackAction.None; + SavedBackAction = false; + BackCooldown = 0; + LastSearchResults = new List(); + RedPassword = string.Empty; + GreenPassword = string.Empty; + BluePassword = string.Empty; + YellowPassword = string.Empty; + LastCmd = string.Empty; + Disabled = false; + DisabledX = -1; + DisabledY = -1; + LastDisabledCheck = DateTime.UtcNow; + SocialSpy = false; + HasNickName = false; + Nickname = string.Empty; + OriginalName = string.Empty; + PtTime = -1.0; + PtDay = true; + InvSee = null; } public void Disable() { - this.TSPlayer.LastThreat = DateTime.UtcNow; - this.TSPlayer.SetBuff(33, 330, true); //Weak - this.TSPlayer.SetBuff(32, 330, true); //Slow - this.TSPlayer.SetBuff(23, 330, true); //Cursed + TSPlayer.LastThreat = DateTime.UtcNow; + TSPlayer.SetBuff(33, 330, true); //Weak + TSPlayer.SetBuff(32, 330, true); //Slow + TSPlayer.SetBuff(23, 330, true); //Cursed + TSPlayer.SetBuff(47, 330, true); //Frozen } } public enum BackAction { None = 0, - TP = 1, + Tp = 1, Death = 2 } } \ No newline at end of file diff --git a/Essentials/esSQL.cs b/Essentials/esSQL.cs index 83d2b5c..8732d39 100644 --- a/Essentials/esSQL.cs +++ b/Essentials/esSQL.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Data; using System.IO; using Mono.Data.Sqlite; @@ -9,12 +8,12 @@ namespace Essentials { - public class esSQL + public class EsSql { - private static IDbConnection db; + private static IDbConnection _db; #region Setup Database - public static void SetupDB() + public static void SetupDb() { if (File.Exists(Path.Combine(TShock.SavePath, "Essentials", "Essentials.db")) && !File.Exists(Path.Combine(TShock.SavePath, "Essentials", "Essentials.sqlite"))) { @@ -23,8 +22,8 @@ public static void SetupDB() switch (TShock.Config.StorageType.ToLower()) { case "mysql": - string[] host = TShock.Config.MySqlHost.Split(':'); - db = new MySqlConnection() + var host = TShock.Config.MySqlHost.Split(':'); + _db = new MySqlConnection { ConnectionString = string.Format("Server={0}; Port={1}; Database={2}; Uid={3}; Pwd={4};", host[0], @@ -35,12 +34,12 @@ public static void SetupDB() }; break; case "sqlite": - string sql = Path.Combine(TShock.SavePath, "Essentials", "Essentials.sqlite"); - db = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); + var sql = Path.Combine(TShock.SavePath, "Essentials", "Essentials.sqlite"); + _db = new SqliteConnection(string.Format("uri=file://{0},Version=3", sql)); break; } - SqlTableCreator sqlcreator = new SqlTableCreator(db, - db.GetSqlType() == SqlType.Sqlite + var sqlcreator = new SqlTableCreator(_db, + _db.GetSqlType() == SqlType.Sqlite ? (IQueryBuilder)new SqliteQueryCreator() : new MysqlQueryCreator()); sqlcreator.EnsureExists(new SqlTable("Homes", @@ -56,138 +55,115 @@ public static void SetupDB() #endregion #region List home names - public static List GetNames(int UserID, int WorldID) + public static List GetNames(int userId, int worldId) { - String query = "SELECT Name FROM Homes WHERE UserID=@0 AND WorldID=@1;"; - List names = new List(); + const string query = "SELECT Name FROM Homes WHERE UserID=@0 AND WorldID=@1;"; + var names = new List(); - using (var reader = db.QueryReader(query, UserID, WorldID)) + using (var reader = _db.QueryReader(query, userId, worldId)) { while (reader.Read()) - { names.Add(reader.Get("Name")); - } } return names; } #endregion #region Add Home - public static bool AddHome(int UserID, int HomeX, int HomeY, string Name, int WorldID) + public static bool AddHome(int userId, int homeX, int homeY, string name, int worldId) { - String query = "INSERT INTO Homes (UserID, HomeX, HomeY, Name, WorldID) VALUES (@0, @1, @2, @3, @4);"; + const string query = "INSERT INTO Homes (UserID, HomeX, HomeY, Name, WorldID) VALUES (@0, @1, @2, @3, @4);"; - if (db.Query(query, UserID, HomeX, HomeY, Name, WorldID) != 1) - { - Log.ConsoleError("[EssentialsDB] Creating a user's MyHome has faild"); - return false; - } - return true; + if (_db.Query(query, userId, homeX, homeY, name, worldId) == 1) return true; + Log.ConsoleError("[EssentialsDB] Creating a user's MyHome has failed"); + return false; } #endregion #region Update Home - public static bool UpdateHome(int HomeX, int HomeY, int UserID, string Name, int WorldID) + public static bool UpdateHome(int homeX, int homeY, int userId, string name, int worldId) { - String query = "UPDATE Homes SET HomeX=@0, HomeY=@1 WHERE UserID=@2 AND Name=@3 AND WorldID=@4;"; + const string query = "UPDATE Homes SET HomeX=@0, HomeY=@1 WHERE UserID=@2 AND Name=@3 AND WorldID=@4;"; - if (db.Query(query, HomeX, HomeY, UserID, Name, WorldID) != 1) - { - Log.ConsoleError("[EssentialsDB] Updating a user's MyHome has failed!"); - return false; - } - return true; + if (_db.Query(query, homeX, homeY, userId, name, worldId) == 1) return true; + Log.ConsoleError("[EssentialsDB] Updating a user's MyHome has failed!"); + return false; } #endregion #region Remove Home - public static bool RemoveHome(int UserID, string Name, int WorldID) + public static bool RemoveHome(int userId, string name, int worldId) { - String query = "DELETE FROM Homes WHERE UserID=@0 AND Name=@1 AND WorldID=@2;"; + const string query = "DELETE FROM Homes WHERE UserID=@0 AND Name=@1 AND WorldID=@2;"; - if (db.Query(query, UserID, Name, WorldID) != 1) - { - Log.ConsoleError("[EssentialsDB] Removing a user's MyHome has faild"); - return false; - } - return true; + if (_db.Query(query, userId, name, worldId) == 1) return true; + Log.ConsoleError("[EssentialsDB] Removing a user's MyHome has faild"); + return false; } #endregion #region Get Home Position - public static Point GetHome(int UserID, string Name, int WorldID) + public static Point GetHome(int userId, string name, int worldId) { - String query = "SELECT HomeX, HomeY FROM Homes WHERE UserID=@0 AND Name=@1 AND WorldID=@2;"; + const string query = "SELECT HomeX, HomeY FROM Homes WHERE UserID=@0 AND Name=@1 AND WorldID=@2;"; - using (var reader = db.QueryReader(query, UserID, Name, WorldID)) + using (var reader = _db.QueryReader(query, userId, name, worldId)) { if (reader.Read()) - { return new Point(reader.Get("HomeX"), reader.Get("HomeY")); - } } return Point.Zero; } #endregion #region Get Nickname - public static bool GetNickname(string Name, out string Nickname) + public static bool GetNickname(string name, out string nickname) { - String query = "SELECT Nickname FROM Nicknames WHERE Name=@0;"; - Dictionary names = new Dictionary(); + const string query = "SELECT Nickname FROM Nicknames WHERE Name=@0;"; - using (var reader = db.QueryReader(query, Name)) + using (var reader = _db.QueryReader(query, name)) { if (reader.Read()) { - Nickname = reader.Get("Nickname"); + nickname = reader.Get("Nickname"); return true; } } - Nickname = string.Empty; + nickname = string.Empty; return false; } #endregion #region Add Nickname - public static bool AddNickname(string Name, string Nickname) + public static bool AddNickname(string name, string nickname) { - String query = "INSERT INTO Nicknames (Name, Nickname) VALUES (@0, @1);"; + const string query = "INSERT INTO Nicknames (Name, Nickname) VALUES (@0, @1);"; - if (db.Query(query, Name, Nickname) != 1) - { - Log.ConsoleError("[EssentialsDB] Creating a user's Nickname has faild"); - return false; - } - return true; + if (_db.Query(query, name, nickname) == 1) return true; + Log.ConsoleError("[EssentialsDB] Creating a user's Nickname has faild"); + return false; } #endregion #region Update Nickname - public static bool UpdateNickname(string Name, string Nickname) + public static bool UpdateNickname(string name, string nickname) { - String query = "UPDATE Nicknames SET Nickname=@0 WHERE Name=@1;"; + const string query = "UPDATE Nicknames SET Nickname=@0 WHERE Name=@1;"; - if (db.Query(query, Nickname, Name) != 1) - { - Log.ConsoleError("[EssentialsDB] Updating a user's Nickname has failed!"); - return false; - } - return true; + if (_db.Query(query, nickname, name) == 1) return true; + Log.ConsoleError("[EssentialsDB] Updating a user's Nickname has failed!"); + return false; } #endregion #region Remove Nickname - public static bool RemoveNickname(string Name) + public static bool RemoveNickname(string name) { - String query = "DELETE FROM Nicknames WHERE Name=@0;"; + const string query = "DELETE FROM Nicknames WHERE Name=@0;"; - if (db.Query(query, Name) != 1) - { - Log.ConsoleError("[EssentialsDB] Removing a user's Nickname has faild"); - return false; - } - return true; + if (_db.Query(query, name) == 1) return true; + Log.ConsoleError("[EssentialsDB] Removing a user's Nickname has faild"); + return false; } #endregion } diff --git a/Refs/TShockAPI.dll b/Refs/TShockAPI.dll index 90cb4af..d373b23 100644 Binary files a/Refs/TShockAPI.dll and b/Refs/TShockAPI.dll differ diff --git a/Refs/TerrariaServer.exe b/Refs/TerrariaServer.exe index 746e364..4aff914 100644 Binary files a/Refs/TerrariaServer.exe and b/Refs/TerrariaServer.exe differ diff --git a/SignCommands/Properties/AssemblyInfo.cs b/SignCommands/Properties/AssemblyInfo.cs index 7654cea..f2b3c32 100644 --- a/SignCommands/Properties/AssemblyInfo.cs +++ b/SignCommands/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Scavenger")] [assembly: AssemblyProduct("SignCommands")] -[assembly: AssemblyCopyright("Copyright \u00A9 Scavenger 2013")] +[assembly: AssemblyCopyright("Copyright \u00A9 Scavenger 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/SignCommands/SignCommands.csproj b/SignCommands/SignCommands.csproj index 86268a8..585ed53 100644 --- a/SignCommands/SignCommands.csproj +++ b/SignCommands/SignCommands.csproj @@ -10,7 +10,7 @@ Properties SignCommands SignCommands - v4.0 + v4.5 512 @@ -21,11 +21,13 @@ ..\Build\ x86 + false ..\Build\ true x86 + false @@ -42,12 +44,11 @@ ..\Refs\Newtonsoft.Json.dll - + False - .exe ..\Refs\TerrariaServer.exe - + False ..\Refs\TShockAPI.dll diff --git a/SignCommands/scCommand.cs b/SignCommands/scCommand.cs index 55cd38d..944cf2a 100644 --- a/SignCommands/scCommand.cs +++ b/SignCommands/scCommand.cs @@ -1,347 +1,358 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Terraria; +using System.Collections.Generic; using TShockAPI; namespace SignCommands { - public class scCommand - { - public string command { get; set; } - public List args { get; set; } - - public scCommand(scSign parent, string command, List args) - { - this.command = command.ToLower(); - this.args = args; - } - - #region AmIValid - public bool AmIValid() - { - switch (command) - { - case "time": - case "heal": - case "show": - case "damage": - case "boss": - case "spawnmob": - case "warp": - case "item": - case "buff": - case "command": - return true; - default: - return false; - } - } - #endregion - - #region ExecuteCommand - public void ExecuteCommand(scPlayer sPly) - { - switch (command) - { - case "time": - CMDtime(sPly, args); - break; - case "heal": - CMDheal(sPly, args); - break; - case "show": - CMDshow(sPly, args); - break; - case "damage": - CMDdamage(sPly, args); - break; - case "boss": - CMDboss(sPly, args); - break; - case "spawnmob": - CMDspawnmob(sPly, args); - break; - case "warp": - CMDwarp(sPly, args); - break; - case "item": - CMDitem(sPly, args); - break; - case "buff": - CMDbuff(sPly, args); - break; - case "command": - CMDcommand(sPly, args); - break; - } - } - #endregion - - #region CMDtime - public static void CMDtime(scPlayer sPly, List args) - { - if (args.Count < 1) return; - string time = args[0].ToLower(); - switch (time) - { - case "day": - TSPlayer.Server.SetTime(true, 150.0); - break; - case "night": - TSPlayer.Server.SetTime(false, 0.0); - break; - case "dusk": - TSPlayer.Server.SetTime(false, 0.0); - break; - case "noon": - TSPlayer.Server.SetTime(true, 27000.0); - break; - case "midnight": - TSPlayer.Server.SetTime(false, 16200.0); - break; - case "fullmoon": - TSPlayer.Server.SetFullMoon(true); - break; - case "bloodmoon": - TSPlayer.Server.SetBloodMoon(true); - break; - } - } - #endregion - - #region CMDheal - public static void CMDheal(scPlayer sPly, List args) - { - Item heart = TShock.Utils.GetItemById(58); - Item star = TShock.Utils.GetItemById(184); - for (int ic = 0; ic < 20; ic++) - sPly.TSPlayer.GiveItem(heart.type, heart.name, heart.width, heart.height, heart.maxStack); - for (int ic = 0; ic < 10; ic++) - sPly.TSPlayer.GiveItem(star.type, star.name, star.width, star.height, star.maxStack); - } - #endregion - - #region CMDshow - public static void CMDshow(scPlayer sPly, List args) - { - if (args.Count < 1) return; - string file = args[0].ToLower(); - switch (file) - { - case "motd": - TShock.Utils.ShowFileToUser(sPly.TSPlayer, "motd.txt"); - break; - case "rules": - TShock.Utils.ShowFileToUser(sPly.TSPlayer, "rules.txt"); - break; - case "playing": - Commands.HandleCommand(sPly.TSPlayer, "/playing"); - break; - default: - { - if (File.Exists(args[0])) - TShock.Utils.ShowFileToUser(sPly.TSPlayer, args[0]); - else - sPly.TSPlayer.SendErrorMessage("Could not find file."); - } - break; - } - } - #endregion - - #region CMDdamage - public static void CMDdamage(scPlayer sPly, List args) - { - int amount = 10; - if (args.Count > 0) - int.TryParse(args[0], out amount); - if (amount < 1) - amount = 10; - sPly.TSPlayer.DamagePlayer(amount); - } - #endregion - - #region CMDboss - public static void CMDboss(scPlayer sPly, List args) - { - if (args.Count < 1) return; - string boss = args[0].ToLower(); - - int amount = 1; - if (args.Count > 1) - int.TryParse(args[1], out amount); - - amount = Math.Min(amount, Main.maxNPCs); - if (amount < 1) - amount = 1; - - NPC npc = null; - switch (boss) - { - case "eater": - npc = TShock.Utils.GetNPCById(13); - break; - case "eye": - { - npc = TShock.Utils.GetNPCById(4); - TSPlayer.Server.SetTime(false, 0.0); - } - break; - case "king": - npc = TShock.Utils.GetNPCById(50); - break; - case "skeletron": - { - npc = TShock.Utils.GetNPCById(35); - TSPlayer.Server.SetTime(false, 0.0); - } - break; - case "wof": - { - for (int i = 0; i < amount; i++) - { - if (Main.wof >= 0 || (sPly.TSPlayer.Y / 16f < (float)(Main.maxTilesY - 205))) - { - sPly.TSPlayer.SendErrorMessage("Can't spawn Wall of Flesh."); - } - NPC.SpawnWOF(new Vector2(sPly.TSPlayer.X, sPly.TSPlayer.Y)); - } - } - break; - case "twins": - { - NPC retinazer = TShock.Utils.GetNPCById(125); - NPC spaz = TShock.Utils.GetNPCById(126); - TSPlayer.Server.SetTime(false, 0.0); - for (int i = 0; i < amount; i++) - { - TSPlayer.Server.SpawnNPC(retinazer.type, retinazer.name, 1, sPly.TSPlayer.TileX, sPly.TSPlayer.TileY); - TSPlayer.Server.SpawnNPC(spaz.type, spaz.name, 1, sPly.TSPlayer.TileX, sPly.TSPlayer.TileY); - } - } - break; - case "destroyer": - { - npc = TShock.Utils.GetNPCById(134); - TSPlayer.Server.SetTime(false, 0.0); - } - break; - case "skeletronprime": - { - npc = TShock.Utils.GetNPCById(127); - TSPlayer.Server.SetTime(false, 0.0); - } - break; - } - - if (npc != null) - for (int i = 0; i < amount; i++) - TSPlayer.Server.SpawnNPC(npc.type, npc.name, 1, sPly.TSPlayer.TileX, sPly.TSPlayer.TileY); - } - #endregion - - #region CMDspawnmob - public static void CMDspawnmob(scPlayer sPly, List args) - { - if (args.Count < 1) return; - string mob = args[0]; - - int amount = 1; - if (args.Count > 1) - int.TryParse(args[1], out amount); - if (amount < 1) - amount = 1; - - amount = Math.Min(amount, Main.maxNPCs); - - var npc = TShock.Utils.GetNPCByIdOrName(mob); - if (npc.Count == 1 && npc[0].type >= 1 && npc[0].type < Main.maxNPCTypes && npc[0].type != 113) - TSPlayer.Server.SpawnNPC(npc[0].type, npc[0].name, amount, sPly.TSPlayer.TileX, sPly.TSPlayer.TileY, 50, 20); - } - #endregion - - #region CMDwarp - public static void CMDwarp(scPlayer sPly, List args) - { - if (args.Count < 1) return; - - string WarpName = args[0]; - - var Warp = TShock.Warps.FindWarp(WarpName); - - if (Warp != null && Warp.WarpName != "" && Warp.WarpPos.X > 0 && Warp.WarpPos.Y > 0 && Warp.WorldWarpID != "") - sPly.TSPlayer.Teleport(Warp.WarpPos.X * 16F, Warp.WarpPos.Y * 16F); - } - #endregion - - #region CMDitem - public static void CMDitem(scPlayer sPly, List args) - { - if (args.Count < 1) return; - string itemname = args[0]; - - int amount = 1; - if (args.Count > 1) - int.TryParse(args[1], out amount); - if (amount < 1) - amount = 1; - - int prefix = 0; - if (args.Count > 2) - int.TryParse(args[2], out prefix); - if (prefix < 0) - prefix = 0; - - List items = TShock.Utils.GetItemByIdOrName(itemname); - if (items.Count == 1 && items[0].type >= 1 && items[0].type < Main.maxItemTypes) - { - Item item = items[0]; - if (sPly.TSPlayer.InventorySlotAvailable || item.name.Contains("Coin")) - { - if (amount == 0 || amount > item.maxStack) - amount = item.maxStack; - sPly.TSPlayer.GiveItemCheck(item.type, item.name, item.width, item.height, amount, prefix); - } - } - } - #endregion - - #region CMDbuff - public static void CMDbuff(scPlayer sPly, List args) - { - if (args.Count < 1) return; - string buffname = args[0]; - - int duration = 60; - if (args.Count > 1) - int.TryParse(args[1], out duration); - - int buffid = -1; - if (!int.TryParse(buffname, out buffid)) - { - List buffs = TShock.Utils.GetBuffByName(buffname); - if (buffs.Count == 1) - buffid = buffs[0]; - else - return; - } - if (buffid > 0 && buffid < Main.maxBuffs) - { - if (duration < 1 || duration > short.MaxValue) - duration = 60; - sPly.TSPlayer.SetBuff(buffid, duration * 60); - } - } - #endregion - - #region CMDcommand - public static void CMDcommand(scPlayer sPly, List args) - { - if (args.Count < 1) return; - string command = args[0]; - Commands.HandleCommand(sPly.TSPlayer, command); - } - #endregion - } + public class SignCommand : Command + { + private int _cooldown; + public SignCommand(int coolDown, List permissions, CommandDelegate cmd, params string[] names) + : base(permissions, cmd, names) + { + _cooldown = coolDown; + } + } + + + //public class ScCommand + //{ + // public string Command { get; private set; } + // public List Args { get; private set; } + + // public ScCommand(string command, List args) + // { + // Command = command.ToLower(); + // Args = args; + // } + + // #region AmIValid + // public bool AmIValid() + // { + // switch (Command) + // { + // case "time": + // case "heal": + // case "show": + // case "damage": + // case "boss": + // case "spawnmob": + // case "warp": + // case "item": + // case "buff": + // case "command": + // return true; + // default: + // return false; + // } + // } + // #endregion + + // #region ExecuteCommand + // public void ExecuteCommand(ScPlayer sPly) + // { + // switch (Command) + // { + // case "time": + // CmdTime(sPly, Args); + // break; + // case "heal": + // CmdHeal(sPly, Args); + // break; + // case "show": + // CmdShow(sPly, Args); + // break; + // case "damage": + // CmdDamage(sPly, Args); + // break; + // case "boss": + // CmdBoss(sPly, Args); + // break; + // case "spawnmob": + // CmdSpawnMob(sPly, Args); + // break; + // case "warp": + // CmdWarp(sPly, Args); + // break; + // case "item": + // CmdItem(sPly, Args); + // break; + // case "buff": + // CmdBuff(sPly, Args); + // break; + // case "command": + // CmdCommand(sPly, Args); + // break; + // } + // } + // #endregion + + // #region CMDtime + + // private static void CmdTime(ScPlayer sPly, List args) + // { + // if (args.Count < 1) return; + // var time = args[0].ToLower(); + // switch (time) + // { + // case "day": + // TSPlayer.Server.SetTime(true, 150.0); + // break; + // case "night": + // TSPlayer.Server.SetTime(false, 0.0); + // break; + // case "dusk": + // TSPlayer.Server.SetTime(false, 0.0); + // break; + // case "noon": + // TSPlayer.Server.SetTime(true, 27000.0); + // break; + // case "midnight": + // TSPlayer.Server.SetTime(false, 16200.0); + // break; + // case "fullmoon": + // TSPlayer.Server.SetFullMoon(true); + // break; + // case "bloodmoon": + // TSPlayer.Server.SetBloodMoon(true); + // break; + // } + // } + // #endregion + + // #region CMDheal + + // private static void CmdHeal(ScPlayer sPly, List args) + // { + // sPly.TsPlayer.Heal(sPly.TsPlayer.TPlayer.statLifeMax); + // } + // #endregion + + // #region CMDshow + + // private static void CmdShow(ScPlayer sPly, List args) + // { + // if (args.Count < 1) return; + // string file = args[0].ToLower(); + // switch (file) + // { + // case "motd": + // TShock.Utils.ShowFileToUser(sPly.TsPlayer, "motd.txt"); + // break; + // case "rules": + // TShock.Utils.ShowFileToUser(sPly.TsPlayer, "rules.txt"); + // break; + // case "playing": + // Commands.HandleCommand(sPly.TsPlayer, "/playing"); + // break; + // default: + // { + // if (File.Exists(args[0])) + // TShock.Utils.ShowFileToUser(sPly.TsPlayer, args[0]); + // else + // sPly.TsPlayer.SendErrorMessage("Could not find file."); + // } + // break; + // } + // } + // #endregion + + // #region CMDdamage + + // private static void CmdDamage(ScPlayer sPly, List args) + // { + // var amount = 10; + // if (args.Count > 0) + // int.TryParse(args[0], out amount); + // if (amount < 1) + // amount = 10; + // sPly.TsPlayer.DamagePlayer(amount); + // } + // #endregion + + // #region CMDboss + + // private static void CmdBoss(ScPlayer sPly, List args) + // { + // if (args.Count < 1) return; + // var boss = args[0].ToLower(); + + // var amount = 1; + // if (args.Count > 1) + // int.TryParse(args[1], out amount); + + // amount = Math.Min(amount, Main.maxNPCs); + // if (amount < 1) + // amount = 1; + + // NPC npc = null; + // switch (boss) + // { + // case "eater": + // npc = TShock.Utils.GetNPCById(13); + // break; + // case "eye": + // { + // npc = TShock.Utils.GetNPCById(4); + // TSPlayer.Server.SetTime(false, 0.0); + // } + // break; + // case "king": + // npc = TShock.Utils.GetNPCById(50); + // break; + // case "skeletron": + // { + // npc = TShock.Utils.GetNPCById(35); + // TSPlayer.Server.SetTime(false, 0.0); + // } + // break; + // case "wof": + // { + // for (var i = 0; i < amount; i++) + // { + // if (Main.wof >= 0 || (sPly.TsPlayer.Y / 16f < (Main.maxTilesY - 205))) + // sPly.TsPlayer.SendErrorMessage("Can't spawn Wall of Flesh."); + // NPC.SpawnWOF(new Vector2(sPly.TsPlayer.X, sPly.TsPlayer.Y)); + // } + // } + // break; + // case "twins": + // { + // var retinazer = TShock.Utils.GetNPCById(125); + // var spaz = TShock.Utils.GetNPCById(126); + // TSPlayer.Server.SetTime(false, 0.0); + // for (var i = 0; i < amount; i++) + // { + // TSPlayer.Server.SpawnNPC(retinazer.type, retinazer.name, 1, sPly.TsPlayer.TileX, sPly.TsPlayer.TileY); + // TSPlayer.Server.SpawnNPC(spaz.type, spaz.name, 1, sPly.TsPlayer.TileX, sPly.TsPlayer.TileY); + // } + // } + // break; + // case "destroyer": + // { + // npc = TShock.Utils.GetNPCById(134); + // TSPlayer.Server.SetTime(false, 0.0); + // } + // break; + // case "skeletronprime": + // { + // npc = TShock.Utils.GetNPCById(127); + // TSPlayer.Server.SetTime(false, 0.0); + // } + // break; + // } + + // if (npc != null) + // for (var i = 0; i < amount; i++) + // TSPlayer.Server.SpawnNPC(npc.type, npc.name, 1, sPly.TsPlayer.TileX, sPly.TsPlayer.TileY); + // } + // #endregion + + // #region CMDspawnmob + + // private static void CmdSpawnMob(ScPlayer sPly, List args) + // { + // if (args.Count < 1) return; + // var mob = args[0]; + + // var amount = 1; + // if (args.Count > 1) + // int.TryParse(args[1], out amount); + // if (amount < 1) + // amount = 1; + + // amount = Math.Min(amount, Main.maxNPCs); + + // var npc = TShock.Utils.GetNPCByIdOrName(mob); + // if (npc.Count == 1 && npc[0].type >= 1 && npc[0].type < Main.maxNPCTypes && npc[0].type != 113) + // TSPlayer.Server.SpawnNPC(npc[0].type, npc[0].name, amount, sPly.TsPlayer.TileX, sPly.TsPlayer.TileY, 50, 20); + // } + // #endregion + + // #region CMDwarp + + // private static void CmdWarp(ScPlayer sPly, List args) + // { + // if (args.Count < 1) return; + + // var warpName = args[0]; + + // var warp = TShock.Warps.Find(warpName); + + // if (warp != null && warp.Name != "" && warp.Position.X > 0 && warp.Position.Y > 0) + // sPly.TsPlayer.Teleport(warp.Position.X * 16F, warp.Position.Y * 16F); + // } + // #endregion + + // #region CMDitem + + // private static void CmdItem(ScPlayer sPly, List args) + // { + // if (args.Count < 1) return; + // var itemname = args[0]; + + // var amount = 1; + // if (args.Count > 1) + // int.TryParse(args[1], out amount); + // if (amount < 1) + // amount = 1; + + // var prefix = 0; + // if (args.Count > 2) + // int.TryParse(args[2], out prefix); + // if (prefix < 0) + // prefix = 0; + + // var items = TShock.Utils.GetItemByIdOrName(itemname); + // if (items.Count == 1 && items[0].type >= 1 && items[0].type < Main.maxItemTypes) + // { + // var item = items[0]; + // if (sPly.TsPlayer.InventorySlotAvailable || item.name.Contains("Coin")) + // { + // if (amount == 0 || amount > item.maxStack) + // amount = item.maxStack; + // sPly.TsPlayer.GiveItemCheck(item.type, item.name, item.width, item.height, amount, prefix); + // } + // } + // } + // #endregion + + // #region CMDbuff + + // private static void CmdBuff(ScPlayer sPly, List args) + // { + // if (args.Count < 1) return; + // var buffname = args[0]; + + // var duration = 60; + // if (args.Count > 1) + // int.TryParse(args[1], out duration); + + // int buffid; + // if (!int.TryParse(buffname, out buffid)) + // { + // var buffs = TShock.Utils.GetBuffByName(buffname); + // if (buffs.Count == 1) + // buffid = buffs[0]; + // else + // return; + // } + // if (buffid > 0 && buffid < Main.maxBuffTypes) + // { + // if (duration < 1 || duration > short.MaxValue) + // duration = 60; + // sPly.TsPlayer.SetBuff(buffid, duration * 60); + // } + // } + // #endregion + + // #region CMDcommand + + // private static void CmdCommand(ScPlayer sPly, List args) + // { + // if (args.Count < 1) return; + // var command = args[0]; + // Commands.HandleCommand(sPly.TsPlayer, command); + // } + // #endregion + //} } diff --git a/SignCommands/scConfig.cs b/SignCommands/scConfig.cs index ed2f73b..ddfd47d 100644 --- a/SignCommands/scConfig.cs +++ b/SignCommands/scConfig.cs @@ -1,88 +1,26 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using Newtonsoft.Json; -using TShockAPI; namespace SignCommands { - public class scConfig + public class ScConfig { public string DefineSignCommands = "[Sign Command]"; - public string CommandsStartWith = ">"; - public Dictionary CooldownGroups = new Dictionary(); + public string CommandsStartWith = ">"; + public Dictionary CooldownGroups = new Dictionary(); public bool ShowDestroyMessage = true; - public static string SavePath = string.Empty; - public static string ConfigPath = string.Empty; - public scConfig Write(string path) - { - File.WriteAllText(path, JsonConvert.SerializeObject(this, Formatting.Indented)); - return this; - } - public static scConfig Read(string path) - { - if (!File.Exists(path)) - { - WriteExample(path); - } - return JsonConvert.DeserializeObject(File.ReadAllText(path)); - } - public static void WriteExample(string path) - { - File.WriteAllText(ConfigPath, @"{ - ""DefineSignCommands"": ""[Sign Command]"", - ""CommandsStartWith"": "">"", - ""CooldownGroups"": { - ""global-time"": 300, - ""heal"": 60, - ""message"": 10, - ""damage"": 10, - ""boss"": 300, - ""item"": 300, - ""buff"": 300, - ""spawnmob"": 300, - ""kit"": 300, - ""command"": 300 - }, - ""ShowDestroyMessage"": true, -}"); - } + public void Write(string path) + { + File.WriteAllText(path, JsonConvert.SerializeObject(this, Formatting.Indented)); + } - public static void LoadConfig() - { - try - { - SavePath = Path.Combine(TShock.SavePath, "Essentials"); - ConfigPath = Path.Combine(SavePath, "SignCommandsConfig.json"); - if (!Directory.Exists(SavePath)) - { - Directory.CreateDirectory(SavePath); - } - SignCommands.Config = scConfig.Read(ConfigPath).Write(ConfigPath); - } - catch (Exception ex) - { - Log.ConsoleError("[Sign Commands] Config Exception. Check logs for more details."); - Log.Error(ex.ToString()); - } - } - public static void ReloadConfig(CommandArgs args) - { - try - { - if (!Directory.Exists(SavePath)) - { - Directory.CreateDirectory(SavePath); - } - SignCommands.Config = scConfig.Read(ConfigPath).Write(ConfigPath); - args.Player.SendSuccessMessage("[Sign Commands] Config reloaded successfully."); - } - catch (Exception ex) - { - args.Player.SendErrorMessage("[Sign Commands] Reload failed. Check logs for more details."); - Log.Error(string.Concat("[Sign Commands] Config Exception:\n", ex.ToString())); - } - } + public static ScConfig Read(string path) + { + return !File.Exists(path) + ? new ScConfig() + : JsonConvert.DeserializeObject(File.ReadAllText(path)); + } } } diff --git a/SignCommands/scMain.cs b/SignCommands/scMain.cs index 7709092..5334116 100644 --- a/SignCommands/scMain.cs +++ b/SignCommands/scMain.cs @@ -1,293 +1,398 @@ using System; using System.Collections.Generic; using System.IO; -using System.Reflection; -using System.Text; +using System.Linq; +using System.Timers; using Terraria; using TerrariaApi.Server; using TShockAPI; namespace SignCommands { - [ApiVersion(1, 14)] + //TODO: Add infinite signs support & Global cooldowns + [ApiVersion(1, 17)] public class SignCommands : TerrariaPlugin { - public override string Name { get { return "Sign Commands"; } } - public override string Author { get { return "Scavenger"; } } - public override string Description { get { return "Put commands on signs!"; } } - public override Version Version { get { return Assembly.GetExecutingAssembly().GetName().Version; } } - - public static scConfig Config = new scConfig(); - public static scPlayer[] scPlayers = new scPlayer[256]; - public static Dictionary GlobalCooldowns = new Dictionary(); - public static Dictionary> OfflineCooldowns = new Dictionary>(); - public static bool UsingInfiniteSigns { get; set; } - public static bool UsingSEConomy { get; set; } - DateTime LastCooldown = DateTime.UtcNow; - DateTime LastPurge = DateTime.UtcNow; + public override string Name + { + get { return "Sign Commands"; } + } + + public override string Author + { + get { return "Scavenger"; } + } + + public override string Description + { + get { return "Put commands on signs!"; } + } + + public override Version Version + { + get { return new Version(1, 6, 0); } + } + + public static ScConfig config = new ScConfig(); + public static readonly ScPlayer[] ScPlayers = new ScPlayer[256]; + + public static readonly List Cooldowns = new List(); + + private static readonly Dictionary ScSigns = new Dictionary(); + + private static bool UsingInfiniteSigns { get; set; } + + private readonly Timer _updateTimer = new Timer { Enabled = true, Interval = 1000d }; public SignCommands(Main game) : base(game) { UsingInfiniteSigns = File.Exists(Path.Combine("ServerPlugins", "InfiniteSigns.dll")); - UsingSEConomy = File.Exists(Path.Combine("ServerPlugins", "Wolfje.Plugins.SEconomy.dll")); } public override void Initialize() { ServerApi.Hooks.GameInitialize.Register(this, OnInitialize); if (!UsingInfiniteSigns) - { ServerApi.Hooks.NetGetData.Register(this, OnGetData); - } ServerApi.Hooks.ServerJoin.Register(this, OnJoin); ServerApi.Hooks.ServerLeave.Register(this, OnLeave); - ServerApi.Hooks.GameUpdate.Register(this, OnUpdate); } - protected override void Dispose(bool Disposing) + protected override void Dispose(bool disposing) { - if (Disposing) + if (disposing) { ServerApi.Hooks.GameInitialize.Deregister(this, OnInitialize); if (!UsingInfiniteSigns) - { ServerApi.Hooks.NetGetData.Deregister(this, OnGetData); - } ServerApi.Hooks.ServerJoin.Deregister(this, OnJoin); ServerApi.Hooks.ServerLeave.Deregister(this, OnLeave); - ServerApi.Hooks.GameUpdate.Deregister(this, OnUpdate); } - base.Dispose(Disposing); + base.Dispose(disposing); } - public void OnInitialize(EventArgs args) + private void OnInitialize(EventArgs args) { - Commands.ChatCommands.Add(new Command("essentials.signs.break", CMDdestsign, "destsign")); - Commands.ChatCommands.Add(new Command("essentials.signs.reload", CMDscreload, "screload")); + Commands.ChatCommands.Add(new Command("essentials.signs.break", CmdDestroySign, "destroysign", "dsign")); + Commands.ChatCommands.Add(new Command("essentials.signs.reload", CmdReloadSigns, "screload")); + + var savePath = Path.Combine(TShock.SavePath, "Essentials"); + if (!Directory.Exists(savePath)) + Directory.CreateDirectory(savePath); + var configPath = Path.Combine(savePath, "scConfig.json"); + (config = ScConfig.Read(configPath)).Write(configPath); - scConfig.LoadConfig(); + _updateTimer.Elapsed += UpdateTimerOnElapsed; } + #region Commands - private void CMDdestsign(CommandArgs args) + + private void CmdDestroySign(CommandArgs args) { - scPlayer sPly = scPlayers[args.Player.Index]; + var sPly = ScPlayers[args.Player.Index]; sPly.DestroyMode = true; args.Player.SendSuccessMessage("You can now destroy a sign."); } - private void CMDscreload(CommandArgs args) + private void CmdReloadSigns(CommandArgs args) { - scConfig.ReloadConfig(args); + var savePath = Path.Combine(TShock.SavePath, "Essentials"); + if (!Directory.Exists(savePath)) + Directory.CreateDirectory(savePath); + var configPath = Path.Combine(savePath, "scConfig.json"); + (config = ScConfig.Read(configPath)).Write(configPath); + + args.Player.SendSuccessMessage("Sign Commands config has been reloaded."); } + #endregion #region scPlayers - public void OnJoin(JoinEventArgs args) + + private static void OnJoin(JoinEventArgs args) { - scPlayers[args.Who] = new scPlayer(args.Who); + ScPlayers[args.Who] = new ScPlayer(args.Who); - if (OfflineCooldowns.ContainsKey(TShock.Players[args.Who].Name)) - { - scPlayers[args.Who].Cooldowns = OfflineCooldowns[TShock.Players[args.Who].Name]; - OfflineCooldowns.Remove(TShock.Players[args.Who].Name); - } + //if (OfflineCooldowns.ContainsKey(TShock.Players[args.Who].Name)) + //{ + //ScPlayers[args.Who].Cooldowns = OfflineCooldowns[TShock.Players[args.Who].Name]; + //OfflineCooldowns.Remove(TShock.Players[args.Who].Name); + //} } - public void OnLeave(LeaveEventArgs args) + private static void OnLeave(LeaveEventArgs args) { - if (scPlayers[args.Who] != null && scPlayers[args.Who].Cooldowns.Count > 0) - OfflineCooldowns.Add(TShock.Players[args.Who].Name, scPlayers[args.Who].Cooldowns); - scPlayers[args.Who] = null; + //if (ScPlayers[args.Who] != null && ScPlayers[args.Who].Cooldowns.Count > 0) + // OfflineCooldowns.Add(TShock.Players[args.Who].Name, ScPlayers[args.Who].Cooldowns); + ScPlayers[args.Who] = null; } + #endregion #region Timer - private void OnUpdate(EventArgs args) + + private void UpdateTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) { - if ((DateTime.UtcNow - LastCooldown).TotalMilliseconds >= 1000) + foreach (var sPly in ScPlayers.Where(sPly => sPly != null)) { - LastCooldown = DateTime.UtcNow; - foreach (var sPly in scPlayers) - { - if (sPly == null) continue; - if (sPly.AlertCooldownCooldown > 0) - sPly.AlertCooldownCooldown--; - if (sPly.AlertPermissionCooldown > 0) - sPly.AlertPermissionCooldown--; - if (sPly.AlertDestroyCooldown > 0) - sPly.AlertDestroyCooldown--; - } + if (sPly.AlertCooldownCooldown > 0) + sPly.AlertCooldownCooldown--; + if (sPly.AlertPermissionCooldown > 0) + sPly.AlertPermissionCooldown--; + if (sPly.AlertDestroyCooldown > 0) + sPly.AlertDestroyCooldown--; + } - if ((DateTime.UtcNow - LastPurge).TotalMinutes >= 5) - { - LastPurge = DateTime.UtcNow; - - List CooldownGroups = new List(GlobalCooldowns.Keys); - foreach (string g in CooldownGroups) - { - if (DateTime.UtcNow > GlobalCooldowns[g]) - GlobalCooldowns.Remove(g); - } - - List OfflinePlayers = new List(OfflineCooldowns.Keys); - foreach (string p in OfflinePlayers) - { - List OfflinePlayerCooldowns = new List(OfflineCooldowns[p].Keys); - foreach (string g in OfflinePlayerCooldowns) - { - if (DateTime.UtcNow > OfflineCooldowns[p][g]) - OfflineCooldowns[p].Remove(g); - } - if (OfflineCooldowns[p].Count == 0) - OfflineCooldowns.Remove(p); - } - - foreach (var sPly in scPlayers) - { - if (sPly == null) continue; - List CooldownIds = new List(sPly.Cooldowns.Keys); - foreach (string id in CooldownIds) - { - if (DateTime.UtcNow > sPly.Cooldowns[id]) - sPly.Cooldowns.Remove(id); - } - } - } + foreach (var signPair in ScSigns) + { + var sign = signPair.Value; + if (sign.cooldown > 0) + sign.cooldown--; } + //if ((DateTime.UtcNow - _lastPurge).TotalMinutes >= 5) + //{ + // _lastPurge = DateTime.UtcNow; + + // var cooldownGroups = new List(GlobalCooldowns.Keys); + // foreach (var g in cooldownGroups.Where(g => DateTime.UtcNow > GlobalCooldowns[g])) + // GlobalCooldowns.Remove(g); + + // var offlinePlayers = new List(OfflineCooldowns.Keys); + // foreach (var p in offlinePlayers) + // { + // var offlinePlayerCooldowns = new List(OfflineCooldowns[p].Keys); + // var localp = p; + // foreach (var g in offlinePlayerCooldowns.Where(g => DateTime.UtcNow > OfflineCooldowns[localp][g])) + // OfflineCooldowns[p].Remove(g); + + // if (OfflineCooldowns[p].Count == 0) + // OfflineCooldowns.Remove(p); + // } + + // foreach (var sPly in ScPlayers) + // { + // if (sPly == null) continue; + // var cooldownIds = new List(sPly.Cooldowns.Keys); + + // var ply = sPly; + // foreach (var id in cooldownIds.Where(id => DateTime.UtcNow > ply.Cooldowns[id])) + // sPly.Cooldowns.Remove(id); + // } + //} } + #endregion - #region OnSignEdit - private bool OnSignEdit(int X, int Y, string text, int who) + #region OnSignNew + + private static bool OnSignNew(int x, int y, string text, int who) { - if (!text.ToLower().StartsWith(Config.DefineSignCommands.ToLower())) return false; + if (!text.ToLower().StartsWith(config.DefineSignCommands.ToLower())) return false; + + var tPly = TShock.Players[who]; + var point = new Point(x, y); + var sign = new ScSign(text, tPly, point); + if (tPly == null) + return false; - TSPlayer tPly = TShock.Players[who]; - scSign sign = new scSign(text, new Point(X, Y)); + if (!ScUtils.CanEdit(tPly, sign)) + return true; - if (scUtils.CanCreate(tPly, sign)) return false; + if (ScUtils.CanCreate(tPly, sign)) + { + ScSigns.AddItem(point, sign); + return false; + } tPly.SendErrorMessage("You do not have permission to create that sign command."); return true; } + #endregion #region OnSignHit - private bool OnSignHit(int X, int Y, string text, int who) + + private static bool OnSignHit(int x, int y, string text, int who) { - if (!text.ToLower().StartsWith(Config.DefineSignCommands.ToLower())) return false; - TSPlayer tPly = TShock.Players[who]; - scPlayer sPly = scPlayers[who]; - scSign sign = new scSign(text, new Point(X, Y)); + if (!text.ToLower().StartsWith(config.DefineSignCommands.ToLower())) return false; + var tPly = TShock.Players[who]; + var sPly = ScPlayers[who]; + var sign = ScSigns.Check(x, y, text, tPly); - bool CanBreak = scUtils.CanBreak(tPly, sign); - if (sPly.DestroyMode && CanBreak) return false; + if (tPly == null || sPly == null) return false; - if (Config.ShowDestroyMessage && CanBreak && sPly.AlertDestroyCooldown == 0) + var canBreak = ScUtils.CanBreak(tPly, sign); + if (sPly.DestroyMode && canBreak) return false; + + if (config.ShowDestroyMessage && canBreak && sPly.AlertDestroyCooldown == 0) { - tPly.SendInfoMessage("To destroy this sign, Type \"/destsign\"."); + tPly.SendInfoMessage("To destroy this sign, Type \"/destroysign\"."); sPly.AlertDestroyCooldown = 10; } + if (!sign.CheckPermissions(tPly)) return true; + sign.ExecuteCommands(sPly); return true; } + #endregion #region OnSignKill - private bool OnSignKill(int X, int Y, string text, int who) + + private static bool OnSignKill(int x, int y, string text, int who) { - if (!text.ToLower().StartsWith(Config.DefineSignCommands.ToLower())) return false; + if (!text.ToLower().StartsWith(config.DefineSignCommands.ToLower())) return false; + + var sPly = ScPlayers[who]; + var tPly = TShock.Players[who]; + if (sPly == null || tPly == null) return false; + var sign = ScSigns.Check(x, y, text, sPly.TsPlayer); - var sPly = scPlayers[who]; - scSign sign = new scSign(text, new Point(X, Y)); + if (sPly == null) + return false; - if (sPly.DestroyMode && scUtils.CanBreak(sPly.TSPlayer, sign)) + if (sPly.DestroyMode && ScUtils.CanBreak(sPly.TsPlayer, sign)) { sPly.DestroyMode = false; - string id = new Point(X, Y).ToString(); - List OfflinePlayers = new List(OfflineCooldowns.Keys); - foreach (var p in OfflinePlayers) - { - if (OfflineCooldowns[p].ContainsKey(id)) - OfflineCooldowns[p].Remove(id); - } - - foreach (var Ply in scPlayers) - { - if (Ply == null || !Ply.Cooldowns.ContainsKey(id)) continue; - Ply.Cooldowns.Remove(id); - } + //Cooldown removal return false; } + + if (!sign.CheckPermissions(tPly)) return true; + sign.ExecuteCommands(sPly); return true; } + + #endregion + + #region OnSignOpen + + private static bool OnSignOpen(int x, int y, string text, int who) + { + if (!text.ToLower().StartsWith(config.DefineSignCommands.ToLower())) return false; + + var tPly = TShock.Players[who]; + var sign = ScSigns.Check(x, y, text, tPly); + + if (!ScUtils.CanRead(tPly, sign)) + return true; + + return false; + } + #endregion #region OnGetData - public void OnGetData(GetDataEventArgs e) + + private static void OnGetData(GetDataEventArgs e) { if (e.Handled) - { return; - } - switch (e.MsgID) - { - #region Sign Edit - case PacketTypes.SignNew: - { - int X = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 2); - int Y = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 6); - string text = Encoding.UTF8.GetString(e.Msg.readBuffer, e.Index + 10, e.Length - 11); - - int id = Terraria.Sign.ReadSign(X, Y); - if (id < 0 || Main.sign[id] == null) return; - X = Main.sign[id].x; - Y = Main.sign[id].y; - if (OnSignEdit(X, Y, text, e.Msg.whoAmI)) + + using (var reader = new BinaryReader(new MemoryStream(e.Msg.readBuffer, e.Index, e.Length))) + switch (e.MsgID) + { + #region Sign Edit + + case PacketTypes.SignNew: { - e.Handled = true; - TShock.Players[e.Msg.whoAmI].SendData(PacketTypes.SignNew, "", id); + reader.ReadInt16(); + var x = reader.ReadInt16(); + var y = reader.ReadInt16(); + var text = reader.ReadString(); + var id = Sign.ReadSign(x, y); + if (id < 0 || Main.sign[id] == null) return; + x = (short)Main.sign[id].x; + y = (short)Main.sign[id].y; + if (OnSignNew(x, y, text, e.Msg.whoAmI)) + { + e.Handled = true; + TShock.Players[e.Msg.whoAmI].SendData(PacketTypes.SignNew, "", id); + TShock.Players[e.Msg.whoAmI].SendErrorMessage("This sign is protected from modifications."); + } } - } - break; - #endregion - - #region Tile Modify - case PacketTypes.Tile: - { - int X = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 1); - int Y = BitConverter.ToInt32(e.Msg.readBuffer, e.Index + 5); - - if (Main.tile[X, Y].type != 55) return; - - int id = Terraria.Sign.ReadSign(X, Y); - if (id < 0 || Main.sign[id] == null) return; - X = Main.sign[id].x; - Y = Main.sign[id].y; - string text = Main.sign[id].text; - - bool handle = false; - if (e.Msg.readBuffer[e.Index] == 0 && e.Msg.readBuffer[e.Index + 9] == 0) - handle = OnSignKill(X, Y, text, e.Msg.whoAmI); - else - handle = OnSignHit(X, Y, text, e.Msg.whoAmI); - - if (handle) + break; + + #endregion + + #region Sign Read + + case PacketTypes.SignRead: { - e.Handled = true; - TShock.Players[e.Msg.whoAmI].SendTileSquare(X, Y); + var x = reader.ReadInt16(); + var y = reader.ReadInt16(); + var id = Sign.ReadSign(x, y); + if (id < 0 || Main.sign[id] == null) return; + x = (short)Main.sign[id].x; + y = (short)Main.sign[id].y; + var text = Main.sign[id].text; + if (OnSignOpen(x, y, text, e.Msg.whoAmI)) + { + e.Handled = true; + TShock.Players[e.Msg.whoAmI].SendErrorMessage("This sign is protected from viewing"); + } } - } - break; - #endregion - } + break; + + #endregion + + #region Tile Modify + + case PacketTypes.Tile: + { + var action = reader.ReadByte(); + var x = reader.ReadInt16(); + var y = reader.ReadInt16(); + var type = reader.ReadUInt16(); + + if (Main.tile[x, y].type != 55) return; + + var id = Sign.ReadSign(x, y); + if (id < 0 || Main.sign[id] == null) return; + x = (short)Main.sign[id].x; + y = (short)Main.sign[id].y; + var text = Main.sign[id].text; + + bool handle; + if (action == 0 && type == 0) + handle = OnSignKill(x, y, text, e.Msg.whoAmI); + else + handle = OnSignHit(x, y, text, e.Msg.whoAmI); + + if (handle) + { + e.Handled = true; + TShock.Players[e.Msg.whoAmI].SendTileSquare(x, y); + } + } + break; + + #endregion + } } + #endregion } + + public class Cooldown + { + public int time; + public ScSign sign; + public string name; + public string group; + + public Cooldown(int time, ScSign sign, string name, string group = null) + { + this.time = time; + this.sign = sign; + this.name = name; + this.group = group; + } + } } \ No newline at end of file diff --git a/SignCommands/scPlayer.cs b/SignCommands/scPlayer.cs index ea68fe4..3b5d95c 100644 --- a/SignCommands/scPlayer.cs +++ b/SignCommands/scPlayer.cs @@ -1,27 +1,24 @@ -using System; -using System.Collections.Generic; -using TShockAPI; +using TShockAPI; namespace SignCommands { - public class scPlayer + public class ScPlayer { public int Index { get; set; } - public TSPlayer TSPlayer { get { return TShock.Players[Index]; } } - public Dictionary Cooldowns { get; set; } + public TSPlayer TsPlayer { get { return TShock.Players[Index]; } } + public ScSign confirmSign; public bool DestroyMode { get; set; } public int AlertCooldownCooldown { get; set; } public int AlertPermissionCooldown { get; set; } public int AlertDestroyCooldown { get; set; } - public scPlayer(int index) + public ScPlayer(int index) { - this.Index = index; - this.Cooldowns = new Dictionary(); - this.DestroyMode = false; - this.AlertDestroyCooldown = 0; - this.AlertPermissionCooldown = 0; - this.AlertCooldownCooldown = 0; + Index = index; + DestroyMode = false; + AlertDestroyCooldown = 0; + AlertPermissionCooldown = 0; + AlertCooldownCooldown = 0; } } } \ No newline at end of file diff --git a/SignCommands/scSign.cs b/SignCommands/scSign.cs index ac06e1f..3de5e4b 100644 --- a/SignCommands/scSign.cs +++ b/SignCommands/scSign.cs @@ -2,231 +2,609 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Terraria; +using TShockAPI; namespace SignCommands { - public class scSign - { - public Point Position { get; set; } - public int Cooldown { get; set; } - public string CooldownGroup { get; set; } - public long Cost { get; set; } - public List Commands { get; set; } - public scSign(string text, Point position) - { - this.Position = position; - this.Cooldown = 0; - this.CooldownGroup = string.Empty; - this.Cost = 0L; - this.Commands = new List(); - ParseCommands(text); - } - - #region ParseCommands - public void ParseCommands(string text) - { - char LF = Encoding.UTF8.GetString(new byte[] { 10 })[0]; - text = string.Join(" ", text.Split(LF)); - - char split = '>'; - if (SignCommands.Config.CommandsStartWith.Length == 1) - split = SignCommands.Config.CommandsStartWith[0]; - - List commands = new List { text }; - if (text.Contains(split)) - commands = text.Split(split).ToList(); - - /* Define Sign Command string should be at [0], we dont need it. */ - if (commands.Count > 0) - commands.RemoveAt(0); - - foreach (string cmd in commands) - { - /* Parse Parameters */ - var args = scUtils.ParseParameters(cmd); + public class ScSign + { + public int cooldown; + private int _cooldown; + private string _cooldownGroup; + private readonly List _groups = new List(); + private readonly List _users = new List(); + private readonly Dictionary _bosses = new Dictionary(); + private readonly Dictionary _mobs = new Dictionary(); + public readonly Dictionary, SignCommand> commands = new Dictionary, SignCommand>(); + public bool freeAccess; + public bool noEdit; + public bool noRead; + private bool _confirm; + private Point _point; - var name = args[0]; - args.RemoveAt(0); + public string requiredPermission = string.Empty; - this.Commands.Add(new scCommand(this, name, args)); - } + public ScSign(string text, TSPlayer registrar, Point point) + { + _point = point; + cooldown = 0; + _cooldownGroup = string.Empty; + RegisterCommands(text, registrar); + } - List Commands = this.Commands.ToList(); - foreach (scCommand cmd in Commands) - { - /* Parse Cooldown */ - if (cmd.command == "cooldown" && cmd.args.Count > 0) - { - int seconds; - if (!int.TryParse(cmd.args[0], out seconds)) - { - this.CooldownGroup = cmd.args[0].ToLower(); - if (SignCommands.Config.CooldownGroups.ContainsKey(this.CooldownGroup)) - this.Cooldown = SignCommands.Config.CooldownGroups[this.CooldownGroup]; - else - this.CooldownGroup = string.Empty; - } - else - this.Cooldown = seconds; - this.Commands.Remove(cmd); - } - /* Parse Cost */ - else if (SignCommands.UsingSEConomy && cmd.command == "cost" && cmd.args.Count > 0) - { - this.Cost = parseCost(cmd.args[0]); - this.Commands.Remove(cmd); - } - /* Check if Valid */ - else if (!cmd.AmIValid()) - { - this.Commands.Remove(cmd); - } - } - } - #endregion - - #region ExecuteCommands - public void ExecuteCommands(scPlayer sPly) - { - #region Check Cooldown - if (!sPly.TSPlayer.Group.HasPermission("essentials.signs.nocooldown") && this.Cooldown > 0) - { - if (this.CooldownGroup.StartsWith("global-")) - { - lock (SignCommands.GlobalCooldowns) - { - if (!SignCommands.GlobalCooldowns.ContainsKey(this.CooldownGroup)) - SignCommands.GlobalCooldowns.Add(this.CooldownGroup, DateTime.UtcNow.AddSeconds(this.Cooldown)); - else - { - if (SignCommands.GlobalCooldowns[this.CooldownGroup] > DateTime.UtcNow) - { - if (sPly.AlertCooldownCooldown == 0) - { - sPly.TSPlayer.SendErrorMessage("Everyone must wait another {0} seconds before using this sign.", (int)(SignCommands.GlobalCooldowns[this.CooldownGroup] - DateTime.UtcNow).TotalSeconds); - sPly.AlertCooldownCooldown = 3; - } - return; - } - else - SignCommands.GlobalCooldowns[this.CooldownGroup] = DateTime.UtcNow.AddSeconds(this.Cooldown); - } - } - } - else + #region ParseCommands + + private IEnumerable> ParseCommands(string text) + { + //Remove the Sign Command definer. It's not required + text = text.Remove(0, SignCommands.config.DefineSignCommands.Length); + + //Replace the Sign Command command starter with the TShock one so that it gets handled properly later + text = text.Replace(SignCommands.config.CommandsStartWith, TShock.Config.CommandSpecifier); + + //Remove whitespace + text = text.Trim(); + + //Create a local variable for our return value + var ret = new List>(); + + //Split the text string at any TShock command character + var cmdStrings = text.Split(Convert.ToChar(TShock.Config.CommandSpecifier)); + + //Iterate through the strings + foreach (var str in cmdStrings) + { + var sbList = new List(); + var sb = new StringBuilder(); + var instr = false; + for (var i = 0; i < str.Length; i++) + { + var c = str[i]; + + if (c == '\\' && ++i < str.Length) + { + if (str[i] != '"' && str[i] != ' ' && str[i] != '\\') + sb.Append('\\'); + sb.Append(str[i]); + } + else if (c == '"') + { + instr = !instr; + if (!instr) + { + sbList.Add(sb.ToString()); + sb.Clear(); + } + else if (sb.Length > 0) + { + sbList.Add(sb.ToString()); + sb.Clear(); + } + } + else if (IsWhiteSpace(c) && !instr) + { + if (sb.Length > 0) + { + sbList.Add(sb.ToString()); + sb.Clear(); + } + } + else + sb.Append(c); + } + if (sb.Length > 0) + sbList.Add(sb.ToString()); + + ret.Add(sbList); + } + return ret; + } + + private static bool IsWhiteSpace(char c) + { + return c == ' ' || c == '\t' || c == '\n'; + } + + #endregion + + #region RegisterCommands + + private void RegisterCommands(string text, TSPlayer ply) + { + var cmdList = ParseCommands(text); + + foreach (var cmdArgs in cmdList) + { + var args = new List(cmdArgs); + if (args.Count < 1) + continue; + + var cmdName = args[0]; + + switch (cmdName) { - lock (sPly.Cooldowns) - { - string CooldownID = string.Concat(this.Position.ToString()); - if (this.CooldownGroup != string.Empty) - CooldownID = this.CooldownGroup; - - if (!sPly.Cooldowns.ContainsKey(CooldownID)) - sPly.Cooldowns.Add(CooldownID, DateTime.UtcNow.AddSeconds(this.Cooldown)); - else - { - if (sPly.Cooldowns[CooldownID] > DateTime.UtcNow) - { - if (sPly.AlertCooldownCooldown == 0) - { - sPly.TSPlayer.SendErrorMessage("You must wait another {0} seconds before using this sign.", (int)(sPly.Cooldowns[CooldownID] - DateTime.UtcNow).TotalSeconds); - sPly.AlertCooldownCooldown = 3; - } - return; - } - else - sPly.Cooldowns[CooldownID] = DateTime.UtcNow.AddSeconds(this.Cooldown); - } - } + case "no-perm": + if (!ply.Group.HasPermission("essentials.signs.negateperms")) + { + ply.SendErrorMessage("You do not have permission to create that sign command."); + continue; + } + freeAccess = true; + continue; + case "confirm": + _confirm = true; + continue; + case "no-read": + noRead = true; + continue; + case "no-edit": + noEdit = true; + continue; + case "require-perm": + case "rperm": + requiredPermission = args[1]; + continue; + case "cd": + case "cooldown": + ParseSignCd(args); + continue; + case "allowg": + if (!ply.Group.HasPermission("essentials.signs.allowgroups")) + { + ply.SendErrorMessage("You do not have permission to create that sign command."); + continue; + } + ParseGroups(args); + continue; + case "allowu": + if (!ply.Group.HasPermission("essentials.signs.allowusers")) + { + ply.SendErrorMessage("You do not have permission to create that sign command."); + continue; + } + ParseUsers(args); + continue; + case "spawnmob": + case "sm": + if (!ply.Group.HasPermission(Permissions.spawnmob)) + { + ply.SendErrorMessage("You do not have permission to create that sign command."); + continue; + } + ParseSpawnMob(args, ply); + continue; + case "spawnboss": + case "sb": + if (!ply.Group.HasPermission(Permissions.spawnboss)) + { + ply.SendErrorMessage("You do not have permission to create that sign command."); + continue; + } + ParseSpawnBoss(args, ply); + continue; } - } - #endregion - #region Check Cost - if (SignCommands.UsingSEConomy && this.Cost > 0 && !chargeSign(sPly)) + IEnumerable cmds = Commands.ChatCommands.Where(c => c.HasAlias(cmdName)).ToList(); + + foreach (var cmd in cmds) + { + if (!CheckPermissions(ply)) + return; + + var sCmd = new SignCommand(cooldown, cmd.Permissions, cmd.CommandDelegate, cmdName); + commands.Add(args, sCmd); + } + } + } + + #endregion + + #region ExecuteCommands + + public void ExecuteCommands(ScPlayer sPly) + { + var hasPerm = CheckPermissions(sPly.TsPlayer); + + if (!hasPerm) return; - #endregion - int DoesntHavePermission = 0; - foreach (scCommand cmd in this.Commands) + if (cooldown > 0) { - if (!sPly.TSPlayer.Group.HasPermission(string.Format("essentials.signs.use.{0}", cmd.command))) + if (sPly.AlertCooldownCooldown == 0) { - DoesntHavePermission++; - continue; + sPly.TsPlayer.SendErrorMessage("This sign is still cooling down. Please wait {0} more second{1}", + cooldown, cooldown.Suffix()); + sPly.AlertCooldownCooldown = 3; } - cmd.ExecuteCommand(sPly); + return; } - if (DoesntHavePermission > 0 && sPly.AlertPermissionCooldown == 0) - { - sPly.TSPlayer.SendErrorMessage("You do not have permission to use {0} command(s) on that sign.", DoesntHavePermission); - sPly.AlertPermissionCooldown = 5; - } - } - #endregion + if (_confirm && sPly.confirmSign != this) + { + sPly.confirmSign = this; + sPly.TsPlayer.SendWarningMessage("Are you sure you want to execute this sign command?"); + sPly.TsPlayer.SendWarningMessage("Hit the sign again to confirm."); + cooldown = 2; + return; + } - #region Economy - long parseCost(string arg) - { - try - { - Wolfje.Plugins.SEconomy.Money cost; - if (!Wolfje.Plugins.SEconomy.Money.TryParse(arg, out cost)) - return 0L; - return cost; - } - catch { return 0L; } - } - bool chargeSign(scPlayer sPly) - { - try - { - var economyPlayer = Wolfje.Plugins.SEconomy.SEconomyPlugin.GetEconomyPlayerSafe(sPly.Index); - var commandCost = new Wolfje.Plugins.SEconomy.Money(this.Cost); + if (_groups.Count > 0 && !_groups.Contains(sPly.TsPlayer.Group.Name)) + { + if (sPly.AlertPermissionCooldown == 0) + { + sPly.TsPlayer.SendErrorMessage("Your group does not have access to this sign"); + sPly.AlertPermissionCooldown = 3; + } + return; + } - if (economyPlayer.BankAccount != null) - { - if (!economyPlayer.BankAccount.IsAccountEnabled) - { - sPly.TSPlayer.SendErrorMessage("You cannot use this command because your account is disabled."); - } - else if (economyPlayer.BankAccount.Balance >= this.Cost) - { - Wolfje.Plugins.SEconomy.Journal.BankTransferEventArgs trans = economyPlayer.BankAccount.TransferTo( - Wolfje.Plugins.SEconomy.SEconomyPlugin.WorldAccount, - commandCost, - Wolfje.Plugins.SEconomy.Journal.BankAccountTransferOptions.AnnounceToSender | - Wolfje.Plugins.SEconomy.Journal.BankAccountTransferOptions.IsPayment, - "", - string.Format("Sign Command charge to {0}", sPly.TSPlayer.Name) - ); - if (trans.TransferSucceeded) - { - return true; - } - else - { - sPly.TSPlayer.SendErrorMessage("Your payment failed."); - } - } - else - { - sPly.TSPlayer.SendErrorMessage("This Sign Command costs {0}. You need {1} more to be able to use it.", - commandCost.ToLongString(), - ((Wolfje.Plugins.SEconomy.Money)(economyPlayer.BankAccount.Balance - commandCost)).ToLongString() - ); - } - } - else - { - sPly.TSPlayer.SendErrorMessage("This command costs money and you don't have a bank account. Please log in first."); - } - } - catch { } - return false; - } - #endregion - } -} + if (_users.Count > 0 && !_users.Contains(sPly.TsPlayer.User.Name)) + { + if (sPly.AlertPermissionCooldown == 0) + { + sPly.TsPlayer.SendErrorMessage("You do not have access to this sign"); + sPly.AlertPermissionCooldown = 3; + } + return; + } + + if (_mobs.Count > 0) + SpawnMobs(_mobs, sPly); + + if (_bosses.Count > 0) + SpawnBosses(_bosses, sPly); + + foreach (var cmdPair in commands) + { + //var args = new List(cmdPair.Key); + var cmd = cmdPair.Value; + var cmdText = string.Join(" ", cmdPair.Key); + cmdText = cmdText.Replace("{player}", sPly.TsPlayer.Name); + //Create args straight from the command text, meaning no need to iterate through args to replace {player} + var args = cmdText.Split(' ').ToList(); + + + //while (args.Any(s => s.Contains("{player}"))) + // args[args.IndexOf("{player}")] = sPly.TsPlayer.Name; + + if (cmd.DoLog) + TShock.Utils.SendLogs( + string.Format("{0} executed: {1}{2} [Via sign command].", sPly.TsPlayer.Name, + TShock.Config.CommandSpecifier, + cmdText), Color.PaleVioletRed, sPly.TsPlayer); + + args.RemoveAt(0); + + cmd.CommandDelegate.Invoke(new CommandArgs(cmdText, sPly.TsPlayer, args)); + } + + cooldown = _cooldown; + sPly.AlertCooldownCooldown = 3; + sPly.confirmSign = null; + } + + #endregion + + #region CheckPermissions + + public bool CheckPermissions(TSPlayer player) + { + if (player == null) return false; + + var sPly = SignCommands.ScPlayers[player.Index]; + if (sPly == null) + { + TShock.Log.ConsoleError("An error occured while executing a sign command." + + "TSPlayer {0} at index {1} does not exist as an ScPlayer", + player.Name, player.Index); + player.SendErrorMessage("An error occured. Please try again"); + return false; + } + + if (freeAccess) return true; + + if (!string.IsNullOrEmpty(requiredPermission)) + if (player.Group.HasPermission(requiredPermission)) + return true; + else + { + if (sPly.AlertPermissionCooldown == 0) + { + player.SendErrorMessage("You do not have the required permission to use this sign."); + sPly.AlertPermissionCooldown = 3; + } + return false; + } + + if (_mobs.Count > 0 && !player.Group.HasPermission(Permissions.spawnmob)) + { + if (sPly.AlertPermissionCooldown == 0) + { + player.SendErrorMessage("You do not have the required permission to use this sign."); + sPly.AlertPermissionCooldown = 3; + } + return false; + } + if (_bosses.Count > 0 && !player.Group.HasPermission(Permissions.spawnboss)) + { + if (sPly.AlertPermissionCooldown == 0) + { + player.SendErrorMessage("You do not have the required permission to use this sign."); + sPly.AlertPermissionCooldown = 3; + } + return false; + } + + if (commands.Values.All(command => command.CanRun(player))) + return true; + + if (sPly.AlertPermissionCooldown == 0) + { + player.SendErrorMessage("You do not have access to the commands on this sign."); + sPly.AlertPermissionCooldown = 3; + } + return false; + } + + #endregion + + private void ParseSpawnMob(IEnumerable args, TSPlayer player) + { + //>sm "blue slime":10 zombie:100 + var list = new List(args); + list.RemoveAt(0); + foreach (var obj in list) + { + try + { + var mob = obj.Split(':')[0]; + var num = obj.Split(':')[1]; + + int spawnCount; + if (!int.TryParse(num, out spawnCount)) + continue; + + _mobs.Add(mob, spawnCount); + } + catch + { + player.SendErrorMessage("Invalid naming format. Format: \"mobname:spawncount\""); + } + } + } + + private void ParseSpawnBoss(IEnumerable args, TSPlayer player) + { + var list = new List(args); + list.RemoveAt(0); + foreach (var obj in list) + { + try + { + var boss = obj.Split(':')[0]; + var num = obj.Split(':')[1]; + + int spawnCount; + if (!int.TryParse(num, out spawnCount)) + continue; + + _bosses.Add(boss, spawnCount); + } + catch + { + player.SendErrorMessage("Invalid naming format. Format: \"bossname:spawncount\""); + } + } + } + + private void ParseSignCd(IList args) + { + int cd; + if (args.Count < 3) + { + //args[0] is command name + if (!int.TryParse(args[1], out cd)) + { + if (SignCommands.config.CooldownGroups.ContainsKey(args[1])) + { + cd = SignCommands.config.CooldownGroups[args[1]]; + _cooldownGroup = args[1]; + } + } + _cooldown = cd; + } + else + { + //args[0] is command name. args[1] is cooldown specifier. args[2] is cooldown + if (string.Equals(args[1], "global", StringComparison.CurrentCultureIgnoreCase)) + { + if (!int.TryParse(args[2], out cd)) + { + if (SignCommands.config.CooldownGroups.ContainsKey(args[2])) + { + cd = SignCommands.config.CooldownGroups[args[2]]; + _cooldownGroup = args[2]; + } + } + _cooldown = cd; + } + } + } + + private void ParseGroups(IEnumerable args) + { + var groups = new List(args); + //Remove the command name- it's not a group + groups.RemoveAt(0); + + foreach (var group in groups) + _groups.Add(group); + } + + private void ParseUsers(IEnumerable args) + { + var users = new List(args); + //Remove the command name- it's not a user + users.RemoveAt(0); + + foreach (var user in users) + _users.Add(user); + } + + private void SpawnMobs(Dictionary mobs, ScPlayer sPly) + { + var mobList = new List(); + foreach (var pair in mobs) + { + var amount = Math.Min(pair.Value, Main.maxNPCs); + + var npcs = TShock.Utils.GetNPCByIdOrName(pair.Key); + if (npcs.Count == 0) + continue; + + if (npcs.Count > 1) + continue; + + var npc = npcs[0]; + if (npc.type >= 1 && npc.type < Main.maxNPCTypes && npc.type != 113) + { + TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, _point.X, _point.Y, 50, + 20); + mobList.Add(npc.name + " (" + amount + ")"); + } + else if (npc.type == 113) + { + if (Main.wof >= 0 || (_point.Y/16f < (Main.maxTilesY - 205))) + continue; + NPC.SpawnWOF(new Vector2(_point.X, _point.Y)); + mobList.Add("the Wall of Flesh (" + amount + ")"); + } + } + + TSPlayer.All.SendSuccessMessage("{0} has spawned {1}", sPly.TsPlayer.Name, string.Join(", ", mobList)); + + TShock.Utils.SendLogs( + string.Format("{0} executed: {1}{2} [Via sign command].", sPly.TsPlayer.Name, + TShock.Config.CommandSpecifier, + "/spawnmob " + string.Join(", ", mobList)), Color.PaleVioletRed, sPly.TsPlayer); + } + + private void SpawnBosses(Dictionary bosses, ScPlayer sPly) + { + var bossList = new List(); + foreach (var pair in bosses) + { + var npc = new NPC(); + switch (pair.Key.ToLower()) + { + case "*": + case "all": + int[] npcIds = {4, 13, 35, 50, 125, 126, 127, 134, 222, 245, 262, 266, 370}; + TSPlayer.Server.SetTime(false, 0.0); + foreach (var i in npcIds) + { + npc.SetDefaults(i); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + } + + bossList.Add("all bosses (" + pair.Value + ")"); + break; + case "brain": + case "brain of cthulhu": + npc.SetDefaults(266); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "destroyer": + npc.SetDefaults(134); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "duke": + case "duke fishron": + case "fishron": + npc.SetDefaults(370); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "eater": + case "eater of worlds": + npc.SetDefaults(13); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "eye": + case "eye of cthulhu": + npc.SetDefaults(4); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "golem": + npc.SetDefaults(245); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "king": + case "king slime": + npc.SetDefaults(50); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "plantera": + npc.SetDefaults(262); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "prime": + case "skeletron prime": + npc.SetDefaults(127); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "queen": + case "queen bee": + npc.SetDefaults(222); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "skeletron": + npc.SetDefaults(35); + TSPlayer.Server.SetTime(false, 0.0); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add(npc.name + " (" + pair.Value + ")"); + break; + case "twins": + TSPlayer.Server.SetTime(false, 0.0); + npc.SetDefaults(125); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + npc.SetDefaults(126); + TSPlayer.Server.SpawnNPC(npc.type, npc.name, pair.Value, _point.X, _point.Y); + bossList.Add("the Twins (" + pair.Value + ")"); + break; + case "wof": + case "wall of flesh": + if (Main.wof >= 0) + return; + if (_point.Y/16f < Main.maxTilesY - 205) + break; + NPC.SpawnWOF(new Vector2(_point.X, _point.Y)); + bossList.Add("the Wall of Flesh (" + pair.Value + ")"); + break; + } + } + + TSPlayer.All.SendSuccessMessage("{0} has spawned {1}", sPly.TsPlayer.Name, string.Join(", ", bossList)); + TShock.Utils.SendLogs( + string.Format("{0} executed: {1}{2} [Via sign command].", sPly.TsPlayer.Name, + TShock.Config.CommandSpecifier, + "/spawnboss " + string.Join(", ", bossList)), Color.PaleVioletRed, sPly.TsPlayer); + } + } +} \ No newline at end of file diff --git a/SignCommands/scUtils.cs b/SignCommands/scUtils.cs index 89a8769..f0f58d5 100644 --- a/SignCommands/scUtils.cs +++ b/SignCommands/scUtils.cs @@ -1,103 +1,98 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; +using System.Linq; using TShockAPI; namespace SignCommands { - public static class scUtils - { - public static bool CanCreate(TSPlayer player, scSign sign) + public static class ScUtils + { + /// + /// Check if the player can create a sign. + /// The player must have the ability to use every command they put on the sign. + /// + /// Player to check permissions with + /// Sign + /// + public static bool CanCreate(TSPlayer player, ScSign sign) + { + if (sign.commands.Count == 0) return true; + + var fails = sign.commands.Count(cmd => !cmd.Value.CanRun(player)); + + return fails != sign.commands.Values.Count; + } + + public static bool CanEdit(TSPlayer player, ScSign sign) { - foreach (scCommand cmd in sign.Commands) - if (!player.Group.HasPermission(string.Concat("essentials.signs.create.", cmd.command))) - return false; - return true; + return !sign.noEdit || player.Group.HasPermission("essentials.signs.editall"); } - public static bool CanBreak(TSPlayer player, scSign sign) + public static bool CanRead(TSPlayer player, ScSign sign) { - foreach (scCommand cmd in sign.Commands) - if (!player.Group.HasPermission(string.Concat("essentials.signs.break.", cmd.command))) - return false; - return true; + return !sign.noRead || player.Group.HasPermission("essentials.signs.readall"); } - #region ParseParameters - public 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]; + /// + /// Check if the player can break a sign. + /// If the player has the sign's override permission they can break it. + /// If the player has the permission "essentials.signs.break" they can break it + /// + /// + /// + /// + public static bool CanBreak(TSPlayer player, ScSign sign) + { + if (player.Group.HasPermission(sign.requiredPermission)) + return true; + if (!player.Group.HasPermission("essentials.signs.break")) + return false; + return true; + } + } - 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 class Extensions + { + /// + /// Adds or modifies a dictionary value + /// + /// Dictionary to edit + /// Sign location + /// Sign + public static void AddItem(this Dictionary dictionary, Point point, ScSign sign) + { + if (!dictionary.ContainsKey(point)) + { + dictionary.Add(point, sign); + return; + } - return ret; - } - private static char GetEscape(char c) - { - switch (c) - { - case '\\': - return '\\'; - case '"': - return '"'; - case 't': - return '\t'; - default: - return c; - } - } - private static bool IsWhiteSpace(char c) - { - return c == ' ' || c == '\t' || c == '\n'; - } - #endregion - } + dictionary[point] = sign; + } + + /// + /// Returns or adds an ScSign from a dictionary. + /// + /// Dictionary to get results from + /// x position of sign + /// y position of sign + /// text on the sign + /// player who initiated the check + /// + public static ScSign Check(this Dictionary dictionary, int x, int y, string text, TSPlayer tPly) + { + var point = new Point(x, y); + if (!dictionary.ContainsKey(point)) + { + var sign = new ScSign(text, tPly, point); + dictionary.Add(point, sign); + return sign; + } + return dictionary[point]; + } + + public static string Suffix(this int number) + { + return number == 0 || number > 1 ? "s" : ""; + } + } }