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

AnnoyingSpeaker

The ship speaker blares fake commercials stitched from the game's own sounds. Each one is real noise that calls Eyeless Dogs - reach the speaker and hit [E] to cut it before they hear. No audio files shipped.

Date uploaded 3 hours ago
Version 1.0.0
Download link Solon-AnnoyingSpeaker-1.0.0.zip
Downloads 15
Dependency string Solon-AnnoyingSpeaker-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

Annoying Speaker

ANNOYING SPEAKER

Lethal Company BepInEx Version License

Language / Язык: English · Русский

ANNOYING SPEAKER

Author: Solo00n

The ship speaker becomes a corporate radio station you cannot escape — it blares fake commercials built from the game's own sounds, and every one of them is real noise that Eyeless Dogs come to investigate.

WHAT IT DOES

  • Fake commercials — the speaker cuts in on a timer with an advert stitched together from real game sounds: advert music, terminal purchase confirmations, walkie static, boombox music.
  • Emergency bulletins — alarms and company announcements, played out of context whenever a Bracken or a Nutcracker is alive inside the complex.
  • Weather bulletins — the radiation and meteor warning tones, on moons that actually have weather.
  • Jumpscare — a 5% chance any broadcast is replaced by one loud, existing, frightening game sound at full volume.
  • Dogs hear it — a broadcast feeds the game's own noise system from the ship and keeps calling for as long as it is still playing.
  • A window to stop it — nothing is heard for the first few seconds, so you can sprint to the speaker and cut the advert before any creature learns where you parked.
  • They lose interest — once the speaker goes quiet, dogs loitering at the ship give up faster than vanilla and wander off instead of camping you.
  • Louder screen ads — the vanilla on-screen advert, with its real 3D product model tied to real store discounts, shown on your own schedule instead of once per quota.
  • Terminal controlspeaker on / speaker off / speaker.
  • No audio files — the mod ships no sound assets whatsoever.

HOW IT WORKS

  • Every clip is a reference to an AudioClip the game already has loaded, resolved by reflection at runtime. Nothing is extracted, copied or redistributed, and the DLL stays a few dozen KB.
  • Banks are declared in the config as Type.field tokens (for example HUDManager.advertMusic), so clips can be added or removed without recompiling. Both AudioClip and AudioClip[] fields work; unknown tokens are logged and skipped.
  • Category roll per broadcast: jumpscare first and independently, then an emergency bulletin if a Bracken or Nutcracker is alive, then a weather bulletin if currentWeather is set, otherwise an advert. The advert is also the guaranteed fallback, so a quiet run is never silent.
  • Playback runs through one cached AudioSource parented to the ship's own speakerAudioSource, copying its spatial settings — nothing is allocated per broadcast.
  • Noise is emitted through the vanilla RoundManager.PlayAudibleNoise. It stays silent for NoiseDelaySeconds, then repeats every NoiseRepeatSeconds until the clip ends.
  • The physical switch reuses the vanilla InteractTrigger already wired to StartOfRound.DisableShipSpeaker in the ship scene — no new networked object is spawned.
  • Pressing [E] on the speaker skips the current advert; it does not switch the speaker off. That is the terminal's job.
Why dogs no longer camp the ship. Vanilla already fades a dog out: in state 1 it drops one point of suspicionLevel every 4s and returns to roaming at <= 1; in state 2 it drops one every 3s and falls back to state 1 at <= 8. A full climb-down takes roughly 40 seconds. The trap is DetectNoise: within 18 x NoiseLoudness metres it does not increment suspicion, it slams it back to 9 and re-enrages — so any noise repeating faster than the climb-down pins the dog there forever.

Three things prevent it: SustainedNoiseInterval stays above the climb-down, SustainedNoiseSkipIfDogNear refuses to keep calling a dog that already arrived, and FadeInterest drains suspicion faster once the speaker is quiet. A broadcast's own noise loop repeats far faster than that on purpose — it is safe because the loop dies with the music.

MULTIPLAYER (HOST-AUTHORITATIVE)

Both the host and all clients must install the mod. Only the host's settings matter — it owns the on/off state and picks every broadcast.

Sync: Unity Netcode named messages via CustomMessagingManager. No NetworkObject is registered and no NetworkVariable or RPC is declared, so the mod needs no NetcodePatcher step and cannot desync a lobby.
Broadcasts: the host chooses the category and the clips, then sends bank and index pairs — every bank is de-duplicated and sorted by clip name so index N means the same clip on every machine, and everyone hears the identical advert at the identical moment.
Noise: emitted by the host only, so a client can never call creatures on its own.
Late joiners: a joining client asks the host for the current state and receives it automatically.

