diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index afd10762..21138e23 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -140,6 +140,9 @@ namespace TShockAPI 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)); @@ -747,6 +750,58 @@ 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])) + { + args.Player.SendMessage("Set warp " + args.Parameters[0], Color.Yellow); + } + else + { + args.Player.SendMessage("Warp " + args.Parameters[0] + " already exists", Color.Red); + } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /setwarp [name]", Color.Red); + } + + private static void DeleteWarp(CommandArgs args) + { + if (args.Parameters.Count > 0) + { + if (WarpsManager.DeleteWarp(args.Parameters[0])) + args.Player.SendMessage("Deleted warp " + args.Parameters[0], Color.Yellow); + else + args.Player.SendMessage("Could not find specified warp", Color.Red); + } + } + + private static void UseWarp(CommandArgs args) + { + if (args.Parameters.Count > 0) + { + if (WarpsManager.FindWarp(args.Parameters[0]) != Vector2.Zero) + { + 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); + } + else + { + args.Player.SendMessage("Specified warp not found", Color.Yellow); + } + } + 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); + } + } + } + #endregion Teleport Commands #region Server Config Commands @@ -980,6 +1035,8 @@ namespace TShockAPI else args.Player.SendMessage("Could not find specified region", Color.Red); } + else + args.Player.SendMessage("Invalid syntax! Proper syntax: /region delete [name]", Color.Red); break; } case "clear": diff --git a/TShockAPI/RegionManager.cs b/TShockAPI/RegionManager.cs index 364251cf..de7f0f52 100644 --- a/TShockAPI/RegionManager.cs +++ b/TShockAPI/RegionManager.cs @@ -15,7 +15,7 @@ namespace TShockAPI { foreach (Region nametest in Regions) { - if (name.ToLower() == nametest.Name.ToLower()) + if (name.ToLower() == nametest.RegionName.ToLower()) { return false; } @@ -28,7 +28,7 @@ namespace TShockAPI { foreach (Region nametest in Regions) { - if (name.ToLower() == nametest.Name.ToLower()) + if (name.ToLower() == nametest.RegionName.ToLower()) { Regions.Remove(nametest); WriteSettings(); @@ -42,7 +42,7 @@ namespace TShockAPI { foreach (Region nametest in Regions) { - if (name.ToLower() == nametest.Name.ToLower()) + if (name.ToLower() == nametest.RegionName.ToLower()) { nametest.DisableBuild = state; WriteSettings(); @@ -80,7 +80,7 @@ namespace TShockAPI foreach (Region region in Regions) { settingsw.WriteStartElement("ProtectedRegion"); - settingsw.WriteElementString("RegionName", region.Name); + settingsw.WriteElementString("RegionName", region.RegionName); settingsw.WriteElementString("Point1X", region.RegionArea.X.ToString()); settingsw.WriteElementString("Point1Y", region.RegionArea.Y.ToString()); settingsw.WriteElementString("Point2X", region.RegionArea.Width.ToString()); @@ -194,20 +194,20 @@ namespace TShockAPI public class Region { public Rectangle RegionArea { get; set; } - public string Name { get; set; } + public string RegionName { get; set; } public bool DisableBuild { get; set; } public Region(Rectangle region, string name, bool disablebuild) { RegionArea = region; - Name = name; + RegionName = name; DisableBuild = disablebuild; } public Region() { RegionArea = Rectangle.Empty; - Name = string.Empty; + RegionName = string.Empty; DisableBuild = true; } } diff --git a/TShockAPI/WarpsManager.cs b/TShockAPI/WarpsManager.cs new file mode 100644 index 00000000..21193bda --- /dev/null +++ b/TShockAPI/WarpsManager.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.Xna.Framework; +using System.Xml; + +namespace TShockAPI +{ + class WarpsManager + { + public static List Warps = new List(); + + public static bool AddWarp(int x, int y, string name) + { + foreach (Warp nametest in Warps) + { + if (name.ToLower() == nametest.WarpName.ToLower()) + { + return false; + } + } + Warps.Add(new Warp(new Vector2(x, y), name)); + return true; + } + + public static bool DeleteWarp(string name) + { + foreach (Warp nametest in Warps) + { + if (name.ToLower() == nametest.WarpName.ToLower()) + { + Warps.Remove(nametest); + WriteSettings(); + return true; + } + } + return false; + } + + public static Vector2 FindWarp(string name) + { + foreach (Warp nametest in Warps) + { + if (name.ToLower() == nametest.WarpName.ToLower()) + { + return nametest.WarpPos; + } + } + return Vector2.Zero; + } + + public static void WriteSettings() + { + try + { + XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); + xmlWriterSettings.Indent = true; + xmlWriterSettings.NewLineChars = Environment.NewLine; + + using (XmlWriter settingsw = XmlWriter.Create("warps.xml", xmlWriterSettings)) + { + settingsw.WriteStartDocument(); + settingsw.WriteStartElement("Warps"); + + foreach (Warp warp in Warps) + { + settingsw.WriteStartElement("Warp"); + settingsw.WriteElementString("WarpName", warp.WarpName); + settingsw.WriteElementString("X", warp.WarpPos.X.ToString()); + settingsw.WriteElementString("Y", warp.WarpPos.Y.ToString()); + settingsw.WriteEndElement(); + } + + settingsw.WriteEndElement(); + settingsw.WriteEndDocument(); + } + Log.Info("Wrote Warps"); + } + catch + { + Log.Info("Could not write Warps"); + } + } + + public static void ReadAllSettings() + { + try + { + XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); + xmlReaderSettings.IgnoreWhitespace = true; + + using (XmlReader settingr = XmlReader.Create("warps.xml", xmlReaderSettings)) + { + while (settingr.Read()) + { + if (settingr.IsStartElement()) + { + switch (settingr.Name) + { + case "Warps": + { + break; + } + case "Warp": + { + if (settingr.Read()) + { + string name; + int x = 0; + int y = 0; + + settingr.Read(); + name = settingr.Value; + + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + Int32.TryParse(settingr.Value, out x); + else + Console.WriteLine("Could not parse x"); + + settingr.Read(); + settingr.Read(); + settingr.Read(); + if (settingr.Value != "" || settingr.Value != null) + Int32.TryParse(settingr.Value, out y); + else + Console.WriteLine("Could not parse y"); + + AddWarp(x, y, name); + } + break; + } + } + } + } + } + Log.Info("Read Warps"); + } + catch + { + Log.Info("Could not read Warps"); + WriteSettings(); + } + } + } + + public class Warp + { + public Vector2 WarpPos { get; set; } + public string WarpName { get; set; } + + public Warp(Vector2 warppos, string name) + { + WarpPos = warppos; + WarpName = name; + } + + public Warp() + { + WarpPos = Vector2.Zero; + WarpName = null; + } + } +}