GameFinder 1.0.0
See the version list below for details.
dotnet add package GameFinder --version 1.0.0
NuGet\Install-Package GameFinder -Version 1.0.0
<PackageReference Include="GameFinder" Version="1.0.0" />
paket add GameFinder --version 1.0.0
#r "nuget: GameFinder, 1.0.0"
// Install GameFinder as a Cake Addin #addin nuget:?package=GameFinder&version=1.0.0 // Install GameFinder as a Cake Tool #tool nuget:?package=GameFinder&version=1.0.0
GameFinder
.NET 5 library for finding games on Windows.
Supported Stores
- Steam
- GOG
- Bethesda.net Launcher
- Epic Games Store
OriginTODO
Example
var steamHandler = new SteamHandler();
steamHandler.FindAllGames();
foreach (var steamGame in steamHandler.Games)
{
Console.WriteLine($"{steamGame} is located at {steamGame.Path}");
}
When to use this Library
This library is best used when you have to find multiple different games from different game stores. If you build a tool for only one game then you might better be off finding it via the registry (common method is looking for the Uninstaller). You could still use this library to only find that one game but it's a bit overkill.
If you build some sort of game library manager like Playnite or LaunchBox then you could make massive use of this library.
How it works
Finding Steam Games
Source: SteamHandler.cs
Steam games can be easily found by searching through "Steam Universes". An Universe is simply a folder where you install Steam games. You can find all Universes by parsing the config.vdf
file in Steam/config
. We can get the Steam folder by opening the registry key HKEY_CURRENT_USER\Software\Valve\Steam
and getting the SteamPath
value.
The config.vdf
file uses Valve's KeyValue format which is similar to JSON:
"InstallConfigStore"
{
"Software"
{
"Valve"
{
"Steam"
{
"BaseInstallFolder_1" "F:\\SteamLibrary"
"BaseInstallFolder_3" "E:\\SteamLibrary"
}
}
}
}
What we want to look for are these BaseInstallFolder_X
values which point to a Universe folder. The steamapps
subdirectory contains the appmanifest_*.acf
files we need. .acf
files have the same KeyValue format as .vdf
files so parsing very easy:
"AppState"
{
"appid" "8930"
"Universe" "1"
"LauncherPath" "C:\\Program Files (x86)\\Steam\\steam.exe"
"name" "Sid Meier's Civilization V"
"StateFlags" "4"
"installdir" "Sid Meier's Civilization V"
"LastUpdated" "1600350073"
"UpdateResult" "0"
"SizeOnDisk" "9235434479"
"buildid" "4390913"
"LastOwner" "76561198110222274"
"BytesToDownload" "20736"
"BytesDownloaded" "20736"
"BytesToStage" "26039"
"BytesStaged" "26039"
}
Important in this file are the appid
, name
and installdir
fields. Note: installdir
is the name of the folder in Universe/steamapps/common/
where the game is installed. It is not absolute but relative to the common
folder.
Finding GOG Games
Source: GOGHandler.cs
GOG stores all information in the registry. This can either be at HKEY_LOCAL_MACHINE\Software\GOG.com\Games
or HKEY_LOCAL_MACHINE\Software\WOW6432Node\GOG.com\Games
. Simply open the registry key and get all sub-key names. Each sub-key in GOG.com\Games
is an installed game with the ID being the name of the sub-key:
Now you can iterate over all sub-keys to get all the information you need:
Important fields are path
, gameID
and gameName
.
Finding BethNet Games
Source: BethNetHandler.cs
Finding games installed with the Bethesda.net Launcher was very rather tricky because there are no config files you can parse or simple registry keys you can open. I ended up using a similar method to the GOG Galaxy Bethesda.net plugin by TouwaStar: GitHub. The interesting part is the _scan_games_registry_keys
function in betty/local.py
:
- open the uninstaller registry key at
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
- iterate over every sub-key:
- find the sub-keys that open the Bethesda Launcher with
bethesdanet://uninstall/
as an argument
- find the sub-keys that open the Bethesda Launcher with
With this you can find all games installed via Bethesda.net. The important fields are DisplayName
, ProductID
(64bit value) and Path
.
Finding EGS Games
Source: EGSHandler.cs
The Epic Games Store uses manifest files, similar to Steam, which contain all information we need. The path to the manifest folder can be found by opening the registry key HKEY_CURRENT_USER\SOFTWARE\Epic Games\EOS
and getting the ModSdkMetadataDir
value. Inside the manifest folder you will find .item
files which are actually just JSON files with a different extension.
See 8AAFB83044E76B812D3D8C9652E8C13C.item
for an example file. Important fields are InstallLocation
, DisplayName
and CatelogItemId
.
Finding Origin Games
TODO
Contributing
See CONTRIBUTING for more information.
License
GPLv3.0, see LICENSE for more information.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0-windows7.0 is compatible. net6.0-windows was computed. net7.0-windows was computed. net8.0-windows was computed. |
-
net5.0-windows7.0
- Microsoft.Win32.Registry (>= 5.0.0)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on GameFinder:
Package | Downloads |
---|---|
Mutagen.Bethesda.Core.Windows
A C# library for Mutagen features that only work on windows |
|
GameFinder.StoreHandlers.BethNet
.NET library for finding games on Windows. |
|
NexusMods.StandardGameLocators
Package Description |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on GameFinder:
Repository | Stars |
---|---|
Nexus-Mods/NexusMods.App
Home of the development of the Nexus Mods App
|
Version | Downloads | Last updated | |
---|---|---|---|
4.3.3 | 271 | 10/31/2024 | |
4.3.2 | 1,633 | 10/7/2024 | |
4.3.1 | 775 | 10/1/2024 | |
4.3.0 | 283 | 9/28/2024 | |
4.2.4 | 10,711 | 7/4/2024 | |
4.2.3 | 99 | 6/25/2024 | |
4.2.2 | 1,666 | 6/6/2024 | |
4.2.1 | 85 | 6/5/2024 | |
4.2.0 | 10,676 | 1/28/2024 | |
4.1.0 | 1,415 | 1/8/2024 | |
4.0.0 | 3,453 | 9/3/2023 | |
3.2.2 | 1,332 | 8/11/2023 | |
3.2.1 | 860 | 7/25/2023 | |
3.2.0 | 265 | 7/25/2023 | |
3.1.0 | 1,309 | 5/23/2023 | |
3.0.2 | 252 | 5/10/2023 | |
3.0.1 | 214 | 5/10/2023 | |
3.0.0 | 255 | 5/9/2023 | |
1.8.0 | 44,860 | 6/27/2022 | |
1.7.3 | 82,124 | 5/14/2022 | |
1.7.2 | 62,530 | 11/10/2021 | |
1.7.1 | 25,175 | 8/19/2021 | |
1.7.0 | 32,016 | 8/9/2021 | |
1.6.4 | 2,541 | 8/3/2021 | |
1.6.3 | 3,457 | 7/30/2021 | |
1.6.2 | 2,514 | 7/17/2021 | |
1.6.1 | 2,975 | 7/10/2021 | |
1.6.0 | 1,997 | 7/10/2021 | |
1.5.3 | 26,229 | 6/13/2021 | |
1.5.2 | 2,382 | 6/9/2021 | |
1.5.1 | 2,310 | 6/6/2021 | |
1.5.0 | 17,528 | 5/29/2021 | |
1.4.1 | 36,162 | 3/26/2021 | |
1.4.0 | 1,698 | 3/26/2021 | |
1.3.1 | 1,784 | 3/14/2021 | |
1.3.0 | 1,846 | 3/13/2021 | |
1.2.0 | 1,533 | 3/13/2021 | |
1.1.0 | 667 | 2/21/2021 | |
1.0.0 | 1,056 | 2/21/2021 |