Initial work to move all Server Side Character code to its own module.

This commit is contained in:
Zack 2014-07-10 21:09:32 -04:00
parent afffa46ef2
commit 915e791406
11 changed files with 137 additions and 43 deletions

View file

@ -735,7 +735,7 @@ namespace TShockAPI
var group = TShock.Utils.GetGroup(user.Group); var group = TShock.Utils.GetGroup(user.Group);
if (TShock.Config.ServerSideCharacter) if (Main.ServerSideCharacter)
{ {
if (group.HasPermission(Permissions.bypassssc)) if (group.HasPermission(Permissions.bypassssc))
{ {
@ -758,7 +758,7 @@ namespace TShockAPI
args.Player.IsLoggedIn = true; args.Player.IsLoggedIn = true;
args.Player.IgnoreActionsForInventory = "none"; args.Player.IgnoreActionsForInventory = "none";
if (!args.Player.IgnoreActionsForClearingTrashCan && TShock.Config.ServerSideCharacter) if (!args.Player.IgnoreActionsForClearingTrashCan && Main.ServerSideCharacter)
{ {
args.Player.PlayerData.CopyCharacter(args.Player); args.Player.PlayerData.CopyCharacter(args.Player);
TShock.CharacterDB.InsertPlayerData(args.Player); TShock.CharacterDB.InsertPlayerData(args.Player);
@ -1347,7 +1347,7 @@ namespace TShockAPI
private static void SaveSSC(CommandArgs args) private static void SaveSSC(CommandArgs args)
{ {
if (TShock.Config.ServerSideCharacter) if (Main.ServerSideCharacter)
{ {
args.Player.SendSuccessMessage("SSC has been saved."); args.Player.SendSuccessMessage("SSC has been saved.");
foreach (TSPlayer player in TShock.Players) foreach (TSPlayer player in TShock.Players)
@ -1362,7 +1362,7 @@ namespace TShockAPI
private static void OverrideSSC(CommandArgs args) private static void OverrideSSC(CommandArgs args)
{ {
if (!TShock.Config.ServerSideCharacter) if (!Main.ServerSideCharacter)
{ {
args.Player.SendErrorMessage("Server Side Characters is disabled."); args.Player.SendErrorMessage("Server Side Characters is disabled.");
return; return;
@ -1473,7 +1473,7 @@ namespace TShockAPI
private static void Off(CommandArgs args) private static void Off(CommandArgs args)
{ {
if (TShock.Config.ServerSideCharacter) if (Main.ServerSideCharacter)
{ {
foreach (TSPlayer player in TShock.Players) foreach (TSPlayer player in TShock.Players)
{ {

View file

@ -201,15 +201,6 @@ namespace TShockAPI
[Description("Disables the dungeon guardian from being spawned by player packets, this will instead force a respawn.")] [Description("Disables the dungeon guardian from being spawned by player packets, this will instead force a respawn.")]
public bool DisableDungeonGuardian; public bool DisableDungeonGuardian;
[Description("Enable server side characters, This stops the client from saving character data! EXPERIMENTAL!!!!!")]
public bool ServerSideCharacter;
[Description("How often SSC should save, in minutes.")]
public int ServerSideCharacterSave = 5;
[Description("Time, in milliseconds, to disallow discarding items after logging in when ServerSideInventory is ON.")]
public int LogonDiscardThreshold = 250;
[Description("Disables clown bomb projectiles from spawning.")] [Description("Disables clown bomb projectiles from spawning.")]
public bool DisableClownBombs; public bool DisableClownBombs;

View file

@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
using System; using System;
using System.Data; using System.Data;
using System.Text;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using Terraria; using Terraria;
@ -102,11 +103,36 @@ namespace TShockAPI.DB
public bool SeedInitialData(User user) public bool SeedInitialData(User user)
{ {
string initialItems = "-15,1,0~-13,1,0~-16,1,45~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0~0,0,0"; var inventory = new StringBuilder();
for (int i = 0; i < Terraria.Main.maxInventory; i++)
{
if (i > 0)
{
inventory.Append("~");
}
if (i < TShock.ServerSideCharacterConfig.StartingInventory.Count)
{
var item = TShock.ServerSideCharacterConfig.StartingInventory[i];
inventory.Append(item.netID).Append(',').Append(item.stack).Append(',').Append(item.prefix);
}
else
{
inventory.Append("0,0,0");
}
}
string initialItems = inventory.ToString();
try try
{ {
database.Query("INSERT INTO tsCharacter (Account, Health, MaxHealth, Mana, MaxMana, Inventory, spawnX, spawnY, questsCompleted) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8);", user.ID, database.Query("INSERT INTO tsCharacter (Account, Health, MaxHealth, Mana, MaxMana, Inventory, spawnX, spawnY, questsCompleted) VALUES (@0, @1, @2, @3, @4, @5, @6, @7, @8);",
100, 100, 20, 20, initialItems, -1, -1, 0); user.ID,
TShock.ServerSideCharacterConfig.StartingHealth,
TShock.ServerSideCharacterConfig.StartingHealth,
TShock.ServerSideCharacterConfig.StartingMana,
TShock.ServerSideCharacterConfig.StartingMana,
initialItems,
-1,
-1,
0);
return true; return true;
} }
catch (Exception ex) catch (Exception ex)

View file

@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
using System; using System;
using System.IO; using System.IO;
using TShockAPI.ServerSideCharacters;
namespace TShockAPI namespace TShockAPI
{ {
@ -55,6 +56,14 @@ namespace TShockAPI
get { return Path.Combine(TShock.SavePath, "config.json"); } get { return Path.Combine(TShock.SavePath, "config.json"); }
} }
/// <summary>
/// Path to the file containing the config.
/// </summary>
internal static string ServerSideCharacterConfigPath
{
get { return Path.Combine(TShock.SavePath, "sscconfig.json"); }
}
/// <summary> /// <summary>
/// Creates an empty file at the given path. /// Creates an empty file at the given path.
/// </summary> /// </summary>
@ -98,6 +107,12 @@ namespace TShockAPI
} }
TShock.Config.Write(ConfigPath); TShock.Config.Write(ConfigPath);
if (File.Exists(ServerSideCharacterConfigPath))
{
TShock.ServerSideCharacterConfig = ServerSideConfig.Read(ServerSideCharacterConfigPath);
// Add all the missing config properties in the json file
}
TShock.ServerSideCharacterConfig.Write(ServerSideCharacterConfigPath);
} }
/// <summary> /// <summary>

View file

@ -1306,7 +1306,7 @@ namespace TShockAPI
args.Player.PlayerData.StoreSlot(slot, type, prefix, stack); args.Player.PlayerData.StoreSlot(slot, type, prefix, stack);
} }
else if ( else if (
TShock.Config.ServerSideCharacter && TShock.Config.DisableLoginBeforeJoin && !bypassTrashCanCheck && Main.ServerSideCharacter && TShock.Config.DisableLoginBeforeJoin && !bypassTrashCanCheck &&
args.Player.HasSentInventory && !args.Player.Group.HasPermission(Permissions.bypassssc) args.Player.HasSentInventory && !args.Player.Group.HasPermission(Permissions.bypassssc)
) { ) {
// The player might have moved an item to their trash can before they performed a single login attempt yet. // The player might have moved an item to their trash can before they performed a single login attempt yet.
@ -1453,7 +1453,7 @@ namespace TShockAPI
var group = TShock.Utils.GetGroup(user.Group); var group = TShock.Utils.GetGroup(user.Group);
if (TShock.Config.ServerSideCharacter) if (Main.ServerSideCharacter)
{ {
if (group.HasPermission(Permissions.bypassssc)) if (group.HasPermission(Permissions.bypassssc))
{ {
@ -1476,7 +1476,7 @@ namespace TShockAPI
args.Player.IsLoggedIn = true; args.Player.IsLoggedIn = true;
args.Player.IgnoreActionsForInventory = "none"; args.Player.IgnoreActionsForInventory = "none";
if (!args.Player.IgnoreActionsForClearingTrashCan && TShock.Config.ServerSideCharacter) if (!args.Player.IgnoreActionsForClearingTrashCan && Main.ServerSideCharacter)
{ {
args.Player.PlayerData.CopyCharacter(args.Player); args.Player.PlayerData.CopyCharacter(args.Player);
TShock.CharacterDB.InsertPlayerData(args.Player); TShock.CharacterDB.InsertPlayerData(args.Player);
@ -1531,7 +1531,7 @@ namespace TShockAPI
var group = TShock.Utils.GetGroup(user.Group); var group = TShock.Utils.GetGroup(user.Group);
if (TShock.Config.ServerSideCharacter) if (Main.ServerSideCharacter)
{ {
if (group.HasPermission(Permissions.bypassssc)) if (group.HasPermission(Permissions.bypassssc))
{ {
@ -1554,7 +1554,7 @@ namespace TShockAPI
args.Player.IsLoggedIn = true; args.Player.IsLoggedIn = true;
args.Player.IgnoreActionsForInventory = "none"; args.Player.IgnoreActionsForInventory = "none";
if (!args.Player.IgnoreActionsForClearingTrashCan && TShock.Config.ServerSideCharacter) if (!args.Player.IgnoreActionsForClearingTrashCan && Main.ServerSideCharacter)
{ {
args.Player.PlayerData.CopyCharacter(args.Player); args.Player.PlayerData.CopyCharacter(args.Player);
TShock.CharacterDB.InsertPlayerData(args.Player); TShock.CharacterDB.InsertPlayerData(args.Player);
@ -1965,7 +1965,7 @@ namespace TShockAPI
args.Player.SendTileSquare(tileX, tileY, 4); args.Player.SendTileSquare(tileX, tileY, 4);
return true; return true;
} }
if (action == EditAction.PlaceTile && (editData == 29 || editData == 97) && TShock.Config.ServerSideCharacter) if (action == EditAction.PlaceTile && (editData == 29 || editData == 97) && Main.ServerSideCharacter)
{ {
args.Player.SendErrorMessage("You cannot place this tile because server side characters are enabled."); args.Player.SendErrorMessage("You cannot place this tile because server side characters are enabled.");
args.Player.SendTileSquare(tileX, tileY, 3); args.Player.SendTileSquare(tileX, tileY, 3);
@ -2625,7 +2625,7 @@ namespace TShockAPI
} }
} }
if (args.TPlayer.difficulty == 2 && TShock.Config.ServerSideCharacter && args.Player.IsLoggedIn) if (args.TPlayer.difficulty == 2 && Main.ServerSideCharacter && args.Player.IsLoggedIn)
{ {
User user = TShock.Users.GetUserByName(args.Player.UserAccountName); User user = TShock.Users.GetUserByName(args.Player.UserAccountName);
if (TShock.CharacterDB.RemovePlayer(user.ID)) if (TShock.CharacterDB.RemovePlayer(user.ID))
@ -2826,7 +2826,7 @@ namespace TShockAPI
else else
args.Player.InitSpawn = true; args.Player.InitSpawn = true;
if ((TShock.Config.ServerSideCharacter) && (args.Player.sX > 0) && (args.Player.sY > 0) && (args.TPlayer.SpawnX > 0) && ((args.TPlayer.SpawnX != args.Player.sX) && (args.TPlayer.SpawnY != args.Player.sY))) if ((Main.ServerSideCharacter) && (args.Player.sX > 0) && (args.Player.sY > 0) && (args.TPlayer.SpawnX > 0) && ((args.TPlayer.SpawnX != args.Player.sX) && (args.TPlayer.SpawnY != args.Player.sY)))
{ {
args.Player.sX=args.TPlayer.SpawnX; args.Player.sX=args.TPlayer.SpawnX;
@ -2836,7 +2836,7 @@ namespace TShockAPI
args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) -48); args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) -48);
} }
else if ((TShock.Config.ServerSideCharacter) && (args.Player.sX > 0) && (args.Player.sY > 0)) else if ((Main.ServerSideCharacter) && (args.Player.sX > 0) && (args.Player.sY > 0))
{ {
if (((Main.tile[args.Player.sX, args.Player.sY - 1].active() && Main.tile[args.Player.sX, args.Player.sY - 1].type == 79)) && (WorldGen.StartRoomCheck(args.Player.sX, args.Player.sY -1))) if (((Main.tile[args.Player.sX, args.Player.sY - 1].active() && Main.tile[args.Player.sX, args.Player.sY - 1].type == 79)) && (WorldGen.StartRoomCheck(args.Player.sX, args.Player.sY -1)))
args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) -48); args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) -48);
@ -3098,7 +3098,7 @@ namespace TShockAPI
args.Player.SendData(PacketTypes.ItemDrop, "", id); args.Player.SendData(PacketTypes.ItemDrop, "", id);
return true; return true;
} }
if ((TShock.Config.ServerSideCharacter) && (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - args.Player.LoginMS < TShock.Config.LogonDiscardThreshold)) if ((Main.ServerSideCharacter) && (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - args.Player.LoginMS < TShock.ServerSideCharacterConfig.LogonDiscardThreshold))
{ {
//Player is probably trying to sneak items onto the server in their hands!!! //Player is probably trying to sneak items onto the server in their hands!!!
Log.ConsoleInfo(string.Format("Player {0} tried to sneak {1} onto the server!", args.Player.Name, item.name)); Log.ConsoleInfo(string.Format("Player {0} tried to sneak {1} onto the server!", args.Player.Name, item.name));

View file

@ -260,7 +260,7 @@ namespace TShockAPI
rules.Add("PvPMode", TShock.Config.PvPMode); rules.Add("PvPMode", TShock.Config.PvPMode);
rules.Add("SpawnProtection", TShock.Config.SpawnProtection); rules.Add("SpawnProtection", TShock.Config.SpawnProtection);
rules.Add("SpawnProtectionRadius", TShock.Config.SpawnProtectionRadius); rules.Add("SpawnProtectionRadius", TShock.Config.SpawnProtectionRadius);
rules.Add("ServerSideInventory", TShock.Config.ServerSideCharacter); rules.Add("ServerSideInventory", Main.ServerSideCharacter);
ret.Add("rules", rules); ret.Add("rules", rules);
} }

View file

@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Web.UI;
using Newtonsoft.Json;
namespace TShockAPI.ServerSideCharacters
{
public class ServerSideConfig
{
[Description("Enable server side characters, This stops the client from saving character data! EXPERIMENTAL!!!!!")]
public bool Enabled;
[Description("How often SSC should save, in minutes.")]
public int ServerSideCharacterSave = 5;
[Description("Time, in milliseconds, to disallow discarding items after logging in when ServerSideInventory is ON.")]
public int LogonDiscardThreshold = 250;
[Description("The starting default health for new SSC.")]
public int StartingHealth = 100;
[Description("The starting default mana for new SSC.")]
public int StartingMana = 20;
[Description("The starting default inventory for new SSC.")]
public List<NetItem> StartingInventory = new List<NetItem>();
public static ServerSideConfig Read(string path)
{
using (var reader = new StreamReader(path))
{
string txt = reader.ReadToEnd();
var config = JsonConvert.DeserializeObject<ServerSideConfig>(txt);
return config;
}
}
public void Write(string path)
{
using (var writer = new StreamWriter(path))
{
writer.Write(JsonConvert.SerializeObject(this, Formatting.Indented));
}
}
}
}

View file

@ -379,7 +379,7 @@ namespace TShockAPI
/// <returns>bool - True/false if it saved successfully</returns> /// <returns>bool - True/false if it saved successfully</returns>
public bool SaveServerCharacter() public bool SaveServerCharacter()
{ {
if (!TShock.Config.ServerSideCharacter) if (!Main.ServerSideCharacter)
{ {
return false; return false;
} }
@ -402,7 +402,7 @@ namespace TShockAPI
/// <returns>bool - True/false if it saved successfully</returns> /// <returns>bool - True/false if it saved successfully</returns>
public bool SendServerCharacter() public bool SendServerCharacter()
{ {
if (!TShock.Config.ServerSideCharacter) if (!Main.ServerSideCharacter)
{ {
return false; return false;
} }
@ -1129,10 +1129,10 @@ namespace TShockAPI
public class PlayerData public class PlayerData
{ {
public NetItem[] inventory = new NetItem[NetItem.maxNetInventory]; public NetItem[] inventory = new NetItem[NetItem.maxNetInventory];
public int health = 100; public int health = TShock.ServerSideCharacterConfig.StartingHealth;
public int maxHealth = 100; public int maxHealth = TShock.ServerSideCharacterConfig.StartingHealth;
public int mana = 20; public int mana = TShock.ServerSideCharacterConfig.StartingMana;
public int maxMana = 20; public int maxMana = TShock.ServerSideCharacterConfig.StartingMana;
public bool exists; public bool exists;
public int spawnX= -1; public int spawnX= -1;
public int spawnY= -1; public int spawnY= -1;
@ -1166,7 +1166,12 @@ namespace TShockAPI
this.inventory[2].stack = 1; this.inventory[2].stack = 1;
if (player.TPlayer.inventory[2] != null && player.TPlayer.inventory[2].netID == -16) if (player.TPlayer.inventory[2] != null && player.TPlayer.inventory[2].netID == -16)
this.inventory[2].prefix = player.TPlayer.inventory[2].prefix; this.inventory[2].prefix = player.TPlayer.inventory[2].prefix;
for (int i = 0; i < TShock.ServerSideCharacterConfig.StartingInventory.Count; i++)
{
var item = TShock.ServerSideCharacterConfig.StartingInventory[i];
StoreSlot(i, item.netID, item.prefix, item.stack);
}
} }
public void StoreSlot(int slot, int netID, int prefix, int stack) public void StoreSlot(int slot, int netID, int prefix, int stack)

View file

@ -38,6 +38,7 @@ using TShockAPI.DB;
using TShockAPI.Net; using TShockAPI.Net;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using TShockAPI.ServerSideCharacters;
namespace TShockAPI namespace TShockAPI
{ {
@ -66,6 +67,7 @@ namespace TShockAPI
public static RememberedPosManager RememberedPos; public static RememberedPosManager RememberedPos;
public static CharacterManager CharacterDB; public static CharacterManager CharacterDB;
public static ConfigFile Config { get; set; } public static ConfigFile Config { get; set; }
public static ServerSideConfig ServerSideCharacterConfig;
public static IDbConnection DB; public static IDbConnection DB;
public static bool OverridePort; public static bool OverridePort;
public static PacketBufferer PacketBuffer; public static PacketBufferer PacketBuffer;
@ -112,6 +114,10 @@ namespace TShockAPI
: base(game) : base(game)
{ {
Config = new ConfigFile(); Config = new ConfigFile();
ServerSideCharacterConfig = new ServerSideConfig();
ServerSideCharacterConfig.StartingInventory.Add(new NetItem { netID = -15, prefix = 0, stack = 1 });
ServerSideCharacterConfig.StartingInventory.Add(new NetItem { netID = -13, prefix = 0, stack = 1 });
ServerSideCharacterConfig.StartingInventory.Add(new NetItem { netID = -16, prefix = 0, stack = 1 });
Order = 0; Order = 0;
} }
@ -132,7 +138,7 @@ namespace TShockAPI
ConfigFile.ConfigRead += OnConfigRead; ConfigFile.ConfigRead += OnConfigRead;
FileTools.SetupConfig(); FileTools.SetupConfig();
Main.ServerSideCharacter = Config.ServerSideCharacter; Main.ServerSideCharacter = ServerSideCharacterConfig.Enabled;
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
string logFilename; string logFilename;
@ -658,7 +664,7 @@ namespace TShockAPI
LastCheck = DateTime.UtcNow; LastCheck = DateTime.UtcNow;
} }
if (TShock.Config.ServerSideCharacter && (DateTime.UtcNow - LastSave).TotalMinutes >= Config.ServerSideCharacterSave) if (Main.ServerSideCharacter && (DateTime.UtcNow - LastSave).TotalMinutes >= ServerSideCharacterConfig.ServerSideCharacterSave)
{ {
foreach (TSPlayer player in Players) foreach (TSPlayer player in Players)
{ {
@ -725,13 +731,13 @@ namespace TShockAPI
if (player.RecentFuse >0) if (player.RecentFuse >0)
player.RecentFuse--; player.RecentFuse--;
if ((TShock.Config.ServerSideCharacter) && (player.TPlayer.SpawnX > 0) &&(player.sX != player.TPlayer.SpawnX)) if ((Main.ServerSideCharacter) && (player.TPlayer.SpawnX > 0) &&(player.sX != player.TPlayer.SpawnX))
{ {
player.sX=player.TPlayer.SpawnX; player.sX=player.TPlayer.SpawnX;
player.sY=player.TPlayer.SpawnY; player.sY=player.TPlayer.SpawnY;
} }
if ((TShock.Config.ServerSideCharacter) && (player.sX > 0) && (player.sY > 0) && (player.TPlayer.SpawnX < 0)) if ((Main.ServerSideCharacter) && (player.sX > 0) && (player.sY > 0) && (player.TPlayer.SpawnX < 0))
{ {
player.TPlayer.SpawnX = player.sX; player.TPlayer.SpawnX = player.sX;
player.TPlayer.SpawnY = player.sY; player.TPlayer.SpawnY = player.sY;
@ -991,7 +997,7 @@ namespace TShockAPI
Utils.Broadcast(tsplr.Name + " has left.", Color.Yellow); Utils.Broadcast(tsplr.Name + " has left.", Color.Yellow);
Log.Info(string.Format("{0} disconnected.", tsplr.Name)); Log.Info(string.Format("{0} disconnected.", tsplr.Name));
if (tsplr.IsLoggedIn && !tsplr.IgnoreActionsForClearingTrashCan && TShock.Config.ServerSideCharacter && (!tsplr.Dead || tsplr.TPlayer.difficulty != 2)) if (tsplr.IsLoggedIn && !tsplr.IgnoreActionsForClearingTrashCan && Main.ServerSideCharacter && (!tsplr.Dead || tsplr.TPlayer.difficulty != 2))
{ {
tsplr.PlayerData.CopyCharacter(tsplr); tsplr.PlayerData.CopyCharacter(tsplr);
CharacterDB.InsertPlayerData(tsplr); CharacterDB.InsertPlayerData(tsplr);
@ -1213,7 +1219,7 @@ namespace TShockAPI
if (!player.IsLoggedIn) if (!player.IsLoggedIn)
{ {
if (Config.ServerSideCharacter) if (Main.ServerSideCharacter)
{ {
player.SendMessage( player.SendMessage(
player.IgnoreActionsForInventory = "Server side characters is enabled! Please /register or /login to play!", player.IgnoreActionsForInventory = "Server side characters is enabled! Please /register or /login to play!",

View file

@ -122,6 +122,7 @@
<Compile Include="Rest\RestObject.cs" /> <Compile Include="Rest\RestObject.cs" />
<Compile Include="Rest\RestVerbs.cs" /> <Compile Include="Rest\RestVerbs.cs" />
<Compile Include="Rest\SecureRest.cs" /> <Compile Include="Rest\SecureRest.cs" />
<Compile Include="ServerSideCharacters\ServerSideConfig.cs" />
<Compile Include="StatTracker.cs" /> <Compile Include="StatTracker.cs" />
<Compile Include="Utils.cs" /> <Compile Include="Utils.cs" />
<Compile Include="TShock.cs" /> <Compile Include="TShock.cs" />
@ -179,7 +180,7 @@
</PropertyGroup> </PropertyGroup>
<ProjectExtensions> <ProjectExtensions>
<VisualStudio> <VisualStudio>
<UserProperties BuildVersion_IncrementBeforeBuild="False" BuildVersion_StartDate="2011/6/17" BuildVersion_BuildVersioningStyle="None.None.None.MonthAndDayStamp" BuildVersion_BuildAction="Both" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" /> <UserProperties BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildAction="Both" BuildVersion_BuildVersioningStyle="None.None.None.MonthAndDayStamp" BuildVersion_StartDate="2011/6/17" BuildVersion_IncrementBeforeBuild="False" />
</VisualStudio> </VisualStudio>
</ProjectExtensions> </ProjectExtensions>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View file

@ -574,7 +574,7 @@ namespace TShockAPI
/// <param name="reason">string reason (default: "Server shutting down!")</param> /// <param name="reason">string reason (default: "Server shutting down!")</param>
public void RestartServer(bool save = true, string reason = "Server shutting down!") public void RestartServer(bool save = true, string reason = "Server shutting down!")
{ {
if (TShock.Config.ServerSideCharacter) if (Main.ServerSideCharacter)
foreach (TSPlayer player in TShock.Players) foreach (TSPlayer player in TShock.Players)
if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan) if (player != null && player.IsLoggedIn && !player.IgnoreActionsForClearingTrashCan)
TShock.CharacterDB.InsertPlayerData(player); TShock.CharacterDB.InsertPlayerData(player);