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