XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEToolBox

【WPF】XFE工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.IO;
using System.Text.RegularExpressions;
using Microsoft.Win32;

namespace XFEToolBox.Tools.SpaceEngineers;

public static class GameDiscovery
{
    public static IReadOnlyList<string> FindInstallations()
    {
        var steamRoots = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
        foreach (string key in new[] { @"HKEY_CURRENT_USER\Software\Valve\Steam", @"HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Valve\Steam" })
        {
            try
            {
                if (Registry.GetValue(key, key.Contains("CURRENT_USER") ? "SteamPath" : "InstallPath", null) is string root)
                    steamRoots.Add(root);
            }
            catch (System.Security.SecurityException) { }
        }
        steamRoots.Add(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "Steam"));
        var libraries = new HashSet<string>(steamRoots, StringComparer.OrdinalIgnoreCase);
        foreach (string root in steamRoots)
        {
            string vdf = Path.Combine(root, "steamapps", "libraryfolders.vdf");
            if (!File.Exists(vdf)) continue;
            try
            {
                foreach (Match match in Regex.Matches(File.ReadAllText(vdf), "\"path\"\\s*\"((?:\\\\.|[^\"])*)\""))
                    libraries.Add(match.Groups[1].Value.Replace("\\\\", "\\"));
            }
            catch (IOException) { }
            catch (UnauthorizedAccessException) { }
        }
        return libraries.Select(root => Path.Combine(root, "steamapps", "common", "SpaceEngineers", "Bin64"))
            .Where(path => File.Exists(Path.Combine(path, "SpaceEngineers.exe"))).Select(Path.GetFullPath)
            .Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
    }

    public static string NormalizeBin64(string value)
    {
        if (string.IsNullOrWhiteSpace(value)) return "";
        string path = Path.GetFullPath(Environment.ExpandEnvironmentVariables(value.Trim().Trim('"')));
        if (File.Exists(path)) path = Path.GetDirectoryName(path)!;
        if (File.Exists(Path.Combine(path, "Bin64", "SpaceEngineers.exe"))) path = Path.Combine(path, "Bin64");
        return path;
    }

    public static void FillDefaults(ManagerSettings settings)
    {
        if (string.IsNullOrWhiteSpace(settings.Bin64Path)) settings.Bin64Path = FindInstallations().FirstOrDefault() ?? "";
        else settings.Bin64Path = NormalizeBin64(settings.Bin64Path);
    }
}