public static void Main(string[] args) { CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; Log.Start(LogTypes.All); CUOEnviroment.GameThread = Thread.CurrentThread; CUOEnviroment.GameThread.Name = "CUO_MAIN_THREAD"; #if !DEBUG AppDomain.CurrentDomain.UnhandledException += (s, e) => { System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.AppendLine("######################## [START LOG] ########################"); #if DEV_BUILD sb.AppendLine($"ClassicUO [DEV_BUILD] - {CUOEnviroment.Version} - {DateTime.Now}"); #else sb.AppendLine($"ClassicUO [STANDARD_BUILD] - {CUOEnviroment.Version} - {DateTime.Now}"); #endif sb.AppendLine ($"OS: {Environment.OSVersion.Platform} {(Environment.Is64BitOperatingSystem ? "x64" : "x86")}"); sb.AppendLine($"Thread: {Thread.CurrentThread.Name}"); sb.AppendLine(); if (Settings.GlobalSettings != null) { sb.AppendLine($"Shard: {Settings.GlobalSettings.IP}"); sb.AppendLine($"ClientVersion: {Settings.GlobalSettings.ClientVersion}"); sb.AppendLine(); } sb.AppendFormat("Exception:\n{0}\n", e.ExceptionObject); sb.AppendLine("######################## [END LOG] ########################"); sb.AppendLine(); sb.AppendLine(); Log.Panic(e.ExceptionObject.ToString()); string path = Path.Combine(CUOEnviroment.ExecutablePath, "Logs"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } using (LogFile crashfile = new LogFile(path, "crash.txt")) { crashfile.WriteAsync(sb.ToString()).RunSynchronously(); } }; #endif ReadSettingsFromArgs(args); #if DEV_BUILD if (!_skipUpdates) { Network.Updater updater = new Network.Updater(); if (updater.Check()) { return; } } #endif if (!_skipUpdates) { if (CheckUpdate(args)) { return; } } if (CUOEnviroment.IsHighDPI) { Log.Trace("HIGH DPI - ENABLED"); Environment.SetEnvironmentVariable("FNA_GRAPHICS_ENABLE_HIGHDPI", "1"); } Environment.SetEnvironmentVariable("FNA3D_BACKBUFFER_SCALE_NEAREST", "1"); Environment.SetEnvironmentVariable("FNA3D_OPENGL_FORCE_COMPATIBILITY_PROFILE", "1"); Environment.SetEnvironmentVariable(SDL.SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); Environment.SetEnvironmentVariable ( "PATH", Environment.GetEnvironmentVariable("PATH") + ";" + Path.Combine (CUOEnviroment.ExecutablePath, "Data", "Plugins") ); string globalSettingsPath = Settings.GetSettingsFilepath(); if (!Directory.Exists(Path.GetDirectoryName(globalSettingsPath)) || !File.Exists(globalSettingsPath)) { // settings specified in path does not exists, make new one { // TODO: Settings.GlobalSettings.Save(); } } Settings.GlobalSettings = ConfigurationResolver.Load <Settings>(globalSettingsPath); CUOEnviroment.IsOutlands = Settings.GlobalSettings.ShardType == 2; ReadSettingsFromArgs(args); // still invalid, cannot load settings if (Settings.GlobalSettings == null) { Settings.GlobalSettings = new Settings(); Settings.GlobalSettings.Save(); } if (!CUOEnviroment.IsUnix) { string libsPath = Path.Combine (CUOEnviroment.ExecutablePath, Environment.Is64BitProcess ? "x64" : "x86"); SetDllDirectory(libsPath); } if (string.IsNullOrWhiteSpace(Settings.GlobalSettings.UltimaOnlineDirectory)) { Settings.GlobalSettings.UltimaOnlineDirectory = CUOEnviroment.ExecutablePath; } const uint INVALID_UO_DIRECTORY = 0x100; const uint INVALID_UO_VERSION = 0x200; uint flags = 0; if (!Directory.Exists(Settings.GlobalSettings.UltimaOnlineDirectory) || !File.Exists(UOFileManager.GetUOFilePath("tiledata.mul"))) { flags |= INVALID_UO_DIRECTORY; } string clientVersionText = Settings.GlobalSettings.ClientVersion; if (!ClientVersionHelper.IsClientVersionValid (Settings.GlobalSettings.ClientVersion, out ClientVersion clientVersion)) { Log.Warn($"Client version [{clientVersionText}] is invalid, let's try to read the client.exe"); // mmm something bad happened, try to load from client.exe [windows only] if (!ClientVersionHelper.TryParseFromFile ( Path.Combine(Settings.GlobalSettings.UltimaOnlineDirectory, "client.exe"), out clientVersionText ) || !ClientVersionHelper.IsClientVersionValid(clientVersionText, out clientVersion)) { Log.Error("Invalid client version: " + clientVersionText); flags |= INVALID_UO_VERSION; } else { Log.Trace($"Found a valid client.exe [{clientVersionText} - {clientVersion}]"); // update the wrong/missing client version in settings.json Settings.GlobalSettings.ClientVersion = clientVersionText; } } if (flags != 0) { if ((flags & INVALID_UO_DIRECTORY) != 0) { Client.ShowErrorMessage(ResGeneral.YourUODirectoryIsInvalid); } else if ((flags & INVALID_UO_VERSION) != 0) { Client.ShowErrorMessage(ResGeneral.YourUOClientVersionIsInvalid); } try { Process.Start(ResGeneral.ClassicUOLink); } catch { } } else { switch (Settings.GlobalSettings.ForceDriver) { case 1: // OpenGL Environment.SetEnvironmentVariable("FNA3D_FORCE_DRIVER", "OpenGL"); break; case 2: // Vulkan Environment.SetEnvironmentVariable("FNA3D_FORCE_DRIVER", "Vulkan"); break; } Client.Run(); } Log.Trace("Closing..."); }
static void Main(string[] args) { // - check for update // - launcher & user setup // - game setup // - game launch // - enjoy CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; Log.Start(LogTypes.All); CUOEnviroment.GameThread = Thread.CurrentThread; CUOEnviroment.GameThread.Name = "CUO_MAIN_THREAD"; #if !DEBUG AppDomain.CurrentDomain.UnhandledException += (s, e) => { StringBuilder sb = new StringBuilder(); sb.AppendLine("######################## [START LOG] ########################"); #if DEV_BUILD sb.AppendLine($"ClassicUO [DEV_BUILD] - {CUOEnviroment.Version}"); #else sb.AppendLine($"ClassicUO [STANDARD_BUILD] - {CUOEnviroment.Version}"); #endif sb.AppendLine($"OS: {Environment.OSVersion.Platform} x{(Environment.Is64BitOperatingSystem ? "64" : "86")}"); sb.AppendLine($"Thread: {Thread.CurrentThread.Name}"); sb.AppendLine(); sb.AppendLine($"Protocol: {Client.Protocol}"); sb.AppendLine($"ClientFeatures: {World.ClientFeatures.Flags}"); sb.AppendLine($"ClientLockedFeatures: {World.ClientLockedFeatures.Flags}"); sb.AppendLine($"ClientVersion: {Client.Version}"); sb.AppendLine(); sb.AppendFormat("Exception:\n{0}\n", e.ExceptionObject); sb.AppendLine("######################## [END LOG] ########################"); sb.AppendLine(); sb.AppendLine(); Log.Panic(e.ExceptionObject.ToString()); string path = Path.Combine(CUOEnviroment.ExecutablePath, "Logs"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } using (LogFile crashfile = new LogFile(path, "crash.txt")) { crashfile.WriteAsync(sb.ToString()).RunSynchronously(); } }; #endif ReadSettingsFromArgs(args); #if DEV_BUILD if (!_skipUpdates) { Updater updater = new Updater(); if (updater.Check()) { return; } } #endif if (!_skipUpdates) { if (CheckUpdate(args)) { return; } } //Environment.SetEnvironmentVariable("FNA_GRAPHICS_FORCE_GLDEVICE", "ModernGLDevice"); if (CUOEnviroment.IsHighDPI) { Log.Trace("HIGH DPI - ENABLED"); Environment.SetEnvironmentVariable("FNA_GRAPHICS_ENABLE_HIGHDPI", "1"); } Environment.SetEnvironmentVariable("FNA_OPENGL_BACKBUFFER_SCALE_NEAREST", "1"); Environment.SetEnvironmentVariable("FNA_OPENGL_FORCE_COMPATIBILITY_PROFILE", "1"); Environment.SetEnvironmentVariable(SDL.SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + Path.Combine(CUOEnviroment.ExecutablePath, "Data", "Plugins")); string globalSettingsPath = Settings.GetSettingsFilepath(); if ((!Directory.Exists(Path.GetDirectoryName(globalSettingsPath)) || !File.Exists(globalSettingsPath))) { // settings specified in path does not exists, make new one { // TODO: Settings.GlobalSettings.Save(); if (!Directory.Exists(Settings.GlobalSettings.UltimaOnlineDirectory) || !ClientVersionHelper.IsClientVersionValid(Settings.GlobalSettings.ClientVersion, out _)) { return; } } } Settings.GlobalSettings = ConfigurationResolver.Load <Settings>(globalSettingsPath); ReadSettingsFromArgs(args); // still invalid, cannot load settings if (Settings.GlobalSettings == null) { Settings.GlobalSettings = new Settings(); Settings.GlobalSettings.Save(); } if (!CUOEnviroment.IsUnix) { string libsPath = Path.Combine(CUOEnviroment.ExecutablePath, "libs", Environment.Is64BitProcess ? "x64" : "x86"); SetDllDirectory(libsPath); } if (string.IsNullOrWhiteSpace(Settings.GlobalSettings.UltimaOnlineDirectory)) { Settings.GlobalSettings.UltimaOnlineDirectory = CUOEnviroment.ExecutablePath; } Client.Run(); Log.Trace("Closing..."); }