using System; using System.IO; using NLog; using NLog.Config; using NLog.Targets; using Torch.Utils; namespace Torch.Server { internal static class Program { [STAThread] public static void Main(string[] args) { var isService = Environment.GetEnvironmentVariable("TORCH_SERVICE") ?.Equals(bool.TrueString, StringComparison.OrdinalIgnoreCase) ?? false; //Ensures that all the files are downloaded in the Torch directory. var workingDir = AppContext.BaseDirectory; var binDir = Path.Combine(Environment.GetEnvironmentVariable("TORCH_GAME_PATH") ?? workingDir, "DedicatedServer64"); Directory.SetCurrentDirectory(Environment.GetEnvironmentVariable("TORCH_GAME_PATH") ?? workingDir); if (!isService && Directory.Exists(binDir)) foreach (var file in Directory.GetFiles(binDir, "System.*.dll")) { File.Delete(file); } // Breaks on Windows Server 2019 #if TORCH_SERVICE if (!new ComputerInfo().OSFullName.Contains("Server 2019") && !Environment.UserInteractive) { using (var service = new TorchService(args)) ServiceBase.Run(service); return; } #endif var instanceName = Environment.GetEnvironmentVariable("TORCH_INSTANCE") ?? "Instance"; string instancePath; if (Path.IsPathRooted(instanceName)) { instancePath = instanceName; instanceName = Path.GetDirectoryName(instanceName); } else { instancePath = Directory.CreateDirectory(instanceName).FullName; } var oldNlog = Path.Combine(workingDir, "NLog.config"); var newNlog = Path.Combine(instancePath, "NLog.config"); if (File.Exists(oldNlog)) File.Move(oldNlog, newNlog, true); else if (!File.Exists(newNlog)) using (var f = File.Create(newNlog)) typeof(Program).Assembly.GetManifestResourceStream("Torch.Server.NLog.config")!.CopyTo(f); var oldTorchCfg = Path.Combine(workingDir, "Torch.cfg"); var torchCfg = Path.Combine(instancePath, "Torch.cfg"); if (File.Exists(oldTorchCfg)) File.Move(oldTorchCfg, torchCfg, true); var config = Persistent.Load(torchCfg); config.Data.InstanceName = instanceName; config.Data.InstancePath = instancePath; if (!config.Data.Parse(args)) { Console.WriteLine("Invalid arguments"); Environment.Exit(1); } var handler = new UnhandledExceptionHandler(config.Data, isService); AppDomain.CurrentDomain.UnhandledException += handler.OnUnhandledException; Target.Register(nameof(LogViewerTarget)); TorchLogManager.RegisterTargets(Environment.GetEnvironmentVariable("TORCH_LOG_EXTENSIONS_PATH") ?? Path.Combine(instancePath, "LoggingExtensions")); TorchLogManager.SetConfiguration(new XmlLoggingConfiguration(newNlog)); var initializer = new Initializer(workingDir, config); if (!initializer.Initialize(args)) Environment.Exit(1); TorchLauncher.Launch(workingDir, binDir); initializer.Run(isService, instanceName, instancePath); } } }