You are viewing a potentially older version of this package. View all versions.
qwbarch-Mirage-1.14.0 icon

Mirage

Voice mimicking where all players hear the same voice, with a focus on masked enemies. Alternative to Skinwalkers + MaskedEnemyOverhaul.

Date uploaded a day ago
Version 1.14.0
Download link qwbarch-Mirage-1.14.0.zip
Downloads 17935
Dependency string qwbarch-Mirage-1.14.0

This mod requires the following mods to function

qwbarch-MirageCore-1.0.3 icon
qwbarch-MirageCore

Core dependencies for Mirage.

Preferred version: 1.0.3

README

Mirage

Mirage is a mod that gives any enemy the ability to mimic a player's voice (fully synced to all players). This mod is required by the host and on all clients.

Mod showcase

Features (all features listed below are configurable)

  • Every enemy can mimic the voice of any player currently in the game.
    • On spawn, each enemy chooses a player to always mimic the voice of.
    • Voices are synced to all players. This means everyone hears the same voice, the same words, at the same time.
    • Only masked enemies mimic voices by default, other enemies can be enabled via config.
  • Masked enemies use the mimicking player's suit and cosmetics.
  • Remove the mask from masked enemies.
  • Remove the arms-out animation from masked enemies.
  • Configuration is synced to all players (only the host's config is used).
  • Adjustable spawn chance for masked enemies.
    • Calculates the spawn weights for each moon internally.
    • Default is set to spawn masked enemies at 2% for each moon.
    • Note: Setting the spawn-rate to 25% basically guarantees a spawn per round.
  • Highly optimized for performance.

I have a question. How can I ask for help?

If you have question, simply create a new discussion on GitHub. I'll respond as soon as I'm available.

I found a bug. Where can I report it?

For bugs, submit a new issue on GitHub. Please mention the bug report is specifically for Lethal Company.

Frequently asked questions

Do I need Skinwalkers for this mod to work?

No, Mirage is a standalone mod. Installing both Mirage and Skinwalkers will result in Skinwalkers playing voices at the same time as Mirage.

Does every player need the same configuration?

No. Only the host's config is used.

How do I select which enemies get to mimic voices?

You will need to first host a game to generate Mirage.Enemies.cfg. Note that you can only modify this config via your mod manager, and will not show up on LethalConfig.

Why is there a dependency on LethalSettings? I don't want to use it.

LethalSettings is used to provide what I want the intended user experience to be for adjusting per-player settings (values that are not synced by the host).
For those who still don't want to use it either way, LethalSettings is a soft dependency and can be safely disabled.

If you have LethalSettings disabled, you and your users will need to modify your per-player settings by editing the Mirage/settings.json file, located inside your Lethal Company directory (highly unrecommended to do this).

How do I access per-player settings?

Settings Settings

Can I use MaskedEnemyOverhaul with this mod?

MaskedEnemyOverhaul will cause the masked enemy's suit and mimicking voice to not match.
Use MaskedEnemyOverhaulFork instead, with the Dont Touch MaskedPlayerEnemy.mimickingPlayer configuration set to true.

Unless you use the nameplate, fading mask, or zombie apocalypse feature(s), you probably don't need it though, since Mirage covers the rest of the features already.

Do I need DissonanceLagFix installed?

No. Mirage already applies the lag fix patch, since v1.0.16.

Does this mod support cosmetics?

Yes, any mod that applies to masked enemies is compatible with Mirage.
If the cosmetic mod you use does not support masked enemies, you will need to request the mod author to support it.

Does this mod use voice recognition and/or AI?

No. This was originally planned for the v2.0.0 update, but the update has been dropped due to time constraints and life priorities.

What happened to the v2 (voice recognition + machine learning) update?

While 99% of the work has been done, 1DWalker and I have other life responsibilities to prioritize. We can no longer justify spending all of our time working on an unpaid passion project, and as such, have decided to drop the update altogether.
To anyone who was excited for the v2 update: I apologize for the disappointment, and I also thank you for all the support.

Recommended mods

  • MirageRevive - Provides the SpawnOnPlayerDeath mechanic from MirageLegacy.
  • StarlancerAIFix - Fixes the EnableEnemyMesh spam when masked enemies move to areas it shouldn't have access to.
  • GeneralImprovements - Optionally adds player nametags to masked enemies, disables radar spinning, etc.
  • Zombies - Alternative to MirageRevive, exploring much more on that type of mechanic.
  • NightOfTheLivingMimic - Can be used alongside MirageRevive for even more masked enemies coming from dead bodies.
  • LethalIntelligenceExperimental - Masked AI changes, as well as supporting walkie talkies with Mirage.

My other (unrelated) mods

  • AutoStart - A mod for developers. Helps you get into the game on multiple clients while also pulling the lever for you.
  • DriftwoodYeet - Yeet.

Can I reupload the mod to Thunderstore?

No, reuploading the mod to Thunderstore is not permitted. If you are creating a modpack, please use the official mod.
If you're making small changes for your friends, you will need to share the compiled .dll directly with them, and then import it locally.

Credits

  • 1DWalker - Huge thanks for all the hard work put towards the v2 update. While the v2 update will no longer be released, I still want to point out that the update would not have even been possible without his work towards the machine-learning part of the codebase.
  • IntegrityFate - Commissioned to create the new Mirage logo, putting his own spin on the design. You can find him here: https://integrityfate.com/

Acknowledgements

  • 1DWalker - Huge contributor to the scrapped v2 update, and is the main person I ran tests with throughout the entire development of Mirage.
  • RugbugRedfern - Mirage is heavily inspired by Skinwalkers. Thank you for creating one of the best mods in the game!
  • Evaisa and LordFireSpeed - For creating the amazing UnityNetcodePatcher, which this mod uses during its build process.
  • Lunxara - Helped test nearly all of the Mirage updates on stream. Check out her stream! https://www.twitch.tv/lunxara
  • TheDebbyCase - For the countless days spent helping me reproduce issues that other players were having, as well as explaining how spawn curves work.
  • Owen3H - For his synced configuration implementation, as well as bringing up issues with the approach taken from the modding wiki.
  • MartinEvans - Author of dissonance, for helping me out with voice activity related issues.
  • IAmBatby and BananaPuncher714 - For answering my spawn control related questions, regarding LethalLevelLoader and LethalQuantities.
  • Zaggy1024 - For pointing me towards setting up a debug build of the game, which is required for me to be able to run a performance profiler.
  • IAmBatby and mattymatty - For their help/implementation on getting rid of the audio spatializer warning log spam.
  • Lunxara, JacuJ, BBAPepsiMan, and JokerMan - For testing the final experimental update. I was only able to fix a lot of the subtle bugs they found because of their extensive testing.
  • Endoxicom - Helped test a lot of the v2 update's hardware requirements that I was trying to figure out at the time.
  • Vladiester - Helped test a lot of the experimental builds, as well as testing my Content Warning version of the mod.
  • Alecksword - For generously dedicating countless hours in voice chat with me to debug issues that I could not replicate on my own.
  • Winter Mantis and Myrin - For their help in testing experimental builds and providing consistent feedback on the Lethal Company modding Discord.
  • a glitched npc - For helping test many of the experimental builds on stream. Check out his stream! https://www.twitch.tv/a_glitched_npc
  • slayer6409 - For helping with profiling Mirage, providing feedback on performance issues.

Changelog

To stay up to date with the latest changes, click here to view the changelog.

CHANGELOG

Changelog

1.14.0

  • Added a config option Enable radar spin.
    • When set to false, will prevent masked enemies from spinning on the radar.
    • Default value: false.
  • Fixed a bug that caused LethalConfig Mirage.General.cfg to not load for some players.

1.13.0

  • Fixed the bugs introduced since v1.9.0:
    • Fixed a bug where voices are sometimes repeated with no delay.
    • Fixed a bug where a voice clip is sometimes played right after another with no delay.
    • Fixed a bug where voice clips can glitch out and sound really weird.
    • Fixed a bug where recordings were sometimes being deleted on startup despite having "never delete recordings" enabled.
    • Exceptions should no longer be thrown when the round is over, or when exiting back to the main menu.
  • Heavily optimized the mod. Personally when comparing to vanilla, my fps is identical now. For any developers interested:
    • Due to needing to process audio, the biggest bottleneck with garbage collection since v1.9.0 was the amount of large arrays being allocated.
    • Every instance where an array used to be allocated has been replaced with array pooling.
    • Replaced F# Async type with ValueTask for any async code, since Async causes heap allocations everywhere.
    • Objects that were being created extremely often (e.g. objects containing audio data) are now structs, to avoid unnecessary heap allocations.
    • Audio packet sizes are extremely tiny now, making the networked audio much more efficient.
    • Audio decompression no longer runs on the main thread.
  • Audio clips no longer save as .mp3, and are instead saved as .opus.
    • The weird glitchy audio turns out to be an issue with the mp3 encoder I was using.
    • Opus (at the current settings I've set) sounds the same as its .wav equivalent, while having a file size even smaller than the previous .mp3 files.
  • Voice activity detection threshold has been lowered.
    • This makes it more lenient on when it creates recordings, on the downside that you'll have a lot more "garbage" recordings like MirageLegacy (v1.8.X and older) had.
    • This was needed, due to SileroVAD not being perfect which caused recordings to be created either too late, or was stopped too early, causing the audio clip to sound cut off.
  • LethalSettings is now a soft dependency and will not crash if LethalSettings is not installed.
    • This is still set as a dependency on Thunderstore due to being the intended user experience.
    • If you are absolutely against using LethalSettings, you and your users can edit your respective settings by editing the Mirage/settings.json file, located in your Lethal Company directory.
    • I highly recommend to keep LethalSettings installed to avoid the need to edit the file manually.
  • Added an option to the LethalSettings menu called Allow record voice. When disabled, audio clips will never be created. Useful when paired with Never delete recordings, for those who want to provide their own audio clips.
  • LethalConfig is now supported, but only for Mirage.General.cfg. If you want to edit which enemies mimic voices, you still need to edit it via your mod manager.
  • NAudio.Lame is no longer a dependency and can be removed from your modpacks.
  • Minimum audio duration ms and Minimum silence duration ms has been removed to keep the config simpler.
Special thanks:
  • Alecksword - For generously dedicating countless hours in voice chat to help debug issues I couldn’t replicate on my own.
  • Winter Mantis and Myrin - For their help in testing experimental builds and providing consistent feedback on the Lethal Company modding Discord.
  • Lunxara and a glitched npc - For testing many updates on stream, even when those updates affected their streaming experience.
  • slayer6409 - For helping with profiling Mirage, providing feedback on performance issues.

1.12.2

  • Fixed a bug introduced in 12.12.1, where recordings are created even if the push-to-talk button isn't pressed.
  • Fixed a bug that caused some recordings to be choppy.

1.12.1

  • Recordings no longer cut off while holding your push to talk key (now matches the recording behaviour from older versions of Mirage).
    • The Minimum silence duration (in milliseconds) config option no longer affects push to talk users, and is only used for voice activity.
    • The Minimum audio duration (in milliseconds) config option no longer affects push to talk users, and is only used for voice activity.

1.12.0

  • Fixed the AcmNotPossible calling acmFormatSuggest exception that caused some players to not be able to use Mirage.
  • Audio files are now saved as a .mp3 instead of a .wav. If you have NeverDeleteRecordings enabled, you will need to delete your previously saved recordings (or convert them to .mp3).

1.11.2

  • Fixed non-masked voice playback delays (accidentally had them set to the same as masked delays).
  • Fixed a null reference exception.

1.11.1

  • Fixed a NullReferenceException issue with AudioReceiver.

1.11.0

  • Added two config options MinSilenceDurationMs and MinAudioDurationMs, explained in their descriptions.
  • Fixed an issue where recordings would end abruptely, even though the user didn't finish speaking their sentence.
  • Fixed an issue related to Enable spawn control (masked enemies) being enabled.
  • Thanks to nattaboy for all the feedback while testing the experimental build for the past week!

1.10.0

  • Moved (and renamed) the following settings back to being a synced config option:
    • "Only hear a monster mimicking your own voice while spectating"
    • "Only record your voice while alive"
  • Re-added LobbyCompatibility as a soft dependency.

1.9.2

  • Updated MirageCore, which was missing dependencies causing players to crash.

1.9.1

Note: This will be the last update, unless any major gamebreaking bugs requires my attention. For anyone expecting the v2 (voice recognition + machine learning) update, please read the README on why this update has been dropped.

  • Config has been reworked and requires you to redo your config. You will need to delete Mirage.cfg (backup the file in case you need it), and then use the newly generated Mirage.General.cfg and Mirage.Enemies.cfg configuration files.
  • Enemy configs are now generated at runtime, no longer requiring a manual update for Mirage every time Zeekers adds new enemies.
  • Optimized the codebase for better performance.
  • Now uses SileroVAD for better voice activity detection, resulting in better recordings when using voice activity.
  • SpawnOnPlayerDeath as a feature has been removed. Use the Zombies as a replacement.
  • Added compatibility with LethalIntelligence.
  • Thanks to Lunxara, JacuJ, BBAPepsiMan, and JokerMan for extensively testing the update. I was only able to fix a lot of the subtle bugs they found because of their extensive testing.
  • Updated icon, created by IntegrityFate.

1.9.0

  • Made a mistake with the upload, this version is skipped.

1.8.1

  • Fixed a compatibility issue for linux users. Thanks to Coppertiel for reporting the bug!

1.8.0

  • Added support for the following v56 enemies:
    • Clay Surgeon
    • Bush Wolf

1.7.2

  • Added a config option to set the maximum number of naturally spawned masked enemies. By default, this is set to 2. Masked enemy spawns have already been capped at 2 since v1.7.1, this update simply allows you to adjust that value.

1.7.1

  • Fixed a bug that caused non-ascii file paths to fail to load. This means players with non-english usernames will finally be able to hear their own voices.

1.7.0

  • Added a config entry RecordWhileDead, that continues to record a player's voice while they're dead. Default value: false.
  • Fixed a bug that caused monsters to try to mimic disconnected players (resulting in no sound, since players must be connected in order to send their voices to others).

1.6.1

  • Added a config entry UseCustomSpawnCurve, that when enabled, changes masked enemies to spawn later in the day.
    • Requires EnableOverrideSpawnChance = true in order to work.
    • Credits: TheDebbyCase for explaining in-depth how spawn curves work.

1.6.0

  • Fixed a bug that caused player dead bodies to disappaer.

1.5.4

  • Temporarily reverted back to v1.5.2 due to a new bug introduced in v1.5.3.

1.5.3

  • Fixed a bug that caused player dead bodies to disappear.

1.5.2

  • Voice clips are no longer created when ToggleMute is toggled.

1.5.1

  • Audio spatializer warning logs are now hidden.
    • This is a vanilla bug that occured more often with Mirage, due to cloning audio sources used by the vanilla game.
    • This log does not provide any value when debugging issues, so I opted to hide them instead.
    • Thanks to IAmBatby and mattymatty for their help/implementation.

1.5.0

  • Fixed LocalPlayerVolume being accidentally synced. Each player can now control the volume of their mimicked voices, as originally intended.
  • Fixed a bug that caused the ghost girl to mimic voices even with EnableGhostGirl set to false.
  • Fixed a bug that caused the ghost girl to mimic voices at the wrong timings.
  • Recordings now also delete on game startup (previously only deleted when closing the game), while IgnoreRecordingsDeletion is set to false.
  • Changed the way masked enemies disable the arms-out animation to hopefully get rid of the rare issue of it having its arms-out when it's not supposed to.

1.4.0

  • Added a config entry for the new enemies (butler, butler bees, flower snake, old bird).
  • Removed debug logs that I previously left in by accident in v1.3.2.
  • Fixed a bug that caused modded enemies that extends from a vanilla enemy type to share its config entry.
  • Fixed a bug that potentially caused an out-of-bounds error if a player dc'd when an enemy tries to mimic a player.

1.3.2

  • Fixed a bug introduced in v1.3.0, where some players didn't have their recordings folder deleted upon closing the game.
  • Fixed a bug introduced in v1.3.1, where voice clips sometimes get repeated multiple times in a row.

1.3.1

  • Enemies mimicking a player now picks at a slightly less random way to avoid mimicking the same player multiple times in a row.
  • MuteLocalPlayerVoice is now set to false by default, due to users who are new to the mod being confused why they can't hear their mimicked voice.

1.3.0

Note: This update removes a couple config entries in favour of new ones. You can safely ignore any orphaned config entries.

  • Removed the config entry AlwaysMuteLocalPlayer in favour of LocalPlayerVolume.
  • Removed the config entry EnableNaturalSpawn as it only made sense to have in the past.
  • Added the config entry LocalPlayerVolume.
    • Allows you to adjust the playback volume for voice mimics of the local player.
    • Value must be between 0-1.
    • Default is set to 1.
    • This config entry is not synced to other players, as it's personal preference on what volume you want for your own "mimics".
  • Added the config entry EnableOverrideSpawnChance, which allows you to enable/disable the OverrideSpawnChance config.
    • Default is set to true.
    • If you want to use a different spawn control mod (such as LethalQuantities), simply set this to false.
  • Added the config entry OverrideSpawnChance, allowing you to control how often masked enemies should spawn.
    • Value must be between 0-100 (as it's a percentage).
    • Default is set to 15.
    • Not to be confused with spawn weights. This will internally calculate the spawn weights for each moon to fit the desired percentage.
    • This will overwrite the spawn weights set by LethalQuantities and LethalLevelLoader. If you want to use those mods for spawn control, set EnableOverrideSpawnChance to false.
    • Masked enemies spawn this way is capped at 2 (this counter is not shared with the SpawnOnPlayerDeath feature).
  • Mimicking voices should actually sound like real player voices now.
    • This was previously attempted by imitating all the settings/filters that dissonance uses.
    • This is now replaced by using what dissonance uses internally.
  • Enemies that mimic non-player voices now adjust playback volume, if the mimicking player's volume has been adjusted.
  • Re-added support for LobbyCompatibility.
  • ImitationMode is now set to NoRepeat by default, to provide a better experience right out of the box.

1.2.1

  • Temporarily removed support for LobbyCompatibility. It currently has a bug that makes it a required dependency, causing Mirage to error when starting/joining a lobby, if you don't have it installed.

1.2.0

  • Add support for LobbyCompatibility
    • Compatibility level is set to minor version. E.g. any 1.2.X lobby is compatible with any other 1.2.X version of Mirage.
    • This only applies to v1.2.X and forward, as I did not follow proper versioning in the 1.0.X versions.
  • Fixed issues of players not being able to hear voices mimicking them at times.

1.1.1

  • Add configuration option ImitateMode to change how a recording is picked.
    • Set this to Random to keep the current behaviour (recordings are picked completely random).
    • Set this to NoRepeat to avoid repeating the same recording (this can still happen when not many recordings exist). Here is how it works:
      • A pool of recordings is filled.
      • A recording is randomly picked, and then removed from the pool.
      • When pool becomes empty, it becomes filled again.
  • SpawnOnPlayerDeath no longer spawns an enemy if the player is not on a navmesh.
    • Previously, this was band-aid fixed by preventing a spawn if the player died by gravity.
    • CauseOfDeath: Gravity no longer prevents the masked enemy from spawning, meaning ladders can spawn them properly now.
    • Note: Many areas throughout the map such as standing on top of a railing is detected as a missing navmesh. Such areas will prevent SpawnOnPlayerDeath from spawning a masked enemy.

1.1.0

  • Rewrote the config syncing logic. Thanks to Owen3H (author of CSync) for their config syncing implementation.
  • DeleteRecordingsPerRound has been slightly reworked.
    • Setting this to true is unchanged (recordings get deleted after the lever is pulled, per round).
    • Setting this to false now only deletes when closing the game.
    • Default value is now set to false.
  • MuteLocalPlayerVoice is now set to true as the default.
  • EnablePenalty is now set to true as the default.
    • To clarify, setting this to true is the vanilla behaviour.
    • This will likely be removed in a future update, as it's a relic of the past back when Mirage had different goals.

1.0.16

  • Fixed a bug that caused the ship teleporter to not work if SpawnOnPlayerDeath spawned a masked enemy
  • DissonanceLagFix is no longer needed when using Mirage
  • Modify configuration descriptions to hopefully be easier to understand
  • Modify configuration default values

1.0.15

  • Fixed a mod conflict issue that caused enemies to not despawn properly
  • SpawnOnPlayerDeath no longer spawns an enemy when CauseOfDeath = Gravity (this means dying to fall damage, and I believe dying to the ladder as well)
    • This was originally done by jarylc, but I tried alternatives to avoid having the mechanic completely ignore dying to gravity
    • This is probably the best band-aid fix for now for avoiding log spam when a masked enemy spawns inside a pit

Huge thanks to TheDebbyCase for their immense effort on bug-testing and figuring out a way to reproduce errors that others have been experiencing. Thanks to dinogolfer from TMLC for figuring out why non-masked enemies weren't despawning as well, which helped me understand why this mod conflict was even happening.

1.0.14

  • Fixed a bug where some enemies types didn't mimic voices
  • Add configuration option to always mute the mimicking voice of a local player
    • Set AlwaysMuteLocalPlayer to true to never hear your voice at all (even while dead)
    • This ignores the MuteLocalPlayerVoice value if enabled
    • This value is not synced to all clients, as it's an optional feature for those who don't want to hear their own voice

1.0.13

  • AdvancedCompany cosmetics now properly apply on hosts (previously only applied on non-hosts)
  • Fixed a bug that caused MuteLocalPlayerVoice to get ignored

1.0.12

  • Mimicked voices should now sound a lot more like an actual player's voice (changed audio filters)
  • SpawnOnPlayerDeath no longer spams an error if a player falls into the void
  • Masked enemies no longer mimic voices if it was spawned after a player falls into the void

1.0.11

  • Hotfix: Revert the crossed-out change from v1.0.10, which caused non-host players to not hear any voices

1.0.10

  • Fixed dress girl issues
    • Mimicking voice is now muted while the dress girl is invisible
    • In singleplayer, dress girl will always mimic the local player's voice
    • In multiplayer, dress girl will always mimic the non-local player's voice
  • Bees no longer mimic voices when EnableModdedEnemies is enabled.
  • Add configuration option to mimic voices for locust swarms
  • Fixed navmesh error spam when an enemy tries to calculate its path
  • Recordings deletion can now be ignored (not synced to all players)

1.0.9

  • Ship camera now spectates the correct masked enemy
  • Recording deletion can now be configured in two ways:
    • DeleteRecordingsPerRound = true to delete recordings per-round
    • DeleteRecordingsPerRound = false to delete recordings per-game
  • Recordings now automatically delete upon closing the game

1.0.8

  • Fixed a bug where voice filters weren't being applied, causing mimicked voices to behave unpredictably
  • Fixed a bug where SpawnOnPlayerDeath could spawn two masked enemies in certain scenarios

1.0.7

  • Hotfix: If the local player's mimicking voice is muted, it now becomes unmuted when the player is dead

1.0.6

Thanks to jarylc for the initial fixes for masked enemy spawns.

  • Rewrite masked enemy spawn and mimicking logic
    • This is less invasive now and should conflict with other mods less often
    • Fixed a bug where naturally spawned masked enemies weren't synced properly
  • Fixed a bug where players not haunted by the ghost girl could hear the mimicking voice.
  • Add configuration option to only spawn player on death, when the dying player is alone
  • Add configuration option to mute the mimicking voice when mimicking the local player
  • Add configuration option to adjust voice mimicking delay for non-masked enemies
  • Add configuration option to mimic voices on modded enemies

1.0.5

  • Use audio filters to sound more like vanilla voices
  • Mimicked voices on the outside can no longer be heard from inside the facility (and vice-versa)
  • Masked enemies no longer mimic voices while hiding on the ship

1.0.4

  • Support voice mimicking on all vanilla enemies.
  • Add configuration option for mask texture and arms-out animation (for masked enemies).
  • Dead enemies no longer mimic voices.

1.0.3

  • Support voice activity.

1.0.2

  • Bundled all dependencies I control into a single core lib (users now pull less packages).

1.0.1

  • Spawn on player death is now configurable.
  • Naturally spawned masked enemies now mimic a player at random.
  • Dependencies are now separated into its own packages.

1.0.0

  • Initial release.