patcher: bundle Goldberg steam_api64.dll stub + steam_appid

Stripping SteamStub DRM with Steamless is necessary but not
sufficient — Rec Room's Plugins/steam_api64.dll still tries to
talk to Steam at runtime and bails when Steam isn't loaded. The
working test installs swap in Goldberg Steam Emulator (~11 MB),
which fakes a logged-in user without needing Steam running.

- DorkNet.ClientMod/steam-stub/ holds the stub DLL + a 7-byte
  steam_appid.txt (Rec Room is Steam app 471710)
- build-patcher-zip.ps1 copies both into the zip and writes a new
  steam_stub block in manifest.json so the launcher knows where to
  install them
- Manifest schema is back-compat: launchers that don't know the
  steam_stub block just ignore it

Without this, the launcher's Steamless step produced a runnable
exe that exited within a second of launch because of the Steam
API failure. With it, the unwrapped exe starts up cleanly.
This commit is contained in:
Alexa
2026-05-27 13:03:43 +03:00
parent 1f407ef7b3
commit bc8bcd99d0
3 changed files with 25 additions and 2 deletions
Binary file not shown.
@@ -0,0 +1 @@
471710
+24 -2
View File
@@ -95,7 +95,22 @@ try {
}
Copy-Item $template "$stage\dorknet-clientmod.json.template"
# ── 4. Write manifest.json ──────────────────────────────────────────
# ── 4. Copy the Steam stub (Goldberg) + appid ────────────────────────
# Replaces the Valve steam_api64.dll so the unwrapped exe can run
# without Steam loaded. App ID 471710 is Rec Room — same across all
# versions we ship for.
$stubDll = "$repoRoot\DorkNet.ClientMod\steam-stub\steam_api64.dll"
$stubAppid = "$repoRoot\DorkNet.ClientMod\steam-stub\steam_appid.txt"
if (-not (Test-Path $stubDll)) {
throw "Steam stub DLL missing: $stubDll"
}
if (-not (Test-Path $stubAppid)) {
throw "Steam appid file missing: $stubAppid"
}
Copy-Item $stubDll "$stage\steam_api64.dll"
Copy-Item $stubAppid "$stage\steam_appid.txt"
# ── 5. Write manifest.json ──────────────────────────────────────────
$manifest = @{
'$schema_version' = 1
'loader_archive' = 'MelonLoader.zip'
@@ -106,10 +121,17 @@ try {
'old_plugin_paths' = @(
'BepInEx/plugins/DorkNet.ClientPatch.dll'
)
'steam_stub' = @{
'api_dll' = 'steam_api64.dll'
'api_dest' = 'Recroom_Release_Data/Plugins/steam_api64.dll'
'api_backup_suffix' = '.steam-original'
'appid_file' = 'steam_appid.txt'
'appid_dest' = 'steam_appid.txt'
}
} | ConvertTo-Json -Depth 4
Set-Content -LiteralPath "$stage\manifest.json" -Value $manifest
# ── 5. Bundle into the final zip ────────────────────────────────────
# ── 6. Bundle into the final zip ────────────────────────────────────
# Strip the extracted MelonLoader scratch dir before zipping so it
# doesn't bloat the artifact. The MelonLoader.zip itself stays.
Remove-Item -Recurse -Force $mlExtract