
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.ANNOYING SPEAKER
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 control —
speaker on/speaker off/speaker. - No audio files — the mod ships no sound assets whatsoever.
HOW IT WORKS
- Every clip is a reference to an
AudioClipthe 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.fieldtokens (for exampleHUDManager.advertMusic), so clips can be added or removed without recompiling. BothAudioClipandAudioClip[]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
currentWeatheris set, otherwise an advert. The advert is also the guaranteed fallback, so a quiet run is never silent. - Playback runs through one cached
AudioSourceparented to the ship's ownspeakerAudioSource, copying its spatial settings — nothing is allocated per broadcast. - Noise is emitted through the vanilla
RoundManager.PlayAudibleNoise. It stays silent forNoiseDelaySeconds, then repeats everyNoiseRepeatSecondsuntil the clip ends. - The physical switch reuses the vanilla InteractTrigger already wired to
StartOfRound.DisableShipSpeakerin 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 ofsuspicionLevelevery 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 isDetectNoise: within18 x NoiseLoudnessmetres 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:SustainedNoiseIntervalstays above the climb-down,SustainedNoiseSkipIfDogNearrefuses to keep calling a dog that already arrived, andFadeInterestdrains 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 viaCustomMessagingManager. NoNetworkObjectis registered and noNetworkVariableor 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.dllintoBepInEx/plugins/. - No sound files to install. There is no assets folder, no bundle and no
.oggto copy — the mod finds everything inside the running game.
CONFIGURATION
File: BepInEx/config/Solon.AnnoyingSpeaker.cfg (created on first launch).
| Section | Key | Default | Description |
|---|---|---|---|
| 1. Speaker | Enabled | true | Master switch for the ship speaker. |
| 1. Speaker | StartsOn | true | Whether the speaker begins each session switched on. |
| 1. Speaker | IntervalMinSeconds | 45 | Shortest wait between two commercials. |
| 1. Speaker | IntervalMaxSeconds | 240 | Longest wait between two commercials. |
| 1. Speaker | Volume | 1.0 | Volume multiplier for normal commercials. |
| 1. Speaker | PlayInOrbit | false | Also talk in orbit between moons, not just on a landed round. |
| 2. Categories | ScreamChance | 0.05 | Chance a broadcast becomes a jumpscare instead. Rolled first. |
| 2. Categories | EmergencyChance | 0.5 | Chance of an emergency bulletin when a Bracken or Nutcracker is alive. |
| 2. Categories | WeatherChance | 0.3 | Chance of a weather bulletin when the moon has weather. |
| 2. Categories | AdClipsMin | 2 | Fewest clips stitched into one commercial. |
| 2. Categories | AdClipsMax | 4 | Most clips stitched into one commercial. |
| 2. Categories | ScreamVolume | 1.0 | Volume multiplier for the jumpscare clip. |
| 3. Audio Banks | MinClipSeconds | 1.0 | Discard clips shorter than this when a bank is built. |
| 3. Audio Banks | PreferLongestClips | true | Strongly favour the longest clips in a bank. |
| 4. HUD Ads | AdsEnabled | true | Show the company's on-screen advert far more often than vanilla. |
| 4. HUD Ads | AdIntervalMinSeconds | 90 | Shortest wait between two on-screen adverts. |
| 4. HUD Ads | AdIntervalMaxSeconds | 300 | Longest wait between two on-screen adverts. |
| 4. HUD Ads | BypassVanillaAdLimits | true | Drop vanilla's once-per-quota and multiplayer-only gates. |
| 5. Dogs | AttractDogs | true | Broadcasts emit real noise creatures can hear. |
| 5. Dogs | DogHearingMultiplier | 1.5 | How much more accurately dogs pinpoint a fresh noise. |
| 5. Dogs | NoiseRange | 45 | How far the noise carries, in metres. |
| 5. Dogs | NoiseLoudness | 0.8 | How loud the broadcast reads to creatures. |
| 5. Dogs | NoiseDelaySeconds | 5 | Silent head — your window to reach the speaker first. |
| 5. Dogs | NoiseRepeatSeconds | 1.5 | How often it re-calls while the clip is still playing. |
| 5. Dogs | SkipCancelsNoise | true | Skipping an advert also cuts its noise. |
| 5. Dogs | SustainedNoiseAfterSeconds | 120 | Uninterrupted uptime before the ship starts pulsing noise by itself. |
| 5. Dogs | SustainedNoiseInterval | 45 | Seconds between those pulses. Keep above ~40. |
| 5. Dogs | SustainedNoiseSkipIfDogNear | true | Skip a pulse while a dog is already at the ship. |
| 5. Dogs | FadeInterest | true | Loitering dogs give up on the ship faster than vanilla. |
| 5. Dogs | InterestFadeSeconds | 30 | Quiet time before the fade begins. |
| 5. Dogs | InterestFadeTickSeconds | 2 | Seconds between each extra point of suspicion drained. |
| 6. Debug | VerboseLogging | false | Log bank contents, network messages and per-clip playback. |
Section3. Audio Banksalso holds six string entries —ad_jingle,ad_item,static,emergency,weatherandscream— each a comma-separated list ofType.fieldtokens. To add a sound, find anyAudioClipfield on any game class and appendClassName.fieldNameto 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. Speaker | Enabled | true | Главный выключатель динамика. |
| 1. Speaker | StartsOn | true | Начинать ли каждую сессию с включённым динамиком. |
| 1. Speaker | IntervalMinSeconds | 45 | Минимальная пауза между роликами. |
| 1. Speaker | IntervalMaxSeconds | 240 | Максимальная пауза между роликами. |
| 1. Speaker | Volume | 1.0 | Множитель громкости обычных роликов. |
| 1. Speaker | PlayInOrbit | false | Говорить и на орбите между лунами, а не только на высадке. |
| 2. Categories | ScreamChance | 0.05 | Шанс, что ролик заменится скримером. Бросается первым. |
| 2. Categories | EmergencyChance | 0.5 | Шанс экстренной сводки, когда жив Бракен или Щелкунчик. |
| 2. Categories | WeatherChance | 0.3 | Шанс погодной сводки, когда на луне есть погода. |
| 2. Categories | AdClipsMin | 2 | Минимум клипов в одном ролике. |
| 2. Categories | AdClipsMax | 4 | Максимум клипов в одном ролике. |
| 2. Categories | ScreamVolume | 1.0 | Множитель громкости скримера. |
| 3. Audio Banks | MinClipSeconds | 1.0 | Отбрасывать клипы короче этого при сборке банка. |
| 3. Audio Banks | PreferLongestClips | true | Сильно смещать выбор к самым длинным клипам банка. |
| 4. HUD Ads | AdsEnabled | true | Показывать экранную рекламу компании намного чаще ванили. |
| 4. HUD Ads | AdIntervalMinSeconds | 90 | Минимальная пауза между экранными баннерами. |
| 4. HUD Ads | AdIntervalMaxSeconds | 300 | Максимальная пауза между экранными баннерами. |
| 4. HUD Ads | BypassVanillaAdLimits | true | Снять ванильные ограничения «раз за квоту» и «только в сети». |
| 5. Dogs | AttractDogs | true | Ролики излучают настоящий шум, слышимый существами. |
| 5. Dogs | DogHearingMultiplier | 1.5 | Насколько точнее собаки наводятся на свежий шум. |
| 5. Dogs | NoiseRange | 45 | Дальность распространения шума в метрах. |
| 5. Dogs | NoiseLoudness | 0.8 | Насколько громким ролик кажется существам. |
| 5. Dogs | NoiseDelaySeconds | 5 | Тихое начало — окно, чтобы успеть к динамику первым. |
| 5. Dogs | NoiseRepeatSeconds | 1.5 | Как часто идёт повторный зов, пока клип ещё звучит. |
| 5. Dogs | SkipCancelsNoise | true | Пропуск рекламы обрывает и её шум. |
| 5. Dogs | SustainedNoiseAfterSeconds | 120 | Сколько динамик должен проработать без перерыва, прежде чем корабль начнёт пульсировать шумом сам. |
| 5. Dogs | SustainedNoiseInterval | 45 | Секунды между такими импульсами. Держите выше ~40. |
| 5. Dogs | SustainedNoiseSkipIfDogNear | true | Пропускать импульс, пока собака уже у корабля. |
| 5. Dogs | FadeInterest | true | Слоняющиеся собаки бросают корабль быстрее ванильного. |
| 5. Dogs | InterestFadeSeconds | 30 | Сколько тишины должно пройти до начала спада. |
| 5. Dogs | InterestFadeTickSeconds | 2 | Секунды между каждым дополнительно снятым очком интереса. |
| 6. Debug | VerboseLogging | false | Логировать содержимое банков, сетевые сообщения и покликовое воспроизведение. |
В секции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.