REQUIREMENTS

  • BepInEx 5.4.21+ (BepInEx-BepInExPack-5.4.2100)
  • Lethal Company V81

INSTALLATION

  • Mod manager (r2modman / Thunderstore Mod Manager): search for the mod and click Install.
  • Manual: install the BepInEx pack, then drop AnnoyingSpeaker.dll into BepInEx/plugins/.
  • No sound files to install. There is no assets folder, no bundle and no .ogg to copy — the mod finds everything inside the running game.

CONFIGURATION

File: BepInEx/config/Solon.AnnoyingSpeaker.cfg (created on first launch).

SectionKeyDefaultDescription
1. SpeakerEnabledtrueMaster switch for the ship speaker.
1. SpeakerStartsOntrueWhether the speaker begins each session switched on.
1. SpeakerIntervalMinSeconds45Shortest wait between two commercials.
1. SpeakerIntervalMaxSeconds240Longest wait between two commercials.
1. SpeakerVolume1.0Volume multiplier for normal commercials.
1. SpeakerPlayInOrbitfalseAlso talk in orbit between moons, not just on a landed round.
2. CategoriesScreamChance0.05Chance a broadcast becomes a jumpscare instead. Rolled first.
2. CategoriesEmergencyChance0.5Chance of an emergency bulletin when a Bracken or Nutcracker is alive.
2. CategoriesWeatherChance0.3Chance of a weather bulletin when the moon has weather.
2. CategoriesAdClipsMin2Fewest clips stitched into one commercial.
2. CategoriesAdClipsMax4Most clips stitched into one commercial.
2. CategoriesScreamVolume1.0Volume multiplier for the jumpscare clip.
3. Audio BanksMinClipSeconds1.0Discard clips shorter than this when a bank is built.
3. Audio BanksPreferLongestClipstrueStrongly favour the longest clips in a bank.
4. HUD AdsAdsEnabledtrueShow the company's on-screen advert far more often than vanilla.
4. HUD AdsAdIntervalMinSeconds90Shortest wait between two on-screen adverts.
4. HUD AdsAdIntervalMaxSeconds300Longest wait between two on-screen adverts.
4. HUD AdsBypassVanillaAdLimitstrueDrop vanilla's once-per-quota and multiplayer-only gates.
5. DogsAttractDogstrueBroadcasts emit real noise creatures can hear.
5. DogsDogHearingMultiplier1.5How much more accurately dogs pinpoint a fresh noise.
5. DogsNoiseRange45How far the noise carries, in metres.
5. DogsNoiseLoudness0.8How loud the broadcast reads to creatures.
5. DogsNoiseDelaySeconds5Silent head — your window to reach the speaker first.
5. DogsNoiseRepeatSeconds1.5How often it re-calls while the clip is still playing.
5. DogsSkipCancelsNoisetrueSkipping an advert also cuts its noise.
5. DogsSustainedNoiseAfterSeconds120Uninterrupted uptime before the ship starts pulsing noise by itself.
5. DogsSustainedNoiseInterval45Seconds between those pulses. Keep above ~40.
5. DogsSustainedNoiseSkipIfDogNeartrueSkip a pulse while a dog is already at the ship.
5. DogsFadeInteresttrueLoitering dogs give up on the ship faster than vanilla.
5. DogsInterestFadeSeconds30Quiet time before the fade begins.
5. DogsInterestFadeTickSeconds2Seconds between each extra point of suspicion drained.
6. DebugVerboseLoggingfalseLog bank contents, network messages and per-clip playback.
Section 3. Audio Banks also holds six string entries — ad_jingle, ad_item, static, emergency, weather and scream — each a comma-separated list of Type.field tokens. To add a sound, find any AudioClip field on any game class and append ClassName.fieldName to the bank you want it in.

COMPATIBILITY

  • No custom network objects and no custom RPCs — low conflict risk with other mods.
  • The on-screen advert reuses the game's own HUDManager.ChooseAdItem, so it stays tied to real store discounts and needs no networking of its own.
  • The physical switch attaches a listener alongside vanilla's rather than replacing it, so the stock behaviour of the speaker is preserved.
  • If a bank resolves to zero clips it is logged and skipped; a missing or renamed field can never break the mod.

BUILD

dotnet build AnnoyingSpeaker.csproj -c Release

