diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 729cf227..dfdc1100 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -102,6 +102,7 @@ namespace TShockAPI ChatCommands.Add(new Command("banip", "ban", BanIP)); ChatCommands.Add(new Command("unban", "unban", UnBan)); ChatCommands.Add(new Command("unbanip", "unban", UnBanIP)); + ChatCommands.Add(new Command("whitelist", "whitelist", Whitelist)); ChatCommands.Add(new Command("off", "maintenance", Off)); ChatCommands.Add(new Command("off-nosave", "maintenance", OffNoSave)); ChatCommands.Add(new Command("checkupdates", "maintenance", CheckUpdates)); @@ -120,16 +121,21 @@ namespace TShockAPI ChatCommands.Add(new Command("spawn", "tp", Spawn)); ChatCommands.Add(new Command("tp", "tp", TP)); ChatCommands.Add(new Command("tphere", "tp", TPHere)); + ChatCommands.Add(new Command("warp", "warp", UseWarp)); + ChatCommands.Add(new Command("setwarp", "managewarp", SetWarp)); + ChatCommands.Add(new Command("delwarp", "managewarp", DeleteWarp)); ChatCommands.Add(new Command("reload", "cfg", Reload)); ChatCommands.Add(new Command("debug-config", "cfg", DebugConfiguration)); ChatCommands.Add(new Command("password", "cfg", Password)); ChatCommands.Add(new Command("save", "cfg", Save)); ChatCommands.Add(new Command("maxspawns", "cfg", MaxSpawns)); ChatCommands.Add(new Command("spawnrate", "cfg", SpawnRate)); - ChatCommands.Add(new Command("time", "cfg", Time)); + ChatCommands.Add(new Command("setspawn", "cfg", SetSpawn)); + ChatCommands.Add(new Command("time", "time", Time)); ChatCommands.Add(new Command("slap", "pvpfun", Slap)); ChatCommands.Add(new Command("antibuild", "editspawn", ToggleAntiBuild)); ChatCommands.Add(new Command("protectspawn", "editspawn", ProtectSpawn)); + ChatCommands.Add(new Command("region", "editspawn", Region)); ChatCommands.Add(new Command("help", "", Help)); ChatCommands.Add(new Command("playing", "", Playing)); ChatCommands.Add(new Command("online", "", Playing)); @@ -138,15 +144,10 @@ namespace TShockAPI ChatCommands.Add(new Command("me", "", ThirdPerson)); ChatCommands.Add(new Command("p", "", PartyChat)); ChatCommands.Add(new Command("rules", "", Rules)); - ChatCommands.Add(new Command("whitelist", "maintenance", Whitelist)); - ChatCommands.Add(new Command("region", "editspawn", Region)); - ChatCommands.Add(new Command("warp", "", UseWarp)); - ChatCommands.Add(new Command("setwarp", "cfg", SetWarp)); - ChatCommands.Add(new Command("delwarp", "cfg", DeleteWarp)); if (ConfigurationManager.DistributationAgent != "terraria-online") { ChatCommands.Add(new Command("kill", "kill", Kill)); - ChatCommands.Add(new Command("butcher", "cheat", Butcher)); + ChatCommands.Add(new Command("butcher", "butcher", Butcher)); ChatCommands.Add(new Command("i", "cheat", Item)); ChatCommands.Add(new Command("item", "cheat", Item)); ChatCommands.Add(new Command("give", "cheat", Give)); @@ -417,6 +418,17 @@ namespace TShockAPI } } + public static void Whitelist(CommandArgs args) + { + if (args.Parameters.Count == 1) + { + TextWriter tw = new StreamWriter(FileTools.WhitelistPath, true); + tw.WriteLine(args.Parameters[0]); + tw.Close(); + args.Player.SendMessage("Added " + args.Parameters[0] + " to the whitelist."); + } + } + #endregion Player Management Commands #region Server Maintenence Commands @@ -660,7 +672,7 @@ namespace TShockAPI { if (!args.Player.RealPlayer) { - args.Player.SendMessage("You cant use teleport commands!"); + args.Player.SendMessage("You cannot use teleport commands!"); return; } @@ -672,21 +684,21 @@ namespace TShockAPI { if (!args.Player.RealPlayer) { - args.Player.SendMessage("You cant use teleport commands!"); + args.Player.SendMessage("You cannot use teleport commands!"); return; } if (args.Player.Teleport(Main.spawnTileX, Main.spawnTileY)) args.Player.SendMessage("Teleported to the map's spawnpoint."); else - args.Player.SendMessage("Teleport unavailable custom spawnpoint set (to unset die after bed is destroyed).", Color.Red); + args.Player.SendMessage("Teleport unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red); } private static void TP(CommandArgs args) { if (!args.Player.RealPlayer) { - args.Player.SendMessage("You cant use teleport commands!"); + args.Player.SendMessage("You cannot use teleport commands!"); return; } @@ -708,7 +720,7 @@ namespace TShockAPI if (args.Player.Teleport(plr.TileX, plr.TileY)) args.Player.SendMessage(string.Format("Teleported to {0}", plr.Name)); else - args.Player.SendMessage("Teleport unavailable custom spawnpoint set (to unset die after bed is destroyed).", Color.Red); + args.Player.SendMessage("Teleport unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red); } } @@ -716,7 +728,7 @@ namespace TShockAPI { if (!args.Player.RealPlayer) { - args.Player.SendMessage("You cant use teleport commands!"); + args.Player.SendMessage("You cannot use teleport commands!"); return; } @@ -745,7 +757,7 @@ namespace TShockAPI args.Player.SendMessage(string.Format("You brought {0} here.", plr.Name)); } else - args.Player.SendMessage("Teleport unavailable target player has custom spawnpoint set.", Color.Red); + args.Player.SendMessage("Teleport unavailable - Target player has spawn point set to Bed.", Color.Red); } } @@ -753,15 +765,22 @@ namespace TShockAPI private static void SetWarp(CommandArgs args) { if (args.Parameters.Count > 0) - if (WarpsManager.AddWarp(args.Player.TileX, args.Player.TileY, args.Parameters[0])) + { + string warpName = String.Join(" ", args.Parameters); + if (warpName.Equals("list")) { - args.Player.SendMessage("Set warp " + args.Parameters[0], Color.Yellow); + args.Player.SendMessage("Name reserved, use a different name", Color.Red); + } + else if (WarpsManager.AddWarp(args.Player.TileX, args.Player.TileY, warpName, Main.worldName)) + { + args.Player.SendMessage("Set warp " + warpName, Color.Yellow); WarpsManager.WriteSettings(); } else { - args.Player.SendMessage("Warp " + args.Parameters[0] + " already exists", Color.Red); + args.Player.SendMessage("Warp " + warpName + " already exists", Color.Red); } + } else args.Player.SendMessage("Invalid syntax! Proper syntax: /setwarp [name]", Color.Red); } @@ -770,43 +789,85 @@ namespace TShockAPI { if (args.Parameters.Count > 0) { - if (WarpsManager.DeleteWarp(args.Parameters[0])) - args.Player.SendMessage("Deleted warp " + args.Parameters[0], Color.Yellow); + string warpName = String.Join(" ", args.Parameters); + if (WarpsManager.DeleteWarp(warpName)) + args.Player.SendMessage("Deleted warp " + warpName, Color.Yellow); else args.Player.SendMessage("Could not find specified warp", Color.Red); } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /delwarp [name]", Color.Red); } private static void UseWarp(CommandArgs args) { if (args.Parameters.Count > 0) { - if (WarpsManager.FindWarp(args.Parameters[0]) != Vector2.Zero) + if (args.Parameters[0].Equals("list")) { - args.Player.Teleport((int)WarpsManager.FindWarp(args.Parameters[0]).X, (int)WarpsManager.FindWarp(args.Parameters[0]).Y); - args.Player.SendMessage("Warped to " + args.Parameters[0], Color.Yellow); + args.Player.SendMessage("Current Warps:", Color.Green); + int page = 1; + if (args.Parameters.Count > 1) + int.TryParse(args.Parameters[1], out page); + var sb = new StringBuilder(); + if (WarpsManager.Warps.Count > (15 * (page - 1))) + { + for (int j = (15 * (page - 1)); j < (15 * page); j++) + { + if (sb.Length != 0) + sb.Append(", "); + sb.Append("/").Append(WarpsManager.Warps[j].WarpName); + if (j == WarpsManager.Warps.Count - 1) + { + args.Player.SendMessage(sb.ToString(), Color.Yellow); + break; + } + if ((j + 1) % 5 == 0) + { + args.Player.SendMessage(sb.ToString(), Color.Yellow); + sb.Clear(); + } + } + } + if (WarpsManager.Warps.Count > (15 * page)) + { + args.Player.SendMessage(string.Format("Type /warp list {0} for more warps.", (page + 1)), Color.Yellow); + } } else { - args.Player.SendMessage("Specified warp not found", Color.Yellow); + string warpName = String.Join(" ", args.Parameters); + var warp = WarpsManager.FindWarp(warpName); + if (warp != Vector2.Zero) + { + if (args.Player.Teleport((int)warp.X, (int)warp.Y)) + args.Player.SendMessage("Warped to " + warpName, Color.Yellow); + else + args.Player.SendMessage("Warp unavailable - Spawn point set to Bed. To unset, destroy Bed and suicide at least once.", Color.Red); + + } + else + { + args.Player.SendMessage("Specified warp not found", Color.Red); + } } } else - { - args.Player.SendMessage("Current Warps:", Color.Green); - - //Someone needs to make it list - for (int i = 0; i < (WarpsManager.Warps.Count); i++) - { - args.Player.SendMessage(WarpsManager.Warps[i].WarpName, Color.Yellow); - } - } + args.Player.SendMessage("Invalid syntax! Proper syntax: /warp [name] or warp list", Color.Red); } #endregion Teleport Commands #region Server Config Commands + private static void SetSpawn(CommandArgs args) + { + Main.spawnTileX = args.Player.TileX; + Main.spawnTileY = args.Player.TileY; + ConfigurationManager.WriteJsonConfiguration(); + args.Player.SendMessage("Set server spawn point to your position"); + } + private static void DebugConfiguration(CommandArgs args) { args.Player.SendMessage("TShock Config:"); @@ -884,6 +945,10 @@ namespace TShockAPI Tools.Broadcast(string.Format("{0} changed the spawn rate to: {1}", args.Player.Name, amount)); } + #endregion Server Config Commands + + #region Time/PvpFun Commands + private static void Time(CommandArgs args) { if (args.Parameters.Count != 1) @@ -920,7 +985,44 @@ namespace TShockAPI } } - #endregion Server Config Commands + private static void Slap(CommandArgs args) + { + if (args.Parameters.Count < 1 || args.Parameters.Count > 2) + { + args.Player.SendMessage("Invalid syntax! Proper syntax: /slap [dmg]", Color.Red); + return; + } + if (args.Parameters[0].Length == 0) + { + args.Player.SendMessage("Missing player name", Color.Red); + return; + } + + string plStr = args.Parameters[0]; + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) + { + args.Player.SendMessage("Invalid player!", Color.Red); + } + else if (players.Count > 1) + { + args.Player.SendMessage("More than one player matched!", Color.Red); + } + else + { + var plr = players[0]; + int damage = 5; + if (args.Parameters.Count == 2) + { + int.TryParse(args.Parameters[1], out damage); + } + plr.DamagePlayer(damage); + Tools.Broadcast(string.Format("{0} slapped {1} for {2} damage.", + args.Player.Name, plr.Name, damage)); + } + } + + #endregion Time/PvpFun Commands #region World Protection Commands @@ -938,122 +1040,170 @@ namespace TShockAPI private static void Region(CommandArgs args) { + string cmd = "help"; if (args.Parameters.Count > 0) { - switch (args.Parameters[0].ToLower()) - { - case "set": + cmd = args.Parameters[0].ToLower(); + } + switch (cmd) + { + case "set": + { + if (args.Parameters.Count == 2) { - if (args.Parameters.Count > 1) + if (args.Parameters[1] == "1") { - if (args.Parameters[1] == "1") + args.Player.TempArea.X = args.Player.TileX; + args.Player.TempArea.Y = args.Player.TileY; + args.Player.SendMessage("Set Temp Point 1", Color.Yellow); + } + else if (args.Parameters[1] == "2") + { + if (args.Player.TempArea.X != 0) { - args.Player.TempArea.X = args.Player.TileX; - args.Player.TempArea.Y = args.Player.TileY; - args.Player.SendMessage("Set Temp Point 1", Color.Yellow); - } - else if (args.Parameters[1] == "2") - { - if (args.Player.TempArea.X != 0) + if (args.Player.TileX > args.Player.TempArea.X && args.Player.TileY > args.Player.TempArea.Y) { - if (args.Player.TileX > args.Player.TempArea.X && args.Player.TileY > args.Player.TempArea.Y) - { - args.Player.TempArea.Width = args.Player.TileX - args.Player.TempArea.X; - args.Player.TempArea.Height = (args.Player.TileY + 3) - args.Player.TempArea.Y; - args.Player.SendMessage("Set Temp Point 2", Color.Yellow); - } - else - { - args.Player.SendMessage("Point 2 must be below and right of Point 1", Color.Yellow); - args.Player.SendMessage("Use /region clear to start again", Color.Yellow); - } + args.Player.TempArea.Width = args.Player.TileX - args.Player.TempArea.X; + args.Player.TempArea.Height = (args.Player.TileY + 3) - args.Player.TempArea.Y; + args.Player.SendMessage("Set Temp Point 2", Color.Yellow); } else { - args.Player.SendMessage("You have not set Point 1 yet", Color.Red); + args.Player.SendMessage("Point 2 must be below and right of Point 1", Color.Yellow); + args.Player.SendMessage("Use /region clear to start again", Color.Yellow); } } + else + { + args.Player.SendMessage("You have not set Point 1 yet", Color.Red); + } } else args.Player.SendMessage("Invalid syntax! Proper syntax: /region set [1/2]", Color.Red); - break; } - case "define": + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region set [1/2]", Color.Red); + break; + } + case "define": + { + if (args.Parameters.Count > 1) { - if (args.Parameters.Count > 1) + if (!args.Player.TempArea.IsEmpty) { - if (!args.Player.TempArea.IsEmpty) + string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); + if (RegionManager.AddRegion(args.Player.TempArea.X, args.Player.TempArea.Y, + args.Player.TempArea.Width, args.Player.TempArea.Height, + regionName, Main.worldName)) { - if (RegionManager.AddRegion(args.Player.TempArea.X, args.Player.TempArea.Y, args.Player.TempArea.Width, args.Player.TempArea.Height, args.Parameters[1], true)) - { - RegionManager.WriteSettings(); - args.Player.TempArea = Rectangle.Empty; - args.Player.SendMessage("Set region " + args.Parameters[1], Color.Yellow); - } - else - { - args.Player.SendMessage("Region " + args.Parameters[1] + " already exists", Color.Red); - } + args.Player.TempArea = Rectangle.Empty; + args.Player.SendMessage("Set region " + regionName, Color.Yellow); } else - args.Player.SendMessage("Points not set up yet", Color.Red); + { + args.Player.SendMessage("Region " + regionName + " already exists", Color.Red); + } } else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region define [name]", Color.Red); - break; + args.Player.SendMessage("Points not set up yet", Color.Red); } - case "protect": + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region define [name]", Color.Red); + break; + } + case "protect": + { + if (args.Parameters.Count == 3) { - if (args.Parameters.Count > 2) + string regionName = args.Parameters[1]; + if (args.Parameters[2].ToLower() == "true") { - if (args.Parameters[2].ToLower() == "true") - { - if(RegionManager.SetRegionState(args.Parameters[1],true)) - args.Player.SendMessage("Protected region " + args.Parameters[1], Color.Yellow); - else - args.Player.SendMessage("Could not find specified region", Color.Red); - } - else if (args.Parameters[2].ToLower() == "false") - { - if (RegionManager.SetRegionState(args.Parameters[1], false)) - args.Player.SendMessage("Unprotected region " + args.Parameters[1], Color.Yellow); - else - args.Player.SendMessage("Could not find specified region", Color.Red); - } + if (RegionManager.SetRegionState(regionName, true)) + args.Player.SendMessage("Protected region " + regionName, Color.Yellow); else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red); + args.Player.SendMessage("Could not find specified region", Color.Red); } - else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red); - break; - } - case "delete": - { - if (args.Parameters.Count > 1) + else if (args.Parameters[2].ToLower() == "false") { - if (RegionManager.DeleteRegion(args.Parameters[1])) - args.Player.SendMessage("Deleted region " + args.Parameters[1], Color.Yellow); + if (RegionManager.SetRegionState(regionName, false)) + args.Player.SendMessage("Unprotected region " + regionName, Color.Yellow); else args.Player.SendMessage("Could not find specified region", Color.Red); } else - args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red); - break; + args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red); } - case "clear": + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region protected [name] [true/false]", Color.Red); + break; + } + case "delete": + { + if (args.Parameters.Count > 1) { - args.Player.TempArea = Rectangle.Empty; - args.Player.SendMessage("Cleared temp area", Color.Yellow); - break; + string regionName = String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)); + if (RegionManager.DeleteRegion(regionName)) + args.Player.SendMessage("Deleted region " + regionName, Color.Yellow); + else + args.Player.SendMessage("Could not find specified region", Color.Red); } - case "help": + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red); + break; + } + case "clear": + { + args.Player.TempArea = Rectangle.Empty; + args.Player.SendMessage("Cleared temp area", Color.Yellow); + break; + } + case "allow": + { + if (args.Parameters.Count > 2) { - args.Player.SendMessage("Avialable region commands:", Color.Green); - args.Player.SendMessage("/region set [1/2] /region define [name] /region protect [name] [true/false]", Color.Yellow); - args.Player.SendMessage("/region delete [name] /region clear (temporary region)", Color.Yellow); - break; + string playerName = args.Parameters[1]; + string regionName = ""; + string playerIP = null; + + for (int i = 2; i < args.Parameters.Count; i++) + { + if (regionName == "") + { + regionName = args.Parameters[2]; + } + else + { + regionName = regionName + " " + args.Parameters[i]; + } + } + if ((playerIP = Tools.GetPlayerIP(playerName)) != null) + { + if (RegionManager.AddNewUser(regionName, playerIP)) + { + args.Player.SendMessage("Added user " + playerName + " to " + regionName, Color.Yellow); + RegionManager.WriteSettings(); + } + else + args.Player.SendMessage("Region " + regionName + " not found", Color.Red); + } + else + { + args.Player.SendMessage("Player " + playerName + " not found", Color.Red); + } } - } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region allow [name] [region]", Color.Red); + break; + } + case "help": + default: + { + args.Player.SendMessage("Avialable region commands:", Color.Green); + args.Player.SendMessage("/region set [1/2] /region define [name] /region protect [name] [true/false]", Color.Yellow); + args.Player.SendMessage("/region delete [name] /region clear (temporary region)", Color.Yellow); + args.Player.SendMessage("/region allow [name] [regionname]", Color.Yellow); + break; + } } } @@ -1062,17 +1212,6 @@ namespace TShockAPI #region General Commands - public static void Whitelist(CommandArgs args) - { - if (args.Parameters.Count == 1) - { - TextWriter tw = new StreamWriter(FileTools.WhitelistPath, true); - tw.WriteLine(args.Parameters[0]); - tw.Close(); - args.Player.SendMessage("Added " + args.Parameters[0] + " to the whitelist."); - } - } - private static void Help(CommandArgs args) { args.Player.SendMessage("TShock Commands:"); @@ -1177,43 +1316,6 @@ namespace TShockAPI #region Cheat Commands - private static void Slap(CommandArgs args) - { - if (args.Parameters.Count < 1 || args.Parameters.Count > 2) - { - args.Player.SendMessage("Invalid syntax! Proper syntax: /slap [dmg]", Color.Red); - return; - } - if (args.Parameters[0].Length == 0) - { - args.Player.SendMessage("Missing player name", Color.Red); - return; - } - - string plStr = args.Parameters[0]; - var players = Tools.FindPlayer(plStr); - if (players.Count == 0) - { - args.Player.SendMessage("Invalid player!", Color.Red); - } - else if (players.Count > 1) - { - args.Player.SendMessage("More than one player matched!", Color.Red); - } - else - { - var plr = players[0]; - int damage = 5; - if (args.Parameters.Count == 2) - { - int.TryParse(args.Parameters[1], out damage); - } - plr.DamagePlayer(damage); - Tools.Broadcast(string.Format("{0} slapped {1} for {2} damage.", - args.Player.Name, plr.Name, damage)); - } - } - private static void Kill(CommandArgs args) { if (args.Parameters.Count < 1) @@ -1328,6 +1430,7 @@ namespace TShockAPI } var items = Tools.GetItemByIdOrName(args.Parameters[0]); + if (items.Count == 0) { args.Player.SendMessage("Invalid item type!", Color.Red); @@ -1424,4 +1527,4 @@ namespace TShockAPI #endregion Cheat Comamnds } -} \ No newline at end of file +} diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index a197a333..e5508afd 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -30,10 +30,11 @@ namespace TShockAPI public bool BanCheaters = true; public bool KickGriefers = true; public bool BanGriefers = true; - public bool BanKillTileAbusers; - public bool KickKillTileAbusers; + public bool BanKillTileAbusers = true; + public bool KickKillTileAbusers = true; public bool BanExplosives = true; public bool KickExplosives = true; + public bool DisableExplosives = true; public bool SpawnProtection = true; public int SpawnProtectionRadius = 5; public string DistributationAgent = "facepunch"; @@ -41,6 +42,7 @@ namespace TShockAPI public bool RangeChecks = true; public bool SpamChecks = false; public bool DisableBuild = false; + public int TileThreshold = 20; public float[] AdminChatRGB = {255, 0, 0}; public string AdminChatPrefix = "(Admin) "; @@ -51,5 +53,10 @@ namespace TShockAPI public int BackupKeepFor = 60; public bool ListServer = false; + + public int spawnTileX; + public int spawnTileY; + + public bool RememberLeavePos = false; } } \ No newline at end of file diff --git a/TShockAPI/ConfigurationManager.cs b/TShockAPI/ConfigurationManager.cs index 00fc8d6c..d8660687 100644 --- a/TShockAPI/ConfigurationManager.cs +++ b/TShockAPI/ConfigurationManager.cs @@ -44,6 +44,7 @@ namespace TShockAPI public static bool KickTnt = true; public static bool BanBoom = true; public static bool KickBoom = true; + public static bool DisableBoom = true; public static bool SpawnProtect = true; public static bool RangeChecks = true; public static int SpawnProtectRadius = 5; @@ -54,6 +55,8 @@ namespace TShockAPI public static bool DisableBuild = false; public static float[] AdminChatRGB = {255, 0, 0}; public static string AdminChatPrefix = "(Admin) "; + public static bool RememberLeavePos = false; + public static int TileThreshold = 20; /// /// Don't allow pvp changing for x seconds. @@ -95,6 +98,7 @@ namespace TShockAPI KickTnt = cfg.KickKillTileAbusers; BanBoom = cfg.BanExplosives; KickBoom = cfg.KickExplosives; + DisableBoom = cfg.DisableExplosives; SpawnProtect = cfg.SpawnProtection; SpawnProtectRadius = cfg.SpawnProtectionRadius; DistributationAgent = cfg.DistributationAgent; @@ -102,6 +106,7 @@ namespace TShockAPI RangeChecks = cfg.RangeChecks; SpamChecks = cfg.SpamChecks; DisableBuild = cfg.DisableBuild; + TileThreshold = cfg.TileThreshold; NPC.maxSpawns = DefaultMaxSpawns; NPC.defaultSpawnRate = DefaultSpawnRate; AdminChatRGB = cfg.AdminChatRGB; @@ -110,6 +115,9 @@ namespace TShockAPI BackupInterval = cfg.BackupInterval; BackupKeepFor = cfg.BackupKeepFor; ListServer = cfg.ListServer; + Main.spawnTileX = cfg.spawnTileX; + Main.spawnTileY = cfg.spawnTileY; + RememberLeavePos = cfg.RememberLeavePos; } public static void WriteJsonConfiguration() @@ -126,22 +134,28 @@ namespace TShockAPI cfg.BanCheaters = BanCheater; cfg.KickGriefers = KickGriefer; cfg.BanGriefers = BanGriefer; - cfg.BanKillTileAbusers = BanGriefer; - cfg.KickKillTileAbusers = KickGriefer; + cfg.BanKillTileAbusers = BanTnt; + cfg.KickKillTileAbusers = KickTnt; cfg.BanExplosives = BanBoom; cfg.KickExplosives = KickBoom; + cfg.DisableExplosives = DisableBoom; cfg.SpawnProtection = SpawnProtect; cfg.SpawnProtectionRadius = SpawnProtectRadius; cfg.MaxSlots = MaxSlots; cfg.RangeChecks = RangeChecks; cfg.SpamChecks = SpamChecks; cfg.DisableBuild = DisableBuild; + cfg.TileThreshold = TileThreshold; cfg.AdminChatRGB = AdminChatRGB; cfg.AdminChatPrefix = AdminChatPrefix; cfg.PvpThrottle = PvpThrottle; cfg.BackupInterval = BackupInterval; cfg.BackupKeepFor = BackupKeepFor; cfg.ListServer = ListServer; + cfg.spawnTileX = Main.spawnTileX; + cfg.spawnTileY = Main.spawnTileY; + cfg.RememberLeavePos = RememberLeavePos; + string json = JsonConvert.SerializeObject(cfg, Formatting.Indented); TextWriter tr = new StreamWriter(FileTools.ConfigPath); tr.Write(json); diff --git a/TShockAPI/FileTools.cs b/TShockAPI/FileTools.cs index a87f94af..fa1938e8 100644 --- a/TShockAPI/FileTools.cs +++ b/TShockAPI/FileTools.cs @@ -29,6 +29,8 @@ namespace TShockAPI public static readonly string WhitelistPath = Path.Combine(TShock.SavePath, "whitelist.txt"); public static readonly string GroupsPath = Path.Combine(TShock.SavePath, "groups.txt"); public static readonly string UsersPath = Path.Combine(TShock.SavePath, "users.txt"); + public static readonly string ItemBansPath = Path.Combine(TShock.SavePath, "itembans.txt"); + public static readonly string RememberedPosPath = Path.Combine(TShock.SavePath, "oldpos.xml"); public static readonly string ConfigPath = Path.Combine(TShock.SavePath, "config.json"); public static void CreateFile(string file) @@ -60,6 +62,7 @@ namespace TShockAPI CreateIfNot(WhitelistPath); CreateIfNot(GroupsPath, Resources.groups); CreateIfNot(UsersPath, Resources.users); + CreateIfNot(ItemBansPath, Resources.itembans); try { @@ -100,7 +103,23 @@ namespace TShockAPI TextReader tr = new StreamReader(WhitelistPath); string whitelist = tr.ReadToEnd(); ip = Tools.GetRealIP(ip); - return whitelist.Contains(ip); + bool contains = whitelist.Contains(ip); + if (!contains) + { + var char2 = Environment.NewLine.ToCharArray(); + var array = whitelist.Split(Environment.NewLine.ToCharArray()); + foreach (var line in whitelist.Split(Environment.NewLine.ToCharArray())) + { + if (string.IsNullOrWhiteSpace(line)) + continue; + contains = Tools.GetIPv4Address(line).Equals(ip); + if (contains) + return true; + } + return false; + } + else + return true; } } } \ No newline at end of file diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 863ec69c..ba0b120b 100755 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -216,7 +216,7 @@ namespace TShockAPI return true; } } - if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(x, y)) + if (!args.Player.Group.HasPermission("editspawn") && RegionManager.InProtectedArea(x, y, Tools.GetPlayerIP(args.Player.Name))) { args.Player.SendMessage("Region protected from changes.", Color.Red); args.Player.SendTileSquare(x, y); @@ -251,6 +251,13 @@ namespace TShockAPI if (!args.Player.TilesDestroyed.ContainsKey(coords)) args.Player.TilesDestroyed.Add(coords, Main.tile[x, y]); } + if (args.Player.LastExplosive != null) + if ((DateTime.UtcNow - args.Player.LastExplosive).TotalMilliseconds < 1000) + { + args.Player.SendMessage("Please wait another " + (1000 - (DateTime.UtcNow - args.Player.LastExplosive).TotalMilliseconds).ToString() + " milliseconds before placing/destroying tiles", Color.Red); + args.Player.SendTileSquare(x, y); + return true; + } return false; } @@ -318,7 +325,16 @@ namespace TShockAPI if (type == 29 || type == 28 || type == 37) { Log.Debug(string.Format("Explosive(PlyXY:{0}_{1}, Type:{2})", args.Player.TileX, args.Player.TileY, type)); - return Tools.HandleExplosivesUser(args.Player, "Throwing an explosive device."); + if (ConfigurationManager.DisableBoom && (!args.Player.Group.HasPermission("useexplosives") || !args.Player.Group.HasPermission("ignoregriefdetection"))) + { + Main.projectile[ident].type = 0; + NetMessage.SendData((int)PacketTypes.ProjectileNew, args.Player.Index, -1, "", ident); + args.Player.SendMessage("Explosives are disabled!", Color.Red); + args.Player.LastExplosive = DateTime.UtcNow; + //return true; + } + else + return Tools.HandleExplosivesUser(args.Player, "Throwing an explosive device."); } return false; } diff --git a/TShockAPI/ItemManager.cs b/TShockAPI/ItemManager.cs new file mode 100644 index 00000000..1a139ee0 --- /dev/null +++ b/TShockAPI/ItemManager.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using Terraria; + +namespace TShockAPI +{ + class ItemManager + { + public static List BannedItems = new List(); + + public static void LoadBans() + { + try + { + if (!File.Exists(FileTools.ItemBansPath)) + return; + + BannedItems.Clear(); + + foreach (var line in File.ReadAllLines(FileTools.ItemBansPath)) + { + int ID = -1; + if (Int32.TryParse(line, out ID)) + { + if (ID <= Main.item.Length) + { + var item = Tools.GetItemById(ID); + BannedItems.Add(new ItemBan(ID, item.name)); + Log.Info("Item: " + item.name + " is banned"); + } + else + { + Log.Warn("Invalid ID " + ID); + } + } + } + } + catch (Exception e) + { + Log.Error(e.ToString()); + } + } + + public static bool ItemIsBanned(string ID) + { + foreach (ItemBan item in BannedItems) + { + if (ID == item.Name) + return true; + } + return false; + } + } + + public class ItemBan + { + public int ID { get; set; } + + public string Name { get; set; } + + public ItemBan(int id, string name) + { + ID = id; + Name = name; + } + + public ItemBan() + { + ID = -1; + Name = string.Empty; + } + } +} diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs index ba1cac2c..a6ae978b 100644 --- a/TShockAPI/Properties/AssemblyInfo.cs +++ b/TShockAPI/Properties/AssemblyInfo.cs @@ -35,5 +35,5 @@ using System.Runtime.InteropServices; // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.2.0.0620")] -[assembly: AssemblyFileVersion("2.2.0.0620")] \ No newline at end of file +[assembly: AssemblyVersion("2.2.0.0623")] +[assembly: AssemblyFileVersion("2.2.0.0623")] \ No newline at end of file diff --git a/TShockAPI/RegionManager.cs b/TShockAPI/RegionManager.cs index de7f0f52..1c92f245 100644 --- a/TShockAPI/RegionManager.cs +++ b/TShockAPI/RegionManager.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Xml; using Microsoft.Xna.Framework; +using Terraria; namespace TShockAPI { @@ -11,24 +12,38 @@ namespace TShockAPI { public static List Regions = new List(); - public static bool AddRegion(int tx, int ty, int width, int height, string name, bool state) + public static bool AddRegion(int tx, int ty, int width, int height, string regionname, string worldname) { foreach (Region nametest in Regions) { - if (name.ToLower() == nametest.RegionName.ToLower()) + if (regionname.ToLower() == nametest.RegionName.ToLower()) { return false; } } - Regions.Add(new Region(new Rectangle(tx, ty, width, height), name, true)); + Regions.Add(new Region(new Rectangle(tx, ty, width, height), regionname, true, worldname)); + WriteSettings(); return true; } + public static bool AddNewUser(string regionName, string IP) + { + foreach (Region nametest in Regions) + { + if (regionName.ToLower() == nametest.RegionName.ToLower()) + { + nametest.RegionAllowedIPs.Add(IP.ToLower()); + return true; + } + } + return false; + } + public static bool DeleteRegion(string name) { foreach (Region nametest in Regions) { - if (name.ToLower() == nametest.RegionName.ToLower()) + if (name.ToLower() == nametest.RegionName.ToLower() && nametest.WorldRegionName == Main.worldName) { Regions.Remove(nametest); WriteSettings(); @@ -52,18 +67,45 @@ namespace TShockAPI return false; } - public static bool InProtectedArea(int X, int Y) + public static bool InProtectedArea(int X, int Y, string IP) { foreach(Region region in Regions) { - if (X >= region.RegionArea.Left && X <= region.RegionArea.Right && Y >= region.RegionArea.Top && Y <= region.RegionArea.Bottom && region.DisableBuild) + if (X >= region.RegionArea.Left && X <= region.RegionArea.Right && Y >= region.RegionArea.Top && Y <= region.RegionArea.Bottom && region.DisableBuild && Main.worldName == region.WorldRegionName && (!AllowedUser(region.RegionName, IP.ToLower()) || region.RegionAllowedIPs.Count == 0)) { + Console.WriteLine(region.RegionName); return true; } } return false; } + public static int GetRegionIndex(string regionName) + { + for(int i = 0; i< Regions.Count;i++) + { + if(Regions[i].RegionName == regionName) + return i; + } + return -1; + } + + public static bool AllowedUser(string regionName, string playerIP) + { + int ID = -1; + if ((ID = GetRegionIndex(regionName)) != -1) + { + for (int i = 0; i < Regions[ID].RegionAllowedIPs.Count; i++) + { + if (Regions[ID].RegionAllowedIPs[i].ToLower() == playerIP.ToLower()) + { + return true; + } + } + } + return false; + } + public static void WriteSettings() { try @@ -86,6 +128,12 @@ namespace TShockAPI settingsw.WriteElementString("Point2X", region.RegionArea.Width.ToString()); settingsw.WriteElementString("Point2Y", region.RegionArea.Height.ToString()); settingsw.WriteElementString("Protected", region.DisableBuild.ToString()); + settingsw.WriteElementString("WorldName", region.WorldRegionName); + settingsw.WriteElementString("AllowedUserCount", region.RegionAllowedIPs.Count.ToString()); + for (int i = 0; i < region.RegionAllowedIPs.Count; i++) + { + settingsw.WriteElementString("IP", region.RegionAllowedIPs[i]); + } settingsw.WriteEndElement(); } @@ -96,7 +144,7 @@ namespace TShockAPI } catch { - Log.Info("Could not write Regions"); + Log.Warn("Could not write Regions"); } } @@ -123,15 +171,21 @@ namespace TShockAPI { if (settingr.Read()) { - string name; + string name = null; int x = 0; int y = 0; int width = 0; int height = 0; bool state = true; + string worldname = null; + int playercount = 0; settingr.Read(); - name = settingr.Value; + if (settingr.Value != "" || settingr.Value != null) + name = settingr.Value; + else + Log.Warn("Region name is empty"); + settingr.Read(); settingr.Read(); @@ -139,7 +193,7 @@ namespace TShockAPI if (settingr.Value != "" || settingr.Value != null) Int32.TryParse(settingr.Value, out x); else - Console.WriteLine("Could not parse x"); + Log.Warn("x for region " + name + " is empty"); settingr.Read(); settingr.Read(); @@ -147,7 +201,7 @@ namespace TShockAPI if (settingr.Value != "" || settingr.Value != null) Int32.TryParse(settingr.Value, out y); else - Console.WriteLine("Could not parse y"); + Log.Warn("y for region " + name + " is empty"); settingr.Read(); settingr.Read(); @@ -155,7 +209,7 @@ namespace TShockAPI if (settingr.Value != "" || settingr.Value != null) Int32.TryParse(settingr.Value, out width); else - Console.WriteLine("Could not parse width"); + Log.Warn("Width for region " + name + " is empty"); settingr.Read(); settingr.Read(); @@ -163,7 +217,7 @@ namespace TShockAPI if (settingr.Value != "" || settingr.Value != null) Int32.TryParse(settingr.Value, out height); else - Console.WriteLine("Could not parse height"); + Log.Warn("Height for region " + name + " is empty"); settingr.Read(); settingr.Read(); @@ -171,9 +225,44 @@ namespace TShockAPI if (settingr.Value != "" || settingr.Value != null) bool.TryParse(settingr.Value, out state); else - Console.WriteLine("Could not parse state"); + Log.Warn("State for region " + name + " is empty"); - AddRegion(x, y, width, height, name, state); + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + worldname = settingr.Value; + else + Log.Warn("Worldname for region " + name + " is empty"); + + Console.WriteLine(settingr.Value); + + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + Int32.TryParse(settingr.Value, out playercount); + else + Log.Warn("Playercount for region " + name + " is empty"); + + AddRegion(x, y, width, height, name, worldname); + + if (playercount > 0) + { + for (int i = 0; i < playercount; i++) + { + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + { + int ID = RegionManager.GetRegionIndex(name); + Regions[ID].RegionAllowedIPs.Add(settingr.Value); + } + else + Log.Warn("PlayerIP " + i + " for region " + name + " is empty"); + } + } } break; } @@ -185,7 +274,7 @@ namespace TShockAPI } catch { - Log.Info("Could not read Regions"); + Log.Warn("Could not read Regions"); WriteSettings(); } } @@ -196,12 +285,15 @@ namespace TShockAPI public Rectangle RegionArea { get; set; } public string RegionName { get; set; } public bool DisableBuild { get; set; } + public string WorldRegionName { get; set; } + public List RegionAllowedIPs = new List(); - public Region(Rectangle region, string name, bool disablebuild) + public Region(Rectangle region, string name, bool disablebuild, string worldname) { RegionArea = region; RegionName = name; DisableBuild = disablebuild; + WorldRegionName = worldname; } public Region() @@ -209,6 +301,7 @@ namespace TShockAPI RegionArea = Rectangle.Empty; RegionName = string.Empty; DisableBuild = true; + WorldRegionName = string.Empty; } } } diff --git a/TShockAPI/RememberPosManager.cs b/TShockAPI/RememberPosManager.cs new file mode 100644 index 00000000..bcab39c8 --- /dev/null +++ b/TShockAPI/RememberPosManager.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using Terraria; +using Microsoft.Xna.Framework; +using System.Xml; + +namespace TShockAPI +{ + class RemeberedPosManager + { + public static List RemeberedPosistions = new List(); + + public static void LoadPos() + { + try + { + XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); + xmlReaderSettings.IgnoreWhitespace = true; + + using (XmlReader settingr = XmlReader.Create(FileTools.RememberedPosPath, xmlReaderSettings)) + { + while (settingr.Read()) + { + if (settingr.IsStartElement()) + { + switch (settingr.Name) + { + case "Positions": + { + break; + } + case "Player": + { + if (settingr.Read()) + { + string IP = null; + float X = 0; + float Y = 0; + + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + IP = settingr.Value; + else + Log.Warn("IP is empty"); + + + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + float.TryParse(settingr.Value, out X); + else + Log.Warn("X for IP " + IP + " is empty"); + + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + float.TryParse(settingr.Value, out Y); + else + Log.Warn("Y for IP " + IP + " is empty"); + + if (X != 0 && Y != 0) + RemeberedPosistions.Add(new RemeberedPos(IP, new Vector2(X, Y))); + } + break; + } + } + } + } + } + Log.Info("Read Remembered Positions"); + } + catch + { + Log.Warn("Could not read Remembered Positions"); + WriteSettings(); + } + } + + public static void WriteSettings() + { + try + { + XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); + xmlWriterSettings.Indent = true; + xmlWriterSettings.NewLineChars = Environment.NewLine; + + using (XmlWriter settingsw = XmlWriter.Create(FileTools.RememberedPosPath, xmlWriterSettings)) + { + settingsw.WriteStartDocument(); + settingsw.WriteStartElement("Positions"); + + foreach (RemeberedPos player in RemeberedPosistions) + { + settingsw.WriteStartElement("Player"); + settingsw.WriteElementString("IP", player.IP); + settingsw.WriteElementString("X", player.Pos.X.ToString()); + settingsw.WriteElementString("Y", player.Pos.Y.ToString()); + settingsw.WriteEndElement(); + } + + settingsw.WriteEndElement(); + settingsw.WriteEndDocument(); + } + Log.Info("Wrote Remembered Positions"); + } + catch + { + Log.Warn("Could not write Remembered Positions"); + } + } + } + + + public class RemeberedPos + { + public string IP { get; set; } + public Vector2 Pos { get; set; } + + public RemeberedPos(string ip, Vector2 pos) + { + IP = ip; + Pos = pos; + } + + public RemeberedPos() + { + IP = string.Empty; + Pos = Vector2.Zero; + } + } +} diff --git a/TShockAPI/Resources.Designer.cs b/TShockAPI/Resources.Designer.cs index 24f858b6..69d5beef 100644 --- a/TShockAPI/Resources.Designer.cs +++ b/TShockAPI/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.225 +// Runtime Version:4.0.30319.1 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -71,9 +71,9 @@ namespace TShockAPI { ///#ALWAYS DECLARE A GROUP'S PARENT BEFORE YOU DECLARE THE GROUP /// ///#currently avaliable permissions: - ///#kick ban ignorecheatdetection - ///#maintenance cfg causeevents spawnboss tp - ///#spawnmob che [rest of string was truncated]";. + ///#reservedslot - reserved slot for player + ///#canwater - allow players to use water + ///#canlav [rest of string was truncated]";. /// internal static string groups { get { @@ -81,6 +81,16 @@ namespace TShockAPI { } } + /// + /// Looks up a localized string similar to #see https://github.com/TShock/TShock/wiki/Item-List for a list of groups + ///#List each banned item below this with spaces. + /// + internal static string itembans { + get { + return ResourceManager.GetString("itembans", resourceCulture); + } + } + /// /// Looks up a localized string similar to #format ///#ip group diff --git a/TShockAPI/Resources.resx b/TShockAPI/Resources.resx index e260f5f5..21b8b3ab 100644 --- a/TShockAPI/Resources.resx +++ b/TShockAPI/Resources.resx @@ -1,21 +1,4 @@  -