From b09b0ba9f2d1c101ae33cf0e15ced5d4140caf96 Mon Sep 17 00:00:00 2001 From: Twitchy Date: Sun, 31 Jul 2011 15:31:57 +1200 Subject: [PATCH] Fixes RememberPosManager and player sprites showing on server, when they are not there --- TShockAPI/DB/RememberPosManager.cs | 93 ++++++++++++++++++ TShockAPI/RememberPosManager.cs | 150 ----------------------------- TShockAPI/TShock.cs | 23 ++--- TShockAPI/TShockAPI.csproj | 2 +- 4 files changed, 102 insertions(+), 166 deletions(-) create mode 100644 TShockAPI/DB/RememberPosManager.cs delete mode 100644 TShockAPI/RememberPosManager.cs diff --git a/TShockAPI/DB/RememberPosManager.cs b/TShockAPI/DB/RememberPosManager.cs new file mode 100644 index 00000000..3d1498f0 --- /dev/null +++ b/TShockAPI/DB/RememberPosManager.cs @@ -0,0 +1,93 @@ +/* +TShock, a server mod for Terraria +Copyright (C) 2011 The TShock Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Xml; +using System.Data; +using Microsoft.Xna.Framework; +using Terraria; + +namespace TShockAPI.DB +{ + public class RemeberedPosManager + { + public IDbConnection database; + + public RemeberedPosManager(IDbConnection db) + { + database = db; + + string query; + if (TShock.Config.StorageType.ToLower() == "sqlite") + query = + "CREATE TABLE IF NOT EXISTS 'RememberedPos' ('Name' TEXT PRIMARY KEY, 'IP' TEXT, 'X' NUMERIC, 'Y' NUMERIC, 'WorldID' TEXT);"; + else + query = + "CREATE TABLE IF NOT EXISTS RememberedPos (Name VARCHAR(255) PRIMARY, IP VARCHAR(255), X INT(11), Y INT(11), WorldID VARCHAR(255));"; + + db.Query(query); + } + + public Vector2 GetLeavePos(string name, string IP) + { + try + { + using (var reader = database.QueryReader("SELECT * FROM RememberedPos WHERE Name=@0 AND IP=@1", name, IP)) + { + if (reader.Read()) + { + return new Vector2(reader.Get("X"), reader.Get("Y")); + } + } + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + + return new Vector2(); + } + + public void InsertLeavePos(string name, string IP, int X, int Y) + { + if (GetLeavePos(name, IP) == Vector2.Zero) + { + try + { + database.Query("INSERT INTO RememberedPos (Name, IP, X, Y, WorldID) VALUES (@0, @1, @2, @3, @4);", name, IP, X, Y + 3, Main.worldID.ToString()); + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + } + else + { + try + { + database.Query("UPDATE RememberedPos SET X = @0, Y = @1 WHERE Name = @2 AND IP = @3 AND WorldID = @4;", X, Y + 3, name, IP, Main.worldID.ToString()); + } + catch (Exception ex) + { + Log.Error(ex.ToString()); + } + } + } + } +} diff --git a/TShockAPI/RememberPosManager.cs b/TShockAPI/RememberPosManager.cs deleted file mode 100644 index da4ff076..00000000 --- a/TShockAPI/RememberPosManager.cs +++ /dev/null @@ -1,150 +0,0 @@ -/* -TShock, a server mod for Terraria -Copyright (C) 2011 The TShock Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -using System; -using System.Collections.Generic; -using System.Xml; -using Microsoft.Xna.Framework; - -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 7b57603b..894b8db8 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -60,6 +60,7 @@ namespace TShockAPI public static GroupManager Groups; public static UserManager Users; public static ItemManager Itembans; + public static RemeberedPosManager RememberedPos; public static ConfigFile Config { get; set; } @@ -167,6 +168,7 @@ namespace TShockAPI Groups.LoadPermisions(); Regions = new RegionManager(DB); Itembans = new ItemManager(DB); + RememberedPos = new RemeberedPosManager(DB); Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename)); @@ -441,10 +443,7 @@ namespace TShockAPI if (Config.RememberLeavePos) { - RemeberedPosManager.RemeberedPosistions.Add(new RemeberedPos(tsplr.IP, - new Vector2(tsplr.X/16, - (tsplr.Y/16) + 3))); - RemeberedPosManager.WriteSettings(); + RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int)(tsplr.X / 16), (int)(tsplr.Y / 16)); } } } @@ -615,7 +614,8 @@ namespace TShockAPI return; } - player.SendData(PacketTypes.WorldInfo); + NetMessage.SendData((int)PacketTypes.TimeSet, -1, -1, "", 0, 0, Main.sunModY, Main.moonModY); + NetMessage.syncPlayers(); Log.Info(string.Format("{0} ({1}) from '{2}' group joined.", player.Name, player.IP, player.Group.Name)); @@ -637,16 +637,9 @@ namespace TShockAPI } if (Config.RememberLeavePos) { - foreach (RemeberedPos playerIP in RemeberedPosManager.RemeberedPosistions) - { - if (playerIP.IP == player.IP) - { - player.Teleport((int) playerIP.Pos.X, (int) playerIP.Pos.Y); - RemeberedPosManager.RemeberedPosistions.Remove(playerIP); - RemeberedPosManager.WriteSettings(); - break; - } - } + var pos = RememberedPos.GetLeavePos(player.Name, player.IP); + player.Teleport((int)pos.X, (int)pos.Y); + player.SendTileSquare((int)pos.X, (int)pos.Y); } e.Handled = true; } diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj index 946f10bf..b81003fc 100644 --- a/TShockAPI/TShockAPI.csproj +++ b/TShockAPI/TShockAPI.csproj @@ -109,7 +109,7 @@ - + True True