Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
REPO Fixes Antispam Latency Fix
Fixes for R.E.P.O multiplayer: late-join enemy tracking errors, grab-beam log spam, instant grab-beam response, a stuck revive item, and LateJoinNow destroying equipped gear on level change.
| Date uploaded | 3 weeks ago |
| Version | 1.1.1 |
| Download link | RicketyWrecked-REPO_Fixes_Antispam_Latency_Fix-1.1.1.zip |
| Downloads | 241 |
| Dependency string | RicketyWrecked-REPO_Fixes_Antispam_Latency_Fix-1.1.1 |
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
R.E.P.O Fixes+
Five small, independent fixes for problems that show up in modded R.E.P.O lobbies. Each one has its own on/off switch, so you only need whichever ones apply to you.
What it fixes, in plain terms
- Enemy tracker fix (late joiners) - Fixes lag or a stuck loading screen when someone joins your game after it's already started. Without this, every enemy that doesn't "know" about the late joiner throws an error every time it tries to see or track them - it can add up to serious stutter the longer the match runs.
- Grab beam antispam - Stops your log file (and sometimes your framerate) from getting flooded with errors when something you're holding with the grab beam gets destroyed mid-grab (thrown in a fire, extracted, killed, etc). Purely a cleanup fix - grabbing itself doesn't change.
- Instant grab beam - Makes your own grab beam turn on and off the instant you click, instead of visibly lagging behind your input in multiplayer. Other players are unaffected either way.
- Revive item fix - If you use the revive item on a downed teammate and they leave the game before getting revived, the item used to get permanently stuck "looking" for them and spam errors nonstop until the level ended, which could tank your host's performance. This notices and clears it automatically.
- LateJoinNow equipped-item fix - Only does anything if you also use LateJoinNow. Without this, LateJoinNow deletes everything currently equipped in your 3 belt slots (weapons, tools, purchased gear) every time the level changes - buy something and equip it, and it's gone the moment you load into the next level. This protects your equipped gear so it survives.
Turn any of these off individually in the config if you don't need them (BepInEx/config/ricketywrecked.repo.fixesplus.cfg, or through REPOConfig in-game).
For the technically curious
Enemy tracker fix (late joiners)
The base game registers each player with every enemy's vision tracking once, when the level's first enemy wave finishes spawning. Anyone who joins after that, or any enemy that spawns after they joined, is never registered. The missing entry throws a KeyNotFoundException every time that enemy checks vision or on-screen state for that player. It can repeat tens of thousands of times in a session and cause heavy stutter or a stuck load.
This registers joining players with every enemy tracker in the scene, registers all current players with each new enemy tracker, and adds a self-healing guard at the exact spot the game was crashing. It only calls the game's own one-shot registration method. Nothing polls and there is no per-frame cost.
Grab beam antispam
When something you are grabbing is destroyed (killed, extracted, despawned), the beam and player eye-tracking keep reading a transform that no longer exists for a frame. That throws NullReferenceException in PhysGrabBeam.DrawCurve and PlayerEyes.LookAtTransform, thousands of times over a long session.
DrawCurve gets the missing null checks. LookAtTransform has several unguarded branches, so it is wrapped in a catch-all instead. Suppression messages in the log are rate limited, so the mod doesn't create spam of its own.
Instant grab beam
In multiplayer the game sends "beam on" and "beam off" to everyone including yourself, so your own beam only appears after a round trip to the network. This runs your own beam locally straight away and tells the other players as usual. It also removes the beam's sound and camera-shake delay.
Other players' beams are unchanged, and other players don't need the mod: it sends the same messages the game already sends.
Revive item fix
The revive item locks onto a dead player's head. If that player leaves the lobby while dead, the item keeps targeting a head that no longer exists and throws a NullReferenceException every frame (about 40 a second) until the level ends, which costs the host frame rate. The game can't clear it on its own either.
This notices when the target is gone, clears it, and tells the other players the same way the game normally does, so the item goes back to looking for other dead players.
LateJoinNow equipped-item fix
LateJoinNow destroys every non-persistent networked object in the scene on every level change, to keep late-joiners from seeing stale objects from the previous level. Its own "what to keep" list only protects player avatars - nothing about whatever gear they currently have equipped. The result: purchased items sitting in a belt slot are destroyed the moment the level changes, for every player, host included - buy something in the shop and it's gone when the next level loads.
ItemEquippable already tracks a network-synced isEquipped flag for exactly this. This adds every currently-equipped item to LateJoinNow's own keep list, the same mechanism it already uses to protect players. Only equipped gear is protected - anything merely being carried/grabbed at that instant (valuables, junk) still resets, same as vanilla.
Requires LateJoinNow to do anything; finds it by name at runtime, so this mod doesn't need LateJoinNow's DLL to build against and simply does nothing if it isn't installed.
Settings
Each fix can be turned off in the config file (BepInEx/config/ricketywrecked.repo.fixesplus.cfg, or through REPOConfig). Restart the game after changing them.
| Setting | Default | What it controls |
|---|---|---|
EnemyTrackerFix |
on | Late-joiner enemy tracker fix |
GrabBeamAntispam |
on | Null guards and log-spam suppression |
InstantGrabBeam |
on | Instant local grab beam |
ReviveItemFix |
on | Revive item stuck on a player who left |
LateJoinNowEquippedItemFix |
on | Equipped gear survives level changes (needs LateJoinNow) |
If anything about grabbing feels off in your lobby, turn off InstantGrabBeam first.
Good to know
- Grabbed objects can still feel delayed when you are not the host. The game runs physics on the host and streams the result to you, and this mod does not change that.
- A patch that can't apply (for example after a game update) is logged and skipped, and the other fixes still load.
- Only needs BepInEx. Works alongside LateJoinNow, MorePlayers and similar mods, and was built and tested in a heavily modded profile on R.E.P.O v0.4.4.3.
- Every fix runs on your own game. Other players in your lobby don't need this mod, and having it or not doesn't affect who can join.
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.
CHANGELOG
Changelog
1.3.8
LevelTeardownErrorGuards: the same "player who has since left" grab message no longer shows an error for doors, levers and other fixed grab points either (StaticGrabObject.GrabLinkRPC, once when joining).
1.3.7
- New setting
VoiceLogCrashFix(on): a voice chat error can no longer crash the game. Photon Voice (the game's voice chat) builds some of its log lines by pasting the error's text into a format string, so a{or}in that text made the logging itself throw a second error (FormatException: Input string was not in a correct format, fromPhoton.Voice.RemoteVoice.decodeThread). On a voice's decode thread nothing catches that, and the game could close. Those lines are now written safely, so the real voice error shows in the log instead. Only changes logging; works whatever mods the other players have. LevelTeardownErrorGuards: no error when you join a lobby where a player who has since left had been grabbing something (the game replays their "grab link" message with no sender; once per join).
1.3.6
- New setting
ProfileButtonVolumeFix(on): clicking a player's Steam profile button in the pause menu no longer turns their voice up to 200%. The game's volume slider next to it reacted to the mouse a little past its end, right where the profile button sits, so just hovering the button moved the slider's marker to the far end and clicking set it there. The slider now ignores the mouse while it's on the profile button. Only changes your own menu.
1.3.5
- A Ko-fi support button on this page. No changes to how the mod works.
1.3.4
- GameTools only (
OtherModGuards): fewer players revived inside a cart and crushed into the ceiling. A player who died in a small cart was revived in it 20 ms later, before the cart check had a chance to see where they died, and died again 26 s later with their head stuck on the ceiling. The revive now waits until the head has dropped. The search for clear floor beside the cart no longer mistakes the cart itself (or players) for a wall or the floor, and when there really is no room beside the cart, the revive waits instead of happening inside it. - Toggle Mute only (
OtherModGuards): its key now uses the game's own mute. Toggle Mute was made before the game had a mute of its own, and it switched your microphone off by itself: other players saw you talking but heard nothing (nobody could tell you were muted), the game's own mute key (B) showed MUTED while your mic kept sending, and its mute stayed on through rejoining. Now its key flips the game's mute: the game's MUTED sign shows, other players see you're muted, and B and the Toggle Mute key do the same thing. - New setting
RejoinVoiceFix(on): after you drop out of a lobby and rejoin without restarting the game, other players can hear you again. Your voice chat object from before could stay loaded, so the game threw away the fresh one it made for your new connection and your microphone kept sending to a connection that no longer existed: you could hear everyone, but nobody heard you. The old one is now thrown away instead. Only changes your own voice; works whatever the host has. - Also in
RejoinVoiceFix: when another player's voice object reaches you twice (their old copy after they rejoin, or the host's late-join mod sending it again), the game threw away both copies. You couldn't hear that player, and their character threw an error every frame (3,485 in one minute). The new copy is now kept, and their character is linked to it. EnemyAttackFix(host): a Tumbler chasing a player who leaves the game no longer freezes mid-chase and throws an error every frame for the rest of the level (1,554 errors in 30 s in one lobby). It stops the chase as the game does when one ends.LevelTeardownErrorGuards: no error when you look at a player in the moment they finish joining, before their name tag exists (one per late joiner).- The voice fix's log names the player instead of "a player" when their voice isn't tied to a character yet.
- The stuck-voice repair skips players whose game is muted: the game still marks them as talking from their mic level, so they looked stuck.
LevelTeardownErrorGuards: no error spam when a player leaves while using the shop's cosmetic machine (it kept animating their token: dozens of errors a second), or while the valuable-throwing enemy is after them (it now goes back to idle and picks someone else instead of erroring every frame).- The voice fix only restarts a player's voice when their voice is actually arriving but not playing. The game marks players "talking" from their mic level even when they aren't sending (push-to-talk not held), and in a long session most restarts were for those, which did nothing.
LevelTeardownErrorGuards: no error when a tranquilizer dart hits a player who is still joining (their voice isn't set up on your side yet).LevelTeardownErrorGuards: no error when you join a lobby where a player who has since left had been grabbing something (the game replays their "grab beam off" message with no sender; once per join).- Fixed: a player whose voice pointed at a voice object that doesn't exist (the bug above, on their side) no longer throws an error on everyone else's game.
1.3.3
- New (GameTools only,
OtherModGuards, host): players revived "on a cart" no longer end up stuck. GameTools revived them where their head lay, inside the cart's basin, and the cart shoved or crushed them, often into the ceiling: in one session 32 of 54 cart revives died again within 30 seconds. The head is now moved to a clear spot on the floor beside the cart first, then GameTools revives them. Works for players without the mod. - Less work every frame in big lobbies: the stuck-voice watchdog looks up each player's voice components once instead of every frame, and the See who is talking fix refreshes names once a second.
- Fixed: the See who is talking fix (added in 1.3.0) never switched on, so its "is speaking" list in the bottom-right corner kept showing the wrong name, or "Player N", for players who joined later. It now always shows the name of the player who is talking.
1.3.2
- New (RepoCasino only,
OtherModGuards, host): the blackjack table no longer stops working after a long session. RepoCasino deals every card as a new network object and only hid old cards between hands, so after about 30 minutes the room ran out of object IDs ("out of 'room' viewIDs") and no new hand could be dealt. The host now deletes a hand's cards when the hand ends. Works for players without the mod.
1.3.1
- New (BetterMap Fixer only,
OtherModGuards): no more lag that builds up and stays. BetterMap Fixer added a new map icon to a player for every revive message, even ones the game ignored: one player's own GameTools sent about 80 a second for 6 minutes, leaving 14,800 icons on them, a 3-second freeze when they were really revived, and about half the frame rate until the level ended. A player now keeps one icon. Its icon removal on death also no longer throws an error.
1.3.0
- New setting
StuckVoiceFix(on): fixes one player's voice going silent for you alone (everyone else still hears them) until they leave and rejoin. When their game restarts its voice stream and the new stream arrives before the old one ends, the new one now takes over, and if someone is talking but nothing has played for 4 seconds, their voice is re-linked. - New (See who is talking only,
OtherModGuards): it shows the right player's name as speaking. It used the voice chat's player number, which drifts apart from the game's as players rejoin.
1.2.9
- New (GameTools only,
OtherModGuards): a host's GameTools heal request heals you once. Its leftover request used to heal you to full 10 times a second for as long as it stayed (960 heals in under 2 minutes in one lobby), which looks like god mode to everyone else and can get you banned.
1.2.8
- New (SoloHUD only,
OtherModGuards): players' name tags show over their heads in levels again. SoloHUD keeps the map switched on for its minimap, and the game hides name tags while the map is open; now only holding the map tool hides them. - New (GameTools only,
OtherModGuards): no more revive flood. When the host revived a player who also has GameTools, GameTools left a "revive yourself" request that player's game answered up to 10 times a second for minutes (48,000+ revives in one session). The host's own revive is used instead, and players with this mod ignore such requests. - New setting
HideKinematicVelocityWarnings(on): hides Unity's "Setting linear/angular velocity of a kinematic body is not supported" warnings that cosmetics (hair, outfit pieces) trigger thousands of times a session.
1.2.7
- New (Repo Admin Menu only,
OtherModGuards): its per-player checks threw when someone joined (Steam ID not known yet), skipping the game's own update for that frame. - New (
LevelTeardownErrorGuards): a player dying before their colours arrived left their body standing (the death stopped halfway with an error); a joiner's grab upgrades weren't applied when their Steam ID wasn't known yet; one error when a player leaves while you turn a held object; and an error every frame on the host after a player left (or was kicked) while holding a door, lever or other fixed object. - New (
SpawnedItemsKeep, host): items spawned by a mod (e.g. Repo Admin Menu) disappeared at the next level and could take the saved name of an item a player already had, mixing the two up. They now get their own name and count as owned, like shop items. - New (
TruckItemsKeep, host, with NoItemSpawnLimit): bought items that don't fit the truck's spots no longer come back outside the truck or in a wall; they go on top of truck spots of their size. - New (XH DamageShow & EnemyHealthBar only,
OtherModGuards): its Chinese welcome popup in the middle of the screen is hidden. - New (
ExtractionSoftlockFix, host): a player joining mid-level after the first extraction was finished could make the host start that finished point again, locking every other extraction point for the rest of the level. The host now only starts a point that is ready.
1.2.6
- New (GameTools only): a player who dies in a cart is no longer revived on the spot by GameTools' cart revive (and killed again a second later); it waits until their head is taken out and put back.
1.2.5
- New: no more red
EnemyDirector.Starterror every time the truck loads (LevelTeardownErrorGuards).
1.2.4
- New: a Spewer latched onto a player when the level changes no longer stays stuck (and erroring every frame) into the next level (
EnemyAttackFix). - New (LateJoinNow only,
LateJoinNowPrivateLobbyFix): in private games LateJoinNow no longer re-opens the Steam lobby every 5 seconds. - New (
ServerListJoinRetry): joining from the server list retries "Game closed" / "Game full" up to 4 times instead of sending you back to the main menu. - The version shown by BepInEx now matches the package (it had stayed at 1.2.1).
- Late-join map sync and level-piece repair, tested in development builds of this mod, ship as their own mod: LatejoinMapSyncFix.
1.2.3
- New option
ToggleMuteShowIndicator(Toggle Mute only, default on): turn it off to drop Toggle Mute's on-screen MUTED text and its "Could not find text to clone" error, while keeping the mute toggle (and its "not while typing in chat" check).
1.2.2
- New (LateJoinNow only,
LateJoinNowVoiceFix): players who join mid-level without LateJoinNow now receive the other players' voice chat objects. LateJoinNow's message for this was refused by Photon every time. - New (GameTools only): its extraction-point auto revive waits while an extraction is running. Before, the revived player was killed again by the tube and then missed by the game's own end-of-extraction revive.
- New: no more error burst from the fog code right after leaving a match or being kicked.
- Added a LICENSE file (all rights reserved; using it and listing it in modpacks is fine).
1.2.1
- New: stops a per-frame error flood from a character that never finished setting up (the character preview in menus, or a player on a different game version). The preview is linked up properly; anything else is skipped quietly and named once in the log.
- New: being revived no longer crashes the spectator camera's cleanup and skips the end of the revive.
- New: no more error burst from the room lighting right after leaving a match.
- New (GameTools only): only the lobby host can remotely kill, revive or heal you, and a kill + revive requested at the same time (which looped) is ignored.
- All of the above are under the existing
LevelTeardownErrorGuardsandOtherModGuardsswitches.
1.2.0
- New: Slow Walker stuck-attack fix (
EnemyAttackFix). - New: more level-teardown error guards -
PlayerEyes.ClosestPhysGrabPoint,PhysGrabObject.PhysicsGrabbingManipulation,PhysGrabber.OverrideDisableGrabLookAt(underGrabBeamAntispam) and the tumble wings upgrade (LevelTeardownErrorGuards). - New: items in extra inventory slots (4+) carried between levels (
ExtraSlotsKeepItems). - New: longer connection timeout, 30 s by default (
ConnectionTimeoutSeconds). - New: lighter logging - no stack traces for ordinary log lines and warnings (
NoStackTracesOnInfoAndWarnings). - New: guards for other mods, only active when installed (
OtherModGuards): Hauler Unlimited Storage no longer destroys non-valuables, Crouch And Crawl Sprint no longer errors during level loading, Toggle Mute's MUTED indicator shows up, CartSpeedSync's no-op physics calls skipped, GameTools' repeated lobby-setting broadcast skipped. - New: Empress Gameboy pauses while nobody is playing (
GameboyPauseWhenIdle). - Instant grab beam now runs after other mods' prefixes on the same methods.
- Optional mods are detected through BepInEx before looking up their code, so missing ones no longer log HarmonyX warnings.
1.1.1
- No functional changes. Fixes the website link (was blank on 1.1.0 due to a CI publishing bug) to point to the Discord.
1.1.0
- New: LateJoinNow equipped-item fix. LateJoinNow's level-change cleanup destroys every player's currently-equipped gear, host included - this adds equipped items to its own keep list so they survive. Has its own setting,
LateJoinNowEquippedItemFix. Requires LateJoinNow; does nothing if it isn't installed.
1.0.3
- New: revive item fix. Stops the revive item getting stuck on a dead player who left the lobby, which threw an error every frame until the level ended. Has its own setting,
ReviveItemFix. - Removed the LateJoinNow and MorePlayers dependencies again, so installing this mod no longer installs them. BepInEx is the only dependency.
1.0.2
- Lists LateJoinNow and MorePlayers as dependencies, so they install alongside this mod and show up as its associated mods. No functional changes.
1.0.1
- Rebuilt without debug metadata, so the DLL carries no build paths. No functional changes.
1.0.0
First combined release. Merges three separate fixes into one mod, each behind its own setting:
- Enemy tracker fix (late joiners): registers joining players with every enemy tracker in the scene, registers current players with each new tracker, and self-heals
EnemyOnScreen.GetOnScreen. - Grab beam antispam: null guards for
PhysGrabBeam.DrawCurveand a catch-all finalizer forPlayerEyes.LookAtTransform. - Instant grab beam: your own beam turns on and off locally without waiting for the network round trip.
New in the combined version:
- Per-fix on/off settings.
- Each patch is applied on its own, so one that can't apply doesn't stop the others.
- Suppression messages are rate limited so the antispam fixes don't spam the log themselves.