Output: bin/Release/AnnoyingSpeaker.dll. Game assemblies are referenced via the LethalCompany.GameLibs.Steam NuGet package as compile-only (PrivateAssets="all") — no game files are distributed. The included nuget.config adds the BepInEx feed, which is where BepInEx.Core lives.

CREDITS

  • Solo00n — author.
  • Built on BepInEx and HarmonyX.
  • All sounds are the game's own, used in place and by reference — no assets are redistributed.
  • Licensed under MIT.

ANNOYING SPEAKER

Автор: Solo00n

Динамик корабля превращается в корпоративное радио, от которого не сбежать: он крутит фальшивую рекламу, собранную из звуков самой игры, и каждый ролик — это настоящий шум, на который приходят безглазые собаки.

ЧТО ДЕЛАЕТ МОД

  • Фальшивая реклама — динамик по таймеру врубает ролик, склеенный из настоящих игровых звуков: рекламной музыки, подтверждений покупки в терминале, помех рации, музыки бумбокса.
  • Экстренные сводки — сирены и объявления компании, проигранные вне контекста, когда внутри комплекса жив Бракен или Щелкунчик.
  • Погодные сводки — сигналы радиационного и метеоритного предупреждения на лунах, где реально есть погода.
  • Скример — с шансом 5% любой ролик заменяется одним громким пугающим звуком из игры на полной громкости.
  • Собаки это слышат — ролик подаёт шум в родную систему игры от корабля и продолжает звать, пока звучит.
  • Окно, чтобы это прервать — первые несколько секунд не слышит никто, так что можно добежать до динамика и оборвать рекламу до того, как кто-то снаружи узнает, где вы припарковались.
  • Интерес спадает — когда динамик замолкает, собаки у корабля теряют интерес быстрее ванильного и уходят, а не караулят вас.
  • Больше рекламы на экране — ванильный рекламный баннер с настоящей 3D-моделью товара, привязанной к реальным скидкам магазина, показывается по вашему расписанию, а не раз за квоту.
  • Управление из терминалаspeaker on / speaker off / speaker.
  • Никаких аудиофайлов — мод не поставляет ни одного звукового ассета.

КАК ЭТО РАБОТАЕТ

  • Каждый клип — это ссылка на AudioClip, уже загруженный игрой, найденный рефлексией во время выполнения. Ничего не извлекается, не копируется и не распространяется, а DLL остаётся весом в несколько десятков килобайт.
  • Банки задаются в конфиге токенами Type.field (например HUDManager.advertMusic), поэтому клипы можно добавлять и убирать без пересборки. Работают и AudioClip, и AudioClip[]; неизвестные токены пишутся в лог и пропускаются.
  • Выбор категории на каждый ролик: сначала независимо скример, затем экстренная сводка, если жив Бракен или Щелкунчик, затем погодная, если задана currentWeather, иначе реклама. Реклама же — гарантированный запасной вариант, поэтому тихий заход никогда не остаётся беззвучным.
  • Воспроизведение идёт через один закэшированный AudioSource, привязанный к родному speakerAudioSource корабля и копирующий его пространственные настройки — на каждый ролик ничего не создаётся.
  • Шум подаётся через ванильный RoundManager.PlayAudibleNoise. Первые NoiseDelaySeconds тишина, затем повтор каждые NoiseRepeatSeconds до конца клипа.
  • Физический тумблер переиспользует ванильный InteractTrigger, уже привязанный в сцене корабля к StartOfRound.DisableShipSpeaker — новый сетевой объект не создаётся.
  • Нажатие [E] по динамику пропускает текущую рекламу, а не выключает динамик. Выключение — задача терминала.
Почему собаки больше не караулят корабль. Ваниль и сама гасит интерес: в состоянии 1 собака теряет очко suspicionLevel каждые 4 с и возвращается к блужданию при <= 1; в состоянии 2 теряет очко каждые 3 с и откатывается в состояние 1 при <= 8. Полный спад занимает около 40 секунд. Ловушка в DetectNoise: ближе 18 x NoiseLoudness метров он не увеличивает интерес, а ставит его обратно на 9 и снова приводит в ярость — поэтому любой шум, повторяющийся чаще спада, приковывает собаку навсегда.

Этого не происходит благодаря трём вещам: SustainedNoiseInterval держится выше времени спада, SustainedNoiseSkipIfDogNear отказывается звать собаку, которая уже пришла, а FadeInterest ускоряет слив интереса, когда динамик замолк. Собственный цикл шума ролика повторяется намного чаще — и это намеренно безопасно, потому что цикл умирает вместе с музыкой.

СЕТЕВАЯ ИГРА (АВТОРИТЕТ У ХОСТА)

