
L A T E
HOST-ONLY: Let friends join your R.E.P.O. game anytime!
Date uploaded | a day ago |
Version | 1.0.0 |
Download link | Nilaier-L_A_T_E-1.0.0.zip |
Downloads | 3123 |
Dependency string | Nilaier-L_A_T_E-1.0.0 |
This mod requires the following mods to function

BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2100README
L.A.T.E - Late Access To Everyone 🚀
This is a purely host-sided BepInEx mod for R.E.P.O. that allows players to join your game session even after it has started (late joining).
✨ Key Features
- Enable Late Joining: Allows clients to connect to the host even after a level (including Shop, Truck, Arena) is in progress.
- Configurable Join Restrictions: Control which scenes (Shop, Truck, Level, Arena) allow late joins via the configuration file.
- Comprehensive State Synchronization: Attempts to synchronize a wide range of game states for late joiners, including:
- Current level progress and status (Game Over).
- Extraction Point status, goals, and surplus value.
- Valuable item values (in levels) and Shop item values (in the shop).
- Item States (Toggles, Battery, Mines, Melee, Drones, Grenades, Trackers, Health Packs).
- Destroyed objects and broken hinges/doors.
- Truck screen page and text initialization.
- Enemy Presence & State (Spawned/Despawned, Target, Freeze, Specific Behaviors - see code for full list).
- Arena-specific state (Cage, Winner, Pedestal).
- Voice chat initialization status.
- Spawn Location Options:
- (Default) Attempts to find a safe, unoccupied spawn point.
- (Optional) Respawn returning players at their last known position (or death head).
- Death State Handling:
- (Optional) Automatically re-kills late joiners if they previously died in the current level instance.
- Configurable Logging: Adjust the mod's log level on the fly (Info, Debug, Warning, etc.).
- Advanced Option:
- (Use with Caution!) Optionally force a level reload for everyone on late join.
⚠️ IMPORTANT: Host-Only ⚠️
This mod only needs to be installed by the person HOSTING the game.
Clients connecting DO NOT need this mod. If clients install it, it will likely have no effect or potentially cause issues. The host running the mod handles all the logic.
💾 Installation
Automatic (Mod Manager) – Recommended
- Use a mod manager like Thunderstore Mod Manager, r2modman, or GaleModManager.
- Install this mod via the mod manager by clicking the “Install with Mod Manager” button (or similar) on the Thunderstore page.
- Ensure BepInEx 5.4.21 is also installed (mod managers usually handle this automatically).
- Launch the game via the mod manager. ✅
Manual
- Ensure you have BepInEx 5.4.21 installed for R.E.P.O.
- Download the latest release of this mod from the Thunderstore page (usually labelled “Manual Download”).
- Extract the downloaded archive.
- Move the
L.A.T.E.dll
file into yourBepInEx/plugins
folder within your R.E.P.O. game directory. - Launch the game normally. ✅
⚙️ Configuration
A configuration file nilaier.late.cfg
will be generated in your BepInEx/config
folder after running the game with the mod installed once.
You can edit this file directly using a text editor, OR you can use an in-game configuration editor mod for easier adjustments!
Recommended: Use REPOConfig by nickklmao to edit the settings directly within the game's main menu!
Click to view all settings
[General]
Allow in shop
: (Default:true
)Allow in truck
: (Default:true
)Allow in level
: (Default:true
)Allow in arena
: (Default:true
)
[Late Join Behavior]
Kill If Previously Dead
: (Default:true
)Spawn At Last Position
: (Default:true
)
[Advanced (Use With Caution)]
Force Level Reload on Late Join
: (Default:false
) HIGHLY DISRUPTIVE!
[Debugging]
Log Level
: (Default:Info
)
🤝 Compatibility & Testing Environment
- Patches core game systems (networking, loading, spawning, items, enemies) using Harmony and MonoMod.
- Game Version: developed & tested on stable R.E.P.O. build 0.1.2.
- Beta Builds: untested – may break. 🚧
- Heavy reflection: future game updates are likely to break the mod until updated.
⛔ Known Incompatibilities
- Mods Tracking/Modifying Valuable Totals
- e.g.
Map_Value_Tracker
orShowTotalLoot
- Values shown may be incorrect because of L.A.T.E.’s resync.
- e.g.
- Mods Using Custom RPCs without Late-Join Handling
- Late joiners may desync if the other mod doesn’t resend state.
🤔 Known Issues
- Spawn/Truck position glitches
- Extraction Point value desync on high latency
- Inventory pickup failures, visual desync, lighting oddities
- Enemy animation “T-pose” on late join
- Brief host-side hitch when syncing many entities
- General desync potential –
Force Level Reload
is a last resort
🐛 Reporting Issues
Found a bug? Please open an issue on the
GitHub Issues page.
Include:
nilaier.late.cfg
BepInEx/LogOutput.log
- R.E.P.O. version (
0.1.2 Stable
,0.1.2_21 Beta
, etc.) - What happened
- Other mods in use
🙏 Acknowledgements
- Semiwork – for R.E.P.O. ❤️
- Rebateman – original LateJoin mod inspiration
- Zehs – LocalMultiplayer for easier testing
- BepInEx, HarmonyLib, MonoMod teams – frameworks & patching libraries
📜 License
Distributed under the GNU GPL v3.0.
See the full text here: https://www.gnu.org/licenses/gpl-3.0.html
CHANGELOG
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.1.0] - 2025-05-07
Added
- R.E.P.O. Beta Compatibility:
- Full support for R.E.P.O. Open Beta
0.1.2_22beta
alongside stable0.1.2
. - Implemented dynamic game version detection (
GameVersionSupport.cs
) to correctly interface with differentSteamManager.UnlockLobby()
signatures (parameterless for stable,UnlockLobby(bool open)
for beta). This ensures proper Steam lobby visibility control across game versions.
- Full support for R.E.P.O. Open Beta
- Museum Map (
Module
) Support:- Introduced synchronization for
Module
components (LateJoinManager.SyncModuleConnectionStatesForPlayer
). - Late joiners will now correctly see the connection states (Top, Bottom, Left, Right, First) of map modules, crucial for new maps like "Museum" that utilize this system. This is achieved by re-sending the
ModuleConnectionSetRPC
to the joining player. - Added reflection helpers for
Module
fields (SetupDone
,ConnectingTop
, etc.) inUtilities.cs
.
- Introduced synchronization for
- Early Lobby Locking Mechanism:
- The game lobby is now locked earlier during level transitions initiated from the truck screen (e.g., when "Start Game" or "Return to Lobby with Loot" is confirmed).
- This is achieved by new prefix patches on
TruckScreenText.PlayerChatBoxStateLockedDestroySlackers
andTruckScreenText.PlayerChatBoxStateLockedStartingTruck
. - This proactive locking (
EarlyLobbyLockHelper.TryLockLobby
) prevents players from joining during potentially unstable mid-transition phases, beforeRunManager.ChangeLevel
fully manages the lobby state.
- Lobby Unlock Failsafe:
- Implemented a coroutine-based failsafe (
Patches.LobbyUnlockFailsafeCoroutine
) to ensure the game lobby unlocks if the intended mechanism (viaGameDirector.SetStart
) is prevented from running (e.g., due to another mod's interference). - If the lobby is meant to be open but remains locked after a timeout, the failsafe will force it open. This is armed during
RunManager_ChangeLevelHook_Postfix
and disarmed byGameDirector_SetStart_Postfix
.
- Implemented a coroutine-based failsafe (
- Configurable Lobby Lock on Level Generation Failure:
- Added a new configuration option:
Lock Lobby On Level Generation Failure
(Default:true
) under the "Late Join Behavior" section. - When
true
(default), if a level reports a generation failure (and doesn't transition to the Arena), the lobby will be locked, preventing late joins. - When
false
, if a modded level reports a generation failure but the game continues (i.e., doesn't crash to Arena), L.A.T.E. will still evaluate normal scene-based join rules (Shop, Truck, Level) as if the failure didn't occur. This can be useful for modded levels that might incorrectly flag a failure but still load. This setting does not affect true failures that lead to the Arena scene.
- Added a new configuration option:
Changed
- Enhanced Hinge/Door Synchronization:
- Improved synchronization for
PhysGrabHinge
objects (e.g., doors, lockers, cabinets). - In addition to the existing
broken
state sync (HingeBreakRPC
), the mod now also syncs the open/closed state for late joiners using thePhysGrabHinge.closed
field andOpenImpulseRPC
. (Ref:DestructionManager.SyncHingeStatesForPlayer
) - This provides a more consistent visual and interactive state for these objects.
- Improved synchronization for
- Lobby Open/Close Logic Refinement:
- The
Patches.ShouldAllowLobbyJoin
logic now uses directRunManager
level instance comparisons (e.g.,runManager.levelCurrent == runManager.levelArena
) instead of relying solely onSemiFunc
helper methods. This offers more precise control over lobby joinability based on the current scene, especially during level transitions. GameDirector.SetStart
(postfix patch) is now the definitive point for unlocking the lobby after level generation and loading, if conditions permit. It also handles disarming the new lobby unlock failsafe.
- The
- Mod Incompatibility Documentation:
- Updated
README.md
to reflect successful testing and support for R.E.P.O.0.1.2_22beta
. - Added new known mod incompatibilities to
README.md
:FastStartup
Imperium_Repo
(due to patchingLevelAnimationCompleted
)
- Updated
Fixed
- Resolved
BerserkerEnemies
Incompatibility: Addressed a previous incompatibility withBerserkerEnemies
that could cause issues with level generation completion hooks (e.g., preventing L.A.T.E.'sGameDirector.SetStart
postfix from running).- This was fixed by adjusting Harmony patch execution order, specifically by applying
[HarmonyPriority(Priority.Last)]
to L.A.T.E.'sGameDirector_SetStart_Postfix
andPlayerAvatar_LoadingLevelAnimationCompletedRPC_Prefix
patches. - This ensures L.A.T.E.'s critical lobby management and synchronization logic executes after potentially conflicting modifications from other mods that hook into the same game methods.
- This was fixed by adjusting Harmony patch execution order, specifically by applying
[1.0.0] - 2025-05-05
Initial Release
Added
- Core functionality allowing players to join games already in progress (Late Joining).
- Host-Only operation: Mod logic runs entirely on the host.
- Configuration options (
BepInEx/config/LATE.cfg
):- Enable/disable joining in Shop, Truck, Level, Arena scenes.
- Option to re-kill players who died before leaving/rejoining the same level instance (
Kill If Previously Dead
). - Option to spawn rejoining players at their last known position or death head (
Spawn At Last Position
). - Advanced option to force a level reload for everyone on late join (
Force Level Reload on Late Join
). - Configurable log level for debugging (
Log Level
).
- Comprehensive state synchronization for late joiners:
- Level state (
RunManager
: level name, completion status, game over). - Level generation completion (
LevelGenerator
). - Extraction Point state (
ExtractionPoint
: state, goal fetched, current goal value, surplus value, shop status, active/inactive status). - Valuable Objects (
ValuableObject
: current dollar value). - Shop Items (
ItemAttributes
: current value). - Player Death Status (
PlayerStateManager
,PlayerAvatar.PlayerDeathRPC
). - Truck Screen (
TruckScreenText
: initialization, current page). - Prop Switch setup trigger (
ValuableDirector
). - Destroyed Physics Objects (
PhysGrabObject.DestroyPhysGrabObjectRPC
). - Destroyed Impact Objects (
PhysGrabObjectImpactDetector.DestroyObjectRPC
). - Broken Hinges (
PhysGrabHinge.DestroyHingeRPC
,HingeBreakRPC
). - Item States via specific RPCs:
ItemToggle
:ToggleItemRPC
(On/Off),ToggleDisableRPC
(Interactable).ItemBattery
:BatteryFullPercentChangeRPC
.ItemMine
:StateSetRPC
.ItemMelee
:MeleeBreakRPC
,MeleeFixRPC
.ItemDrone
:ButtonToggleRPC
.ItemHealthPack
:UsedRPC
.ItemGrenade
:TickStartRPC
.ItemTracker
:SetTargetRPC
.
- Enemy synchronization:
- Spawn/Despawn status via
EnemyParent
(SpawnRPC
,DespawnRPC
). - Target Player View ID (
Enemy.TargetPlayerViewID
,UpdatePlayerTargetRPC
, etc.). - Frozen status (
Enemy.FreezeRPC
). - Specific states/targets for numerous enemy types (Animal, Bang, Beamer, etc. - see README for full list).
- Notifies enemies when players join (
PlayerAdded
) or leave (PlayerRemoved
).
- Spawn/Despawn status via
- Arena-specific state (
Arena
):DestroyCrownCageRPC
,CrownGrabRPC
(Winner),PlayerKilledRPC
(Pedestal Count). - Voice chat state initialization (
VoiceManager
,PlayerAvatar.UpdateMyPlayerVoiceChat
).
- Level state (
- Player Position Tracking (
PlayerPositionManager
) forSpawn At Last Position
feature. - Patching Mechanisms:
- Uses HarmonyLib (Attribute and Explicit patches) and MonoMod Hooks.
- Patches
NetworkManager
,RunManager
,PlayerAvatar
,PhysGrabObject
,PhysGrabObjectImpactDetector
,PhysGrabHinge
,EnemyVision
,EnemyTriggerAttack
,NetworkConnect
,GameDirector
.
- Utilities class (
Utilities
) for caching reflected members and helper functions. - Fix for potential
EnemyVision
dictionary errors when late joiners trigger vision/attacks. - Forces
PhotonNetwork.AutomaticallySyncScene = true
early for joining clients viaNetworkConnect
patch. - Extraction Point Item Resync: Teleports items in the EP out and back to force clients to re-evaluate their state (addresses potential value desync).