You are viewing a potentially older version of this package. View all versions.
Nilaier-L_A_T_E-1.0.0 icon

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-5.4.2100 icon
BepInEx-BepInExPack

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

Preferred version: 5.4.2100

README

L.A.T.E - Late Access To Everyone 🚀

Thunderstore Version Thunderstore Downloads Thunderstore Likes

GitHub Stars GitHub Forks GitHub Watchers

BepInEx

L.A.T.E Banner

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

  1. Use a mod manager like Thunderstore Mod Manager, r2modman, or GaleModManager.
  2. Install this mod via the mod manager by clicking the “Install with Mod Manager” button (or similar) on the Thunderstore page.
  3. Ensure BepInEx 5.4.21 is also installed (mod managers usually handle this automatically).
  4. Launch the game via the mod manager. ✅

Manual

  1. Ensure you have BepInEx 5.4.21 installed for R.E.P.O.
  2. Download the latest release of this mod from the Thunderstore page (usually labelled “Manual Download”).
  3. Extract the downloaded archive.
  4. Move the L.A.T.E.dll file into your BepInEx/plugins folder within your R.E.P.O. game directory.
  5. 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
  • 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:

  1. nilaier.late.cfg
  2. BepInEx/LogOutput.log
  3. R.E.P.O. version (0.1.2 Stable, 0.1.2_21 Beta, etc.)
  4. What happened
  5. Other mods in use

🙏 Acknowledgements

  • Semiwork – for R.E.P.O. ❤️
  • Rebateman – original LateJoin mod inspiration
  • ZehsLocalMultiplayer 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 stable 0.1.2.
    • Implemented dynamic game version detection (GameVersionSupport.cs) to correctly interface with different SteamManager.UnlockLobby() signatures (parameterless for stable, UnlockLobby(bool open) for beta). This ensures proper Steam lobby visibility control across game versions.
  • 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.) in Utilities.cs.
  • 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 and TruckScreenText.PlayerChatBoxStateLockedStartingTruck.
    • This proactive locking (EarlyLobbyLockHelper.TryLockLobby) prevents players from joining during potentially unstable mid-transition phases, before RunManager.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 (via GameDirector.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 by GameDirector_SetStart_Postfix.
  • 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.

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 the PhysGrabHinge.closed field and OpenImpulseRPC. (Ref: DestructionManager.SyncHingeStatesForPlayer)
    • This provides a more consistent visual and interactive state for these objects.
  • Lobby Open/Close Logic Refinement:
    • The Patches.ShouldAllowLobbyJoin logic now uses direct RunManager level instance comparisons (e.g., runManager.levelCurrent == runManager.levelArena) instead of relying solely on SemiFunc 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.
  • 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 patching LevelAnimationCompleted)

Fixed

  • Resolved BerserkerEnemies Incompatibility: Addressed a previous incompatibility with BerserkerEnemies that could cause issues with level generation completion hooks (e.g., preventing L.A.T.E.'s GameDirector.SetStart postfix from running).
    • This was fixed by adjusting Harmony patch execution order, specifically by applying [HarmonyPriority(Priority.Last)] to L.A.T.E.'s GameDirector_SetStart_Postfix and PlayerAvatar_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.

[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).
    • Arena-specific state (Arena): DestroyCrownCageRPC, CrownGrabRPC (Winner), PlayerKilledRPC (Pedestal Count).
    • Voice chat state initialization (VoiceManager, PlayerAvatar.UpdateMyPlayerVoiceChat).
  • Player Position Tracking (PlayerPositionManager) for Spawn 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 via NetworkConnect 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).