Мод должен быть установлен и у хоста, и у всех клиентов. Значение имеют только настройки хоста — ему принадлежит состояние вкл/выкл, и он выбирает каждый ролик.

Синхронизация: именованные сообщения Unity Netcode через CustomMessagingManager. Ни одного NetworkObject не регистрируется, ни одной NetworkVariable или RPC не объявляется, поэтому моду не нужен NetcodePatcher и он не может рассинхронизировать лобби.
Ролики: хост выбирает категорию и клипы, затем шлёт пары «банк — индекс». Каждый банк очищается от дублей и сортируется по имени клипа, поэтому индекс N означает один и тот же клип на всех машинах, и все слышат одинаковую рекламу в один и тот же момент.
Шум: излучает только хост, поэтому клиент не может самостоятельно призвать существ.
Поздние подключения: подключившийся клиент запрашивает у хоста текущее состояние и получает его автоматически.

ТРЕБОВАНИЯ

  • BepInEx 5.4.21+ (BepInEx-BepInExPack-5.4.2100)
  • Lethal Company V81

УСТАНОВКА

  • Через менеджер модов (r2modman / Thunderstore Mod Manager): найдите мод и нажмите Install.
  • Вручную: установите пакет BepInEx, затем положите AnnoyingSpeaker.dll в BepInEx/plugins/.
  • Звуковые файлы ставить не нужно. Нет ни папки с ассетами, ни бандла, ни .ogg для копирования — мод находит всё внутри запущенной игры.

НАСТРОЙКА

Файл: BepInEx/config/Solon.AnnoyingSpeaker.cfg (создаётся при первом запуске).

СекцияКлючПо умолчаниюОписание
1. SpeakerEnabledtrueГлавный выключатель динамика.
1. SpeakerStartsOntrueНачинать ли каждую сессию с включённым динамиком.
1. SpeakerIntervalMinSeconds45Минимальная пауза между роликами.
1. SpeakerIntervalMaxSeconds240Максимальная пауза между роликами.
1. SpeakerVolume1.0Множитель громкости обычных роликов.
1. SpeakerPlayInOrbitfalseГоворить и на орбите между лунами, а не только на высадке.
2. CategoriesScreamChance0.05Шанс, что ролик заменится скримером. Бросается первым.
2. CategoriesEmergencyChance0.5Шанс экстренной сводки, когда жив Бракен или Щелкунчик.
2. CategoriesWeatherChance0.3Шанс погодной сводки, когда на луне есть погода.
2. CategoriesAdClipsMin2Минимум клипов в одном ролике.
2. CategoriesAdClipsMax4Максимум клипов в одном ролике.
2. CategoriesScreamVolume1.0Множитель громкости скримера.
3. Audio BanksMinClipSeconds1.0Отбрасывать клипы короче этого при сборке банка.
3. Audio BanksPreferLongestClipstrueСильно смещать выбор к самым длинным клипам банка.
4. HUD AdsAdsEnabledtrueПоказывать экранную рекламу компании намного чаще ванили.
4. HUD AdsAdIntervalMinSeconds90Минимальная пауза между экранными баннерами.
4. HUD AdsAdIntervalMaxSeconds300Максимальная пауза между экранными баннерами.
4. HUD AdsBypassVanillaAdLimitstrueСнять ванильные ограничения «раз за квоту» и «только в сети».
5. DogsAttractDogstrueРолики излучают настоящий шум, слышимый существами.
5. DogsDogHearingMultiplier1.5Насколько точнее собаки наводятся на свежий шум.
5. DogsNoiseRange45Дальность распространения шума в метрах.
5. DogsNoiseLoudness0.8Насколько громким ролик кажется существам.
5. DogsNoiseDelaySeconds5Тихое начало — окно, чтобы успеть к динамику первым.
5. DogsNoiseRepeatSeconds1.5Как часто идёт повторный зов, пока клип ещё звучит.
5. DogsSkipCancelsNoisetrueПропуск рекламы обрывает и её шум.
5. DogsSustainedNoiseAfterSeconds120Сколько динамик должен проработать без перерыва, прежде чем корабль начнёт пульсировать шумом сам.
5. DogsSustainedNoiseInterval45Секунды между такими импульсами. Держите выше ~40.
5. DogsSustainedNoiseSkipIfDogNeartrueПропускать импульс, пока собака уже у корабля.
5. DogsFadeInteresttrueСлоняющиеся собаки бросают корабль быстрее ванильного.
5. DogsInterestFadeSeconds30Сколько тишины должно пройти до начала спада.
5. DogsInterestFadeTickSeconds2Секунды между каждым дополнительно снятым очком интереса.
6. DebugVerboseLoggingfalseЛогировать содержимое банков, сетевые сообщения и покликовое воспроизведение.
В секции 3. Audio Banks есть ещё шесть строковых записей — ad_jingle, ad_item, static, emergency, weather и scream — каждая представляет собой список токенов Type.field через запятую. Чтобы добавить звук, найдите любое поле AudioClip в любом классе игры и допишите ИмяКласса.имяПоля в нужный банк.

СОВМЕСТИМОСТЬ

  • Никаких собственных сетевых объектов и RPC — низкий риск конфликтов с другими модами.
  • Экранная реклама переиспользует родной HUDManager.ChooseAdItem, поэтому остаётся привязанной к настоящим скидкам магазина и не требует собственной сети.
  • Физический тумблер добавляет слушателя рядом с ванильным, а не заменяет его, поэтому штатное поведение динамика сохраняется.
  • Если банк собрался пустым, это пишется в лог и пропускается; отсутствующее или переименованное поле не может сломать мод.

СБОРКА

dotnet build AnnoyingSpeaker.csproj -c Release

Результат: bin/Release/AnnoyingSpeaker.dll. Игровые сборки подключаются через NuGet-пакет LethalCompany.GameLibs.Steam только для компиляции (PrivateAssets="all") — файлы игры не распространяются. Приложенный nuget.config добавляет фид BepInEx, где и лежит BepInEx.Core.

БЛАГОДАРНОСТИ

  • Solo00n — автор.
  • Построено на BepInEx и HarmonyX.
  • Все звуки — собственные звуки игры, используемые на месте и по ссылке; никакие ассеты не распространяются.
  • Лицензия MIT.

CHANGELOG

Changelog

1.0.0

  • Initial release. The ship speaker periodically broadcasts a fake commercial assembled from clips the game already has loaded — no audio files are shipped, extracted or redistributed. Banks are declared in the config as Type.field tokens and resolved by reflection at runtime, so clips can be added or removed without recompiling.
  • Four broadcast categories. A jumpscare is rolled first and independently (5%); then an emergency bulletin if a FlowermanAI or NutcrackerEnemyAI is alive inside; then a weather bulletin if the moon's currentWeather is set; otherwise an advert. The advert is also the guaranteed fallback, so a quiet run is never silent.
  • Long clips preferred. Banks discard anything shorter than MinClipSeconds, and each pick samples four candidates and keeps the longest. The filter never empties a bank.
  • Dogs hear the ship. A broadcast feeds the vanilla RoundManager.PlayAudibleNoise from the ship: silent for NoiseDelaySeconds, then repeating every NoiseRepeatSeconds until the clip ends. noiseID stays 0 and timesPlayedInSameSpot stays 0 on purpose — MouthDogAI.DetectNoise ignores IDs 675189/7/546 and any noise past 15 repeats.
  • Dogs lose interest again. The noise loop dies with the music, SustainedNoiseSkipIfDogNear refuses to keep calling a dog that already arrived, and FadeInterest drains suspicion faster than vanilla once the speaker is quiet. The fade only accelerates the game's own countdown; a dog with a real targetPlayer is never touched.
  • Skip button. Pressing [E] on the ship speaker cuts the current advert short rather than switching the speaker off, and with SkipCancelsNoise on it kills the pending noise too — silence it inside the delay and no creature ever hears it. The hover tip reports whether the speaker is sounding right now, not whether it is armed.
  • Terminal commands. speaker on, speaker off and speaker for status, intercepted in Terminal.ParsePlayerSentence without hijacking option menus.
  • On-screen adverts. Re-triggers the vanilla HUDManager.ChooseAdItem on its own timer, keeping the real 3D product model and real store discounts. BypassVanillaAdLimits drops vanilla's once-per-quota, post-first-quota and multiplayer-only gates so adverts show in singleplayer from day one.
  • Host-authoritative multiplayer over Unity Netcode named messages. No NetworkObject is registered and no NetworkVariable or RPC is declared, so no NetcodePatcher step is needed and a lobby cannot desync. The host picks every clip and broadcasts bank/index pairs; banks are de-duplicated and sorted by clip name so index N is the same clip on every machine. Late joiners are sent the current state automatically.
  • Physical switch reuses the vanilla InteractTrigger already wired to StartOfRound.DisableShipSpeaker in the ship scene, found by matching the serialized UnityEvent binding — no new networked object is spawned, and vanilla behaviour is preserved.