private static void Start(string[] args) { //Setup error handling for unmanaged exceptions AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException; Application.ThreadException += Application_ThreadException; Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); LogManager.APILog.WriteLine("Starting SEServerExtender with " + args.Length.ToString() + " arguments ..."); CommandLineArgs extenderArgs = new CommandLineArgs(); //Setup the default args extenderArgs.autoStart = false; extenderArgs.worldName = ""; extenderArgs.instanceName = ""; extenderArgs.noGUI = false; extenderArgs.noConsole = false; extenderArgs.debug = false; extenderArgs.gamePath = ""; extenderArgs.noWCF = false; extenderArgs.noSLWCF = true; extenderArgs.autosave = 0; extenderArgs.wcfPort = 0; extenderArgs.path = ""; //Process the args foreach (string arg in args) { if (arg.Split('=').Length > 1) { string argName = arg.Split('=')[0]; string argValue = arg.Split('=')[1]; if (argName.ToLower().Equals("instance")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(0, argValue.Length - 1); } extenderArgs.instanceName = argValue; } else if (argName.ToLower().Equals("gamepath")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(0, argValue.Length - 1); } extenderArgs.gamePath = argValue; } else if (argName.ToLower().Equals("autosave")) { try { extenderArgs.autosave = int.Parse(argValue); } catch (Exception) { //Do nothing } } else if (argName.ToLower().Equals("wcfport")) { try { extenderArgs.wcfPort = ushort.Parse(argValue); } catch (Exception) { //Do nothing } } else if (argName.ToLower().Equals("slwcfport")) { try { extenderArgs.slWcfPort = ushort.Parse(argValue); } catch (Exception) { //Do nothing } } else if (argName.ToLower().Equals("path")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(0, argValue.Length - 1); } extenderArgs.path = argValue; } else if (argName.ToLower().Equals("noslwcf")) { if (argValue.ToLower() == "false") { extenderArgs.noSLWCF = false; } } } else { if (arg.ToLower().Equals("autostart")) { extenderArgs.autoStart = true; } if (arg.ToLower().Equals("nogui")) { extenderArgs.noGUI = true; //Implies autostart extenderArgs.autoStart = true; } if (arg.ToLower().Equals("noconsole")) { extenderArgs.noConsole = true; //Implies nogui and autostart extenderArgs.noGUI = true; extenderArgs.autoStart = true; } if (arg.ToLower().Equals("debug")) { extenderArgs.debug = true; } if (arg.ToLower().Equals("nowcf")) { extenderArgs.noWCF = true; } } } if (extenderArgs.noWCF) { extenderArgs.wcfPort = 0; } if (!string.IsNullOrEmpty(extenderArgs.path)) { extenderArgs.instanceName = ""; } if (!Environment.UserInteractive) { extenderArgs.noConsole = true; extenderArgs.noGUI = true; extenderArgs.autoStart = true; } if (extenderArgs.debug) { SandboxGameAssemblyWrapper.IsDebugging = true; } try { bool unitTestResult = BasicUnitTestManager.Instance.Run(); if (!unitTestResult) { SandboxGameAssemblyWrapper.IsInSafeMode = true; } m_server = Server.Instance; m_server.CommandLineArgs = extenderArgs; m_server.IsWCFEnabled = !extenderArgs.noWCF; m_server.IsSLWCFEnabled = !extenderArgs.noSLWCF; m_server.WCFPort = extenderArgs.wcfPort; m_server.SLWCFPort = extenderArgs.slWcfPort; m_server.Init(); ChatManager.ChatCommand guiCommand = new ChatManager.ChatCommand(); guiCommand.command = "gui"; guiCommand.callback = ChatCommand_GUI; ChatManager.Instance.RegisterChatCommand(guiCommand); if (extenderArgs.autoStart) { m_server.StartServer(); } if (!extenderArgs.noGUI) { Thread uiThread = new Thread(new ThreadStart(StartGUI)); uiThread.SetApartmentState(ApartmentState.STA); uiThread.Start(); } } catch (AutoException eEx) { if (!extenderArgs.noConsole) { Console.WriteLine("AutoException - " + eEx.AdditionnalInfo + "\n\r" + eEx.GetDebugString()); } if (!extenderArgs.noGUI) { MessageBox.Show(eEx.AdditionnalInfo + "\n\r" + eEx.GetDebugString(), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.noConsole && extenderArgs.noGUI) { throw eEx.GetBaseException(); } } catch (TargetInvocationException ex) { if (!extenderArgs.noConsole) { Console.WriteLine("TargetInvocationException - " + ex.ToString() + "\n\r" + ex.InnerException.ToString()); } if (!extenderArgs.noGUI) { MessageBox.Show(ex.ToString() + "\n\r" + ex.InnerException.ToString(), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.noConsole && extenderArgs.noGUI) { throw ex; } } catch (Exception ex) { if (!extenderArgs.noConsole) { Console.WriteLine("Exception - " + ex.ToString()); } if (!extenderArgs.noGUI) { MessageBox.Show(ex.ToString(), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.noConsole && extenderArgs.noGUI) { throw ex; } } }
private static void Start(string[] args) { // SE_VERSION is a private constant. Need to use reflection to get it. FieldInfo field = typeof(SpaceEngineersGame).GetField("SE_VERSION", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); SeVersion = new Version(new MyVersion((int)field.GetValue(null)).FormattedText.ToString().Replace("_", ".")); //bool stableBuild = (bool)typeof(MyFinalBuildConstants).GetField("IS_STABLE").GetValue(null); ApplicationLog.BaseLog.Info($"SE version: {SeVersion}"); string versionMessage = $"Extender version: {Assembly.GetExecutingAssembly().GetName().Version}"; #if DEBUG //mark debug builds as such versionMessage += " DEBUG"; #endif ApplicationLog.BaseLog.Info(versionMessage); /* * if (stableBuild) * { * BaseLog.Info("Detected \"Stable\" branch!"); * //BaseLog.Error("WARNING: THIS BUILD OF SESE IS NOT COMPATIBLE WITH STABLE BRANCH"); * //if (SystemInformation.UserInteractive) * //{ * // var result = MessageBox.Show("This build of SESE is not compatible with stable branch!", * // "Fatal Error", * // MessageBoxButtons.OK, * // MessageBoxIcon.Error); * // if (result == DialogResult.OK) * // { * // Stop(); * // return; * // } * //} * //else * //{ * // Stop(); * // return; * //} * IsStable = true; * PluginManager.IsStable = true; * Server.IsStable = true; * } * else * BaseLog.Info("Detected \"Development\" branch!"); */ InitSandbox(); //Setup error handling for unmanaged exceptions AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException; Application.ThreadException += Application_ThreadException; Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //AppDomain.CurrentDomain.ClearEventInvocations("_unhandledException"); BaseLog.Info("Starting SEServerExtender with {0} arguments: {1}", args.Length, string.Join("\r\n\t", args)); CommandLineArgs extenderArgs = CommandLineArgs = new CommandLineArgs { ConsoleTitle = string.Empty, AutoStart = false, WorldName = string.Empty, InstanceName = string.Empty, NoGui = false, NoConsole = false, Debug = false, GamePath = new DirectoryInfo(PathManager.BasePath).Parent.FullName, //TODO: turn noWFC back to off by default whenever WCF gets fixed NoWcf = true, Autosave = 0, InstancePath = string.Empty, CloseOnCrash = false, RestartOnCrash = false, NoProfiler = false, Args = string.Join(" ", args.Select(x => string.Format("\"{0}\"", x))) }; if (ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryAge"] != null) { if (!int.TryParse(ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryAge"], out _maxChatHistoryMessageAge)) { ConfigurationManager.AppSettings.Add("WCFChatMaxMessageHistoryAge", "3600"); } } if (ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryCount"] != null) { if (!int.TryParse(ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryCount"], out _maxChatHistoryMessageCount)) { ConfigurationManager.AppSettings.Add("WCFChatMaxMessageHistoryCount", "100"); } } bool logPathSet = false; //Process the args foreach (string arg in args) { string[] splitAtEquals = arg.Split('='); if (splitAtEquals.Length > 1) { string argName = splitAtEquals[0]; string argValue = splitAtEquals[1]; string lowerCaseArgument = argName.ToLower( ); if (lowerCaseArgument.Equals("instance")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } //sanitize input because stupid people put full paths for this argument extenderArgs.InstanceName = argValue.Replace(@"\", "-").Replace(@":", "-"); //Only let this override log path if the log path wasn't already explicitly set if (!logPathSet) { FileTarget baseLogTarget = LogManager.Configuration.FindTargetByName("BaseLog") as FileTarget; if (baseLogTarget != null) { baseLogTarget.FileName = baseLogTarget.FileName.Render(new LogEventInfo { TimeStamp = DateTime.Now }).Replace("NoInstance", argValue.Replace(@"\", "-").Replace(@":", "-")); } FileTarget chatLogTarget = LogManager.Configuration.FindTargetByName("ChatLog") as FileTarget; if (chatLogTarget != null) { chatLogTarget.FileName = chatLogTarget.FileName.Render(new LogEventInfo { TimeStamp = DateTime.Now }).Replace("NoInstance", argValue.Replace(@"\", "-").Replace(@":", "-")); } FileTarget pluginLogTarget = LogManager.Configuration.FindTargetByName("PluginLog") as FileTarget; if (pluginLogTarget != null) { pluginLogTarget.FileName = pluginLogTarget.FileName.Render(new LogEventInfo { TimeStamp = DateTime.Now }).Replace("NoInstance", argValue.Replace(@"\", "-").Replace(@":", "-")); } } } else if (lowerCaseArgument.Equals("gamepath")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } extenderArgs.GamePath = argValue; } else if (lowerCaseArgument.Equals("autosave")) { if (!int.TryParse(argValue, out extenderArgs.Autosave)) { BaseLog.Warn("Autosave parameter was not a valid integer."); } } else if (lowerCaseArgument.Equals("path")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } extenderArgs.InstancePath = argValue; } else if (lowerCaseArgument.Equals("instancepath")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } extenderArgs.InstancePath = argValue; } else if (lowerCaseArgument.Equals("title")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } extenderArgs.ConsoleTitle = argValue; } else if (lowerCaseArgument == "logpath") { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } //This argument always prevails. FileTarget baseLogTarget = LogManager.Configuration.FindTargetByName("BaseLog") as FileTarget; if (baseLogTarget != null) { Layout l = new SimpleLayout(Path.Combine(argValue, "SEServerExtenderLog-${shortdate}.log")); baseLogTarget.FileName = l.Render(new LogEventInfo { TimeStamp = DateTime.Now }); ApplicationLog.BaseLog = BaseLog; } FileTarget chatLogTarget = LogManager.Configuration.FindTargetByName("ChatLog") as FileTarget; if (chatLogTarget != null) { Layout l = new SimpleLayout(Path.Combine(argValue, "ChatLog-${shortdate}.log")); chatLogTarget.FileName = l.Render(new LogEventInfo { TimeStamp = DateTime.Now }); ApplicationLog.ChatLog = ChatLog; } FileTarget pluginLogTarget = LogManager.Configuration.FindTargetByName("PluginLog") as FileTarget; if (pluginLogTarget != null) { Layout l = new SimpleLayout(Path.Combine(argValue, "PluginLog-${shortdate}.log")); pluginLogTarget.FileName = l.Render(new LogEventInfo { TimeStamp = DateTime.Now }); logPathSet = true; ApplicationLog.PluginLog = PluginLog; } } } else { string lowerCaseArgument = arg.ToLower( ); if (lowerCaseArgument.Equals("autostart")) { extenderArgs.AutoStart = true; } else if (lowerCaseArgument.Equals("nogui")) { extenderArgs.NoGui = true; //Implies autostart //extenderArgs.AutoStart = true; } else if (lowerCaseArgument.Equals("noconsole")) { extenderArgs.NoConsole = true; //Implies nogui and autostart extenderArgs.NoGui = true; extenderArgs.AutoStart = true; } else if (lowerCaseArgument.Equals("debug")) { extenderArgs.Debug = true; } else if (lowerCaseArgument.Equals("nowcf")) { extenderArgs.NoWcf = true; } else if (lowerCaseArgument.Equals("wcfon")) { extenderArgs.NoWcf = false; } else if (lowerCaseArgument.Equals("closeoncrash")) { extenderArgs.CloseOnCrash = true; } else if (lowerCaseArgument.Equals("autosaveasync")) { extenderArgs.AutoSaveSync = false; } else if (lowerCaseArgument.Equals("autosavesync")) { extenderArgs.AutoSaveSync = true; } else if (lowerCaseArgument.Equals("restartoncrash")) { extenderArgs.RestartOnCrash = true; } else if (lowerCaseArgument.Equals("noprofiler") && !IsStable) { extenderArgs.NoProfiler = true; Server.DisableProfiler = true; } //these things are legacy and don't work anyway /* * else if ( lowerCaseArgument.Equals( "wrr" ) ) * { * extenderArgs.WorldRequestReplace = true; * } * else if ( lowerCaseArgument.Equals( "wrm" ) ) * { * extenderArgs.WorldDataModify = true; * } * else if (lowerCaseArgument.Equals("wvm")) * { * extenderArgs.WorldVoxelModify = true; * } */ } } if (!Environment.UserInteractive) { extenderArgs.NoConsole = true; extenderArgs.NoGui = true; extenderArgs.AutoStart = true; } if (extenderArgs.Debug) { ExtenderOptions.IsDebugging = true; } try { bool unitTestResult = BasicUnitTestManager.Instance.Run( ); if (!unitTestResult) { ExtenderOptions.IsInSafeMode = true; } Server = Server.Instance; Server.CommandLineArgs = extenderArgs; Server.IsWCFEnabled = !extenderArgs.NoWcf; Server.Init( ); //if(!DedicatedServerAssemblyWrapper.IsStable) // InitSandbox(Path.Combine( GameInstallationInfo.GamePath, @"..\Content"), Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "SpaceEngineers")); ChatManager.ChatCommand guiCommand = new ChatManager.ChatCommand("gui", ChatCommand_GUI, false); ChatManager.Instance.RegisterChatCommand(guiCommand); if (!CommandLineArgs.NoConsole) { if (string.IsNullOrEmpty(extenderArgs.ConsoleTitle) || string.IsNullOrWhiteSpace(extenderArgs.ConsoleTitle)) { Console.Title = "SESE"; } else { Console.Title = extenderArgs.ConsoleTitle; } } if (extenderArgs.AutoStart) { Server.StartServer( ); } if (!extenderArgs.NoWcf) { string uriString = string.Format("{0}{1}", ConfigurationManager.AppSettings["WCFServerServiceBaseAddress"], CommandLineArgs.InstanceName); BaseLog.Info("Opening up WCF service listener at {0}", uriString); ServerServiceHost = new ServiceHost(typeof(ServerService.ServerService), new Uri(uriString, UriKind.Absolute)); ServerServiceHost.Open( ); ChatManager.Instance.ChatMessage += ChatManager_ChatMessage; } if (!extenderArgs.NoGui) { Thread uiThread = new Thread(StartGui); uiThread.SetApartmentState(ApartmentState.STA); uiThread.Start( ); } else if (Environment.UserInteractive) { Console.ReadLine( ); } } catch (AutoException eEx) { if (!extenderArgs.NoConsole) { BaseLog.Info("AutoException - {0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )); } if (!extenderArgs.NoGui) { MessageBox.Show(string.Format("{0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw eEx.GetBaseException( ); } } catch (TargetInvocationException ex) { if (!extenderArgs.NoConsole) { BaseLog.Info("TargetInvocationException - {0}\n\r{1}", ex, ex.InnerException); } if (!extenderArgs.NoGui) { MessageBox.Show(string.Format("{0}\n\r{1}", ex, ex.InnerException), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw; } } catch (Exception ex) { if (!extenderArgs.NoConsole) { BaseLog.Info(ex, "Exception - {0}", ex); } if (!extenderArgs.NoGui) { MessageBox.Show(ex.ToString( ), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw; } } }
private static void Start(string[] args) { //Setup error handling for unmanaged exceptions AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException; Application.ThreadException += Application_ThreadException; Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //AppDomain.CurrentDomain.ClearEventInvocations("_unhandledException"); BaseLog.Info("Starting SEServerExtender with {0} arguments: {1}", args.Length, string.Join("\r\n\t", args)); CommandLineArgs extenderArgs = CommandLineArgs = new CommandLineArgs { AutoStart = false, WorldName = string.Empty, InstanceName = string.Empty, NoGui = false, NoConsole = false, Debug = false, GamePath = new DirectoryInfo(PathManager.BasePath).Parent.FullName, NoWcf = false, Autosave = 0, InstancePath = string.Empty, CloseOnCrash = false, RestartOnCrash = false, Args = string.Join(" ", args.Select(x => string.Format("\"{0}\"", x))) }; if (ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryAge"] != null) { if (!int.TryParse(ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryAge"], out _maxChatHistoryMessageAge)) { ConfigurationManager.AppSettings.Add("WCFChatMaxMessageHistoryAge", "3600"); } } if (ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryCount"] != null) { if (!int.TryParse(ConfigurationManager.AppSettings["WCFChatMaxMessageHistoryCount"], out _maxChatHistoryMessageCount)) { ConfigurationManager.AppSettings.Add("WCFChatMaxMessageHistoryCount", "100"); } } bool logPathSet = false; //Process the args foreach (string arg in args) { string[] splitAtEquals = arg.Split('='); if (splitAtEquals.Length > 1) { string argName = splitAtEquals[0]; string argValue = splitAtEquals[1]; string lowerCaseArgument = argName.ToLower( ); if (lowerCaseArgument.Equals("instance")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } extenderArgs.InstanceName = argValue; //Only let this override log path if the log path wasn't already explicitly set if (!logPathSet) { FileTarget baseLogTarget = LogManager.Configuration.FindTargetByName("BaseLog") as FileTarget; if (baseLogTarget != null) { baseLogTarget.FileName = baseLogTarget.FileName.Render(new LogEventInfo { TimeStamp = DateTime.Now }).Replace("NoInstance", argValue); } FileTarget chatLogTarget = LogManager.Configuration.FindTargetByName("ChatLog") as FileTarget; if (chatLogTarget != null) { chatLogTarget.FileName = chatLogTarget.FileName.Render(new LogEventInfo { TimeStamp = DateTime.Now }).Replace("NoInstance", argValue); } FileTarget pluginLogTarget = LogManager.Configuration.FindTargetByName("PluginLog") as FileTarget; if (pluginLogTarget != null) { pluginLogTarget.FileName = pluginLogTarget.FileName.Render(new LogEventInfo { TimeStamp = DateTime.Now }).Replace("NoInstance", argValue); } } } else if (lowerCaseArgument.Equals("gamepath")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } extenderArgs.GamePath = argValue; } else if (lowerCaseArgument.Equals("autosave")) { if (!int.TryParse(argValue, out extenderArgs.Autosave)) { BaseLog.Warn("Autosave parameter was not a valid integer."); } } else if (lowerCaseArgument.Equals("path")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } extenderArgs.InstancePath = argValue; } else if (lowerCaseArgument.Equals("instancepath")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } extenderArgs.InstancePath = argValue; } else if (lowerCaseArgument == "logpath") { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(1, argValue.Length - 2); } //This argument always prevails. FileTarget baseLogTarget = LogManager.Configuration.FindTargetByName("BaseLog") as FileTarget; if (baseLogTarget != null) { Layout l = new SimpleLayout(Path.Combine(argValue, "SEServerExtenderLog-${shortdate}.log")); baseLogTarget.FileName = l.Render(new LogEventInfo { TimeStamp = DateTime.Now }); ApplicationLog.BaseLog = BaseLog; } FileTarget chatLogTarget = LogManager.Configuration.FindTargetByName("ChatLog") as FileTarget; if (chatLogTarget != null) { Layout l = new SimpleLayout(Path.Combine(argValue, "ChatLog-${shortdate}.log")); chatLogTarget.FileName = l.Render(new LogEventInfo { TimeStamp = DateTime.Now }); ApplicationLog.ChatLog = ChatLog; } FileTarget pluginLogTarget = LogManager.Configuration.FindTargetByName("PluginLog") as FileTarget; if (pluginLogTarget != null) { Layout l = new SimpleLayout(Path.Combine(argValue, "PluginLog-${shortdate}.log")); pluginLogTarget.FileName = l.Render(new LogEventInfo { TimeStamp = DateTime.Now }); logPathSet = true; ApplicationLog.PluginLog = PluginLog; } } } else { string lowerCaseArgument = arg.ToLower( ); if (lowerCaseArgument.Equals("autostart")) { extenderArgs.AutoStart = true; } else if (lowerCaseArgument.Equals("nogui")) { extenderArgs.NoGui = true; //Implies autostart //extenderArgs.AutoStart = true; } else if (lowerCaseArgument.Equals("noconsole")) { extenderArgs.NoConsole = true; //Implies nogui and autostart extenderArgs.NoGui = true; extenderArgs.AutoStart = true; } else if (lowerCaseArgument.Equals("debug")) { extenderArgs.Debug = true; } else if (lowerCaseArgument.Equals("nowcf")) { extenderArgs.NoWcf = true; } else if (lowerCaseArgument.Equals("closeoncrash")) { extenderArgs.CloseOnCrash = true; } else if (lowerCaseArgument.Equals("autosaveasync")) { extenderArgs.AutoSaveSync = false; } else if (lowerCaseArgument.Equals("autosavesync")) { extenderArgs.AutoSaveSync = true; } else if (lowerCaseArgument.Equals("restartoncrash")) { extenderArgs.RestartOnCrash = true; } else if (lowerCaseArgument.Equals("wrr")) { extenderArgs.WorldRequestReplace = true; } else if (lowerCaseArgument.Equals("wrm")) { extenderArgs.WorldDataModify = true; } else if (lowerCaseArgument.Equals("wvm")) { extenderArgs.WorldVoxelModify = true; } } } if (!Environment.UserInteractive) { extenderArgs.NoConsole = true; extenderArgs.NoGui = true; extenderArgs.AutoStart = true; } if (extenderArgs.Debug) { ExtenderOptions.IsDebugging = true; } try { bool unitTestResult = BasicUnitTestManager.Instance.Run( ); if (!unitTestResult) { ExtenderOptions.IsInSafeMode = true; } Server = Server.Instance; Server.CommandLineArgs = extenderArgs; Server.IsWCFEnabled = !extenderArgs.NoWcf; Server.Init( ); ChatManager.ChatCommand guiCommand = new ChatManager.ChatCommand("gui", ChatCommand_GUI, false); ChatManager.Instance.RegisterChatCommand(guiCommand); if (extenderArgs.AutoStart) { Server.StartServer( ); } if (!extenderArgs.NoWcf) { string uriString = string.Format("{0}{1}", ConfigurationManager.AppSettings["WCFServerServiceBaseAddress"], CommandLineArgs.InstanceName); BaseLog.Info("Opening up WCF service listener at {0}", uriString); ServerServiceHost = new ServiceHost(typeof(ServerService.ServerService), new Uri(uriString, UriKind.Absolute)); ServerServiceHost.Open( ); ChatManager.Instance.ChatMessage += ChatManager_ChatMessage; } if (!extenderArgs.NoGui) { Thread uiThread = new Thread(StartGui); uiThread.SetApartmentState(ApartmentState.STA); uiThread.Start( ); } else if (Environment.UserInteractive) { Console.ReadLine( ); } } catch (AutoException eEx) { if (!extenderArgs.NoConsole) { BaseLog.Info("AutoException - {0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )); } if (!extenderArgs.NoGui) { MessageBox.Show(string.Format("{0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw eEx.GetBaseException( ); } } catch (TargetInvocationException ex) { if (!extenderArgs.NoConsole) { BaseLog.Info("TargetInvocationException - {0}\n\r{1}", ex, ex.InnerException); } if (!extenderArgs.NoGui) { MessageBox.Show(string.Format("{0}\n\r{1}", ex, ex.InnerException), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw; } } catch (Exception ex) { if (!extenderArgs.NoConsole) { BaseLog.Info(ex, "Exception - {0}", ex); } if (!extenderArgs.NoGui) { MessageBox.Show(ex.ToString( ), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw; } } }
private static void Start(string[] args) { //Setup error handling for unmanaged exceptions AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException; Application.ThreadException += Application_ThreadException; Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //AppDomain.CurrentDomain.ClearEventInvocations("_unhandledException"); LogManager.APILog.WriteLine(string.Format("Starting SEServerExtender with {0} arguments ...", args.Length)); CommandLineArgs extenderArgs = new CommandLineArgs { AutoStart = false, WorldName = string.Empty, InstanceName = string.Empty, NoGui = false, NoConsole = false, Debug = false, GamePath = string.Empty, NoWcf = false, Autosave = 0, WcfPort = 0, Path = string.Empty, CloseOnCrash = false, RestartOnCrash = false, Args = string.Join(" ", args.Select(x => string.Format("\"{0}\"", x))) }; //Setup the default args //Process the args foreach (string arg in args) { if (arg.Split('=').Length > 1) { string argName = arg.Split('=')[0]; string argValue = arg.Split('=')[1]; if (argName.ToLower( ).Equals("instance")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(0, argValue.Length - 1); } extenderArgs.InstanceName = argValue; } else if (argName.ToLower( ).Equals("gamepath")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(0, argValue.Length - 1); } extenderArgs.GamePath = argValue; } else if (argName.ToLower( ).Equals("autosave")) { try { extenderArgs.Autosave = int.Parse(argValue); } catch { //Do nothing } } else if (argName.ToLower( ).Equals("wcfport")) { try { extenderArgs.WcfPort = ushort.Parse(argValue); } catch { //Do nothing } } else if (argName.ToLower( ).Equals("path")) { if (argValue[argValue.Length - 1] == '"') { argValue = argValue.Substring(0, argValue.Length - 1); } extenderArgs.Path = argValue; } } else { if (arg.ToLower( ).Equals("autostart")) { extenderArgs.AutoStart = true; } if (arg.ToLower( ).Equals("nogui")) { extenderArgs.NoGui = true; //Implies autostart extenderArgs.AutoStart = true; } if (arg.ToLower( ).Equals("noconsole")) { extenderArgs.NoConsole = true; //Implies nogui and autostart extenderArgs.NoGui = true; extenderArgs.AutoStart = true; } if (arg.ToLower( ).Equals("debug")) { extenderArgs.Debug = true; } if (arg.ToLower( ).Equals("nowcf")) { extenderArgs.NoWcf = true; } if (arg.ToLower( ).Equals("closeoncrash")) { extenderArgs.CloseOnCrash = true; } if (arg.ToLower( ).Equals("autosaveasync")) { extenderArgs.AutoSaveSync = false; } if (arg.ToLower( ).Equals("autosavesync")) { extenderArgs.AutoSaveSync = true; } if (arg.ToLower( ).Equals("restartoncrash")) { extenderArgs.RestartOnCrash = true; } if (arg.ToLower( ).Equals("wrr")) { extenderArgs.WorldRequestReplace = true; } if (arg.ToLower( ).Equals("wrm")) { extenderArgs.WorldDataModify = true; } } } if (extenderArgs.NoWcf) { extenderArgs.WcfPort = 0; } if (!string.IsNullOrEmpty(extenderArgs.Path)) { extenderArgs.InstanceName = string.Empty; } if (!Environment.UserInteractive) { extenderArgs.NoConsole = true; extenderArgs.NoGui = true; extenderArgs.AutoStart = true; } if (extenderArgs.Debug) { SandboxGameAssemblyWrapper.IsDebugging = true; } try { bool unitTestResult = BasicUnitTestManager.Instance.Run( ); if (!unitTestResult) { SandboxGameAssemblyWrapper.IsInSafeMode = true; } _server = Server.Instance; _server.CommandLineArgs = extenderArgs; _server.IsWCFEnabled = !extenderArgs.NoWcf; _server.WCFPort = extenderArgs.WcfPort; _server.Init( ); ChatManager.ChatCommand guiCommand = new ChatManager.ChatCommand { Command = "gui", Callback = ChatCommand_GUI }; ChatManager.Instance.RegisterChatCommand(guiCommand); if (extenderArgs.AutoStart) { _server.StartServer( ); } if (!extenderArgs.NoGui) { Thread uiThread = new Thread(StartGui); uiThread.SetApartmentState(ApartmentState.STA); uiThread.Start( ); } else if (Environment.UserInteractive) { Console.ReadLine( ); } } catch (AutoException eEx) { if (!extenderArgs.NoConsole) { Console.WriteLine("AutoException - {0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )); } if (!extenderArgs.NoGui) { MessageBox.Show(string.Format("{0}\n\r{1}", eEx.AdditionnalInfo, eEx.GetDebugString( )), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw eEx.GetBaseException( ); } } catch (TargetInvocationException ex) { if (!extenderArgs.NoConsole) { Console.WriteLine("TargetInvocationException - {0}\n\r{1}", ex, ex.InnerException); } if (!extenderArgs.NoGui) { MessageBox.Show(string.Format("{0}\n\r{1}", ex, ex.InnerException), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw; } } catch (Exception ex) { if (!extenderArgs.NoConsole) { Console.WriteLine("Exception - {0}", ex); } if (!extenderArgs.NoGui) { MessageBox.Show(ex.ToString( ), @"SEServerExtender", MessageBoxButtons.OK, MessageBoxIcon.Error); } if (extenderArgs.NoConsole && extenderArgs.NoGui) { throw; } } }