A BepInEx library mod for R.E.P.O. that carries the stats the game simulates on the host, so they finally work while you are a co-op client.
Some upgrades in R.E.P.O. are not read on your own machine. Grab Strength, Tumble Launch, Throw and Tumble Wings are computed by the host, from the host's own copy of your character — and that copy only ever knows the upgrades you actually bought. It never learns about levels a mod gave you, and the game's stat-writing network messages are host-only by design, so a client cannot send them either.
The result: as a co-op client, those four stats do nothing, no matter which mod grants them. Your Improve points, your trained Train levels, your Berserk boost — the numbers show up, and nothing happens.
Relay is the one piece that closes that gap. Mods tell Relay what they want you to have; Relay reports it to the host, and Relay on the host applies it to the host's copy of you — the copy the game actually reads.
Settings are in BepInEx/config/headclef.Relay.cfg or in the in-game mod config menu:
| Key | Default | Description |
|---|---|---|
| Enabled | false |
Turn the bridge on. Needed on both machines — yours and the host's. |
Both you and the host must run Relay with this on. This is the single most common reason it "doesn't work": the bridge is a conversation, and it takes two. Against a host without it, nothing happens and nothing breaks — you simply keep the vanilla behaviour for those four stats.
The switch takes effect immediately, but turn it on before you connect if you want to be sure it is not the cause of a connection problem — that is the path worth testing (see below).
Improve 1.1.9 carried this bridge itself, with its own switch. That setting is gone and is not migrated. If you had it on, turn Relay's on instead:
| Improve 1.1.9 | Relay 1.0.0 | |
|---|---|---|
| File | headclef.Improve.cfg |
headclef.Relay.cfg |
| Key | Host-Simulated Stat Bridge |
Enabled |
Nothing warns you — a bridge you had switched on simply stops working until you switch this one on.
| Symptom | Cause |
|---|---|
| Nothing changes as a client | Switch off on your side, or the host's — check both |
| Berserk refuses to activate | Same thing; the log line says which half is missing |
| The force works, the damage does not scale | Character Stats is not installed — see Requirements |
| Nothing at all, no log lines | Host is not running Relay; nothing is listening |
An earlier version of this bridge, which lived inside Improve, broke multiplayer connect: the public server list would not populate, and picking a region hung the game on a loading screen forever — with no error anywhere in the log. That version subscribed to network events when the game loaded the mod and polled the network every frame, so it was live through connecting, region select and the lobby.
Relay only touches the network from inside a running level, twice a second, and stops the instant the level ends. That change is what brought the connect flow back, and it is the only evidence there is about the cause. Since the root cause was never proven outright, the switch stays off until you choose otherwise. With it off, not one line of the bridge runs, and every mod behaves exactly as it does without Relay installed.
Relay.dll into your BepInEx/plugins folder.[Multiplayer] → Enabled = true, on your machine and the host's. It does nothing until you do.Improve 1.2.0+ and Berserk 1.1.0+ will not load without Relay — it is a hard dependency for both. Installing them through Thunderstore pulls it in for you.
Note for the host: you need Relay too, with the switch on, even if you personally do not care about the feature. The whole point is that clients cannot reach these stats without you — you are the one who applies them.
This mod is only about multiplayer.
Report what you want the local player to have, and Relay handles the rest:
// Add levels on top of what the host already knows about (your purchased upgrades).
Relay.Relay.Report("your.plugin.guid", Relay.Relay.StatTumbleLaunch, 5);
// Withdraw when your effect ends.
Relay.Relay.Clear("your.plugin.guid");
// True when the bridge can actually deliver: as the host, in single player, or as a client
// once the switch is on AND the host has answered. Gate any effect whose COST is local but
// whose BENEFIT is bridged on this — otherwise a client pays and gets nothing.
if (Relay.Relay.CanDeliver) { /* ... */ }
Sources are summed, so two mods granting the same stat both land. Use your plugin GUID as the source id. Calling Report on a timer is fine — Relay only sends when a total actually changes.
├── Relay.cs # Plugin entry point, config & the public API
├── RelayBridge.cs # The bridge: sender, receiver, reconcile, Character Stats overlay
├── Patches/
│ └── RelayPatch.cs # The in-level coroutine that is the bridge's only clock
└── README.md
This project references Character Stats (compile-only, soft dependency at runtime) and is part of the Repo.slnx solution:
dotnet build ../Repo.slnx
MIT — see LICENSE.
These mods (all) generated by using AI tools. If there's anything wrong use NexusMods to give a feedback, I use there more than ThunderStore.