Render the flag from {ENABLE_TLS_TRUST_BYPASS} instead of hardcoding
true, so the launcher's opt-in toggle controls it. Off by default
since Localtunnel/Tunnelto serve valid certs.
MelonLoader (DorkNet.ClientMod) is the sole client patcher now:
- delete the DorkNet.ClientPatch project + tools/install-plugin.ps1
- drop the project from DorkNet.sln
- README / deploy docs: present DorkNet.ClientMod (install-melon.ps1)
as the patcher instead of the BepInEx plugin
- drop the dead install-plugin.ps1 reference from Program.cs's JWT
error and install-melon.ps1's DRM-fallback hint
- tidy stray 'BepInEx port' comments
Legacy-cleanup paths that REMOVE an old BepInEx install
(install-legacy-client.ps1, build-patcher-zip.ps1's old_plugin_paths)
are kept intentionally.
The harmony hook on PhotonNetwork.ConnectUsingSettings registers in
March's IL2CPP build but never actually fires — the watch's connect
path goes through a different (mangled) entry point. Log confirms
[patch-ok] PhotonNetwork.ConnectUsingSettings but no
[photon-appid] override line, ever.
Fix moves the override out of the prefix-only path:
- New PhotonPatches.TryApplyOverride(reason) does the
PhotonServerSettings.AppID / VoiceAppID / region mutation and
flips an OverrideApplied flag once it succeeds. Idempotent.
- OnUpdate polls TryApplyOverride every 6th frame (~10 Hz) until
it succeeds, then stops. The "type not found yet" log is
throttled to once on first miss + every 300th miss after, so
the file doesn't drown if PhotonServerSettings stays unloaded.
- Mod.ResolveType made internal (was private) so PhotonPatches
+ SavePatches can use the broader assembly-scan fallback —
the local FindGameType copies were too narrow and missed
IL2CPP-mangled type names. Both FindGameType helpers collapse
to one-line delegates to Mod.ResolveType.
- Prefix on ConnectUsingSettings kept as a belt-and-braces hook
(passes reason="prefix"); harmless if it fires, fine if it
doesn't.
- Photon dashboard has CustomAuth disabled on the AppId now, so the
watch never needs to attach userid/LoginLock to its Authenticate
ops. Removed the harmony hook on NetworkingPeer.CallAuthenticate,
the AuthValuesInjector_Prefix method, the GetCurrentLockToken
helper, and the InjectAuthValues Cfg field + config load. Bumped
the [config] log line to drop the InjectAuthValues field.
- Both dorknet-clientmod.json.template copies (source +
local-releases) lose the "InjectAuthValues" key.
- Code moved verbatim to DorkNet.ClientMod/attic/AuthValuesInjector.cs.attic
with a header explaining why it was parked and how to restore it.
The .cs.attic suffix keeps the SDK's auto-globber from compiling it.
- ClientMod: add SingleOriginBaseUrl config + URI rewrite path so the
client can talk to one https://<apex>/__dn/<service>/... base
instead of demanding wildcard subdomains. ServerHost rewrite still
the fallback when SingleOriginBaseUrl is empty.
- ClientMod config: InjectAuthValues now defaults to false. The
server's PhotonCustomAuthController already fail-opens
(Photon:RequireCustomAuth=false), so anonymous bootstrap is the
cleaner default and avoids Photon's CustomAuthFailed loop when a
WAF returns 403 to Photon's probe.
- Server: SQLite path now reads Database:SqlitePath config
(Database__SqlitePath env). Falls back to <bin>/data/dorknet.db
so existing Docker / standalone deploys are unchanged. Lets the
Windows launcher put the db under %APPDATA%\DorkNet.
- Server: DomainConfig + ConfigService updates for the single-origin
apex.
- .gitignore: exclude local-releases.zip.
MelonLoader 0.6.x scans <install root>\Mods\ for plugin DLLs and
ignores MelonLoader\Mods\, so 'plugin_dest' = 'MelonLoader/Mods'
in the manifest meant DorkNet.ClientMod.dll was never loaded —
Player.log showed '0 Mods loaded.' and the watch booted unpatched.
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.
The mod resolves every game-side type at runtime via
AccessTools.TypeByName, so the IL2CPP interop assemblies
(Assembly-CSharp, Photon3Unity3D, UnityEngine.*) in the csproj were
dead references. Dropped them entirely — only MelonLoader's own
DLLs are actually needed at compile time.
tools/build-patcher-zip.ps1 now downloads MelonLoader BEFORE the
dotnet build and points MelonLoaderDir at the extracted contents,
so a fresh contributor checkout builds the patcher zip cold with
no Rec Room install required. (Previously the csproj defaulted
RecRoomDir to a hardcoded user path and failed for anyone else.)
Verified by deleting bin/obj and running the script from scratch
on a machine without RecRoomDir set — produces a 20 MB zip with
the same manifest/DLL/MelonLoader.zip layout as before.
Targets Rec Room 2020.03.10 client (also serves 2020.03.06).
Re-import after adding:
- DorkNet.ClientMod/dorknet-clientmod.json.template — config schema
the launcher's manifest-driven patcher renders into UserData/.
- tools/build-patcher-zip.ps1 — produces dorknet-clientpatch-{key}.zip
for v1-march-* Release uploads.
- .github/workflows/release.yml — on tag push publishes both
dorknet-server-march_2020_03_10-win-x64.zip and
dorknet-clientpatch-march_2020_03_10.zip as Release assets.
Same scrub rules as december; tools/build-patcher-zip.ps1 added to
the maintainer-side allow-list so it survives.