You are viewing a potentially older version of this package. View all versions.
no00ob-LCSoundTool-1.3.0 icon

LCSoundTool

Let's you easily load audio files, replace in game audio, send audio over the network and log any audio playback into console.

Date uploaded 11 months ago
Version 1.3.0
Download link no00ob-LCSoundTool-1.3.0.zip
Downloads 10193
Dependency string no00ob-LCSoundTool-1.3.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

LC Sound Tool

Simplistic Lethal Company sound tool and debugger. Patches all native Unity AudioSource components allowing you to dynamically replace (almost) any sound in the game at the final stages of playback with one or multiple random options with specified chances by simply specifying new audio clip(s) and the original clip's name to this mod. Let's you easily load your own custom .wav sound files for your own mods. Experimental networking for sending and syncing audio clips across all of the connected players. Lastly, optionally allows logging all AudioSources playback, including PlayOneShot, PlayClipAtPoint etc. and the names of each clip playing into the BepInEx console when you press the F5 key. More in depth logging can be toggled with LeftAlt + F5.

ATTENTION

This mod won't work without a mod of your own that does the replacing. This mod is just purely a tool/API for replacing and loading sound files from the game folder. For replacing without a mod of your own you can try the following seperate mod utilizing this tool: https://thunderstore.io/c/lethal-company/p/Clementinise/CustomSounds/

Features

  • Press F5 to log all audio playback to BepInEx console.
  • Load your own custom .wav audio files for your mod.
  • Replace any audio clip with another one or multiple random ones.
  • Send audio clips over the network and optionally sync the hosts clips with all clients.

Installation

Install like any other BepInEx mod, either manually or with mod manager of your choice.

When installing manually, install the mod to the following directory:

  \GAME_LOCATION\Lethal Company\BepInEx\plugins

Usage/Examples

Loading a custom sound .wav file:

using LCSoundTool;

AudioClip newSound;

// 'test.wav' is the name of the .wav sound file you're going to load 
// 'YourModDirectory' is the name of your mods installation folder which mod managers create
// This is usually the format of 'Author-ModName', if you're unsure check how your mod manager installs mods
// As an example, this mod is installed as 'no00ob-LCSoundTool'
// This is because the author on this website is listed as me 'no00ob' and my mod is called 'LCSoundTool' here
// 'SubFolder' is the OPTIONAL folder inside the 'YourModDirectory' folder where the mod will try to load the sound files from
// You can also leave this blank and it will just load them from the root where your mod's DLL file is also located.

newSound = SoundTool.GetAudioClip("YourModDirectory", "SubFolder", "test.wav");

Adding a replacement sound:

using LCSoundTool;

// Your own logic for the new sound
// This could be what is shown above or you could load it from an AssetBundle

AudioClip newSound;

// GhostDevicePing is the name of the original sound
// In this case it is the radar ping sound

SoundTool.ReplaceAudioClip("GhostDevicePing", newSound); 

Removing a replacement sound:

using LCSoundTool;

// GhostDevicePing is the name of the sound we replaced 
// In this case it is the radar ping sound
// Which we now restore back to the default vanilla sound

SoundTool.RestoreAudioClip("GhostDevicePing");

Adding a replacement sound with multiple random options:

using LCSoundTool;

// Your own logic for the new sounds
// This could be what is shown above or you could load it from an AssetBundle
// When doing multiple random sounds you define the chance for each sound at the end of the .wav files name.
// Eg. In this case if newRandomSound1 was called random_25.wav and newRandomSound2 was called random_75.wav
// newRandomSound1 would have a chance of 25% and newRandomSound2 would have a chance of 75%

AudioClip newRandomSound1;
AudioClip newRandomSound2;

// GhostDevicePing is the name of the original sound
// In this case it is the radar ping sound

SoundTool.ReplaceAudioClip("GhostDevicePing", newRandomSound1);
SoundTool.ReplaceAudioClip("GhostDevicePing", newRandomSound2); 

Removing a replacement sound:

using LCSoundTool;

// GhostDevicePing is the name of the sound we replaced 
// In this case it is the radar ping sound
// Which we now restore back to the default vanilla sound

SoundTool.RestoreAudioClip("GhostDevicePing");

Networked audio clips:

using LCSoundTool;

// This is the dictionary you can use to access all networked audio clips.

SoundTool.networkedClips;

// Your own logic for the new sound
// This could be what is shown above or you could load it from an AssetBundle

AudioClip networkedSound;

// You can use this method to send a networked audio clip to all clients that have LCSoundTool installed.
// It will be accessible through the variable specified above after the clients receive it.

SoundTool.SendNetworkedAudioClip(networkedSound);

// You can use this method to remove a networked audio clip from all clients that have LCSoundTool installed.
// It will be removed from the dictionary that is shown above after the clients receive the request for removal.

SoundTool.RemoveNetworkedAudioClip(networkedSound);

// Lastly with this method you can send all of the current clips stored in networkedClips dictionary to all clients.
// All of the hosts networked audio clips will be sent to all other clients that have LCSoundTool installed.

SoundTool.SyncNetworkedAudioClips();

// You can also use the following events to determine when the networkedClips dictionary has changed. 
// Check the example github repo for an idea on how this can be utilized.

SoundTool.ClientNetworkedAudioChanged;
SoundTool.HostNetworkedAudioChanged;

For more in-depth example see the following github repo: https://github.com/no00ob/LCSoundToolTest

FAQ

Why are none of the logs showing up?

Make sure you have at least the following BepInEx.cfg settings:

  • [Chainloader] HideManagerGameObject = true
  • [Logging.Console] Enabled = true
  • [Logging.Console] LogLevels = Fatal, Error, Info, Debug, Warning
  • Possibly [Logging.Disk] WriteUnityLog = false

If nothing else works you can try my BepInEx.cfg from here: https://pastebin.com/LdsPhH5U

If they're still not showing up just shoot me a msg in Discord (@no00ob) and we can try to figure it out.

Why does this one sound not show up in log and I cannot replace it?

Few of the AudioSources with playOnAwake do not work with this tool. They for some reason refuse to work. Might try to look at this later but for now check the bottom of the page for all the culprits.

Can you use this tool to record sounds or interact with the voice chat?

No, not at the moment. I might look into this later.

What is the performance impact of this tool compared to just manual replacement?

Idk, haven't done any major testing. In theory this should add slight delay and overhead to any audio playback, this game is so messily programmed however that finding certain audio clips was painful enough where I just decided that a tool like this might come in handy.

Can you add this or that?

Depends totally on what you're asking. If you want a new feature that has something to do with this mods original scope feel free to shoot me a message and I'll take a look. Otherwise no.

Does this mod work with other Unity games?

Any version prior to 1.2.0 should and versions past that will not work. I tried the pre 1.2.0 version with my Unity 2022.3.x game and it did work for it too. The mods replacing the audio do not however, as different games use different sounds obviously.

Can I contribute somehow?

Yes. If you find any bugs or errors let me know and feel free to send pull requests my way if you feel like you can provide better programming or more features.

Known Issues

  • Sometimes some AudioSources escape the logging. It seems to be mostly once that are either already playing before logging with loop set to true (intended behaviour) or ones that have playOnAwake set to true
  • The following AudioSources cannot be edited with this mod currently: all 4 of the ship's ThrusterCloseAudio, the ship's ThrusterAmbientAudio and the ship's Ship3dSFX. These AudioSource's break and refuse to play anything if handled through my mod's custom playOnAwake handling.

CHANGELOG

  • 1.5.1

    • Fixed a bug where the Boombox and other vanilla audio was not being randomized properly after the last update.
    • Fixed a bug where the Extension Ladder and few other vanilla audio sources that played multiple different sounds were not working properly after the last update.
    • Fixed a bug where all sounds using a specific audio source could get wrongly checked for the source name filter if one sound playing through it had it defined.
    • Fixed a bug where syncing all networked sounds to clients could cause an overflow error if the string array was too long.
    • Fixed a bug where the legacy path warning was triggered wrongly for CustomSounds based mods. (sorry for taking this long Clementinise lol)
    • Fixed a bug where certain sounds could get stuck in the fileType dictionary as it has now been removed.
    • Improved networked sound handling. Now channels and frequency gets synced and handled properly.
    • Further tweaks to logging. New logging messages and fixes to existing ones.
    • Rewrote the SoundTool class to remove bloat and simplify future updates. You need to now define all parameters and nothing gets parsed automatically from the sound name anymore!
    • Other small internal tweaks and QoL changes for myself for future updates :)
  • 1.5.0

    • Added support for AudioSource names as filters to where sounds can play. No more same sound from different sources!
    • Fixed a bug where AudioSources using the standard Play() would not randomize properly.
    • Added a config option to turn informational debugging on by default on launch.
    • Some minor tweaks to logging again. Mostly the same this time too. Cleaned up some useless messages, fixed typos, etc.
    • Added few new mod API methods and updated existing ones. You can now use some of the methods with different parameters than before.
  • 1.4.0

    • Added support for Ogg Vorbis and Mpeg MP3 files. Now any of the 3 file types should work. Wav, ogg or mp3.
    • Reworked playOnAwake patching. Hopefully now ALL playOnAwake AudioSources and sounds should work without any problems.
    • Added a config option to let the mod patch any playOnAwake AudioSources that get created later during a game, as before it only ran when a new Unity scene was loaded. The option is for the delay between each runtime patch.
    • Added config option to sync host's Unity built in randomization seed with all clients. Random sounds should be the same for everyone with this on.
    • Some minor tweaks to logging. Mostly cleaned up some useless messages, fixed typos and added a new keybind for informational logs, F5 + LeftControl.
    • Added few new mod API methods and updated existing ones. You can now add sounds with multiple random variants from code without having the chance specified in the file name and small tweaks like that.
  • 1.3.2

    • Small bug fixes.
    • Made networking optional. It was never meant to be forced on. It can now be toggled from the config file.
  • 1.3.1

    • Changed the random clip seperator from "_" to "-".
  • 1.3.0

    • Internal restructure of multiple parts of the mod. Shouldn't change previous behaviour.
    • Added support for random replacement clips. One vanilla sound can now have new multiple random clips with set chances that play randomly when the vanilla sound would.
    • Fixed multiple small bugs. AudioSources with playOnAwake set to true should now play more than once when the scene is not reloaded between playback.
    • Experimental networking for Unity AudioClips. Send AudioClips over the network to all connected players, also optionally sync all of the networked clips of the host to all clients.
    • Minor tweaks for game v45
  • 1.2.2

    • Added support for mod managers. This changes the folder structure and loading of custom sounds a bit and all mods will need to be updated to work with mod managers. Old mods will continue to work with the newest release when manually installed. Mods only need to update to support mod managers, otherwise no sounds will load when using a mod manager.
  • 1.2.1

    • Minor edits to mod page.
  • 1.2.0

    • Added ability to load sound files from plugins folder, more in depth logging option and support for most AudioSources with playOnAwake flag set to true.
  • 1.1.1

    • Minor edits to mod page.
  • 1.1.0

    • Added a way to replace any in game audio clip by a custom one. Mod released on thunderstore.
  • 1.0.0

    • Mod released on github.