Fixes RememberPosManager and player sprites showing on server, when they are not there
This commit is contained in:
parent
5ec03c8e08
commit
b09b0ba9f2
4 changed files with 102 additions and 166 deletions
93
TShockAPI/DB/RememberPosManager.cs
Normal file
93
TShockAPI/DB/RememberPosManager.cs
Normal file
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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<int>("X"), reader.Get<int>("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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Xml;
|
|
||||||
using Microsoft.Xna.Framework;
|
|
||||||
|
|
||||||
namespace TShockAPI
|
|
||||||
{
|
|
||||||
class RemeberedPosManager
|
|
||||||
{
|
|
||||||
public static List<RemeberedPos> RemeberedPosistions = new List<RemeberedPos>();
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -60,6 +60,7 @@ namespace TShockAPI
|
||||||
public static GroupManager Groups;
|
public static GroupManager Groups;
|
||||||
public static UserManager Users;
|
public static UserManager Users;
|
||||||
public static ItemManager Itembans;
|
public static ItemManager Itembans;
|
||||||
|
public static RemeberedPosManager RememberedPos;
|
||||||
|
|
||||||
public static ConfigFile Config { get; set; }
|
public static ConfigFile Config { get; set; }
|
||||||
|
|
||||||
|
|
@ -167,6 +168,7 @@ namespace TShockAPI
|
||||||
Groups.LoadPermisions();
|
Groups.LoadPermisions();
|
||||||
Regions = new RegionManager(DB);
|
Regions = new RegionManager(DB);
|
||||||
Itembans = new ItemManager(DB);
|
Itembans = new ItemManager(DB);
|
||||||
|
RememberedPos = new RemeberedPosManager(DB);
|
||||||
|
|
||||||
Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename));
|
Log.ConsoleInfo(string.Format("TShock Version {0} ({1}) now running.", Version, VersionCodename));
|
||||||
|
|
||||||
|
|
@ -441,10 +443,7 @@ namespace TShockAPI
|
||||||
|
|
||||||
if (Config.RememberLeavePos)
|
if (Config.RememberLeavePos)
|
||||||
{
|
{
|
||||||
RemeberedPosManager.RemeberedPosistions.Add(new RemeberedPos(tsplr.IP,
|
RememberedPos.InsertLeavePos(tsplr.Name, tsplr.IP, (int)(tsplr.X / 16), (int)(tsplr.Y / 16));
|
||||||
new Vector2(tsplr.X/16,
|
|
||||||
(tsplr.Y/16) + 3)));
|
|
||||||
RemeberedPosManager.WriteSettings();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -615,7 +614,8 @@ namespace TShockAPI
|
||||||
return;
|
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));
|
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)
|
if (Config.RememberLeavePos)
|
||||||
{
|
{
|
||||||
foreach (RemeberedPos playerIP in RemeberedPosManager.RemeberedPosistions)
|
var pos = RememberedPos.GetLeavePos(player.Name, player.IP);
|
||||||
{
|
player.Teleport((int)pos.X, (int)pos.Y);
|
||||||
if (playerIP.IP == player.IP)
|
player.SendTileSquare((int)pos.X, (int)pos.Y);
|
||||||
{
|
|
||||||
player.Teleport((int) playerIP.Pos.X, (int) playerIP.Pos.Y);
|
|
||||||
RemeberedPosManager.RemeberedPosistions.Remove(playerIP);
|
|
||||||
RemeberedPosManager.WriteSettings();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@
|
||||||
<Compile Include="Net\WorldInfoMsg.cs" />
|
<Compile Include="Net\WorldInfoMsg.cs" />
|
||||||
<Compile Include="DB\RegionManager.cs" />
|
<Compile Include="DB\RegionManager.cs" />
|
||||||
<Compile Include="RconHandler.cs" />
|
<Compile Include="RconHandler.cs" />
|
||||||
<Compile Include="RememberPosManager.cs" />
|
<Compile Include="DB\RememberPosManager.cs" />
|
||||||
<Compile Include="Resources.Designer.cs">
|
<Compile Include="Resources.Designer.cs">
|
||||||
<AutoGen>True</AutoGen>
|
<AutoGen>True</AutoGen>
|
||||||
<DesignTime>True</DesignTime>
|
<DesignTime>True</DesignTime>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue