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

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

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

Preferred version: 5.4.2100

README

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.IsCurrentlyTransmitting directly, 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 23 instead of their real nicknames. The voice subsystem uses a separate Photon room with its own actor numbering, so feeding the voice playerId straight into Room.GetPlayer() resolves the wrong player (or no one).
  • The fix reads the PhotonView ID that PUN packs into VoiceInfo.UserData (this is the same hint PunVoiceClient.InstantiateSpeakerForRemoteVoice uses to link a Speaker to a player), and derives the real game ActorNumber from it (PUN's standard viewID = actorNumber * 1000 + viewNumber layout). 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 Snitch hint 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.onVoiceFrameEvent hooks; everything now flows through RemoteVoiceLink.OnDecodedFrameFloatAction which 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.onVoiceFrameEvent so detection works even when other players' cosmetic mods break Speaker initialization.
  • Local mic detection via LocalVoice.IsCurrentlyTransmitting — shows your own name too.
  • All game/Photon types resolved via reflection for forward-compatibility.