diff --git a/Torch.API/ITorchBase.cs b/Torch.API/ITorchBase.cs index 53a45e1..b7e15d0 100644 --- a/Torch.API/ITorchBase.cs +++ b/Torch.API/ITorchBase.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Torch.API.Managers; +using Torch.API.Session; using VRage.Game.ModAPI; namespace Torch.API @@ -33,15 +34,22 @@ namespace Torch.API /// event Action SessionUnloaded; + /// + /// Gets the currently running session instance, or null if none exists. + /// + ITorchSession CurrentSession { get; } + /// /// Configuration for the current instance. /// ITorchConfig Config { get; } /// + [Obsolete] IMultiplayerManager Multiplayer { get; } /// + [Obsolete] IPluginManager Plugins { get; } /// diff --git a/Torch.Client/TorchClient.cs b/Torch.Client/TorchClient.cs index b98883d..384ad3b 100644 --- a/Torch.Client/TorchClient.cs +++ b/Torch.Client/TorchClient.cs @@ -12,6 +12,7 @@ using VRage.Steam; using Torch.API; using VRage; using VRage.FileSystem; +using VRage.GameServices; using VRageRender; using VRageRender.ExternalApp; @@ -53,7 +54,7 @@ namespace Torch.Client _startup.DetectSharpDxLeaksBeforeRun(); var steamService = new SteamService(Game.IsDedicated, APP_ID); - MyServiceManager.Instance.AddService(steamService); + MyServiceManager.Instance.AddService(steamService); _renderer = null; SpaceEngineersGame.SetupPerGameSettings(); // I'm sorry, but it's what Keen does in SpaceEngineers.MyProgram diff --git a/Torch/Session/TorchSessionManager.cs b/Torch/Session/TorchSessionManager.cs index f043832..cd7eda4 100644 --- a/Torch/Session/TorchSessionManager.cs +++ b/Torch/Session/TorchSessionManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using NLog; using Sandbox.Game.World; using Torch.API; using Torch.API.Managers; @@ -17,6 +18,7 @@ namespace Torch.Session /// public class TorchSessionManager : Manager, ITorchSessionManager { + private static readonly Logger _log = LogManager.GetCurrentClassLogger(); private TorchSession _currentSession; /// @@ -46,7 +48,13 @@ namespace Torch.Session private void SessionLoaded() { - _currentSession?.Detach(); + if (_currentSession != null) + { + _log.Warn($"Override old torch session {_currentSession.KeenSession.Name}"); + _currentSession.Detach(); + } + + _log.Info($"Starting new torch session for {MySession.Static.Name}"); _currentSession = new TorchSession(Torch, MySession.Static); foreach (SessionManagerFactory factory in _factories) { @@ -59,7 +67,10 @@ namespace Torch.Session private void SessionUnloaded() { - _currentSession?.Detach(); + if (_currentSession == null) + return; + _log.Info($"Unloading torch session for {_currentSession.KeenSession.Name}"); + _currentSession.Detach(); _currentSession = null; } diff --git a/Torch/SteamService.cs b/Torch/SteamService.cs index a39b443..552bc4f 100644 --- a/Torch/SteamService.cs +++ b/Torch/SteamService.cs @@ -3,9 +3,11 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using NLog; using SteamSDK; using VRage.Steam; using Sandbox; +using Sandbox.Engine.Networking; using Torch.Utils; using VRage.GameServices; @@ -19,6 +21,9 @@ namespace Torch /// public class SteamService : MySteamService { + private static readonly Logger _log = LogManager.GetCurrentClassLogger(); + +#pragma warning disable 649 [ReflectedSetter(Name = nameof(SteamServerAPI))] private static Action _steamServerAPISetter; [ReflectedSetter(Name = "m_gameServer")] @@ -45,6 +50,7 @@ namespace Torch private static Action RegisterCallbacks; [ReflectedSetter(Name = nameof(Peer2Peer))] private static Action _steamPeer2PeerSetter; +#pragma warning restore 649 public SteamService(bool isDedicated, uint appId) : base(true, appId) @@ -53,7 +59,7 @@ namespace Torch _steamServerAPISetter.Invoke(this, null); _steamGameServerSetter.Invoke(this, null); _steamAppIdSetter.Invoke(this, appId); - + if (isDedicated) { _steamServerAPISetter.Invoke(this, null); @@ -63,7 +69,10 @@ namespace Torch { SteamAPI steamApi = SteamAPI.Instance; _steamApiSetter.Invoke(this, steamApi); - _steamIsActiveSetter.Invoke(this, steamApi.Init()); + bool initResult = steamApi.Init(); + if (!initResult) + _log.Warn("Failed to initialize SteamService"); + _steamIsActiveSetter.Invoke(this, initResult); if (IsActive) { @@ -76,7 +85,8 @@ namespace Torch _steamInventoryAPISetter.Invoke(this, new MySteamInventory()); RegisterCallbacks(this); - } + } else + _log.Warn("SteamService isn't initialized; Torch Client won't start"); } _steamPeer2PeerSetter.Invoke(this, new MySteamPeer2Peer()); diff --git a/Torch/TorchBase.cs b/Torch/TorchBase.cs index 7bdc650..3880a19 100644 --- a/Torch/TorchBase.cs +++ b/Torch/TorchBase.cs @@ -19,9 +19,11 @@ using SpaceEngineers.Game; using Torch.API; using Torch.API.Managers; using Torch.API.ModAPI; +using Torch.API.Session; using Torch.Commands; using Torch.Managers; using Torch.Utils; +using Torch.Session; using VRage.Collections; using VRage.FileSystem; using VRage.Game.ObjectBuilder; @@ -57,15 +59,24 @@ namespace Torch /// public string[] RunArgs { get; set; } /// + [Obsolete] public IPluginManager Plugins { get; protected set; } /// + [Obsolete] public IMultiplayerManager Multiplayer { get; protected set; } /// + [Obsolete] public EntityManager Entities { get; protected set; } /// + [Obsolete] public INetworkManager Network { get; protected set; } /// + [Obsolete] public CommandManager Commands { get; protected set; } + + /// + public ITorchSession CurrentSession => Managers?.GetManager()?.CurrentSession; + /// public event Action SessionLoading; /// @@ -107,6 +118,7 @@ namespace Torch Network = new NetworkManager(this); Commands = new CommandManager(this); + Managers.AddManager(new TorchSessionManager(this)); Managers.AddManager(new FilesystemManager(this)); Managers.AddManager(new UpdateManager(this)); Managers.AddManager(Network); @@ -116,7 +128,6 @@ namespace Torch Managers.AddManager(Entities); Managers.AddManager(new ChatManager(this)); - TorchAPI.Instance = this; }