diff --git a/README.md b/README.md index a9507220..daff162a 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,13 @@ XIVLauncher Core has community packages for various Linux distributions. Please | ----------- | ----------- | | [**Flathub (official)**](https://flathub.org/apps/details/dev.goats.xivlauncher) | ![Flathub](https://img.shields.io/flathub/v/dev.goats.xivlauncher) | | [AUR](https://aur.archlinux.org/packages/xivlauncher) | ![AUR version](https://img.shields.io/aur/version/xivlauncher) | +| [AUR (bin)](https://aur.archlinux.org/packages/xivlauncher-bin) | ![AUR version](https://img.shields.io/aur/version/xivlauncher-bin) | | [AUR (git)](https://aur.archlinux.org/packages/xivlauncher-git) | ![AUR version](https://img.shields.io/aur/version/xivlauncher-git) | | [Copr (Fedora+openSuse+EL9)](https://copr.fedorainfracloud.org/coprs/rankyn/xivlauncher/) | ![COPR version](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Frankynbass%2FXIVLauncher4rpm%2Fmain%2Fbadge.json)| | [GURU (Gentoo)](https://gitweb.gentoo.org/repo/proj/guru.git/tree/games-util/xivlauncher) | ![GURU version](https://repology.org/badge/version-for-repo/gentoo_ovl_guru/xivlauncher.core.svg?header=guru) | | [MPR (Debian+Ubuntu)](https://mpr.makedeb.org/packages/xivlauncher) | ![MPR package](https://repology.org/badge/version-for-repo/mpr/xivlauncher.core.svg?header=MPR) | | [MPR (git) (Debian+Ubuntu)](https://mpr.makedeb.org/packages/xivlauncher-git) | ![MPR package](https://repology.org/badge/version-for-repo/mpr/xivlauncher.core.svg?header=MPR) | -| [nixpkgs stable](https://search.nixos.org/packages?channel=23.11&from=0&size=50&sort=relevance&type=packages&query=xivlauncher) | ![nixpkgs stable version](https://repology.org/badge/version-for-repo/nix_stable_23_11/xivlauncher.core.svg?header=nixpkgs%2023.11) | +| [nixpkgs stable](https://search.nixos.org/packages?channel=24.05&from=0&size=50&sort=relevance&type=packages&query=xivlauncher) | ![nixpkgs stable version](https://repology.org/badge/version-for-repo/nix_stable_24_05/xivlauncher.core.svg?header=nixpkgs%2024.05) | | [nixpkgs unstable](https://search.nixos.org/packages?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=xivlauncher) | ![nixpkgs unstable version](https://repology.org/badge/version-for-repo/nix_unstable/xivlauncher.core.svg?header=nixpkgs%20unstable) | | [PPA (Ubuntu)](https://launchpad.net/~linneris/+archive/ubuntu/xivlauncher-core-stable) | ![PPA version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Flaunchpad.net%2Fapi%2F1.0%2F~linneris%2F%2Barchive%2Fxivlauncher-core-stable%3Fws.op%3DgetPublishedBinaries%26status%3DPublished%26distro_arch_series%3Dhttps%3A%2F%2Flaunchpad.net%2Fapi%2F1.0%2Fubuntu%2Fjammy%2Famd64&query=%24.entries%5B0%5D.binary_package_version&logo=ubuntu&label=PPA&color=green) | +| [AppImage](https://github.com/rankynbass/XIVLauncher-AppImage/releases/latest) | ![v1.1.0-1](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Frankynbass%2FXIVLauncher-AppImage%2Fmaster%2Fbadge.json) | diff --git a/src/XIVLauncher.Core/Accounts/AccountSwitcherEntry.cs b/src/XIVLauncher.Core/Accounts/AccountSwitcherEntry.cs index bc8c0bd3..add3ba45 100644 --- a/src/XIVLauncher.Core/Accounts/AccountSwitcherEntry.cs +++ b/src/XIVLauncher.Core/Accounts/AccountSwitcherEntry.cs @@ -30,11 +30,7 @@ public void UpdateProfileImage(DirectoryInfo storage) } else { - using (var client = new HttpClient()) - { - imageBytes = client.GetByteArrayAsync(uri).Result; - } - + imageBytes = Program.HttpClient.GetByteArrayAsync(uri).Result; File.WriteAllBytes(cacheFile, imageBytes); } diff --git a/src/XIVLauncher.Core/Accounts/XivAccount.cs b/src/XIVLauncher.Core/Accounts/XivAccount.cs index b9aa178d..7511144f 100644 --- a/src/XIVLauncher.Core/Accounts/XivAccount.cs +++ b/src/XIVLauncher.Core/Accounts/XivAccount.cs @@ -90,11 +90,8 @@ public static async Task GetCharacterSearch(string name, string world) public static async Task Get(string endpoint) { - using (var client = new HttpClient()) - { - var result = await client.GetStringAsync(URL + endpoint).ConfigureAwait(false); - var parsedObject = JObject.Parse(result); - return parsedObject; - } + var result = await Program.HttpClient.GetStringAsync(URL + endpoint).ConfigureAwait(false); + var parsedObject = JObject.Parse(result); + return parsedObject; } } diff --git a/src/XIVLauncher.Core/AppUtil.cs b/src/XIVLauncher.Core/AppUtil.cs index a2cf7afa..c473aaed 100644 --- a/src/XIVLauncher.Core/AppUtil.cs +++ b/src/XIVLauncher.Core/AppUtil.cs @@ -51,6 +51,13 @@ public static string GetAssemblyVersion() return fvi.FileVersion.ToString(); } + /// + /// Open a URL in the system's default browser. + /// + /// + /// On Steam Deck this method will open the in-game overlay instead of a browser instance. + /// + /// The URL to open. public static void OpenBrowser(string url) { if (Program.IsSteamDeckHardware && Program.Steam != null && Program.Steam.IsValid) diff --git a/src/XIVLauncher.Core/Components/Background.cs b/src/XIVLauncher.Core/Components/Background.cs index 0eed5b81..21533bf7 100644 --- a/src/XIVLauncher.Core/Components/Background.cs +++ b/src/XIVLauncher.Core/Components/Background.cs @@ -16,31 +16,7 @@ public Background() public override void Draw() { ImGui.SetCursorPos(new Vector2(0, ImGuiHelpers.ViewportSize.Y - bgTexture.Height)); - ImGui.Image(bgTexture.ImGuiHandle, new Vector2(bgTexture.Width, bgTexture.Height)); - - /* - ImGui.SetCursorPos(new Vector2()); - - var vpSize = ImGuiHelpers.ViewportSize; - - var width = vpSize.X; - var height = this.bgTexture.Height / (float)this.bgTexture.Width * width; - - if (height < vpSize.Y) - { - height = vpSize.Y; - width = this.bgTexture.Width / (float)this.bgTexture.Height * height; - ImGui.SetCursorPosX((vpSize.X - width) / 2); - } - else - { - ImGui.SetCursorPosY((vpSize.Y - height) / 2); - } - - ImGui.Image(this.bgTexture.ImGuiHandle, new Vector2(width, height)); - */ - base.Draw(); } } diff --git a/src/XIVLauncher.Core/Components/MainPage/ActionButtons.cs b/src/XIVLauncher.Core/Components/MainPage/ActionButtons.cs index 521cb3ee..9cffb076 100644 --- a/src/XIVLauncher.Core/Components/MainPage/ActionButtons.cs +++ b/src/XIVLauncher.Core/Components/MainPage/ActionButtons.cs @@ -6,7 +6,6 @@ namespace XIVLauncher.Core.Components.MainPage; public class ActionButtons : Component { - public event Action? OnQueueButtonClicked; public event Action? OnStatusButtonClicked; public event Action? OnSettingsButtonClicked; @@ -15,19 +14,6 @@ public override void Draw() var btnSize = new Vector2(80) * ImGuiHelpers.GlobalScale; ImGui.PushFont(FontManager.IconFont); - - ImGui.BeginDisabled(this.OnQueueButtonClicked == null); - if (ImGui.Button(FontAwesomeIcon.Clock.ToIconString(), btnSize)) - { - this.OnQueueButtonClicked?.Invoke(); - } - ImGui.PushFont(FontManager.TextFont); - ImGuiHelpers.AddTooltip("Queue"); - ImGui.PopFont(); - ImGui.EndDisabled(); - - ImGui.SameLine(); - ImGui.BeginDisabled(this.OnStatusButtonClicked == null); if (ImGui.Button(FontAwesomeIcon.Globe.ToIconString(), btnSize)) { diff --git a/src/XIVLauncher.Core/Components/MainPage/MainPage.cs b/src/XIVLauncher.Core/Components/MainPage/MainPage.cs index 4dd3167b..ca7de3bd 100644 --- a/src/XIVLauncher.Core/Components/MainPage/MainPage.cs +++ b/src/XIVLauncher.Core/Components/MainPage/MainPage.cs @@ -246,14 +246,18 @@ public async Task Login(string username, string password, bool isOtp, bool private async Task TryProcessLoginResult(Launcher.LoginResult loginResult, bool isSteam, LoginAction action) { + // Format error message in the way OauthLoginException expects. + var preErrorMsg = "window.external.user(\"login=auth,ng,err,"; + var postErrorMsg = "\");"; + if (loginResult.State == Launcher.LoginState.NoService) { - throw new OauthLoginException("No service account or subscription"); + throw new OauthLoginException(preErrorMsg + "No service account or subscription" + postErrorMsg); } if (loginResult.State == Launcher.LoginState.NoTerms) { - throw new OauthLoginException("Need to accept terms of use"); + throw new OauthLoginException(preErrorMsg + "Need to accept terms of use" + postErrorMsg); } /* @@ -277,7 +281,7 @@ private async Task TryProcessLoginResult(Launcher.LoginResult loginResult, "Error", MessageBoxButton.OK, MessageBoxImage.Error, parentWindow: _window); */ - throw new OauthLoginException("Boot conflict, need reinstall"); + throw new OauthLoginException(preErrorMsg + "Boot conflict, need reinstall" + postErrorMsg); } if (action == LoginAction.Repair) @@ -299,7 +303,7 @@ private async Task TryProcessLoginResult(Launcher.LoginResult loginResult, "The server sent an incorrect response - the repair cannot proceed."), "Error", MessageBoxButton.OK, MessageBoxImage.Error, parentWindow: _window); */ - throw new OauthLoginException("Repair login state not NeedsPatchGame"); + throw new OauthLoginException(preErrorMsg + "Repair login state not NeedsPatchGame" + postErrorMsg); } } catch (Exception) diff --git a/src/XIVLauncher.Core/Components/MainPage/NewsFrame.cs b/src/XIVLauncher.Core/Components/MainPage/NewsFrame.cs index c7cad2c5..9634a4e6 100644 --- a/src/XIVLauncher.Core/Components/MainPage/NewsFrame.cs +++ b/src/XIVLauncher.Core/Components/MainPage/NewsFrame.cs @@ -57,11 +57,10 @@ public void ReloadNews() this.banners = new TextureWrap[bannerList.Count]; - var client = new HttpClient(); for (var i = 0; i < bannerList.Count; i++) { - var textureBytes = await client.GetByteArrayAsync(this.bannerList[i].LsbBanner).ConfigureAwait(false); + var textureBytes = await Program.HttpClient.GetByteArrayAsync(this.bannerList[i].LsbBanner).ConfigureAwait(false); this.banners[i] = TextureWrap.Load(textureBytes); } diff --git a/src/XIVLauncher.Core/Components/SettingsPage/SettingsPage.cs b/src/XIVLauncher.Core/Components/SettingsPage/SettingsPage.cs index ce837880..464909a3 100644 --- a/src/XIVLauncher.Core/Components/SettingsPage/SettingsPage.cs +++ b/src/XIVLauncher.Core/Components/SettingsPage/SettingsPage.cs @@ -15,7 +15,6 @@ public class SettingsPage : Page new SettingsTabWine(), new SettingsTabDxvk(), new SettingsTabDalamud(), - new SettingsTabAutoStart(), new SettingsTabAbout(), new SettingsTabDebug(), new SettingsTabTroubleshooting(), diff --git a/src/XIVLauncher.Core/Components/SettingsPage/Tabs/SettingsTabAutoStart.cs b/src/XIVLauncher.Core/Components/SettingsPage/Tabs/SettingsTabAutoStart.cs deleted file mode 100644 index 0e86afd2..00000000 --- a/src/XIVLauncher.Core/Components/SettingsPage/Tabs/SettingsTabAutoStart.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ImGuiNET; - -namespace XIVLauncher.Core.Components.SettingsPage.Tabs; - -public class SettingsTabAutoStart : SettingsTab -{ - public override SettingsEntry[] Entries { get; } = new SettingsEntry[] { }; - public override string Title => "Auto-Start"; - - public override void Draw() - { - ImGui.Text("Please check back later."); - - base.Draw(); - } -} diff --git a/src/XIVLauncher.Core/CoreEnvironmentSettings.cs b/src/XIVLauncher.Core/CoreEnvironmentSettings.cs index e54d69eb..e17b66f3 100644 --- a/src/XIVLauncher.Core/CoreEnvironmentSettings.cs +++ b/src/XIVLauncher.Core/CoreEnvironmentSettings.cs @@ -19,6 +19,7 @@ public static class CoreEnvironmentSettings public static bool ClearAll => CheckEnvBool("XL_CLEAR_ALL"); public static bool? UseSteam => CheckEnvBoolOrNull("XL_USE_STEAM"); // Fix for Steam Deck users who lock themselves out public static bool IsSteamCompatTool => CheckEnvBool("XL_SCT"); + public static uint AltAppID => GetAltAppId(System.Environment.GetEnvironmentVariable("XL_APPID")); private static bool CheckEnvBool(string key) { @@ -42,6 +43,14 @@ public static string GetCleanEnvironmentVariable(string envvar, string badstring return string.Join(separator, Array.FindAll(dirty.Split(separator, StringSplitOptions.RemoveEmptyEntries), s => !s.Contains(badstring))); } + public static uint GetAltAppId(string? appid) + { + uint.TryParse(appid, out var result); + + // Will return 0 if appid is invalid (or zero). + return result; + } + public static string GetCType() { if (System.OperatingSystem.IsWindows()) diff --git a/src/XIVLauncher.Core/FontManager.cs b/src/XIVLauncher.Core/FontManager.cs index d0bafc6e..318e4290 100644 --- a/src/XIVLauncher.Core/FontManager.cs +++ b/src/XIVLauncher.Core/FontManager.cs @@ -7,9 +7,10 @@ namespace XIVLauncher.Core; public class FontManager { private const float FONT_GAMMA = 1.4f; + private const string TEXT_FONT_NAME = "NotoSansCJKjp-Regular.otf"; + private const string ICON_FONT_NAME = "FontAwesome5FreeSolid.otf"; public static ImFontPtr TextFont { get; private set; } - public static ImFontPtr IconFont { get; private set; } public unsafe void SetupFonts(float pxSize) @@ -21,8 +22,8 @@ public unsafe void SetupFonts(float pxSize) ImFontConfigPtr fontConfig = ImGuiNative.ImFontConfig_ImFontConfig(); fontConfig.PixelSnapH = true; - var fontDataText = AppUtil.GetEmbeddedResourceBytes("NotoSansCJKjp-Regular.otf"); - var fontDataIcons = AppUtil.GetEmbeddedResourceBytes("FontAwesome5FreeSolid.otf"); + var fontDataText = AppUtil.GetEmbeddedResourceBytes(TEXT_FONT_NAME); + var fontDataIcons = AppUtil.GetEmbeddedResourceBytes(ICON_FONT_NAME); var fontDataTextPtr = Marshal.AllocHGlobal(fontDataText.Length); Marshal.Copy(fontDataText, 0, fontDataTextPtr, fontDataText.Length); diff --git a/src/XIVLauncher.Core/ImGuiBindings.cs b/src/XIVLauncher.Core/ImGuiBindings.cs index e0e2f404..527837e8 100644 --- a/src/XIVLauncher.Core/ImGuiBindings.cs +++ b/src/XIVLauncher.Core/ImGuiBindings.cs @@ -1,4 +1,3 @@ -using System.Diagnostics.CodeAnalysis; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/src/XIVLauncher.Core/ImGuiHelpers.cs b/src/XIVLauncher.Core/ImGuiHelpers.cs index a9c69400..c8ebd706 100644 --- a/src/XIVLauncher.Core/ImGuiHelpers.cs +++ b/src/XIVLauncher.Core/ImGuiHelpers.cs @@ -7,7 +7,6 @@ namespace XIVLauncher.Core; public static class ImGuiHelpers { public static Vector2 ViewportSize => ImGui.GetIO().DisplaySize; - public static float GlobalScale => ImGui.GetIO().FontGlobalScale; public static void TextWrapped(string text) diff --git a/src/XIVLauncher.Core/LauncherApp.cs b/src/XIVLauncher.Core/LauncherApp.cs index bf377e5f..e9a9b4c3 100644 --- a/src/XIVLauncher.Core/LauncherApp.cs +++ b/src/XIVLauncher.Core/LauncherApp.cs @@ -29,7 +29,7 @@ public class LauncherApp : Component private string modalText = string.Empty; private string modalTitle = string.Empty; private string modalButtonText = string.Empty; - private Action modalButtonPressAction; + private Action modalButtonPressAction = null!; private readonly ManualResetEvent modalWaitHandle = new(false); #endregion @@ -53,11 +53,9 @@ public LauncherState State set { // If we are coming from the settings, we should reload the news, as the client language might have changed - switch (this.state) + if (this.state == LauncherState.Settings) { - case LauncherState.Settings: - this.mainPage.ReloadNews(); - break; + this.mainPage.ReloadNews(); } this.state = value; diff --git a/src/XIVLauncher.Core/LauncherClientConfig.cs b/src/XIVLauncher.Core/LauncherClientConfig.cs index 22c62ddc..8d8f3120 100644 --- a/src/XIVLauncher.Core/LauncherClientConfig.cs +++ b/src/XIVLauncher.Core/LauncherClientConfig.cs @@ -18,15 +18,11 @@ public readonly struct LauncherClientConfig public string? cutOffBootver { get; init; } public uint flags { get; init; } - public static async Task Fetch() + public static async Task GetAsync() { try { - using var client = new HttpClient() - { - Timeout = TimeSpan.FromSeconds(5), - }; - return await client.GetFromJsonAsync(LAUNCHER_CONFIG_URL).ConfigureAwait(false); + return await Program.HttpClient.GetFromJsonAsync(LAUNCHER_CONFIG_URL).ConfigureAwait(false); } catch (Exception ex) { diff --git a/src/XIVLauncher.Core/Program.cs b/src/XIVLauncher.Core/Program.cs index e35a5a2f..c23c9002 100644 --- a/src/XIVLauncher.Core/Program.cs +++ b/src/XIVLauncher.Core/Program.cs @@ -31,7 +31,7 @@ namespace XIVLauncher.Core; -class Program +sealed class Program { private static Sdl2Window window = null!; private static CommandList cl = null!; @@ -47,6 +47,10 @@ class Program public static DalamudOverlayInfoProxy DalamudLoadInfo { get; private set; } = null!; public static CompatibilityTools CompatibilityTools { get; private set; } = null!; public static ISecretProvider Secrets { get; private set; } = null!; + public static HttpClient HttpClient { get; private set; } = new() + { + Timeout = TimeSpan.FromSeconds(5) + }; private static readonly Vector3 ClearColor = new(0.1f, 0.1f, 0.1f); @@ -210,7 +214,15 @@ private static void Main(string[] args) uint appId, altId; string appName, altName; - if (Config.IsFt == true) + // AppId of 0 is invalid (though still a valid uint) + if (CoreEnvironmentSettings.AltAppID > 0) + { + appId = CoreEnvironmentSettings.AltAppID; + altId = STEAM_APP_ID_FT; + appName = $"Override AppId={appId.ToString()}"; + altName = "FFXIV Free Trial"; + } + else if (Config.IsFt == true) { appId = STEAM_APP_ID_FT; altId = STEAM_APP_ID; @@ -306,7 +318,7 @@ private static void Main(string[] args) needUpdate = CoreEnvironmentSettings.IsUpgrade ? true : needUpdate; - var launcherClientConfig = LauncherClientConfig.Fetch().GetAwaiter().GetResult(); + var launcherClientConfig = LauncherClientConfig.GetAsync().GetAwaiter().GetResult(); launcherApp = new LauncherApp(storage, needUpdate, launcherClientConfig.frontierUrl, launcherClientConfig.cutOffBootver); Invalidate(20); @@ -357,6 +369,7 @@ private static void Main(string[] args) gd.SwapBuffers(gd.MainSwapchain); } + HttpClient.Dispose(); // Clean up Veldrid resources gd.WaitForIdle(); bindings.Dispose(); diff --git a/src/XIVLauncher.Core/Resources/bg1.jpg b/src/XIVLauncher.Core/Resources/bg1.jpg deleted file mode 100644 index 0bf1355e..00000000 Binary files a/src/XIVLauncher.Core/Resources/bg1.jpg and /dev/null differ diff --git a/src/XIVLauncher.Core/Resources/FontAwesome5FreeSolid.otf b/src/XIVLauncher.Core/Resources/fonts/FontAwesome5FreeSolid.otf similarity index 100% rename from src/XIVLauncher.Core/Resources/FontAwesome5FreeSolid.otf rename to src/XIVLauncher.Core/Resources/fonts/FontAwesome5FreeSolid.otf diff --git a/src/XIVLauncher.Core/Resources/NotoSansCJKjp-Regular.otf b/src/XIVLauncher.Core/Resources/fonts/NotoSansCJKjp-Regular.otf similarity index 100% rename from src/XIVLauncher.Core/Resources/NotoSansCJKjp-Regular.otf rename to src/XIVLauncher.Core/Resources/fonts/NotoSansCJKjp-Regular.otf diff --git a/src/XIVLauncher.Core/Support/PackGenerator.cs b/src/XIVLauncher.Core/Support/PackGenerator.cs index c52855cb..5939e981 100644 --- a/src/XIVLauncher.Core/Support/PackGenerator.cs +++ b/src/XIVLauncher.Core/Support/PackGenerator.cs @@ -20,11 +20,11 @@ public static string SavePack(Storage storage) troubleEntry.Close(); var xlLogFile = new FileInfo(Path.Combine(storage.GetFolder("logs").FullName, "launcher.log")); - var patcherLogFile = new FileInfo(Path.Combine(storage.Root.FullName, "patcher.log")); - var dalamudLogFile = new FileInfo(Path.Combine(storage.Root.FullName, "dalamud.log")); - var dalamudInjectorLogFile = new FileInfo(Path.Combine(storage.Root.FullName, "dalamud.injector.log")); - var dalamudBootLogFile = new FileInfo(Path.Combine(storage.Root.FullName, "dalamud.boot.log")); - var ariaLogFile = new FileInfo(Path.Combine(storage.Root.FullName, "aria.log")); + var patcherLogFile = new FileInfo(Path.Combine(storage.GetFolder("logs").FullName, "patcher.log")); + var dalamudLogFile = new FileInfo(Path.Combine(storage.GetFolder("logs").FullName, "dalamud.log")); + var dalamudInjectorLogFile = new FileInfo(Path.Combine(storage.GetFolder("logs").FullName, "dalamud.injector.log")); + var dalamudBootLogFile = new FileInfo(Path.Combine(storage.GetFolder("logs").FullName, "dalamud.boot.log")); + var ariaLogFile = new FileInfo(Path.Combine(storage.GetFolder("logs").FullName, "aria.log")); var wineLogFile = new FileInfo(Path.Combine(storage.GetFolder("logs").FullName, "wine.log")); AddIfExist(xlLogFile, archive); diff --git a/src/XIVLauncher.Core/UpdateCheck.cs b/src/XIVLauncher.Core/UpdateCheck.cs index 1f22bd0f..cd682821 100644 --- a/src/XIVLauncher.Core/UpdateCheck.cs +++ b/src/XIVLauncher.Core/UpdateCheck.cs @@ -10,10 +10,7 @@ public static async Task CheckForUpdate() { try { - using var client = new HttpClient(); - client.Timeout = TimeSpan.FromSeconds(5); - - var response = await client.GetStringAsync(UPDATE_URL).ConfigureAwait(false); + var response = await Program.HttpClient.GetStringAsync(UPDATE_URL).ConfigureAwait(false); var remoteVersion = Version.Parse(response); var localVersion = Version.Parse(AppUtil.GetAssemblyVersion()); diff --git a/src/XIVLauncher.Core/XIVLauncher.Core.csproj b/src/XIVLauncher.Core/XIVLauncher.Core.csproj index e4e35821..23970b63 100644 --- a/src/XIVLauncher.Core/XIVLauncher.Core.csproj +++ b/src/XIVLauncher.Core/XIVLauncher.Core.csproj @@ -95,14 +95,13 @@ - - -