From 18a5391e3701342921725665088ca25c1b86b848 Mon Sep 17 00:00:00 2001
From: Alexa <53471801+Alexa-RR@users.noreply.github.com>
Date: Wed, 27 May 2026 11:49:10 +0300
Subject: [PATCH] clientmod: build without a local Rec Room install
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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.
Mirrors the march-2020-03-10 1f407ef change.
---
DorkNet.ClientMod/DorkNet.ClientMod.csproj | 50 ++++++---------------
tools/build-patcher-zip.ps1 | 51 +++++++++++++++-------
2 files changed, 49 insertions(+), 52 deletions(-)
diff --git a/DorkNet.ClientMod/DorkNet.ClientMod.csproj b/DorkNet.ClientMod/DorkNet.ClientMod.csproj
index d246de6..1390eae 100644
--- a/DorkNet.ClientMod/DorkNet.ClientMod.csproj
+++ b/DorkNet.ClientMod/DorkNet.ClientMod.csproj
@@ -12,21 +12,22 @@
- C:\Users\you\Documents\Recnet\dist\RecRoom-Clean-2020.03.10
- $(RecRoomDir)\MelonLoader
- $(MelonLoaderDir)\Il2CppAssemblies
+ $(MSBuildThisFileDirectory)..\build\melonloader
@@ -46,31 +47,6 @@
$(MelonLoaderDir)\net6\Il2CppInterop.Common.dll
false
-
-
- $(Il2CppAssembliesDir)\Il2Cppmscorlib.dll
- false
-
-
- $(Il2CppAssembliesDir)\Il2CppSystem.dll
- false
-
-
- $(Il2CppAssembliesDir)\Assembly-CSharp.dll
- false
-
-
- $(Il2CppAssembliesDir)\Assembly-CSharp-firstpass.dll
- false
-
-
- $(Il2CppAssembliesDir)\Photon3Unity3D.dll
- false
-
-
- $(Il2CppAssembliesDir)\UnityEngine.CoreModule.dll
- false
-
diff --git a/tools/build-patcher-zip.ps1 b/tools/build-patcher-zip.ps1
index 9298232..bf74cb4 100644
--- a/tools/build-patcher-zip.ps1
+++ b/tools/build-patcher-zip.ps1
@@ -16,6 +16,11 @@
user's Rec Room install root, copies the DLL into Mods/, then
renders the config template into UserData/.
+ Self-contained: downloads MelonLoader before the dotnet build and
+ feeds its DLLs into the build as references, so no local Rec Room
+ install is required to compile DorkNet.ClientMod. (The mod resolves
+ every game-side type at runtime via AccessTools.TypeByName.)
+
.PARAMETER VersionKey
The version key matching versions.json on the public main branch
(e.g. december_2020_12_18 or march_2020_03_10).
@@ -45,10 +50,35 @@ New-Item -ItemType Directory -Force $OutputDir | Out-Null
$stage = Join-Path $env:TEMP "dorknet-patcher-$VersionKey-$([guid]::NewGuid().Guid.Substring(0,8))"
New-Item -ItemType Directory -Force $stage | Out-Null
try {
- # ── 1. Build DorkNet.ClientMod ───────────────────────────────────────
+ # ── 1. Fetch MelonLoader from upstream releases ──────────────────────
+ # We download it first so the DLLs inside can serve as compile-time
+ # references for DorkNet.ClientMod — keeps the build self-contained
+ # (no local Rec Room install required to compile the mod).
+ # x64 .NET 6 build targets 2020-era Rec Room. The asset name pattern
+ # is stable across 0.6.x: MelonLoader.x64.zip.
+ $mlAsset = "MelonLoader.x64.zip"
+ $mlUrl = "https://github.com/LavaGang/MelonLoader/releases/download/$MelonLoaderVersion/$mlAsset"
+ $mlZip = "$stage\MelonLoader.zip"
+ $mlExtract = "$stage\melonloader-extracted"
+ Write-Host "[fetch] downloading $mlUrl"
+ Invoke-WebRequest -Uri $mlUrl -OutFile $mlZip
+ if (-not (Test-Path $mlZip) -or (Get-Item $mlZip).Length -lt 1MB) {
+ throw "MelonLoader download failed or produced an unexpectedly small file"
+ }
+ Expand-Archive -Path $mlZip -DestinationPath $mlExtract -Force
+ # The 0.6.x release zip layout has a top-level `MelonLoader` folder
+ # containing net6, net35, Dependencies, Documentation. Point the
+ # csproj at that inner folder.
+ $mlRefRoot = Join-Path $mlExtract 'MelonLoader'
+ if (-not (Test-Path "$mlRefRoot\net6\MelonLoader.dll")) {
+ throw "Extracted MelonLoader is missing net6\MelonLoader.dll — release layout may have changed"
+ }
+
+ # ── 2. Build DorkNet.ClientMod (no Rec Room install needed) ─────────
Write-Host "[build] dotnet build DorkNet.ClientMod (Release)"
dotnet build "$repoRoot\DorkNet.ClientMod\DorkNet.ClientMod.csproj" `
- -c Release --nologo | Out-Null
+ -c Release --nologo `
+ "-p:MelonLoaderDir=$mlRefRoot" | Out-Null
if ($LASTEXITCODE -ne 0) { throw "ClientMod build failed" }
$dll = Get-ChildItem "$repoRoot\DorkNet.ClientMod\bin\Release" -Recurse `
-Filter "DorkNet.ClientMod.dll" |
@@ -58,18 +88,6 @@ try {
Copy-Item $dll.FullName "$stage\DorkNet.ClientMod.dll"
Write-Host "[build] copied $($dll.FullName)"
- # ── 2. Fetch MelonLoader from upstream releases ──────────────────────
- # The x64 .NET 6 build is what targets 2020-era Rec Room. The asset
- # name pattern is stable across 0.6.x: MelonLoader.x64.zip.
- $mlAsset = "MelonLoader.x64.zip"
- $mlUrl = "https://github.com/LavaGang/MelonLoader/releases/download/$MelonLoaderVersion/$mlAsset"
- $mlOut = "$stage\MelonLoader.zip"
- Write-Host "[build] downloading $mlUrl"
- Invoke-WebRequest -Uri $mlUrl -OutFile $mlOut
- if (-not (Test-Path $mlOut) -or (Get-Item $mlOut).Length -lt 1MB) {
- throw "MelonLoader download failed or produced an unexpectedly small file"
- }
-
# ── 3. Copy the config template ──────────────────────────────────────
$template = "$repoRoot\DorkNet.ClientMod\dorknet-clientmod.json.template"
if (-not (Test-Path $template)) {
@@ -92,12 +110,15 @@ try {
Set-Content -LiteralPath "$stage\manifest.json" -Value $manifest
# ── 5. 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
$outZip = Join-Path $OutputDir "dorknet-clientpatch-$VersionKey.zip"
if (Test-Path $outZip) { Remove-Item $outZip -Force }
Compress-Archive -Path "$stage\*" -DestinationPath $outZip
$sizeMb = [math]::Round((Get-Item $outZip).Length / 1MB, 1)
Write-Host ""
- Write-Host "✓ Built $outZip ($sizeMb MB)" -ForegroundColor Green
+ Write-Host "Built $outZip ($sizeMb MB)" -ForegroundColor Green
Write-Host " Upload this to the v1-* GitHub Release on this branch."
}
finally {