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 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@
|
|||
<Compile Include="Net\WorldInfoMsg.cs" />
|
||||
<Compile Include="DB\RegionManager.cs" />
|
||||
<Compile Include="RconHandler.cs" />
|
||||
<Compile Include="RememberPosManager.cs" />
|
||||
<Compile Include="DB\RememberPosManager.cs" />
|
||||
<Compile Include="Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue