Add async session save method, random tweaks
This commit is contained in:
@@ -13,8 +13,7 @@ namespace Torch.API
|
|||||||
event Action<IChatItem> MessageReceived;
|
event Action<IChatItem> MessageReceived;
|
||||||
Dictionary<ulong, IPlayer> Players { get; }
|
Dictionary<ulong, IPlayer> Players { get; }
|
||||||
List<IChatItem> Chat { get; }
|
List<IChatItem> Chat { get; }
|
||||||
void SendMessage(string message);
|
void SendMessage(string message, string author = "Server", long playerId = 0, string font = MyFontEnum.Blue);
|
||||||
void SendMessage(string message, long playerId, string author = "Server", string font = MyFontEnum.Blue);
|
|
||||||
void KickPlayer(ulong id);
|
void KickPlayer(ulong id);
|
||||||
void BanPlayer(ulong id, bool banned = true);
|
void BanPlayer(ulong id, bool banned = true);
|
||||||
IMyPlayer GetPlayerBySteamId(ulong id);
|
IMyPlayer GetPlayerBySteamId(ulong id);
|
||||||
|
@@ -27,6 +27,7 @@ namespace Torch.API
|
|||||||
public interface ITorchServer : ITorchBase
|
public interface ITorchServer : ITorchBase
|
||||||
{
|
{
|
||||||
bool IsRunning { get; }
|
bool IsRunning { get; }
|
||||||
|
string InstancePath { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface ITorchClient : ITorchBase
|
public interface ITorchClient : ITorchBase
|
||||||
|
@@ -39,9 +39,9 @@ namespace Torch.Server
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string configName = args.Length > 0 ? args[0] : "TorchConfig.xml";
|
var configName = args.FirstOrDefault() ?? "TorchConfig.xml";
|
||||||
var configPath = Path.Combine(Directory.GetCurrentDirectory(), configName);
|
var configPath = Path.Combine(Directory.GetCurrentDirectory(), configName);
|
||||||
var options = new ServerConfig("Torch");
|
ServerConfig options;
|
||||||
if (File.Exists(configName))
|
if (File.Exists(configName))
|
||||||
{
|
{
|
||||||
_log.Info($"Loading config {configPath}");
|
_log.Info($"Loading config {configPath}");
|
||||||
@@ -50,6 +50,7 @@ namespace Torch.Server
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_log.Info($"Generating default config at {configPath}");
|
_log.Info($"Generating default config at {configPath}");
|
||||||
|
options = new ServerConfig();
|
||||||
options.SaveTo(configPath);
|
options.SaveTo(configPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,7 +16,6 @@ namespace Torch.Server
|
|||||||
|
|
||||||
public string InstancePath { get; set; }
|
public string InstancePath { get; set; }
|
||||||
public string InstanceName { get; set; }
|
public string InstanceName { get; set; }
|
||||||
//public string SaveName { get; set; }
|
|
||||||
public int Autosave { get; set; }
|
public int Autosave { get; set; }
|
||||||
public bool AutoRestart { get; set; }
|
public bool AutoRestart { get; set; }
|
||||||
|
|
||||||
@@ -30,7 +29,6 @@ namespace Torch.Server
|
|||||||
|
|
||||||
public static ServerConfig LoadFrom(string path)
|
public static ServerConfig LoadFrom(string path)
|
||||||
{
|
{
|
||||||
_log.Info($"Loading config from '{path}'");
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var serializer = new XmlSerializer(typeof(ServerConfig));
|
var serializer = new XmlSerializer(typeof(ServerConfig));
|
||||||
@@ -43,14 +41,13 @@ namespace Torch.Server
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Console.WriteLine(e);
|
_log.Error(e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SaveTo(string path)
|
public bool SaveTo(string path)
|
||||||
{
|
{
|
||||||
_log.Info($"Saving config to '{path}'");
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var serializer = new XmlSerializer(typeof(ServerConfig));
|
var serializer = new XmlSerializer(typeof(ServerConfig));
|
||||||
@@ -62,7 +59,7 @@ namespace Torch.Server
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Console.WriteLine(e);
|
_log.Error(e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -74,15 +74,10 @@ namespace Torch.Managers
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendMessage(string message)
|
|
||||||
{
|
|
||||||
SendMessage(message, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send a message in chat.
|
/// Send a message in chat.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendMessage(string message, long playerId, string author = "Server", string font = MyFontEnum.Red)
|
public void SendMessage(string message, string author = "Server", long playerId = 0, string font = MyFontEnum.Red)
|
||||||
{
|
{
|
||||||
var msg = new ScriptedChatMsg {Author = author, Font = font, Target = playerId, Text = message};
|
var msg = new ScriptedChatMsg {Author = author, Font = font, Target = playerId, Text = message};
|
||||||
MyMultiplayerBase.SendScriptedChatMessage(ref msg);
|
MyMultiplayerBase.SendScriptedChatMessage(ref msg);
|
||||||
|
@@ -10,6 +10,8 @@ using System.Threading.Tasks;
|
|||||||
using NLog;
|
using NLog;
|
||||||
using Sandbox;
|
using Sandbox;
|
||||||
using Sandbox.Game;
|
using Sandbox.Game;
|
||||||
|
using Sandbox.Game.Multiplayer;
|
||||||
|
using Sandbox.Game.Screens.Helpers;
|
||||||
using Sandbox.Game.World;
|
using Sandbox.Game.World;
|
||||||
using Sandbox.ModAPI;
|
using Sandbox.ModAPI;
|
||||||
using SpaceEngineers.Game;
|
using SpaceEngineers.Game;
|
||||||
@@ -23,10 +25,9 @@ namespace Torch
|
|||||||
public abstract class TorchBase : ITorchBase
|
public abstract class TorchBase : ITorchBase
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Dirty hack because *keen*
|
/// Hack because *keen*.
|
||||||
/// Use only if absolutely necessary.
|
/// Use only if necessary, prefer dependency injection.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Obsolete]
|
|
||||||
public static ITorchBase Instance { get; private set; }
|
public static ITorchBase Instance { get; private set; }
|
||||||
protected static Logger Log { get; } = LogManager.GetLogger("Torch");
|
protected static Logger Log { get; } = LogManager.GetLogger("Torch");
|
||||||
public Version TorchVersion { get; protected set; }
|
public Version TorchVersion { get; protected set; }
|
||||||
@@ -54,6 +55,37 @@ namespace Torch
|
|||||||
Multiplayer = new MultiplayerManager(this);
|
Multiplayer = new MultiplayerManager(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task SaveGameAsync()
|
||||||
|
{
|
||||||
|
Log.Info("Saving game");
|
||||||
|
if (MySandboxGame.IsGameReady && !MyAsyncSaving.InProgress && Sync.IsServer && !(MySession.Static.LocalCharacter?.IsDead ?? true))
|
||||||
|
{
|
||||||
|
using (var e = new AutoResetEvent(false))
|
||||||
|
{
|
||||||
|
MyAsyncSaving.Start(() =>
|
||||||
|
{
|
||||||
|
MySector.ResetEyeAdaptation = true;
|
||||||
|
e.Set();
|
||||||
|
});
|
||||||
|
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
if (!e.WaitOne(60000))
|
||||||
|
{
|
||||||
|
Log.Error("Save failed!");
|
||||||
|
Multiplayer.SendMessage("Save timed out!", author: "Error");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.Error("Cannot save");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Game Actions
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Invokes an action on the game thread.
|
/// Invokes an action on the game thread.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -117,6 +149,8 @@ namespace Torch
|
|||||||
throw new TimeoutException("The game action timed out.");
|
throw new TimeoutException("The game action timed out.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
public virtual void Init()
|
public virtual void Init()
|
||||||
{
|
{
|
||||||
Debug.Assert(!_init, "Torch instance is already initialized.");
|
Debug.Assert(!_init, "Torch instance is already initialized.");
|
||||||
|
Reference in New Issue
Block a user