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.
MicSnitch
Snitches on whoever is talking - shows their nicknames on screen, even when cosmetic mods break voice init and hide who it is.
By efmeow
| Date uploaded | 5 months ago |
| Version | 1.0.0 |
| Download link | efmeow-MicSnitch-1.0.0.zip |
| Downloads | 123 |
| Dependency string | efmeow-MicSnitch-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
Mic Snitch
Snitches on whoever is talking. Shows the nicknames of every player currently transmitting voice, right on your screen — so the soundboard spammer on the loading screen has nowhere to hide.
A working replacement for the old, deprecated See_who_is_talking mod, which stopped
showing names in current R.E.P.O. builds.
Why
In R.E.P.O. voice is proximity-based in a level, but global on loading screens and
in the lobby — that's where someone always blasts a soundboard and you have no idea who.
The old mod hooked the per-player Speaker component to find out. Problem: when other
players run cosmetic mods (MoreHead & co.), their SetupCosmeticsModdedRPC fails, the
Speaker never gets created, and the old mod sees nothing.
How it's fixed
Mic Snitch hooks below the Speaker layer:
LoadBalancingTransport.onVoiceFrameEvent— the dispatcher every incoming voice frame passes through, before any player-init check. Works even when a player's avatar/Speaker is broken by other mods.VoiceClient.onFrame/Speaker.OnAudioFrame/RemoteVoiceLink— extra hooks for full coverage.- Local mic poll — reads
LocalVoice.IsCurrentlyTransmittingdirectly, so your own name shows too (and you can test it solo).
Names are resolved through PhotonNetwork.CurrentRoom.GetPlayer(actorNumber).NickName,
which keeps working even if a player's local object is broken by RPC errors.
Everything is resolved via reflection — if a future game patch renames a type, the mod logs a warning and degrades gracefully instead of crashing.
Display
A bright yellow list in the upper-right corner showing who has spoken in the last ~0.7s. No background plate (stays readable on the black loading screen).
Install
Use a mod manager (r2modman / Thunderstore app) — it handles the dependency on BepInEx.
Manual install: drop MicSnitch.dll into BepInEx/plugins/.
Credits
Concept inspired by the original See_who_is_talking by xiaolei. Rebuilt from scratch.
CHANGELOG
Changelog
1.1.1
- Fixed nickname resolution. Some players were showing as
Player 9/Player 23instead of their real nicknames. The voice subsystem uses a separate Photon room with its own actor numbering, so feeding the voice playerId straight intoRoom.GetPlayer()resolves the wrong player (or no one). - The fix reads the PhotonView ID that PUN packs into
VoiceInfo.UserData(this is the same hintPunVoiceClient.InstantiateSpeakerForRemoteVoiceuses to link a Speaker to a player), and derives the real game ActorNumber from it (PUN's standardviewID = actorNumber * 1000 + viewNumberlayout). Falls back to the voice playerId only if UserData is missing.
1.1.0
- Loudness filter: quiet background noise (passing the open-mic threshold but contributing nothing) no longer pollutes the list. Only real speech registers.
- Loud shouters in red: anyone speaking above the loud threshold is highlighted in bold red and stays visible for 3 seconds, so a sudden shout pops out from the always-on chatter.
- F8 toggles the overlay. A faint
[F8] Mic Snitchhint stays in the corner when hidden, so the hotkey is never forgotten. - Sort order: loud speakers on top (most recent first), then normal-volume speakers below.
- Smaller, semi-transparent text — readable but not in your face when 10 people are on a loading screen.
- Internal: dropped the redundant
Speaker.OnAudioFrame/VoiceClient.onFrame/Transport.onVoiceFrameEventhooks; everything now flows throughRemoteVoiceLink.OnDecodedFrameFloatActionwhich fires for every decoded voice (init-broken or not) and gives access to the audio samples for the loudness analysis.
1.0.0
- Initial release.
- Shows nicknames of currently-talking players in the upper-right corner.
- Hooks
LoadBalancingTransport.onVoiceFrameEventso detection works even when other players' cosmetic mods breakSpeakerinitialization. - Local mic detection via
LocalVoice.IsCurrentlyTransmitting— shows your own name too. - All game/Photon types resolved via reflection for forward-compatibility.