mirror of https://github.com/acidicoala/SmokeAPI
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
320 lines
12 KiB
Plaintext
320 lines
12 KiB
Plaintext
= 🐨 SmokeAPI ♨
|
|
|
|
_Legit DLC Unlocker for Steamworks_
|
|
|
|
image::https://www.gstatic.com/android/keyboard/emojikitchen/20201001/u1f428/u1f428_u2615.png[,256,align="center"]
|
|
|
|
== ✨ Features
|
|
|
|
* 🔓 Legit DLC Unlocking
|
|
* 🛅 Inventory emulation
|
|
* 📝 Config-less operation
|
|
* Multiple installation methods:
|
|
** 🛍️ Store mode
|
|
** 🎮 Game mode
|
|
*** 🪝 Hook mode
|
|
*** 🔀 Proxy mode
|
|
|
|
== 🔗 Links
|
|
|
|
:forum-topic: https://cs.rin.ru/forum/viewtopic.php?p=2597932#p2597932[SmokeAPI forum topic]
|
|
|
|
* 📥 https://github.com/acidicoala/SmokeAPI/releases/latest[Download the latest release]
|
|
|
|
* 💬 {forum-topic}
|
|
|
|
== 📖 Introduction
|
|
|
|
=== What is SmokeAPI?
|
|
|
|
SmokeAPI is a DLC unlocker for the games that are legitimately owned in your Steam account.
|
|
It attempts to spoof games that use Steamworks SDK into believing that you own desired DLCs.
|
|
However, SmokeAPI does not modify the rest of the Steamworks SDK, hence features like multiplayer, achievements, etc. remain fully functional.
|
|
|
|
.Supported versions
|
|
[%collapsible]
|
|
====
|
|
SmokeAPI aims to support all released SteamAPI versions.
|
|
When it encountered a new, unsupported interface version, it will fall back on the latest supported version.
|
|
Below is a list of supported interface versions:
|
|
|
|
* ISteamClient v6 — v20. (Versions before 6 did not contain any DLC related interfaces)
|
|
* ISteamApps v2 — v8. (Version 1 did not contain any DLC related functions)
|
|
* ISteamUser v12 — v21. (Versions before 12 did not contain any DLC related functions)
|
|
* ISteamInventory v1 — v3.
|
|
|
|
Steam inventory does not work in all games with steam inventory because of custom implementation, and online checks.
|
|
A list of games where inventory emulation has been shown to work is as follows:
|
|
|
|
* Project Winter
|
|
* Euro Truck Simulator 2
|
|
* Hero Siege (if you bypass EAC)
|
|
====
|
|
|
|
== 🛠 Installation Instructions
|
|
|
|
WARNING: Please proceed with installation at your own risk.
|
|
Usage of this unlocker entails breaking one or more terms of service, which might result in a permanent loss of your account.
|
|
|
|
:smokeapi_release: https://github.com/acidicoala/SmokeAPI/releases/latest[SmokeAPI Releases]
|
|
|
|
SmokeAPI supports 2 main modes of installation: *Store* mode and *Game* mode, which are described in the next section.
|
|
|
|
=== 🛍️ Store mode
|
|
|
|
NOTE: It is worth noting that the following instructions describe a _manual_ installation method.
|
|
You can benefit from _automatic_ installation and GUI configuration by using https://github.com/acidicoala/Koalageddon2#readme[Koalageddon v2].
|
|
|
|
In this installation mode, SmokeAPI is loaded into the Steam process, which makes it able to affect all Steam games.
|
|
|
|
:steam-dir: the Steam directoryfootnote:fn-steam-dir[The root directory where Steam is installed]
|
|
|
|
. Download the latest Koaloader release zip from https://github.com/acidicoala/Koaloader/releases/latest[Koaloader Releases].
|
|
. From Koaloader archive unpack `version.dll` from `version-32`, and place it in {steam-dir}.
|
|
. In {steam-dir} create the following Koaloader configuration file:
|
|
+
|
|
.`Koaloader.config.json`
|
|
[%collapsible]
|
|
====
|
|
[source,json]
|
|
----
|
|
{
|
|
"auto_load": false,
|
|
"targets": [
|
|
"Steam.exe"
|
|
],
|
|
"modules": [
|
|
{
|
|
"path": "SmokeAPI.dll",
|
|
"required": true
|
|
}
|
|
]
|
|
}
|
|
----
|
|
====
|
|
. Download the latest SmokeAPI release zip from {smokeapi_release}.
|
|
. From SmokeAPI archive unpack `steam_api.dll`, rename it to `SmokeAPI.dll`, and place it in {steam-dir}.
|
|
|
|
=== 🎮 Game mode
|
|
|
|
In this installation mode, SmokeAPI is loaded into a game process, which limits it to that particular game only.
|
|
This mode itself supports 2 modes: hook mode and proxy mode.
|
|
Try installing the unlocker in hook mode first.
|
|
If it doesn't work, try installing it in proxy mode.
|
|
|
|
==== 🪝 Hook mode
|
|
|
|
. Download the latest Koaloader release zip from https://github.com/acidicoala/Koaloader/releases/latest[Koaloader Releases].
|
|
. From Koaloader archive unpack `version.dll` from version-32/64, depending on the game bitness, and place it next to the game exe file.
|
|
. Download the latest SmokeAPI release zip from {smokeapi_release}.
|
|
. From SmokeAPI archive unpack `steam_api.dll`/`steam_api64.dll`, depending on the game bitness, rename it to `SmokeAPI.dll`, and place it next to the game exe file.
|
|
|
|
==== 🔀 Proxy mode
|
|
|
|
. Find `steam_api.dll` / `steam_api64.dll` file in game directory, and rename it to `steam_api_o.dll` / `steam_api64_o.dll`.
|
|
. Download the latest SmokeAPI release zip from {smokeapi_release}.
|
|
. From SmokeAPI archive unpack `steam_api.dll`/`steam_api64.dll`, depending on the game bitness, and place it next to the original steam_api DLL file.
|
|
|
|
If the unlocker is not working as expected, then please fully read the https://gist.github.com/acidicoala/2c131cb90e251f97c0c1dbeaf2c174dc[Generic Unlocker Installation Instructions] before seeking support in the {forum-topic}.
|
|
|
|
== ⚙ Configuration
|
|
|
|
NOTE: This document describes configuration for version 2 of SmokeAPI.
|
|
You can find the version 1 documentation https://github.com/acidicoala/SmokeAPI/blob/v1.0.3/README.md#-configuration[here].
|
|
|
|
:steam_config: https://github.com/acidicoala/public-entitlements/blob/main/steam/v2/store_config.json
|
|
:fn-app-id: footnote:fn-app-id[App/DLC IDs can be obtained from https://steamdb.info. Keep in mind that you need to be signed in with a steam account in order to see accurate inventory item IDs on that website.]
|
|
|
|
SmokeAPI does not require any manual configuration.
|
|
By default, it uses the most reasonable options and tries to unlock all DLCs that it can.
|
|
However, there might be circumstances in which you need more custom-tailored behaviour, such as disabling certain DLCs, or selectively enabling just a few of them.
|
|
In this case you can use a configuration file link:res/SmokeAPI.config.json[SmokeAPI.config.json] that you can find here in this repository or in the release zip.
|
|
To use it, simply place it next to the SmokeAPI DLL.
|
|
It will be read upon each launch of a game or the store.
|
|
In the absence of the config file, default values specified below will be used.
|
|
The configuration file is expected to conform to the Json standard.
|
|
|
|
`logging`:: Toggles generation of a `SmokeAPI.log.log` file.
|
|
+
|
|
[horizontal]
|
|
Type::: Boolean
|
|
Default::: `false`
|
|
|
|
`unlock_family_sharing`:: *_Store mode only_*.
|
|
Toggles Family Sharing bypass, which enables the borrower of a shared library to start and continue playing games when library owner is playing as well.
|
|
+
|
|
[horizontal]
|
|
Type::: Boolean
|
|
Default::: `true`
|
|
|
|
`default_app_status`:: This option sets the default DLC unlocking behaviour.
|
|
+
|
|
[horizontal]
|
|
Possible values:::
|
|
+
|
|
[horizontal]
|
|
`original`:::: Leaves DLC unlock status unmodified, unless specified otherwise.
|
|
`unlocked`:::: Unlocks all DLCs in all games, unless specified otherwise.
|
|
Type::: String
|
|
Default::: `unlocked`
|
|
|
|
`override_app_status`:: This option overrides the status of all DLCs that belong to a specified app ID{fn-app-id}.
|
|
+
|
|
[horizontal]
|
|
Possible values::: An object with key-value pairs, where the key corresponds to the app ID, and value to the app status.
|
|
Possible app status values are defined in the `default_app_status` option.
|
|
Type::: Object
|
|
Default::: `{}`
|
|
|
|
`override_dlc_status`:: This option overrides the status of individual DLCs, regardless of the corresponding app status.
|
|
+
|
|
[horizontal]
|
|
Possible values::: An object with key-value pairs, where the key corresponds to the app ID, and value to the app status.
|
|
Possible app status values are defined in the `default_app_status` option.
|
|
Furthermore, it is possible to lock even the legitimately locked DLCs by setting the corresponding app status value to `locked`.
|
|
Type::: Object
|
|
Default::: `{}`
|
|
|
|
`auto_inject_inventory`:: Toggles whether SmokeAPI should automatically inject a list of all registered inventory items, when a game queries user inventory
|
|
+
|
|
[horizontal]
|
|
Type::: Boolean
|
|
Default::: `true`
|
|
|
|
`extra_inventory_items`:: A list of inventory items IDs{fn-app-id} that will be added in addition to the automatically injected items.
|
|
+
|
|
[horizontal]
|
|
Type::: Array (of Integers)
|
|
Default::: `[]`
|
|
|
|
=== Advanced options
|
|
|
|
`$version`:: A technical field reserved for use by tools like GUI config editors.
|
|
Do not modify this value.
|
|
+
|
|
[horizontal]
|
|
Type::: Integer
|
|
Default::: `2`
|
|
|
|
`extra_dlcs`:: See <<How SmokeAPI works in games with large number of DLCs>> to understand the use case for this option.
|
|
+
|
|
[horizontal]
|
|
Possible values::: An object with key-value pairs, where the key corresponds to the app ID, and value to the object that contains DLC IDs.
|
|
The format is the same as in the aforementioned GitHub config.
|
|
Type::: Object
|
|
Default::: `{}`
|
|
|
|
`store_config`:: *_Store mode only_*.
|
|
An object that specifies offsets required for store mode operation.
|
|
It will override the config fetched from {steam_config}[remote source] or local cache.
|
|
Do not modify this value unless you know what you are doing.
|
|
+
|
|
[horizontal]
|
|
Type::: Object
|
|
Default::: See {steam_config}[online config]
|
|
|
|
.Complete example
|
|
|
|
[%collapsible]
|
|
====
|
|
[source,json]
|
|
----
|
|
{
|
|
"$version": 2,
|
|
"logging": true,
|
|
"unlock_family_sharing": true,
|
|
"default_app_status": "unlocked",
|
|
"override_app_status": {
|
|
"1234": "original",
|
|
"4321": "unlocked"
|
|
},
|
|
"override_dlc_status": {
|
|
"1234": "original",
|
|
"4321": "unlocked",
|
|
"5678": "locked"
|
|
},
|
|
"auto_inject_inventory": true,
|
|
"extra_inventory_items": [],
|
|
"extra_dlcs": {
|
|
"1234": {
|
|
"dlcs": {
|
|
"56789": "Example DLC 1"
|
|
}
|
|
},
|
|
"4321": {
|
|
"dlcs": {
|
|
"98765": "Example DLC 2",
|
|
"98766": "Example DLC 3"
|
|
}
|
|
}
|
|
},
|
|
"store_config": {
|
|
"client_engine_steam_client_internal_ordinal": 12,
|
|
"steam_client_internal_interface_selector_ordinal": 18,
|
|
"vstdlib_callback_address_offset": 20,
|
|
"vstdlib_callback_data_offset": 0,
|
|
"vstdlib_callback_interceptor_address_offset": 1,
|
|
"vstdlib_callback_name_offset": 4
|
|
}
|
|
}
|
|
----
|
|
====
|
|
|
|
== Extra info
|
|
|
|
=== How SmokeAPI works in games with large number of DLCs
|
|
|
|
Some games that have a large number of DLCs begin ownership verification by querying the Steamworks API for a list of all available DLCs.
|
|
Once the game receives the list, it will go over each item and check the ownership.
|
|
The issue arises from the fact that response from Steamworks SDK may max out at 64, depending on how much unowned DLCs the user has.
|
|
To alleviate this issue, SmokeAPI will make a web request to Steam API for a full list of DLCs, which works well most of the time.
|
|
Unfortunately, even the web API does not solve all of our problems, because it will only return DLCs that are available in Steam store.
|
|
This means that DLCs without a dedicated store offer, such as pre-order DLCs will be left out.
|
|
That's where the `extra_dlcs` config option comes into play.
|
|
You can specify those missing DLC IDs there, and SmokeAPI will make them available to the game.
|
|
However, this introduces the need for manual configuration, which goes against the ideals of this project.
|
|
To remedy this issue SmokeAPI will also fetch a https://github.com/acidicoala/public-entitlements/blob/main/steam/v2/dlc.json[manually maintained list of extra DLCs] stored in a GitHub repository.
|
|
The purpose of this document is to contain all the DLC IDs that are lacking a Steam store page.
|
|
This enables SmokeAPI to unlock all DLCs without any config file at all.
|
|
Feel free to report in the {forum-topic} games that have more than 64 DLCs,
|
|
_and_ have DLCs without a dedicated store page.
|
|
They will be added to the list of missing DLC IDs to facilitate config-less operation.
|
|
|
|
== 🏗️ Building from source
|
|
|
|
=== 🚦 Requirements
|
|
|
|
:fn-lower-ver: footnote:lower-versions[Older versions may be supported as well.]
|
|
|
|
* CMake v3.24 (Make sure that cmake is available from powershell)
|
|
* Visual Studio 2022{fn-lower-ver}.
|
|
* Tested on Windows 11 SDK (10.0.22621.0){fn-lower-ver}.
|
|
|
|
=== 👨💻 Commands
|
|
|
|
Build the project
|
|
|
|
----
|
|
.\build.ps1 <arch> <config>
|
|
----
|
|
|
|
where
|
|
|
|
[horizontal]
|
|
arch::: `32` or `64`
|
|
config::: `Debug` or `Release`
|
|
|
|
For example:
|
|
|
|
----
|
|
.\build.ps1 32 Debug
|
|
----
|
|
|
|
== 📚 Open-Source libraries
|
|
|
|
This project makes use of the open source projects specified in the https://github.com/acidicoala/KoalaBox#-open-source-libraries[KoalaBox Readme]
|
|
|
|
== 📄 License
|
|
|
|
This software is licensed under the https://unlicense.org/[Unlicense], terms of which are available in link:UNLICENSE.txt[UNLICENSE.txt]
|