From df1cbab1f5d6f51512eb9abac0816514fb67936a Mon Sep 17 00:00:00 2001 From: Twitchy Date: Thu, 23 Jun 2011 20:43:57 +1200 Subject: [PATCH] Adds option to remember leave positions. Change to true in config.json --- TShockAPI/ConfigFile.cs | 2 + TShockAPI/ConfigurationManager.cs | 3 + TShockAPI/FileTools.cs | 1 + TShockAPI/RememberPosManager.cs | 136 ++++++++++++++++++++++++++++++ TShockAPI/TShock.cs | 20 ++++- TShockAPI/TShockAPI.csproj | 3 +- 6 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 TShockAPI/RememberPosManager.cs diff --git a/TShockAPI/ConfigFile.cs b/TShockAPI/ConfigFile.cs index 49bad490..36427e32 100644 --- a/TShockAPI/ConfigFile.cs +++ b/TShockAPI/ConfigFile.cs @@ -54,5 +54,7 @@ namespace TShockAPI 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 db080b18..d95fc3bd 100644 --- a/TShockAPI/ConfigurationManager.cs +++ b/TShockAPI/ConfigurationManager.cs @@ -54,6 +54,7 @@ namespace TShockAPI public static bool DisableBuild = false; public static float[] AdminChatRGB = {255, 0, 0}; public static string AdminChatPrefix = "(Admin) "; + public static bool RememberLeavePos = false; /// /// Don't allow pvp changing for x seconds. @@ -112,6 +113,7 @@ namespace TShockAPI ListServer = cfg.ListServer; Main.spawnTileX = cfg.spawnTileX; Main.spawnTileY = cfg.spawnTileY; + RememberLeavePos = cfg.RememberLeavePos; } public static void WriteJsonConfiguration() @@ -146,6 +148,7 @@ namespace TShockAPI 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); diff --git a/TShockAPI/FileTools.cs b/TShockAPI/FileTools.cs index 3998b8b3..90b9468e 100644 --- a/TShockAPI/FileTools.cs +++ b/TShockAPI/FileTools.cs @@ -30,6 +30,7 @@ namespace TShockAPI 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) 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/TShock.cs b/TShockAPI/TShock.cs index 0413c00b..029d6c0e 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -102,11 +102,11 @@ namespace TShockAPI Log.Info("Commands initialized"); RegionManager.ReadAllSettings(); - WarpsManager.ReadAllSettings(); - ItemManager.LoadBans(); + + Backups.KeepFor = ConfigurationManager.BackupKeepFor; Backups.Interval = ConfigurationManager.BackupInterval; @@ -270,6 +270,12 @@ namespace TShockAPI if (tsplr != null && tsplr.ReceivedInfo) Log.Info(string.Format("{0} left.", tsplr.Name)); + if (ConfigurationManager.RememberLeavePos) + { + RemeberedPosManager.RemeberedPosistions.Add(new RemeberedPos(Players[ply].IP, new Vector2(Players[ply].X / 16, (Players[ply].Y / 16) + 3))); + RemeberedPosManager.WriteSettings(); + } + Players[ply] = null; } @@ -416,6 +422,16 @@ namespace TShockAPI { StartInvasion(); } + if (ConfigurationManager.RememberLeavePos) + { + foreach (RemeberedPos playerIP in RemeberedPosManager.RemeberedPosistions) + { + if (playerIP.IP == Players[who].IP) + { + Players[who].Teleport((int)playerIP.Pos.X, (int)playerIP.Pos.Y); + } + } + } e.Handled = true; } diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index c8dff8d9..1533604e 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -83,6 +83,7 @@ + True True @@ -144,7 +145,7 @@ - +