From d5159dc72a7e1f1ef4ce7b7c9900eddd8f9fb66d Mon Sep 17 00:00:00 2001 From: John Gross Date: Sun, 5 Feb 2017 08:26:48 -0800 Subject: [PATCH] Add automatic versioning and server configuration XML in preparation for services --- NLog.config | 2 +- TestPlugin/Commands.cs | 6 +- TestPlugin/Plugin.cs | 2 +- TestPlugin/TestPlugin.csproj | 8 ++ Torch.API/IPluginManager.cs | 2 +- Torch.API/ITorchBase.cs | 5 +- Torch.API/ITorchPlugin.cs | 7 +- Torch.Client/Program.cs | 14 ++- Torch.Client/Properties/AssemblyInfo.cs | 53 ++------ Torch.Client/Properties/AssemblyInfo.tt | 28 +++++ Torch.Client/Torch.Client.csproj | 23 +++- Torch.Client/TorchClient.cs | 7 +- Torch.Client/torchicon.ico | Bin 0 -> 16958 bytes Torch.Server/Program.cs | 63 +++++++--- Torch.Server/Properties/AssemblyInfo.cs | 53 ++------ Torch.Server/Properties/AssemblyInfo.tt | 28 +++++ Torch.Server/ServerConfig.cs | 70 +++++++++++ Torch.Server/SpaceEngineers.ico | Bin 32038 -> 0 bytes Torch.Server/Torch.Server.csproj | 117 ++++++++++++------ Torch.Server/TorchServer.cs | 46 +++---- Torch.Server/TorchService.cs | 11 +- Torch.Server/torchicon.ico | Bin 0 -> 16958 bytes Torch/Collections/KeyTree.cs | 79 ++++++++++++ Torch/Commands/CommandContext.cs | 2 +- Torch/Commands/TorchCommands.cs | 14 ++- Torch/Managers/MultiplayerManager.cs | 4 +- .../Managers/NetworkManager/NetworkManager.cs | 12 +- Torch/Managers/PluginManager.cs | 9 +- Torch/Reflection.cs | 4 +- Torch/Torch.csproj | 1 + Torch/TorchBase.cs | 41 ++++-- Torch/TorchPluginBase.cs | 6 +- torchicon.ico | Bin 0 -> 16958 bytes 33 files changed, 501 insertions(+), 216 deletions(-) create mode 100644 Torch.Client/Properties/AssemblyInfo.tt create mode 100644 Torch.Client/torchicon.ico create mode 100644 Torch.Server/Properties/AssemblyInfo.tt create mode 100644 Torch.Server/ServerConfig.cs delete mode 100644 Torch.Server/SpaceEngineers.ico create mode 100644 Torch.Server/torchicon.ico create mode 100644 Torch/Collections/KeyTree.cs create mode 100644 torchicon.ico diff --git a/NLog.config b/NLog.config index 078af4e..61d309a 100644 --- a/NLog.config +++ b/NLog.config @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - + diff --git a/TestPlugin/Commands.cs b/TestPlugin/Commands.cs index 7141749..6617b26 100644 --- a/TestPlugin/Commands.cs +++ b/TestPlugin/Commands.cs @@ -3,11 +3,15 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Sandbox; +using Sandbox.Game.Entities; +using Sandbox.Game.World; using Torch.Commands; +using VRage.Game.Entity; +using VRage.Game.ModAPI; namespace TestPlugin { - [Category("admin", "tools")] public class Commands : CommandModule { [Command("Ban", "Bans a player from the game")] diff --git a/TestPlugin/Plugin.cs b/TestPlugin/Plugin.cs index b276bce..6017a95 100644 --- a/TestPlugin/Plugin.cs +++ b/TestPlugin/Plugin.cs @@ -26,7 +26,7 @@ namespace TestPlugin } /// - public override void Unload() + public override void Dispose() { //Torch.Log.Write($"Plugin unload {Name}"); } diff --git a/TestPlugin/TestPlugin.csproj b/TestPlugin/TestPlugin.csproj index 24445bb..21772c3 100644 --- a/TestPlugin/TestPlugin.csproj +++ b/TestPlugin/TestPlugin.csproj @@ -31,6 +31,9 @@ MinimumRecommendedRules.ruleset + + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\Sandbox.Game.dll + @@ -42,6 +45,11 @@ ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\VRage.dll + + False + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\VRage.Game.dll + + diff --git a/Torch.API/IPluginManager.cs b/Torch.API/IPluginManager.cs index 42bf9b1..9e28193 100644 --- a/Torch.API/IPluginManager.cs +++ b/Torch.API/IPluginManager.cs @@ -9,6 +9,6 @@ namespace Torch.API { void UpdatePlugins(); void Init(); - void UnloadPlugins(); + void DisposePlugins(); } } \ No newline at end of file diff --git a/Torch.API/ITorchBase.cs b/Torch.API/ITorchBase.cs index 5415ec3..981cd28 100644 --- a/Torch.API/ITorchBase.cs +++ b/Torch.API/ITorchBase.cs @@ -8,10 +8,13 @@ namespace Torch.API { public interface ITorchBase { + event Action SessionLoading; event Action SessionLoaded; + event Action SessionUnloading; + event Action SessionUnloaded; IMultiplayer Multiplayer { get; } IPluginManager Plugins { get; } - Version Version { get; } + Version TorchVersion { get; } void Invoke(Action action); void InvokeBlocking(Action action); Task InvokeAsync(Action action); diff --git a/Torch.API/ITorchPlugin.cs b/Torch.API/ITorchPlugin.cs index 3053170..d333196 100644 --- a/Torch.API/ITorchPlugin.cs +++ b/Torch.API/ITorchPlugin.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace Torch.API { - public interface ITorchPlugin + public interface ITorchPlugin : IDisposable { Guid Id { get; } Version Version { get; } @@ -23,10 +23,5 @@ namespace Torch.API /// Called after each game tick. Not thread safe, use invocation methods in . /// void Update(); - - /// - /// Called when the game exits. - /// - void Unload(); } } diff --git a/Torch.Client/Program.cs b/Torch.Client/Program.cs index 68e8231..1bb555a 100644 --- a/Torch.Client/Program.cs +++ b/Torch.Client/Program.cs @@ -1,12 +1,17 @@ using System; using System.Windows; +using NLog; namespace Torch.Client { public static class Program { + private static Logger _log = LogManager.GetLogger("Torch"); + public static void Main(string[] args) { + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + var client = new TorchClient(); try @@ -15,11 +20,18 @@ namespace Torch.Client } catch (Exception e) { - MessageBox.Show($"Torch encountered an error trying to initialize the game.\n{e.Message}"); + _log.Fatal("Torch encountered an error trying to initialize the game."); + _log.Fatal(e); return; } client.Start(); } + + private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + var ex = (Exception)e.ExceptionObject; + MessageBox.Show(ex.StackTrace, ex.Message); + } } } \ No newline at end of file diff --git a/Torch.Client/Properties/AssemblyInfo.cs b/Torch.Client/Properties/AssemblyInfo.cs index 7b43e53..e1e6015 100644 --- a/Torch.Client/Properties/AssemblyInfo.cs +++ b/Torch.Client/Properties/AssemblyInfo.cs @@ -1,55 +1,16 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; + +using System.Reflection; using System.Runtime.InteropServices; -using System.Windows; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("PistonClient")] +[assembly: AssemblyTitle("Torch Client")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PistonClient")] -[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyProduct("Torch")] +[assembly: AssemblyCopyright("Copyright © Torch API 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] -//In order to begin building localizable applications, set -//CultureYouAreCodingWith in your .csproj file -//inside a . For example, if you are using US english -//in your source files, set the to en-US. Then uncomment -//the NeutralResourceLanguage attribute below. Update the "en-US" in -//the line below to match the UICulture setting in the project file. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] - - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.35.456")] +[assembly: AssemblyFileVersion("1.0.35.456")] \ No newline at end of file diff --git a/Torch.Client/Properties/AssemblyInfo.tt b/Torch.Client/Properties/AssemblyInfo.tt new file mode 100644 index 0000000..c1b48cf --- /dev/null +++ b/Torch.Client/Properties/AssemblyInfo.tt @@ -0,0 +1,28 @@ +<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ output extension=".cs" #> + +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Torch Client")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Torch")] +[assembly: AssemblyCopyright("Copyright © Torch API 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] + +<# var dt = DateTime.Now; + int major = 1; + int minor = 0; + int build = dt.DayOfYear; + int rev = (int)dt.TimeOfDay.TotalMinutes / 2; +#> +[assembly: AssemblyVersion("<#= major #>.<#= minor #>.<#= build #>.<#= rev #>")] +[assembly: AssemblyFileVersion("<#= major #>.<#= minor #>.<#= build #>.<#= rev #>")] \ No newline at end of file diff --git a/Torch.Client/Torch.Client.csproj b/Torch.Client/Torch.Client.csproj index 27926f5..cafcd96 100644 --- a/Torch.Client/Torch.Client.csproj +++ b/Torch.Client/Torch.Client.csproj @@ -36,6 +36,9 @@ MinimumRecommendedRules.ruleset true + + torchicon.ico + ..\packages\NLog.4.4.1\lib\net45\NLog.dll @@ -100,14 +103,16 @@ + + AssemblyInfo.tt + True + True + - - Code - True True @@ -141,6 +146,18 @@ True + + + + + + TextTemplatingFileGenerator + AssemblyInfo.cs + + + + + copy "$(SolutionDir)NLog.config" "$(TargetDir)" diff --git a/Torch.Client/TorchClient.cs b/Torch.Client/TorchClient.cs index ea1c3bd..d164f31 100644 --- a/Torch.Client/TorchClient.cs +++ b/Torch.Client/TorchClient.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using System.Windows; using Sandbox; using Sandbox.Engine.Platform; +using Sandbox.Engine.Utils; using Sandbox.Game; using SpaceEngineers.Game; using Torch.API; @@ -24,6 +25,7 @@ namespace Torch.Client public override void Init() { + Log.Info("Initializing Torch Client"); base.Init(); if (!File.Exists("steam_appid.txt")) @@ -71,9 +73,8 @@ namespace Torch.Client { Persons = new List { - new MyCreditsPerson("JIMMACLE"), - new MyCreditsPerson("REXXAR"), - new MyCreditsPerson("PHOENIXTHESAGE") + new MyCreditsPerson("THE TORCH TEAM"), + new MyCreditsPerson("http://github.com/TorchSE"), } }; MyPerGameSettings.Credits.Departments.Insert(0, credits); diff --git a/Torch.Client/torchicon.ico b/Torch.Client/torchicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4563964572400f7337a29a5dc0921e76befa40b6 GIT binary patch literal 16958 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 Gxc@(CkrRjj literal 0 HcmV?d00001 diff --git a/Torch.Server/Program.cs b/Torch.Server/Program.cs index 3be41f6..0e6292c 100644 --- a/Torch.Server/Program.cs +++ b/Torch.Server/Program.cs @@ -12,9 +12,14 @@ using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Threading; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; using NLog; +using Sandbox.Game.World; +using Sandbox.ModAPI; using Torch; using Torch.API; +using VRage.Game.ModAPI; namespace Torch.Server { @@ -34,19 +39,49 @@ namespace Torch.Server return; } - if (args.FirstOrDefault() == "-svcinstall") + string configName = args.Length > 0 ? args[0] : "TorchConfig.xml"; + var configPath = Path.Combine(Directory.GetCurrentDirectory(), configName); + var options = new ServerConfig("Torch"); + if (File.Exists(configName)) { - /* Working on installing the service properly instead of with sc.exe - _log.Info("Installing service"); - var installer = new TorchServiceInstaller(); - installer.Context = new InstallContext(Path.Combine(Directory.GetCurrentDirectory(), "svclog.log"), null); - installer.Context.Parameters.Add("name", "Torch DS"); - installer.Install(new Hashtable + _log.Info($"Loading config {configPath}"); + options = ServerConfig.LoadFrom(configPath); + } + else + { + _log.Info($"Generating default config at {configPath}"); + options.SaveTo(configPath); + } + + /* + if (!parser.ParseArguments(args, options)) + { + _log.Error($"Parsing arguments failed: {string.Join(" ", args)}"); + return; + } + + if (!string.IsNullOrEmpty(options.Config) && File.Exists(options.Config)) + { + options = ServerConfig.LoadFrom(options.Config); + parser.ParseArguments(args, options); + }*/ + + //RestartOnCrash autostart autosave=15 + //gamepath ="C:\Program Files\Space Engineers DS" instance="Hydro Survival" instancepath="C:\ProgramData\SpaceEngineersDedicated\Hydro Survival" + + /* + if (options.InstallService) + { + var serviceName = $"\"Torch - {options.InstanceName}\""; + // Working on installing the service properly instead of with sc.exe + _log.Info($"Installing service '{serviceName}"); + var exePath = $"\"{Assembly.GetExecutingAssembly().Location}\""; + var createInfo = new ServiceCreateInfo { - {"name", "Torch DS"} - - }); - _log.Info("Service Installed");*/ + Name = options.InstanceName, + BinaryPath = exePath, + }; + _log.Info("Service Installed"); var runArgs = string.Join(" ", args.Skip(1)); _log.Info($"Installing Torch as a service with arguments '{runArgs}'"); @@ -63,7 +98,7 @@ namespace Torch.Server return; } - if (args.FirstOrDefault() == "-svcuninstall") + if (options.UninstallService) { _log.Info("Uninstalling Torch service"); var startInfo = new ProcessStartInfo @@ -77,9 +112,9 @@ namespace Torch.Server Process.Start(startInfo).WaitForExit(); _log.Info("Torch service uninstalled"); return; - } + }*/ - _server = new TorchServer(); + _server = new TorchServer(options); _server.Init(); _server.Start(); } diff --git a/Torch.Server/Properties/AssemblyInfo.cs b/Torch.Server/Properties/AssemblyInfo.cs index 8ff64c2..cdf7092 100644 --- a/Torch.Server/Properties/AssemblyInfo.cs +++ b/Torch.Server/Properties/AssemblyInfo.cs @@ -1,55 +1,16 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; + +using System.Reflection; using System.Runtime.InteropServices; -using System.Windows; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("TorchServer")] +[assembly: AssemblyTitle("Torch Server")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TorchServer")] -[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyProduct("Torch")] +[assembly: AssemblyCopyright("Copyright © Torch API 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] -//In order to begin building localizable applications, set -//CultureYouAreCodingWith in your .csproj file -//inside a . For example, if you are using US english -//in your source files, set the to en-US. Then uncomment -//the NeutralResourceLanguage attribute below. Update the "en-US" in -//the line below to match the UICulture setting in the project file. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] - - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.35.456")] +[assembly: AssemblyFileVersion("1.0.35.456")] \ No newline at end of file diff --git a/Torch.Server/Properties/AssemblyInfo.tt b/Torch.Server/Properties/AssemblyInfo.tt new file mode 100644 index 0000000..eee6580 --- /dev/null +++ b/Torch.Server/Properties/AssemblyInfo.tt @@ -0,0 +1,28 @@ +<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ output extension=".cs" #> + +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Torch Server")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Torch")] +[assembly: AssemblyCopyright("Copyright © Torch API 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] + +<# var dt = DateTime.Now; + int major = 1; + int minor = 0; + int build = dt.DayOfYear; + int rev = (int)dt.TimeOfDay.TotalMinutes / 2; +#> +[assembly: AssemblyVersion("<#= major #>.<#= minor #>.<#= build #>.<#= rev #>")] +[assembly: AssemblyFileVersion("<#= major #>.<#= minor #>.<#= build #>.<#= rev #>")] \ No newline at end of file diff --git a/Torch.Server/ServerConfig.cs b/Torch.Server/ServerConfig.cs new file mode 100644 index 0000000..d970309 --- /dev/null +++ b/Torch.Server/ServerConfig.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Xml.Serialization; +using NLog; +using VRage.Dedicated; + +namespace Torch.Server +{ + public class ServerConfig + { + private static Logger _log = LogManager.GetLogger("Config"); + + public string InstancePath { get; set; } + public string InstanceName { get; set; } + //public string SaveName { get; set; } + public int Autosave { get; set; } + public bool AutoRestart { get; set; } + + public ServerConfig(string instanceName = "Torch", string instancePath = null, int autosaveInterval = 5, bool autoRestart = false) + { + InstanceName = instanceName; + InstancePath = instancePath ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Torch", InstanceName); + Autosave = autosaveInterval; + AutoRestart = autoRestart; + } + + public static ServerConfig LoadFrom(string path) + { + _log.Info($"Loading config from '{path}'"); + try + { + var serializer = new XmlSerializer(typeof(ServerConfig)); + ServerConfig config; + using (var f = File.OpenRead(path)) + { + config = (ServerConfig)serializer.Deserialize(f); + } + return config; + } + catch (Exception e) + { + Console.WriteLine(e); + return null; + } + } + + public bool SaveTo(string path) + { + _log.Info($"Saving config to '{path}'"); + try + { + var serializer = new XmlSerializer(typeof(ServerConfig)); + using (var f = File.OpenWrite(path)) + { + serializer.Serialize(f, this); + } + return true; + } + catch (Exception e) + { + Console.WriteLine(e); + return false; + } + } + } +} diff --git a/Torch.Server/SpaceEngineers.ico b/Torch.Server/SpaceEngineers.ico deleted file mode 100644 index ea7041aef980d15dfb8f489cd290dae2d128ce1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32038 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 O@5B!L@85s11pW{GiKV6h diff --git a/Torch.Server/Torch.Server.csproj b/Torch.Server/Torch.Server.csproj index e6f61d3..2269baa 100644 --- a/Torch.Server/Torch.Server.csproj +++ b/Torch.Server/Torch.Server.csproj @@ -40,7 +40,7 @@ Torch.Server.Program - SpaceEngineers.ico + torchicon.ico @@ -48,28 +48,38 @@ C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\DedicatedServer64\HavokWrapper.dll False + + False + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\Microsoft.CodeAnalysis.dll + + + False + ..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\NLog.4.4.1\lib\net45\NLog.dll True - - False - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\DedicatedServer64\Sandbox.Common.dll - False + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\Sandbox.Common.dll - - False - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\DedicatedServer64\Sandbox.Game.dll - False + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\Sandbox.Game.dll - + False - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\SpaceEngineers.Game.dll - False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\Sandbox.Graphics.dll - - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\DedicatedServer64\SpaceEngineersDedicated.exe - False + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\SpaceEngineers.Game.dll + + + False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\SpaceEngineers.ObjectBuilders.dll + + + False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\SpaceEngineers.ObjectBuilders.XmlSerializers.dll False @@ -91,36 +101,63 @@ 4.0 - - False - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\VRage.dll - False + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.dll - + False - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\DedicatedServer64\VRage.Dedicated.dll - False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Audio.dll - - False - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\DedicatedServer64\VRage.Game.dll - False + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Dedicated.dll - - False - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\VRage.Input.dll - False + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Game.dll - + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Game.XmlSerializers.dll + + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Input.dll + + + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Library.dll + + False - C:\Program Files (x86)\Steam\steamapps\common\SpaceEngineers\Bin64\VRage.Library.dll - False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Math.dll + + + False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Native.dll + + + False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.OpenVRWrapper.dll + + + False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Render.dll + + + False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Render11.dll + + + False + ..\..\..\..\..\..\..\steamcmd\steamapps\common\SpaceEngineersDedicatedServer\DedicatedServer64\VRage.Scripting.dll + + True + True + AssemblyInfo.tt + + Component @@ -150,9 +187,6 @@ - - Code - True True @@ -213,7 +247,16 @@ - + + + + + + + + TextTemplatingFileGenerator + AssemblyInfo.cs + diff --git a/Torch.Server/TorchServer.cs b/Torch.Server/TorchServer.cs index 930c475..5d89b8e 100644 --- a/Torch.Server/TorchServer.cs +++ b/Torch.Server/TorchServer.cs @@ -8,9 +8,12 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; +using NLog; using Torch; using Sandbox; +using Sandbox.Engine.Analytics; using Sandbox.Engine.Multiplayer; +using Sandbox.Engine.Utils; using Sandbox.Game; using Sandbox.Game.Gui; using Sandbox.Game.World; @@ -27,31 +30,24 @@ namespace Torch.Server { public Thread GameThread { get; private set; } public bool IsRunning { get; private set; } - public bool IsService { get; } - public string InstancePath { get; private set; } + public string InstancePath { get; } public string InstanceName { get; } - public event Action SessionLoading; - private readonly AutoResetEvent _stopHandle = new AutoResetEvent(false); - internal TorchServer(string instanceName = null) + internal TorchServer(ServerConfig options) { - if (instanceName != null) - { - IsService = true; - InstanceName = instanceName; - } - - MySession.OnLoading += OnSessionLoading; + InstanceName = options.InstanceName; + InstancePath = options.InstancePath; } public override void Init() { base.Init(); - SpaceEngineersGame.SetupBasicGameInfo(); - SpaceEngineersGame.SetupPerGameSettings(); + Log.Info($"Server instance {InstanceName} at path {InstancePath}"); + + MyFakes.ENABLE_INFINARIO = false; MyPerGameSettings.SendLogToKeen = false; MyPerServerSettings.GameName = MyPerGameSettings.GameName; MyPerServerSettings.GameNameSafe = MyPerGameSettings.GameNameSafe; @@ -68,18 +64,7 @@ namespace Torch.Server var gameVersion = MyPerGameSettings.BasicGameInfo.GameVersion; MyFinalBuildConstants.APP_VERSION = gameVersion ?? 0; - InstancePath = InstanceName != null ? GetInstancePath(true, InstanceName) : GetInstancePath(); - } - - private void OnSessionLoading() - { - SessionLoading?.Invoke(); - MySession.Static.OnReady += OnSessionReady; - } - - private void OnSessionReady() - { - InvokeSessionLoaded(); + //InstancePath = InstanceName != null ? GetInstancePath(true, InstanceName) : GetInstancePath(); } /// @@ -100,6 +85,7 @@ namespace Torch.Server try { Reflection.InvokeStaticMethod(typeof(DedicatedServer), "RunMain", InstanceName, InstancePath, false, true); } catch (Exception e) { + Log.Error("Error running server."); Log.Error(e); throw; } @@ -134,26 +120,28 @@ namespace Torch.Server VRage.FileSystem.MyFileSystem.Reset(); VRage.Input.MyGuiGameControlsHelpers.Reset(); VRage.Input.MyInput.UnloadData(); - CleanupProfilers(); + //CleanupProfilers(); Log.Info("Server stopped."); _stopHandle.Set(); IsRunning = false; } + /* private string GetInstancePath(bool isService = false, string instanceName = "Torch") { if (isService) return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), MyPerServerSettings.GameDSName, instanceName); return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), MyPerServerSettings.GameDSName); - } + }*/ + /* private void CleanupProfilers() { typeof(MyRenderProfiler).GetField("m_threadProfiler", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, null); typeof(MyRenderProfiler).GetField("m_gpuProfiler", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, null); (typeof(MyRenderProfiler).GetField("m_threadProfilers", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null) as List).Clear(); - } + }*/ } } diff --git a/Torch.Server/TorchService.cs b/Torch.Server/TorchService.cs index 46839c3..a9ce339 100644 --- a/Torch.Server/TorchService.cs +++ b/Torch.Server/TorchService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -30,7 +31,15 @@ namespace Torch.Server protected override void OnStart(string[] args) { base.OnStart(args); - _server = new TorchServer("Torch"); + + string configName = args.Length > 0 ? args[0] : "TorchConfig.xml"; + var options = new ServerConfig("Torch"); + if (File.Exists(configName)) + options = ServerConfig.LoadFrom(configName); + else + options.SaveTo(configName); + + _server = new TorchServer(options); _server.Init(); _server.RunArgs = args; Task.Run(() => _server.Start()); diff --git a/Torch.Server/torchicon.ico b/Torch.Server/torchicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4563964572400f7337a29a5dc0921e76befa40b6 GIT binary patch literal 16958 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 Gxc@(CkrRjj literal 0 HcmV?d00001 diff --git a/Torch/Collections/KeyTree.cs b/Torch/Collections/KeyTree.cs new file mode 100644 index 0000000..79add2e --- /dev/null +++ b/Torch/Collections/KeyTree.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Torch.Collections +{ + public class KeyTree + { + private Dictionary> _nodes = new Dictionary>(); + } + + public class KeyTreeNode + { + public TKey Key { get; } + public TValue Value { get; set; } + public KeyTreeNode Parent { get; private set; } + private readonly Dictionary> _children = new Dictionary>(); + + public IEnumerable> Children => _children.Values; + + public KeyTreeNode(TKey key, TValue value) + { + Key = key; + Value = value; + } + + public KeyTreeNode GetChild(TKey key) + { + if (_children.TryGetValue(key, out KeyTreeNode value)) + return value; + + return null; + } + + public bool AddChild(TKey key, TValue value) + { + if (_children.ContainsKey(key)) + return false; + + var node = new KeyTreeNode(key, value) { Parent = this }; + _children.Add(key, node); + return true; + } + + public bool AddChild(KeyTreeNode node) + { + if (node.Parent != null || _children.ContainsKey(node.Key)) + return false; + + node.Parent = this; + _children.Add(node.Key, node); + return true; + } + + public bool RemoveChild(TKey key) + { + if (!_children.TryGetValue(key, out KeyTreeNode value)) + return false; + + value.Parent = null; + _children.Remove(key); + return true; + } + + public IEnumerable> Traverse() + { + foreach (var node in Children) + { + yield return node; + foreach (var child in node.Traverse()) + { + yield return child; + } + } + } + } +} diff --git a/Torch/Commands/CommandContext.cs b/Torch/Commands/CommandContext.cs index 7c38927..d85f52b 100644 --- a/Torch/Commands/CommandContext.cs +++ b/Torch/Commands/CommandContext.cs @@ -28,7 +28,7 @@ namespace Torch.Commands public void Respond(string message, string sender = "Server", string font = MyFontEnum.Blue) { - Torch.Multiplayer.SendMessage(message, Player.PlayerID, sender, font); + Torch.Multiplayer.SendMessage(message, Player.IdentityId, sender, font); } } } \ No newline at end of file diff --git a/Torch/Commands/TorchCommands.cs b/Torch/Commands/TorchCommands.cs index e15ad2e..61a6726 100644 --- a/Torch/Commands/TorchCommands.cs +++ b/Torch/Commands/TorchCommands.cs @@ -9,13 +9,20 @@ namespace Torch.Commands { public class TorchCommands : CommandModule { +#if DEBUG + [Command("fixit")] + public void Fixit() + { + Environment.Exit(0); + } + [Command("dbgcmd")] public void Dbgcmd() { var commandManager = ((PluginManager)Context.Torch.Plugins).Commands; Console.WriteLine(commandManager.Commands.GetTreeString()); } - +#endif [Command("help", "Displays help for a command")] public void Help() { @@ -32,8 +39,7 @@ namespace Torch.Commands if (command != null) sb.AppendLine(command.HelpText); - if (children.Any()) - sb.AppendLine($"Subcommands: {string.Join(", ", children)}"); + sb.AppendLine($"Subcommands: {string.Join(", ", children)}"); Context.Respond(sb.ToString()); } @@ -47,7 +53,7 @@ namespace Torch.Commands [Command("ver", "Shows the running Torch version.")] public void Version() { - var ver = Context.Torch.Version; + var ver = Context.Torch.TorchVersion; Context.Respond($"Torch version: {ver}"); } diff --git a/Torch/Managers/MultiplayerManager.cs b/Torch/Managers/MultiplayerManager.cs index 378422c..b743c62 100644 --- a/Torch/Managers/MultiplayerManager.cs +++ b/Torch/Managers/MultiplayerManager.cs @@ -82,7 +82,7 @@ namespace Torch.Managers /// /// Send a message in chat. /// - public void SendMessage(string message, long playerId, string author = "Server", string font = MyFontEnum.Blue) + public void SendMessage(string message, long playerId, string author = "Server", string font = MyFontEnum.Red) { var msg = new ScriptedChatMsg {Author = author, Font = font, Target = playerId, Text = message}; MyMultiplayerBase.SendScriptedChatMessage(ref msg); @@ -164,7 +164,7 @@ namespace Torch.Managers private HashSet _waitingForGroup; private HashSet _waitingForFriends; private Dictionary _gameOwnerIds = new Dictionary(); - private IMultiplayer _multiplayerImplementation; + //private IMultiplayer _multiplayerImplementation; /// /// Removes Keen's hooks into some Steam events so we have full control over client authentication diff --git a/Torch/Managers/NetworkManager/NetworkManager.cs b/Torch/Managers/NetworkManager/NetworkManager.cs index 2a735a3..e0c3ece 100644 --- a/Torch/Managers/NetworkManager/NetworkManager.cs +++ b/Torch/Managers/NetworkManager/NetworkManager.cs @@ -16,8 +16,16 @@ namespace Torch.Managers { private NetworkManager() { - if (ReflectionUnitTest()) - InitNetworkIntercept(); + try + { + if (ReflectionUnitTest()) + InitNetworkIntercept(); + } + catch (Exception ex) + { + _log.Error("Error initializing network intercept"); + _log.Error(ex); + } } private static Logger _log = LogManager.GetLogger(nameof(NetworkManager)); diff --git a/Torch/Managers/PluginManager.cs b/Torch/Managers/PluginManager.cs index 25a925c..c669345 100644 --- a/Torch/Managers/PluginManager.cs +++ b/Torch/Managers/PluginManager.cs @@ -72,10 +72,10 @@ namespace Torch.Managers /// /// Unloads all plugins. /// - public void UnloadPlugins() + public void DisposePlugins() { foreach (var plugin in _plugins) - plugin.Unload(); + plugin.Dispose(); _plugins.Clear(); } @@ -114,11 +114,14 @@ namespace Torch.Managers catch (Exception e) { _log.Error($"Error loading plugin '{type.FullName}'"); + _log.Error(e); throw; } } } } + + _plugins.ForEach(p => p.Init(_torch)); } public IEnumerator GetEnumerator() @@ -168,7 +171,7 @@ namespace Torch.Managers public void Dispose() { - _manager.UnloadPlugins(); + _manager.DisposePlugins(); } } } diff --git a/Torch/Reflection.cs b/Torch/Reflection.cs index 14f3e98..4f8b62d 100644 --- a/Torch/Reflection.cs +++ b/Torch/Reflection.cs @@ -48,7 +48,7 @@ namespace Torch return true; } - catch (AmbiguousMatchException aex) + catch (AmbiguousMatchException) { return true; } @@ -95,7 +95,7 @@ namespace Torch if (prop == null) prop = type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy); if (prop == null) - prop = type.BaseType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy); + prop = type.BaseType?.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy); if (prop == null) { Log.Error("Failed to find property '{0}' in type '{1}'", propertyName, type.FullName); diff --git a/Torch/Torch.csproj b/Torch/Torch.csproj index 690e454..e453fe7 100644 --- a/Torch/Torch.csproj +++ b/Torch/Torch.csproj @@ -145,6 +145,7 @@ + diff --git a/Torch/TorchBase.cs b/Torch/TorchBase.cs index 253cabf..15cc773 100644 --- a/Torch/TorchBase.cs +++ b/Torch/TorchBase.cs @@ -9,10 +9,14 @@ using System.Threading; using System.Threading.Tasks; using NLog; using Sandbox; +using Sandbox.Game; +using Sandbox.Game.World; using Sandbox.ModAPI; +using SpaceEngineers.Game; using Torch.API; using Torch.Managers; using VRage.Scripting; +using VRage.Utils; namespace Torch { @@ -24,20 +28,19 @@ namespace Torch /// [Obsolete] public static ITorchBase Instance { get; private set; } - protected static Logger Log = LogManager.GetLogger("Torch"); - public Version Version { get; protected set; } + protected static Logger Log { get; } = LogManager.GetLogger("Torch"); + public Version TorchVersion { get; protected set; } + public Version GameVersion { get; private set; } public string[] RunArgs { get; set; } public IPluginManager Plugins { get; protected set; } public IMultiplayer Multiplayer { get; protected set; } + public event Action SessionLoading; public event Action SessionLoaded; + public event Action SessionUnloading; + public event Action SessionUnloaded; private bool _init; - protected void InvokeSessionLoaded() - { - SessionLoaded?.Invoke(); - } - protected TorchBase() { if (Instance != null) @@ -45,7 +48,7 @@ namespace Torch Instance = this; - Version = Assembly.GetExecutingAssembly().GetName().Version; + TorchVersion = Assembly.GetExecutingAssembly().GetName().Version; RunArgs = new string[0]; Plugins = new PluginManager(this); Multiplayer = new MultiplayerManager(this); @@ -120,12 +123,34 @@ namespace Torch AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + SpaceEngineersGame.SetupBasicGameInfo(); + SpaceEngineersGame.SetupPerGameSettings(); + TorchVersion = Assembly.GetEntryAssembly().GetName().Version; + GameVersion = new Version(new MyVersion(MyPerGameSettings.BasicGameInfo.GameVersion.Value).FormattedText.ToString().Replace("_", ".")); + var verInfo = $"Torch {TorchVersion}, SE {GameVersion}"; + Console.Title = verInfo; +#if DEBUG + Log.Info("DEBUG"); +#else + Log.Info("RELEASE"); +#endif + Log.Info(verInfo); + Log.Info($"Executing assembly: {Assembly.GetEntryAssembly().FullName}"); + Log.Info($"Executing directory: {AppDomain.CurrentDomain.BaseDirectory}"); + + MySession.OnLoading += () => SessionLoading?.Invoke(); + MySession.AfterLoading += () => SessionLoaded?.Invoke(); + MySession.OnUnloading += () => SessionUnloading?.Invoke(); + MySession.OnUnloaded += () => SessionUnloaded?.Invoke(); + _init = true; } private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Log.Fatal((Exception)e.ExceptionObject); + Console.ReadLine(); + Environment.Exit(-1); } public abstract void Start(); diff --git a/Torch/TorchPluginBase.cs b/Torch/TorchPluginBase.cs index fe7cb8f..5f5b456 100644 --- a/Torch/TorchPluginBase.cs +++ b/Torch/TorchPluginBase.cs @@ -18,7 +18,7 @@ namespace Torch public Version Version { get; } public string Name { get; } public ITorchBase Torch { get; private set; } - private static Logger _log = LogManager.GetCurrentClassLogger(); + private static readonly Logger _log = LogManager.GetLogger(nameof(TorchPluginBase)); protected TorchPluginBase() { @@ -44,7 +44,7 @@ namespace Torch Torch = torch; } - public abstract void Update(); - public abstract void Unload(); + public virtual void Update() { } + public abstract void Dispose(); } } diff --git a/torchicon.ico b/torchicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4563964572400f7337a29a5dc0921e76befa40b6 GIT binary patch literal 16958 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 Gxc@(CkrRjj literal 0 HcmV?d00001