uhmVoiceGrunts
Configurable custom voices for your characters in game. Comes with presets.
By UHMatthias
| Date uploaded | 2 weeks ago |
| Version | 1.5.0 |
| Download link | UHMatthias-uhmVoiceGrunts-1.5.0.zip |
| Downloads | 77 |
| Dependency string | UHMatthias-uhmVoiceGrunts-1.5.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.2305README
Stable Release 1.5
If you've had the mod downloaded and recorded your voicelines, BACK UP YOUR /Sounds folder, re extract them after installing this update.
This release features mixed/compressed presets who just want lively character sounds with their game, all voicelines courtesy of
Matthias (me) Kat (Zora) PJ (Soull) LePresto (LePresto) Kuron (Kuron) Darius (Darius)
Support
Join our Discord Server! Feel free to message me directly about the mod.
Custom Voice Grunts
Layers custom voice grunts on top of vanilla swing, jump, and knockouts SFX. Swing grunts are triggered by specific swing strengths & randomzied; jump and knocked grunts are randomized as well. Variations are unlimited. Vanilla game sounds still play — this mod only adds voice on top. Mod grunts follow the Announcer volume slider in settings. If you want to modify the volume for all voicepacks, adjust the Announcer slider in audio settings.
v1.4+: Up to nine voice packs sync over multiplayer. Your pack choice is what others hear when you swing, jump, or get knocked out. Press F2 in-game to open the voice pack picker (hotkey configurable in mod settings).
With this mod, as long as all clients share the same voice packs, everything is synced!
Install
Extract into <game or profile>/BepInEx/plugins/uhm-VoiceGrunts/:
VoiceGrunts.dllSounds/folder (withVoicePack1–VoicePack9subfolders as needed) THIS SHOULD BE INCLUDED WITH PLACEHOLDERS!
Requires BepInExPack 5.4.2305.
Choose your voice pack
Option 1. [Recommended] Open the game, press F2, this will open an overlay where you can choose from your ~9 VoicePacks.
Option 2. Edit BepInEx/config/sbg.voicegrunts.cfg after first launch, or use r2modman → VoiceGrunts → Settings:
[Voice]
SelectedPack = 2
Valid values: 1–9. Add a VoicePack5 folder (same layout) and set SelectedPack = 5. Your pack applies immediately for your own grunts. In multiplayer, other modded players learn your pack from your swing power value (no extra network messages). Jump and knocked grunts use whatever pack was learned from your last swing.
Custom overlay names (F2 menu)
By default the overlay shows VoicePack1, VoicePack2, etc. You can rename them two ways (config wins if both are set):
In BepInEx/Plugins/Sounds/VoicePackX/displayname.txt, you can see the names of the placeholders that show up by default on the F2 menu.
- Per-pack file — add
displayname.txtinside the pack folder with a single line, e.g.Sounds/VoicePack2/displayname.txtcontainingMatthiasVoice. - Config — in
sbg.voicegrunts.cfgunder[DisplayNames], setPack2 = MatthiasVoice(keysPack1–Pack9).
Folder names stay VoicePackX for audio loading; only the overlay label changes. DO NOT CHANGE THE FOLDER NAMES!
Your selection syncs to other players with this mod installed. When you act, they play clips from their local copy of your pack folder.
Sound folder layout
There is currently no trigger for power shots 101%-115%.
Sounds/
VoicePack1/
SwingGrunt/
LightTap/ # Swing Power 0–25% power
grunt_1.wav
grunt_2.wav
grunt_3.wav
MediumGrunt/ # Swing Power 25–50%
grunt_1.wav
grunt_2.wav
StrongGrunt/ # Swing Power 50–75%
FullPower/ # Swing Power 75–100%
JumpGrunt/
Standard/
jump_1.wav
Knocked/
Standard/
knocked_1.wav
knocked_2.wav
knocked_3.wav
VoicePack2/
VoicePack3/
VoicePack4/
VoicePack5/
...
VoicePack9/
you get the point.
- Replace placeholder clips with your recordings per pack.
- Add multiple files per tier folder for random variety.
- Supported formats:
.wav,.ogg,.mp3. - Friends need the same pack folders installed to hear your custom voice (share a zip or optional add-on mod).
Multiplayer
Anyone who has the mod installed will automatically be synced with eachother, if someone does not have it, they will just hear vanilla sounds.
CHANGELOG
Changelog
v1.5
- Stable.
v1.4.12
- Fixed knockout grunts still only playing for the knocked player: hook moved to
PlayerAudio.StartKnockoutLoopLocalOnly, which the game invokes on all clients via the synced knockout VFX hook (remote SyncVar updates bypass the knockout-state setter we patched before). - Knockout clip choice now derives from synced
KnockedOutVfxDataso all clients pick the same variant.
v1.4.10
- Fixed knockout grunts only playing for the knocked player in multiplayer: the SyncVar hook now plays for all clients (like jump grunts). Removed the TargetRpc-only observer hook that never reached other players.
v1.4.9
- Fixed mouse cursor staying on screen after closing the F2 overlay: release the game's
CursorManagerforce-unlock and callInputManager.UpdateCursorLock()so gameplay re-hides the cursor.
v1.4.8
- Fixed remaining startup Harmony error: avoid ambiguous Mirror
ReadNetworkBehaviourlookup in a static constructor (match the call site from transpiler IL instead).
v1.4.7
- Fixed F2 overlay not listing VoicePack folders when Harmony
PatchAllfailed during startup (pack discovery now runs before patches;PatchAllis caught soStart()always runs). - Fixed
ReadNetworkBehaviour<PlayerInfo>ambiguous Mirror method lookup that broke jump/knock clip sync patches in v1.4.6.
v1.4.6
- Fixed BepInEx startup errors: invalid Harmony
__knockClipIndexstate on knockout SyncVar patch, and invalid IL from the knockout Rpc clip transpiler (stack mismatch).
v1.4.5
- Fixed jump and knocked clip sync in multiplayer: clip index now piggybacks on existing Cmd/Rpc payloads the same way swing clips use encoded power, instead of per-client random or mismatched timestamps.
v1.4.4
- F2 overlay title now shows
uhm — VoiceGrunts.
v1.4.2
- Fixed BepInEx log spam when closing the overlay with Esc on games using Unity's new Input System.
v1.4.1
- F2 overlay buttons can show custom pack names via
Sounds/VoicePackN/displayname.txtor BepInEx config[DisplayNames] PackN.
v1.4.0
- Jump grunt clip choice now syncs in multiplayer (clip index piggybacked on existing jump Cmd/Rpc).
- Knocked grunt clip choice now syncs via deterministic selection from the synced knockout timestamp (all clients pick the same clip).
- Added F2 voice pack overlay — toggle in-game picker to switch packs on the fly (configurable hotkey under
[UI] OverlayHotkey).
v1.3.5
- Fixed remote players always hearing the first swing clip (
grunt_1): the server was re-encoding the swing RPC with clip index 0 after stripping it in the Cmd handler. It now preserves the captured clip index when re-sending the Rpc.
v1.3.4
- Fixed knocked grunts still only playing locally in multiplayer: observers now hook
PlayerMovement.RpcInformKnockedOutOtherPlayer(the game's actual knockout notification RPC). Local knocked player still uses the SyncVar setter hook. - Swing grunt clip choice is now synced across clients: the random variant index is piggybacked on the existing swing RPC alongside voice pack id (both players must run v1.3.4+).
v1.3.3
- Fixed knocked grunts not playing for remote players in multiplayer: hook moved from local-only
SetKnockOutStateto Mirror SyncVar setterset_NetworkknockoutState, which runs on all clients when knockout state replicates.
v1.3.2
- Fixed knocked grunts not playing: Harmony patch parameter renamed to
stateto matchPlayerMovement.SetKnockOutState. - Fixed Announcer volume slider having no effect: v1.3.1 routed through a non-existent
announcerBusfield; grunts now readGameSettings.All.Audio.AnnouncerVolumeand apply it viachannel.setVolumeafter each play.
v1.3.1
- Voice grunts (swing, jump, knocked) now route through the game's Announcer FMOD bus, so the Announcer volume slider controls mod audio.
v1.3.0
- Voice packs expanded to 1–9 (drop in
VoicePack5–VoicePack9folders; config accepts up to 9). - Added Knocked grunts when a player is knocked out (
Knocked/Standard/per pack, same layout as jump). - Knocked grunts replicate in multiplayer using the same pack sync as swings/jumps.
v1.2.3
- Fixed host→client voice pack sync: the game server was stripping the encoded swing power before Rpc, so joining players always heard the host on VoicePack1. The server now captures the pack from the Cmd and re-encodes before Rpc is sent to clients.
v1.2.2
- Fixed asymmetric voice pack sync: pack 1 appeared to work for everyone because decode defaulted to 1 when the tiny float offset was lost over the network. Encoding now uses a ones-digit suffix (e.g. power 0.75 + pack 2 → 0.7502) that survives Mirror float serialization.
v1.2.1
- Fixed joining player disconnect on first swing. Removed custom Mirror network messages entirely.
- Voice pack id now piggybacks on the existing swing RPC via a tiny offset in
normalizedPower(invisible to gameplay audio). - Jump grunts use the last pack learned from that player's most recent swing.
v1.2.0
- Restored multiplayer voice pack sync using a safer approach: pack choice is sent when you swing or jump (not at lobby creation), so hosts no longer disconnect when opening a lobby.
- Other modded players hear your configured voice pack once you take your first swing or jump in a match.
v1.1.3
- Removed all custom Mirror network messages — they were disconnecting hosts from their own lobbies. Voice pack selection now applies locally from config only (your swings use your chosen pack). Multiplayer voice sync will return in a future version using a safer approach.
v1.1.2
- Fixed lobby disconnects caused by custom Mirror network messages missing IL2CPP writers. Voice pack sync now uses manual message handlers compatible with BepInEx.
v1.1.1
- Fixed voice pack selection staying on pack 1 (VoicePackSync NullReferenceException). Pack choice now reads config directly for your swings and broadcasts via Mirror network messages for multiplayer.
- Startup log now lists each loaded clip path so you can verify the correct files were picked up.
v1.1.0
- Added four voice packs (
VoicePack1–VoicePack4) with Mirror SyncVar replication. - Your configured pack is what other modded players hear when you swing or jump.
- Choose your pack via BepInEx config:
[Voice] SelectedPack = 1(1–4), editable in r2modman mod settings.
v1.0.0
- Initial release as a standalone mod.
- Layered swing grunts by power tier and jump grunts from local
Sounds/folders.