mirror of
https://github.com/djdevin/recnet-plugin.git
synced 2026-09-08 06:31:29 -07:00
126 lines
5.5 KiB
Markdown
126 lines
5.5 KiB
Markdown
# RecNet Plugin
|
|
|
|
A [BepInEx 6](https://github.com/BepInEx/BepInEx) (IL2CPP) plugin that points the Rec Room client at a self-hosted / private server.
|
|
|
|
It does this entirely client-side with [Harmony](https://harmony.pardeike.net/) patches — no game files are modified on disk (except global-metadata.dat - needed for image signatures). The plugin rewrites the RecNet name-server lookups, swaps in your own Photon credentials, and disables the client-side guards (EasyAntiCheat, TLS certificate pinning) that would otherwise reject a non-official server.
|
|
|
|
> ⚠️ This disables anti-cheat and certificate validation on the client. Use at your own risk.
|
|
|
|
## Safety
|
|
|
|
Using BepInEx plugins may cause anti-virus scanners or Windows Defender to pick it up as a threat.
|
|
|
|
If you don't trust the complied .DLL, you can build it yourself.
|
|
|
|
See https://github.com/djdevin/recnet-plugin#from-source
|
|
|
|
## What it does
|
|
|
|
| Patch | File | Effect |
|
|
| --- | --- | --- |
|
|
| Name-server redirect | `Patches/SendRequestPatch.cs` | Intercepts `BestHTTP` requests and rewrites the host `ns.rec.net` → your configured server. Also provides optional HTTP request/response logging for development. |
|
|
| Photon override | `Patches/PhotonPatches.cs` | Replaces the Realtime / Voice / Chat App IDs (and optionally the Photon name server + port) with your own. |
|
|
| EAC bypass | `Patches/EACPatches.cs` | Forces EasyAntiCheat "ready" and stubs the challenge-response so the client connects without the official anti-cheat. |
|
|
| TLS bypass | `Patches/FuckOffTLS.cs` | Skips server-certificate validation so a custom server's cert is accepted. |
|
|
| Promise stub | `Patches/PromisePatch.cs` | Allows custom global-metadata.dat files without the game crashing. |
|
|
| CheatManager handling | `Plugin.cs` | Deactivates the in-game `CheatManager` (which would otherwise boot you from rooms) while keeping it resolvable for account creation / login. |
|
|
|
|
## Requirements
|
|
|
|
- A Rec Room install set up with **BepInEx 6 (IL2CPP, bleeding-edge)**, launched at least once so the IL2CPP interop assemblies have been generated under `BepInEx/interop/`.
|
|
- **.NET 6 SDK** to build the plugin.
|
|
- Your own server endpoints: a RecNet name server, and [Photon](https://www.photonengine.com) app keys.
|
|
|
|
_Looking for a custom RecNet server?_ Try https://github.com/djdevin/recflare
|
|
|
|
## Installing
|
|
|
|
1. Download the game using https://github.com/SteamRE/DepotDownloader. The manifest ID is `7859140924515540835`.
|
|
Example: `depotdownloader -app 471710 -depot 471711 -manifest 7859140924515540835`
|
|
**You must use this specific version.**
|
|
3. Install BepInEx to the game. See https://docs.bepinex.dev/articles/user_guide/installation/index.html. **Note that you must use version 6!**
|
|
|
|
Alternatively, use the [RecFlare client](https://github.com/djdevin/recflare-client)
|
|
|
|
### From release
|
|
|
|
1. Download a release from [/releases](/releases)
|
|
2. Drop the `.dll` file into `BepInEx/plugins/`
|
|
|
|
### From source
|
|
|
|
The project references the game's interop DLLs, so the build needs to know where your Rec Room install lives. Set `GamePath` using any one of:
|
|
|
|
1. **A local props file** (recommended):
|
|
```sh
|
|
cp GamePath.props.example GamePath.props
|
|
```
|
|
then edit `GamePath` in `GamePath.props` to point at your Rec Room install root. This file is local-only and stays out of the repo.
|
|
|
|
2. **An environment variable:**
|
|
```sh
|
|
set RECROOM_PATH=C:\Path\To\RecRoom # cmd
|
|
$env:RECROOM_PATH = "C:\Path\To\RecRoom" # PowerShell
|
|
```
|
|
|
|
3. **On the command line:**
|
|
```sh
|
|
dotnet build -p:GamePath="C:\Path\To\RecRoom"
|
|
```
|
|
|
|
Then build:
|
|
|
|
```sh
|
|
dotnet build
|
|
```
|
|
|
|
The build validates that `GamePath` is set and that `$(GamePath)\BepInEx\interop` exists, and fails with a clear message otherwise.
|
|
|
|
A post-build step (the `DeployPlugin` target in the `.csproj`) automatically copies the built `RecNetPatcher.dll` into your Rec Room install's `BepInEx/plugins/` folder after every build. Since `GamePath` already points at your install, you don't need to copy anything by hand — just `dotnet build` and launch the game.
|
|
|
|
If you need the DLL elsewhere, it's also left in `bin/Debug/net6.0/`.
|
|
|
|
## Configuration
|
|
|
|
Start the game for the first time. In `BepInEx` you should now see a `config` folder. If not, verify BepInEx installation and version.
|
|
|
|
Inside `config`, edit the `net.rec.plugin.cfg` file and update as needed:
|
|
|
|
**[Server]**
|
|
- `RecNet NameServer Host` — base URL of your RecNet name server (like `https://ns.rec.net`).
|
|
|
|
**[Photon]**
|
|
- `App Id Realtime` — Photon Realtime App ID.
|
|
- `App Id Voice` — Photon Voice App ID.
|
|
- `App Id Chat` — Photon Chat App ID.
|
|
|
|
**[Advanced]**
|
|
- `Enabled Advanced Settings` — must be `true` to apply the custom Photon name server / port below.
|
|
- `Photon NameServer` — custom Photon name server host.
|
|
- `Photon NameServer Port` — custom port (`0` uses the default, `4533`).
|
|
- `Debug` — verbose HTTP request/response logging (only needed for development)
|
|
> ⚠️ Debug logs include **sensitive data** (passwords, auth tokens). Be careful when sharing them.
|
|
|
|
## Project layout
|
|
|
|
| Path | Purpose |
|
|
| --- | --- |
|
|
| `Plugin.cs` | Plugin entry point, config bindings, Harmony bootstrap |
|
|
| `Patches/` | Harmony patches (HTTP, EAC, TLS, Photon) |
|
|
| `RecNetPlugin.csproj` | Build config + interop references (driven by `GamePath`), and the `DeployPlugin` post-build copy |
|
|
| `GamePath.props.example` | Template for your local `GamePath.props` |
|
|
|
|
## FAQ
|
|
|
|
**Can I use this for my own Rec Room server?**
|
|
|
|
Yes. That's the point.
|
|
|
|
## Credits
|
|
|
|
Based on https://github.com/CannedNet/CannedNet.Client
|
|
|
|
## License
|
|
|
|
[MIT](LICENSE)
|