From Andrew (Andrew1431) and Ryan, MoonSweepers-GarageLib maintainers · 6 November 2026

Moon Sweepers on Thunderstore

We have BepInEx running Moon Sweepers without ModEngine, and our mods work on it in test saves. It's set up for you to take over in your own fork, as you asked, and the changes are ready to send upstream.

Where it stands: a working proof of concept on Windows, in single player. A test pack now builds from public source, but it hasn't been played on yet, and multiplayer and other Unity versions are untested.

What we need from you: answers to the three questions at the end, which you can post in the comments on this page.

Download and take over

Download BepInExPack_MoonSweepers-0.1.0.zip (38.6 MB, test build). It uses the same layout as BepInEx-BepInExPack_IL2CPP.

SHA-256: 0b17928d590930efcebabfeffab396406e5504a552a8616ee320e6931a5e21b1

You said you'd want control of the code, in a fork on thunderstore-io or ethangreen-dev. Nothing needs to stay on our account. The takeover guide covers two ways to do that:

Either way, one command then builds the pack from your account: build-moonsweepers-pack.ps1 -WorkDir ..\pack-build -Owner YOUR_ACCOUNT. It needs Windows, and we haven't run these steps from another account.

The problem

Moon Sweepers is Unity 6000.6.0f1 with IL2CPP metadata v108 (Steam app 5335510). Stock BepInEx can't read that metadata, and its Il2CppInterop doesn't know the Unity 6000.6 class layout. The latest bleeding-edge build you suggested trying, be.793, is the same commit we started from (dbc82f0), and it still pins Cpp2IL 1452. We haven't tried MelonLoader. Mods for the game run through ModEngine today, a patcher whose licence forbids re-uploading it, so it can't be the base for a Thunderstore pack.

What we changed

Most of the work already exists upstream, and we built on it. Credit goes to the Cpp2IL maintainers and to RTBRuhan and XLG-WSM for the 6000.5 work.

ProjectChange
Cpp2IL (MIT)No change. The development feed build 1743 already reads v107 and v108.
BepInEx (LGPL-2.1), from master dbc82f0Cpp2IL version bump only, from 1452 to 1743. See the change.
Il2CppInterop (LGPL-3.0), from PR #292 head 72a5fd3Generator moved to AsmResolver 6.0.1, which Cpp2IL now uses. New Class_6000_6 struct handler. Class injection reads interfaces from InterfaceOffsets, because 6000.6 has no separate interface array. See commits 578e2ac (generator) and 03dc757 (runtime).

We measured the class layout from the running game through the public il2cpp API. We did not decompile or copy ModEngine.

Source: Andrew1431/BepInEx, branch v108 and Andrew1431/Il2CppInterop, branch v108. Both v108 branches stay clean for upstream PRs.

The moonsweepers-pack branch combines the two into one Thunderstore package, BepInExPack_MoonSweepers. Its build script packages our Il2CppInterop into a local NuGet feed as 1.5.3-moonsweepers.1, then runs BepInEx's normal build, which fetches doorstop, dobby and the .NET runtime from their official releases. It removes Il2CppInterop's global.json first, because that asks for .NET SDK 8 and we build with SDK 10.

What we tested

All of this ran on a copy of the game with ModEngine absent. The boot checks used our unmodified release builds. The two save sessions used a dev build of GarageLib rebuilt against the new interop. Late Game Vehicles was the release build throughout. Shared Upgrades was the release build in the first session and an unreleased 0.2.0 build in the second. Those sessions ran on the hand-assembled build that came before the pack, so the pack itself has only had the boot test below.

CheckResultDetail
Boot and interop generationWorks108 interop DLLs, chainloader completes
Our existing release DLLsWorksLoad unmodified; all 1,080 referenced types and members resolve
Harmony patches, type injectionWorks10 patch groups, 0 failed; 4 types injected
Played an existing test saveWorksBought 2 modded vehicles, which spawned and saved. 0 errors and 0 exceptions in the log
Played a new saveWorksBought vehicle upgrades across several kinds. 0 errors and 0 exceptions in the log
Test pack, with the previous loader files removedBootsInterop regenerated; our release mods load; 10 patch groups, 0 failed; 0 errors. Not played yet
Compiling mods from sourceWorksGarageLib needs list.get_Item(i) changed to list[i]
MultiplayerUntestedNext on our list
Other Unity versions, including 6000.5UntestedWe only have this game to test on
Other platformsUntestedWindows only so far

Known gaps

Proposed path

  1. You bring the changes into your fork, as they are or reworked however you prefer.
  2. We play-test the pack, including multiplayer, and report against your builds.
  3. The changes go upstream through PR #292, issue #1395 and new PRs to Il2CppInterop and BepInEx.
  4. The pack ships on Thunderstore from your fork, with source available as the licences require, and moves to official builds once they land.

Questions for you

  1. Which works better for you: forking our branches or applying the patches? Is anything in them a problem for you to own?
  2. What else do you need before you can enable the Moon Sweepers community, and is there anything you'd want us to test first?
  3. Do you want to handle the upstream PRs and any contact with the BepInEx maintainers, or should we?

Comments

Loading comments…