RicketyWrecked-LatejoinMapSyncFix icon

LatejoinMapSyncFix

Fixes for joining R.E.P.O mid-level: uncovers map rooms explored before you arrived, sets up level pieces that never reached you (invisible holes, phantom walls) and stops resting enemies appearing frozen. Works with LateJoinNow.

Last updated 20 minutes ago
Total downloads 339
Total rating 1 
Categories Mods AI Generated Quality Of Life
Dependency string RicketyWrecked-LatejoinMapSyncFix-1.1.0
Dependants 1 other package depends on this package

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2100 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2100

README

Latejoin Map Sync Fix

Fixes three things that go wrong when you join a R.E.P.O lobby in the middle of a level (with a late-join mod such as LateJoinNow):

  • A covered map. The map uncovers a room when the game sees a player walk into it, and every player's game does that on its own - nothing about it is shared. Join mid-level and every room explored before you arrived stays covered until the next level. This mod uncovers them.
  • Enemies frozen in one room. Enemies spend part of each level resting off the map. The game only announces an enemy leaving or coming back to the players already there, so a mid-level joiner saw every resting enemy standing frozen where it was created. As host, this mod tells each joiner which enemies are resting - using the game's own message, so it works for joiners without any mods.
  • Invisible holes and phantom walls. When the host builds a level, each level piece is told which of its sides connect to a neighbour, which decides its floor bridges, walls and pit covers. That message is only sent to players already in the game, so a mid-level joiner can end up with holes they fall straight through and walls that aren't really there. This mod sets those pieces up on your side the same way the host did.

How the map part works

  • Host and joiner both have this mod: when someone joins mid-level, the host sends them the rooms explored so far, and their map uncovers exactly those.
  • Only the joiner has it: nothing can be sent, so by default nothing changes. Turn on RevealAllRoomsWhenHostHasNoMod to uncover the whole map instead when the host doesn't have the mod (note: that also shows rooms nobody has explored yet).
  • Players without the mod are never affected.

The level-piece repair only needs the mod on the joiner's side. It waits a few seconds after you arrive so that anything the host's late-join mod resends lands first, and it only touches pieces that are still not set up.

Settings

BepInEx/config/ricketywrecked.repo.mapsyncfix.cfg, or REPOConfig in-game. Restart the game after changing.

Setting Default What it does
MapSync on Host: send explored rooms to mid-level joiners. Joiner: uncover the rooms the host sends.
RevealAllRoomsWhenHostHasNoMod off Joiner: uncover every room if the host can't send its list.
LevelRepair on Joiner: set up level pieces whose setup message never arrived.
EnemySync on Host: tell mid-level joiners which enemies are resting, so they don't see them frozen. Works for joiners without the mod.

For the technically curious

  • Map: RoomVolume.SetExplored() is called locally from each player's RoomVolumeCheck; nothing is networked. A mid-level join is detected on the client as the first RunManager.UpdateLevel in a Photon room being a real level within 10 s of OnJoinedRoom, acted on at LevelGenerator.GenerateDone. The host, on a remote PlayerAvatar.Start during a running level, sends the positions of explored RoomVolumes (raise-event 163, tagged). The joiner matches them by position and only marks a room explored once its MapModule cover exists.
  • Level pieces: Module.ModuleConnectionSetRPC goes to RpcTarget.All (not buffered). The joiner rebuilds each unset piece's sides from neighbouring pieces 15 units away (plus the first piece's connection to the start room) and runs the game's own ModulePropSwitch.Setup(). A guard makes the RPC ignore pieces that are already set up, because running Setup() twice rotates the switches onto the wrong side.
  • Enemies: EnemyParent.SpawnRPC/DespawnRPC go to RpcTarget.All (not buffered) and its network sync only carries SetupDone, so a joiner builds every enemy from the cached instantiate with its body enabled. On a remote PlayerAvatar.Start during a running level, the host sends that player the vanilla DespawnRPC for each enemy whose Spawned is false (at 4 s and again 6 s later).

Good to know

  • The BepInEx name is "Map Sync Fix" (GUID ricketywrecked.repo.mapsyncfix) on purpose: LateJoinNow warns about any other plugin whose name contains "late" or "join".
  • Only needs BepInEx. Doesn't affect who can join: players without any mods can still join, and the enemy fix works for them.

License

Copyright (c) 2026 RicketyWrecked. All rights reserved. You may download and play with this mod, and list it as a dependency in your own Thunderstore modpack. You may not copy, modify, decompile, reuse or re-upload any of it without written permission - see the included LICENSE file. Permission requests: Discord.

Credits

Made by RicketyWrecked. Not affiliated with the R.E.P.O developers or any of the mods mentioned above.

Questions, bug reports, or suggestions: Discord.