diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2022-10-08 21:32:10 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2022-10-08 21:32:10 -0400 |
commit | ab66266b4bc4d7b1a7ae76d05693e9dd30c03989 (patch) | |
tree | 6e2aeb6d019508a4766bd69defae2e1247aa6da4 | |
parent | c6b3446e9cb1d1e02db9db86f143ecfe75e9908c (diff) | |
download | SMAPI-ab66266b4bc4d7b1a7ae76d05693e9dd30c03989.tar.gz SMAPI-ab66266b4bc4d7b1a7ae76d05693e9dd30c03989.tar.bz2 SMAPI-ab66266b4bc4d7b1a7ae76d05693e9dd30c03989.zip |
update installer for VdfConverter & rework avoid custom models
4 files changed, 30 insertions, 65 deletions
diff --git a/build/windows/prepare-install-package.ps1 b/build/windows/prepare-install-package.ps1 index 87a4fe01..002bcbca 100644 --- a/build/windows/prepare-install-package.ps1 +++ b/build/windows/prepare-install-package.ps1 @@ -154,7 +154,7 @@ foreach ($folder in $folders) { cp -Recurse "$smapiBin/i18n" "$bundlePath/smapi-internal" # bundle smapi-internal - foreach ($name in @("0Harmony.dll", "0Harmony.xml", "Mono.Cecil.dll", "Mono.Cecil.Mdb.dll", "Mono.Cecil.Pdb.dll", "MonoMod.Common.dll", "Newtonsoft.Json.dll", "Pathoschild.Http.Client.dll", "Pintail.dll", "TMXTile.dll", "SMAPI.Toolkit.dll", "SMAPI.Toolkit.pdb", "SMAPI.Toolkit.xml", "SMAPI.Toolkit.CoreInterfaces.dll", "SMAPI.Toolkit.CoreInterfaces.pdb", "SMAPI.Toolkit.CoreInterfaces.xml", "System.Net.Http.Formatting.dll")) { + foreach ($name in @("0Harmony.dll", "0Harmony.xml", "Mono.Cecil.dll", "Mono.Cecil.Mdb.dll", "Mono.Cecil.Pdb.dll", "MonoMod.Common.dll", "Newtonsoft.Json.dll", "Pathoschild.Http.Client.dll", "Pintail.dll", "TMXTile.dll", "SMAPI.Toolkit.dll", "SMAPI.Toolkit.pdb", "SMAPI.Toolkit.xml", "SMAPI.Toolkit.CoreInterfaces.dll", "SMAPI.Toolkit.CoreInterfaces.pdb", "SMAPI.Toolkit.CoreInterfaces.xml", "System.Net.Http.Formatting.dll", "VdfConverter.dll")) { cp "$smapiBin/$name" "$bundlePath/smapi-internal" } diff --git a/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs b/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs index 8e24dcdf..66465ffe 100644 --- a/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs +++ b/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs @@ -24,6 +24,9 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning /// <summary>The current OS.</summary> private readonly Platform Platform; + /// <summary>The Steam app ID for Stardew Valley.</summary> + private const string SteamAppId = "413150"; + /********* ** Public methods @@ -146,7 +149,7 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning #if SMAPI_FOR_WINDOWS IDictionary<string, string> registryKeys = new Dictionary<string, string> { - [@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 413150"] = "InstallLocation", // Steam + [@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App " + GameScanner.SteamAppId] = "InstallLocation", // Steam [@"SOFTWARE\WOW6432Node\GOG.com\Games\1453375253"] = "PATH", // GOG on 64-bit Windows }; foreach (var pair in registryKeys) @@ -160,9 +163,10 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning string? steamPath = this.GetCurrentUserRegistryValue(@"Software\Valve\Steam", "SteamPath"); if (steamPath != null) { + // conventional path yield return Path.Combine(steamPath.Replace('/', '\\'), @"steamapps\common\Stardew Valley"); - // Check for Steam libraries in other locations + // from Steam's .vdf file string? path = this.GetPathFromSteamLibrary(steamPath); if (!string.IsNullOrWhiteSpace(path)) yield return path; @@ -257,26 +261,34 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning /// <returns>The game directory, if found.</returns> private string? GetPathFromSteamLibrary(string? steamPath) { - string stardewAppId = "413150"; - if (steamPath != null) + if (steamPath == null) + return null; + + // get raw .vdf data + string libraryFoldersPath = Path.Combine(steamPath.Replace('/', '\\'), "steamapps\\libraryfolders.vdf"); + using FileStream fileStream = File.OpenRead(libraryFoldersPath); + VdfDeserializer deserializer = new(); + dynamic libraries = deserializer.Deserialize(fileStream); + if (libraries?.libraryfolders is null) + return null; + + // get path from Stardew Valley app (if any) + foreach (dynamic pair in libraries.libraryfolders) { - string? libraryFoldersPath = Path.Combine(steamPath.Replace('/', '\\'), "steamapps\\libraryfolders.vdf"); - using FileStream fs = File.OpenRead(libraryFoldersPath); - VdfDeserializer deserializer = new VdfDeserializer(); - SteamLibraryCollection libraries = deserializer.Deserialize<SteamLibraryCollection>(fs); - if (libraries.libraryfolders != null) + dynamic library = pair.Value; + + foreach (dynamic app in library.apps) { - var stardewLibrary = libraries.libraryfolders.FirstOrDefault(f => - { - var apps = f.Value?.apps; - return apps != null && apps.Any(a => a.Key.Equals(stardewAppId)); - }); - if (stardewLibrary.Value?.path != null) + string key = app.Key; + if (key == GameScanner.SteamAppId) { - return Path.Combine(stardewLibrary.Value.path.Replace("\\\\", "\\"), @"steamapps\common\Stardew Valley"); + string path = library.path; + + return Path.Combine(path.Replace("\\\\", "\\"), "steamapps", "common", "Stardew Valley"); } } } + return null; } #endif diff --git a/src/SMAPI.Toolkit/Framework/GameScanning/SteamLibraryCollection.cs b/src/SMAPI.Toolkit/Framework/GameScanning/SteamLibraryCollection.cs deleted file mode 100644 index 7a186f69..00000000 --- a/src/SMAPI.Toolkit/Framework/GameScanning/SteamLibraryCollection.cs +++ /dev/null @@ -1,47 +0,0 @@ -#if SMAPI_FOR_WINDOWS -using System.Collections.Generic; - -namespace StardewModdingAPI.Toolkit.Framework.GameScanning -{ -#pragma warning disable IDE1006 // Model requires lowercase naming. -#pragma warning disable CS8618 // Required for model. - /// <summary>Model for Steam's libraryfolders.vdf.</summary> - public class SteamLibraryCollection - { - /// <summary>Each entry identifies a different location that part of the Steam games library is installed to.</summary> - public LibraryFolders<int, LibraryFolder> libraryfolders { get; set; } - } - - /// <summary>A collection of LibraryFolders. Like a dictionary, but has contentstatsid used as an index also.</summary> - /// <typeparam name="TKey"></typeparam> - /// <typeparam name="TValue"></typeparam> -#pragma warning disable CS8714 // Required for model. - public class LibraryFolders<TKey, TValue> : Dictionary<TKey, TValue> -#pragma warning restore CS8714 - { - /// <summary>Index of the library, starting from "0".</summary> - public string contentstatsid { get; set; } - } - - /// <summary>A Steam library folder, containing information on the location and size of games installed there.</summary> - public class LibraryFolder - { - /// <summary>The escaped path to this Steam library folder. There will be a steam.exe here, but this may not be the one the player generally launches.</summary> - public string path { get; set; } - /// <summary>Label for the library, or ""</summary> - public string label { get; set; } - /// <summary>~19-digit identifier.</summary> - public string contentid { get; set; } - /// <summary>Size of the library in bytes. May show 0 when size is non-zero.</summary> - public string totalsize { get; set; } - /// <summary>Used for downloads.</summary> - public string update_clean_bytes_tally { get; set; } - /// <summary>Normally "0".</summary> - public string time_last_update_corruption { get; set; } - /// <summary>List of Steam app IDs, and their current size in bytes.</summary> - public Dictionary<string, string> apps { get; set; } - } -#pragma warning restore IDE1006 -#pragma warning restore CS8618 -} -#endif diff --git a/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj b/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj index 411fd469..6080a85e 100644 --- a/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj +++ b/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj @@ -14,7 +14,7 @@ <PackageReference Include="Pathoschild.Http.FluentClient" Version="4.1.1" /> <PackageReference Include="System.Management" Version="5.0.0" Condition="'$(OS)' == 'Windows_NT'" /> <PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" Condition="'$(OS)' == 'Windows_NT'" /> - <PackageReference Include="VdfConverter" Version="1.0.3" /> + <PackageReference Include="VdfConverter" Version="1.0.3" Condition="'$(OS)' == 'Windows_NT'" /> </ItemGroup> <ItemGroup> |