private void CheckPlatformDisconnect() { // marker to signify disconnect if (m_platformClient.LoginId == 0) { if (!m_reconnecting) { if (m_platformConnectingTime == null || (DateTime.UtcNow - m_platformConnectingTime.Value).TotalSeconds > 5) { this.Log().Warn("Disconnected from Terminal - reconnecting..."); m_reconnecting = true; Task.Run(() => { if (m_platformClient.Connect()) { this.Log().Warn("Authenticating to Terminal during reconnect."); m_platformClient.AuthenticateWithLicenseKey("").ContinueWith(success => { m_platformConnectingTime = null; m_reconnecting = false; this.Log().Warn("Terminal reauthentication complete!"); }); } else { this.Log().Warn("Reconnecting to Terminal failed."); // throw an exception for capture in the continuation throw new Exception("Failed to connect to Terminal"); } }).ContinueWith(task => { if (task.Exception != null) { m_platformConnectingTime = DateTime.UtcNow; m_reconnecting = false; } }); } } } }
private async Task Start(string configFileName) { Configuration config; try { config = Configuration.Load(configFileName ?? "citmp-server.yml"); // if running on WinNT default to using windowed logger if (Environment.OSVersion.Platform == PlatformID.Win32NT && !config.DisableWindowedLogger) { WindowedLogger.Initialize(config.DebugLog); } if (config.AutoStartResources == null) { this.Log().Fatal("No auto-started resources were configured."); return; } if (config.ListenPort == 0) { this.Log().Fatal("No port was configured."); return; } if (config.Downloads == null) { config.Downloads = new Dictionary <string, DownloadConfiguration>(); } } catch (System.IO.IOException) { this.Log().Fatal("Could not open the configuration file {0}.", configFileName ?? "citmp-server.yml"); return; } var platformServer = config.PlatformServer ?? "iv-platform.prod.citizen.re"; var client = new NPClient(platformServer, (config.PlatformPort == 0) ? (ushort)3036 : (ushort)config.PlatformPort); this.Log().Info("Connecting to Terminal platform server at {0}.", platformServer); var connectResult = client.Connect(); if (!connectResult) { this.Log().Fatal("Could not connect to the configured platform server ({0}).", platformServer); return; } this.Log().Info("Authenticating to Terminal with anonymous license key."); // authenticate anonymously var task = client.AuthenticateWithLicenseKey(""); if (!task.Wait(15000)) { this.Log().Fatal("Could not authenticate anonymously to the configured platform server ({0}) - operation timed out.", platformServer); return; } if (!task.Result) { this.Log().Fatal("Could not authenticate anonymously to the configured platform server ({0}).", platformServer); return; } this.Log().Info("Creating initial server instance."); var commandManager = new Commands.CommandManager(); var resManager = new Resources.ResourceManager(config); // create the game server (as resource scanning needs it now) var gameServer = new Game.GameServer(config, resManager, commandManager, client); // preparse resources if (config.PreParseResources != null) { this.Log().Info("Pre-parsing resources: {0}", string.Join(", ", config.PreParseResources)); foreach (var resource in config.PreParseResources) { resManager.ScanResources("resources/", resource); var res = resManager.GetResource(resource); if (res != null) { await res.Start(); } } } else { this.Log().Warn("No PreParseResources defined. This usually means you're using an outdated configuration file. Please consider this."); } // scan resources resManager.ScanResources("resources/"); // start the game server gameServer.Start(); // and initialize the HTTP server var httpServer = new HTTP.HttpServer(config, resManager); httpServer.Start(); // start resources foreach (var resource in config.AutoStartResources) { var res = resManager.GetResource(resource); if (res == null) { this.Log().Error("Could not find auto-started resource {0}.", resource); } else { await res.Start(); } } // start synchronizing the started resources resManager.StartSynchronization(); // main loop int lastTickCount = Environment.TickCount; while (true) { Thread.Sleep(5); var tc = Environment.TickCount; gameServer.Tick(tc - lastTickCount); lastTickCount = tc; } }
private async Task Start(string configFileName) { Configuration config; try { config = Configuration.Load(configFileName ?? "citmp-server.yml"); // if running on WinNT default to using windowed logger if (Environment.OSVersion.Platform == PlatformID.Win32NT && !config.DisableWindowedLogger) { WindowedLogger.Initialize(config.DebugLog); } if (config.AutoStartResources == null) { this.Log().Fatal("No auto-started resources were configured."); return; } if (config.ListenPort == 0) { this.Log().Fatal("No port was configured."); return; } if (config.Downloads == null) { config.Downloads = new Dictionary<string, DownloadConfiguration>(); } } catch (System.IO.IOException) { this.Log().Fatal("Could not open the configuration file {0}.", configFileName ?? "citmp-server.yml"); return; } var platformServer = config.PlatformServer ?? "iv-platform.prod.citizen.re"; var client = new NPClient(platformServer, (config.PlatformPort == 0) ? (ushort)3036 : (ushort)config.PlatformPort); this.Log().Info("Connecting to Terminal platform server at {0}.", platformServer); var connectResult = client.Connect(); if (!connectResult) { this.Log().Fatal("Could not connect to the configured platform server ({0}).", platformServer); return; } this.Log().Info("Authenticating to Terminal with anonymous license key."); // authenticate anonymously var task = client.AuthenticateWithLicenseKey(""); if (!task.Wait(15000)) { this.Log().Fatal("Could not authenticate anonymously to the configured platform server ({0}) - operation timed out.", platformServer); return; } if (!task.Result) { this.Log().Fatal("Could not authenticate anonymously to the configured platform server ({0}).", platformServer); return; } this.Log().Info("Creating initial server instance."); var commandManager = new Commands.CommandManager(); var resManager = new Resources.ResourceManager(config); // create the game server (as resource scanning needs it now) var gameServer = new Game.GameServer(config, resManager, commandManager, client); // preparse resources if (config.PreParseResources != null) { this.Log().Info("Pre-parsing resources: {0}", string.Join(", ", config.PreParseResources)); foreach (var resource in config.PreParseResources) { resManager.ScanResources("resources/", resource); var res = resManager.GetResource(resource); if (res != null) { await res.Start(); } } } else { this.Log().Warn("No PreParseResources defined. This usually means you're using an outdated configuration file. Please consider this."); } // scan resources resManager.ScanResources("resources/"); // start the game server gameServer.Start(); // and initialize the HTTP server var httpServer = new HTTP.HttpServer(config, resManager); httpServer.Start(); // start resources foreach (var resource in config.AutoStartResources) { var res = resManager.GetResource(resource); if (res == null) { this.Log().Error("Could not find auto-started resource {0}.", resource); } else { await res.Start(); } } // start synchronizing the started resources resManager.StartSynchronization(); // main loop int lastTickCount = Environment.TickCount; while (true) { Thread.Sleep(5); var tc = Environment.TickCount; gameServer.Tick(tc - lastTickCount); lastTickCount = tc; } }