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

MonstersGordion

Configurable monster spawning inside the Company building on 71-Gordion: timers, weights, caps, floor balance. Runs BrutalCompanyMinus events on a moon it always skipped, and sends a horde in from the map edges.

Date uploaded 2 days ago
Version 1.9.0
Download link Solon-MonstersGordion-1.9.0.zip
Downloads 83
Dependency string Solon-MonstersGordion-1.9.0

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2305 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2305
TRizzle-NavMeshInCompanyRedux-1.2.0 icon
TRizzle-NavMeshInCompanyRedux

[V81] Enables the use of AI pathfinding and navigation in the Company Building allowing the spawning of Enemies.

Preferred version: 1.2.0

README

MonstersGordion

MONSTERS GORDION

Lethal Company BepInEx Version License

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

MonstersGordion

MONSTERS GORDION

Author: Solo00n

The Company building on 71-Gordion is no longer safe — vanilla monsters now spawn and hunt inside it, on timers, weights and caps you control.

WHAT IT DOES

  • Monsters on the Company moon — enemies spawn inside the building on the interior navmesh, the one place the game never threatens you.
  • Timed weighted spawning — a random interval between a min and max, then a weighted-random pick from every enemy you enabled.
  • Reachability-checked points — connected-region analysis plus a path check, so nothing spawns on roofs, shelves or in pits it cannot leave.
  • Floor balance — a configurable split between the ship-landing level and the basement, instead of everything piling into the larger lower floor.
  • Indoor / outdoor pools — each spawn rolls which pool to draw from, so dogs, giants and Old Birds actually appear alongside interior enemies.
  • Per-enemy control — every spawnable type gets Enabled, SpawnWeight, MinSpawnCount and MaxSpawnCount.
  • Blacklist or whitelist — restrict the whole moon to a chosen set, optionally stripping enemies other mods spawn as well.
  • Self-healing — stranded enemies are teleported back, idle ones are nudged, and any type that keeps dying instantly is auto-disabled instead of spammed.

MONSTERS

Enabled by default: every interior enemy — Bracken, Thumper, Hoarding Bug, Snare Flea, Bunker Spider, Coil-Head, Ghost Girl, Spore Lizard, Nutcracker, Jester, Masked, Hygrodere, Butler, Barber, Maneater — plus Stingray, Tulip Snake, the bee swarms, and the outdoor threats that path correctly indoors: Baboon Hawk, Eyeless Dog, Forest Keeper, Old Bird and Giant Kiwi. Nest-requiring enemies get their nest placed automatically.

Monsters that need extra work to function on this moon, made to work here and toggleable in the config:

  • Feiopar — the mod grows dead trees on the interior navmesh so it can climb, perch and pounce as it does outdoors.
  • Earth Leviathan — the Company floor is registered as a surface it may breach, so it erupts indoors instead of circling below forever.
  • Cadaver Bloom — planted as standalone corpse traps that burst and give chase, with no dungeon required.
  • Kidnapper Fox — vain shrouds are grown on the moon so it has cover and survives.
Cadaver Growths is intentionally left disabled: it hard-requires a generated dungeon, which the Company building is not. Use the Cadaver Bloom traps instead.

HOW IT WORKS

  • Landing is detected by polling StartOfRound.shipHasLanded rather than hooking the doors sequence, so other mods cannot starve the trigger.
  • The interior navmesh is triangulated, welded into connected regions and anchored, then every spawn point and patrol node must have a complete path to that anchor.
  • The Company building has no vanilla interior AI nodes, so the mod generates its own patrol nodes tagged for both indoor and outdoor lookups.
  • Spawned enemies are flagged as outdoor enemies: the game gates targeting behind player.isInsideFactory != enemy.isOutside, and players in the Company building are not flagged as being in a factory, so without this no enemy could ever chase or kill you.
  • Enemies are created through RoundManager.SpawnEnemyGameObject — the game's own spawn path, no custom network objects.

MULTIPLAYER (HOST-AUTHORITATIVE)

Only the host needs this mod. Clients receive the enemies through the game's own netcode.

Spawning: the host alone runs the spawner and owns enemy AI; every spawn goes through the vanilla server spawn call and replicates to all clients.
Clients: need NavMeshInCompanyRedux so the interior navmesh matches, but not this mod.
Cleanup: when the ship leaves, the host despawns what it created, so nothing leaks between landings.

REQUIREMENTS

  • BepInEx 5.4.21+ (BepInEx-BepInExPack-5.4.2305)
  • NavMeshInCompanyRedux (TRizzle-NavMeshInCompanyRedux) — provides the interior navmesh everything spawns on
  • Lethal Company V81

INSTALLATION

  • Mod manager (r2modman / Thunderstore Mod Manager): search for the mod and click Install; dependencies are pulled in automatically.
  • Manual: install the BepInEx pack and NavMeshInCompanyRedux, then drop MonstersGordion.dll into BepInEx/plugins/.

CONFIGURATION

File: BepInEx/config/Timofey.MonstersGordion.cfg (created on first launch, applied on game restart).

KeyDefaultDescription
GlobalCap5Maximum enemies alive at once on the moon.
MinSpawnInterval15Minimum delay between spawn attempts, in seconds.
MaxSpawnInterval45Maximum delay between spawn attempts, in seconds.
RespawnOnLoadtrueWipe existing enemies and repopulate on every landing.
DebugModefalseVerbose logging of every spawn decision.
UpperFloorSpawnShare70Percent of spawns placed at the ship-landing level.
OutsideEnemyShare50Percent chance to draw from the outdoor enemy pool.
OldBirdUpperFloorOnlytrueKeep the Old Bird on the upper floor, where it has room.
AllowHarmlessCreaturestrueMaster switch for the Manticoil and the Roaming Locust swarm.
EarthLeviathanFloorEmergetrueLet the worm breach up through the building floor.
CoilHeadTurretChance25Percent chance a Coil-Head spawns with a ToilHead turret.
ManticoilTurretChance25Same, for the Manticoil.
MaskedTurretChance0Same, for the Masked.
FeioparDeadTreestrueGrow dead trees so Feiopar can stalk and pounce.
CadaverBloomTrapstruePlant standalone Cadaver Bloom traps, no dungeon needed.
VainShroudIterations0Vain shroud density for the Kidnapper Fox; 0 is automatic.
ExcludedEnemiesComma-separated list of enemy names to exclude.
ExcludedEnemiesIsWhitelistfalseFlip that list into an allow-list instead.
ForeignEnemiesRemoveExcludedApply the list to enemies other mods spawn as well.
CountForeignEnemiestrueOther mods' enemies count toward the caps.
TreatEnemiesAsOutsidetrueRequired for enemies to be able to target players.
EnableStockEventsfalseLet curated stock BrutalCompanyMinus events run on Gordion.
StockEventWhitelistNothing, Gloomy, ...Which stock events are allowed here; empty means the built-in list.
HazardDensityMultiplier1Scales how many turrets, landmines or trees an event places here.
HazardMaxPerEvent40Hard ceiling on objects placed by one event.
Horde.EnabledtrueA horde closes in from both far edges of the map on every landing.
Horde.EnemyMaskedWhich enemy arrives, by its in-game name.
Horde.CountPerSide5How many arrive at each of the two edges.
Horde.DelaySeconds240Seconds after landing before they arrive.
Horde.RepeatSeconds00 is one wave per landing; otherwise the gap between waves.
Horde.AnnouncetrueAnnounce each wave in chat as it arrives.
Every spawnable enemy also gets its own section — [Enemy.Flowerman], [Enemy.Bunker Spider] and so on — with Enabled, SpawnWeight, MinSpawnCount and MaxSpawnCount. MaxSpawnCount defaults high, so GlobalCap is the only limit until you cap a type yourself. Further tuning (MinDistanceFromPlayers, AINodeCount, RequireIndoorPoints, MaintenanceInterval) lives in the Advanced section.

INTEGRATIONS AND COMPATIBILITY

  • ToilHead — per-enemy turret chances for Coil-Head, Manticoil and Masked, including the Slayer variants.
  • StarlancerAIFix — detected automatically; its AI fix applies to spawned enemies, and this mod's interior node assignment runs afterwards.
  • BrutalCompanyMinus (ExtraReborn) — shares one enemy budget through CountForeignEnemies, so the two never stack past your cap. It also brings its events to Gordion, which BCMER itself never does: its level hook returns early on this moon, so no config key, no per-event moon whitelist and not even the MEVENT command can trigger one here. With EnableStockEvents the mod rolls one event per landing from a curated list of events that can actually work without a dungeon, and hands it back to BCMER to run — your BCMER config still decides everything, from the per-event enable flag to the event type weights. The list was picked by reading each event's own code rather than its description, because BCMER's eligibility checks are often unrelated to what the event does: Warzone and Trees both refuse to run unless the moon already has a turret in its hazard table, which Gordion never does.
  • WeatherGordion — required for the AllWeather event. That event refuses to run unless the moon has at least three weathers in its pool, and Gordion's pool is empty in vanilla; WeatherGordion is what fills it. Without it the event declines itself and says so in the log.
  • All integrations are resolved at runtime by reflection, so the mod runs with or without them and never hard-depends on their versions.
  • Modded enemies appear in the config automatically but stay disabled until you enable them.

BUILD

dotnet build MonstersGordion.csproj -c Release

Output: bin/Release/netstandard2.1/MonstersGordion.dll. Game assemblies are referenced through the LethalCompany.GameLibs.Steam NuGet package as compile-only (PrivateAssets="all") — no game files are distributed.

CREDITS

  • Solo00n — author.
  • Built on BepInEx and HarmonyX.
  • Requires NavMeshInCompanyRedux by T-Rizzle for the interior navmesh.
  • Vain shroud technique inspired by FoxLover by ButteryStancakes.
  • Licensed under MIT.

MONSTERS GORDION

Автор: Solo00n

Здание Компании на 71-Гордион больше не безопасно — внутри него теперь появляются и охотятся ванильные монстры, а таймеры, веса и лимиты полностью в ваших руках.

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

  • Монстры на луне Компании — враги появляются внутри здания на интерьерном навмеше, в единственном месте, где игра никогда не угрожает.
  • Спавн по таймеру с весами — случайный интервал между минимумом и максимумом, затем взвешенный выбор из всех включённых врагов.
  • Проверка достижимости точек — анализ связных областей и проверка пути, поэтому никто не появится на крыше, полке или в яме, откуда не выбраться.
  • Баланс по этажам — настраиваемое распределение между уровнем посадки корабля и подвалом, вместо скатывания всех спавнов на просторный нижний этаж.
  • Пулы улицы и помещения — каждый спавн решает, из какого пула брать врага, поэтому собаки, гиганты и Old Bird появляются наравне с интерьерными.
  • Настройка каждого монстра — у любого типа есть Enabled, SpawnWeight, MinSpawnCount и MaxSpawnCount.
  • Чёрный или белый список — можно ограничить всю луну выбранным набором, при желании удаляя и тех, кого спавнят другие моды.
  • Самовосстановление — застрявшие враги телепортируются обратно, замершие получают новую цель, а тип, который постоянно умирает мгновенно, отключается вместо бесконечного спама.

МОНСТРЫ

Включены по умолчанию: все интерьерные враги — Bracken, Thumper, Hoarding Bug, Snare Flea, Bunker Spider, Coil-Head, Ghost Girl, Spore Lizard, Nutcracker, Jester, Masked, Hygrodere, Butler, Barber, Maneater — плюс Stingray, Tulip Snake, рои пчёл и уличные угрозы, которые корректно ходят внутри: Baboon Hawk, Eyeless Dog, Forest Keeper, Old Bird и Giant Kiwi. Тем, кому нужно гнездо, мод ставит его автоматически.

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

  • Feiopar — мод выращивает мёртвые деревья на интерьерном навмеше, чтобы он забирался, сидел в засаде и прыгал, как на улице.
  • Earth Leviathan — пол здания регистрируется как поверхность, сквозь которую можно вынырнуть, поэтому червь атакует внутри, а не кружит под полом.
  • Cadaver Bloom — высаживается как самостоятельная ловушка-труп, которая раскрывается и бросается в погоню, без всякого данжена.
  • Kidnapper Fox — на луне выращиваются вайншрауды, чтобы лисе было где прятаться и она выживала.
Cadaver Growths намеренно оставлен выключенным: ему жёстко нужен сгенерированный данжен, которым здание Компании не является. Используйте ловушки Cadaver Bloom.

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

  • Посадка определяется опросом StartOfRound.shipHasLanded, а не хуком на последовательность дверей, поэтому другие моды не могут перехватить триггер.
  • Интерьерный навмеш триангулируется, сшивается в связные области и получает якорь, после чего каждая точка спавна и каждая нода патруля обязаны иметь полный путь до этого якоря.
  • В здании Компании нет ванильных интерьерных AI-нод, поэтому мод создаёт свои, помеченные тегами и для внутреннего, и для внешнего поиска.
  • Заспавненные враги помечаются как уличные: игра разрешает выбор цели по условию player.isInsideFactory != enemy.isOutside, а игрок в здании Компании не считается находящимся на фабрике, поэтому без этого ни один враг не смог бы преследовать и убивать.
  • Враги создаются через RoundManager.SpawnEnemyGameObject — штатный путь спавна самой игры, без собственных сетевых объектов.

МУЛЬТИПЛЕЕР (HOST-AUTHORITATIVE)

Мод нужен только хосту. Клиенты получают врагов через штатный неткод игры.

Спавн: спавнер работает только у хоста, он же владеет ИИ врагов; каждый спавн идёт через ванильный серверный вызов и реплицируется всем клиентам.
Клиенты: им нужен NavMeshInCompanyRedux, чтобы навмеш совпадал, но сам этот мод не нужен.
Очистка: при отлёте корабля хост удаляет созданных им врагов, поэтому между вылетами ничего не накапливается.

ЗАВИСИМОСТИ

  • BepInEx 5.4.21+ (BepInEx-BepInExPack-5.4.2305)
  • NavMeshInCompanyRedux (TRizzle-NavMeshInCompanyRedux) — даёт интерьерный навмеш, на котором всё спавнится
  • Lethal Company V81

УСТАНОВКА

  • Через менеджер (r2modman / Thunderstore Mod Manager): найти мод и нажать Install, зависимости подтянутся сами.
  • Вручную: установить BepInEx-пак и NavMeshInCompanyRedux, затем положить MonstersGordion.dll в BepInEx/plugins/.

НАСТРОЙКА

Файл: BepInEx/config/Timofey.MonstersGordion.cfg (создаётся при первом запуске, применяется после перезапуска игры).

КлючПо умолчаниюОписание
GlobalCap5Максимум одновременно живых врагов на луне.
MinSpawnInterval15Минимальная задержка между попытками спавна, в секундах.
MaxSpawnInterval45Максимальная задержка между попытками спавна, в секундах.
RespawnOnLoadtrueОчищать врагов и заселять луну заново при каждой посадке.
DebugModefalseПодробный лог каждого решения спавнера.
UpperFloorSpawnShare70Процент спавнов на уровне посадки корабля.
OutsideEnemyShare50Процент шанса взять врага из уличного пула.
OldBirdUpperFloorOnlytrueДержать Old Bird на верхнем этаже, где ему есть где развернуться.
AllowHarmlessCreaturestrueОбщий выключатель для Manticoil и роя саранчи.
EarthLeviathanFloorEmergetrueРазрешить червю выныривать сквозь пол здания.
CoilHeadTurretChance25Процент шанса, что у Coil-Head будет турель от ToilHead.
ManticoilTurretChance25То же самое для Manticoil.
MaskedTurretChance0То же самое для Masked.
FeioparDeadTreestrueВыращивать мёртвые деревья, чтобы Feiopar охотился из засады.
CadaverBloomTrapstrueВысаживать самостоятельные ловушки Cadaver Bloom без данжена.
VainShroudIterations0Густота вайншраудов для лисы; 0 означает автоматический режим.
ExcludedEnemiesСписок имён врагов через запятую для исключения.
ExcludedEnemiesIsWhitelistfalseПревратить этот список в белый список.
ForeignEnemiesRemoveExcludedПрименять список и к врагам, которых спавнят другие моды.
CountForeignEnemiestrueВраги других модов учитываются в лимитах.
TreatEnemiesAsOutsidetrueОбязательно, чтобы враги могли выбирать игроков целью.
EnableStockEventsfalseРазрешить отобранным штатным ивентам BrutalCompanyMinus идти на Гордионе.
StockEventWhitelistNothing, Gloomy, ...Какие штатные ивенты здесь допущены; пусто — встроенный список.
HazardDensityMultiplier1Множитель числа турелей, мин и деревьев, которые ставит ивент.
HazardMaxPerEvent40Жёсткий потолок на количество объектов от одного ивента.
Horde.EnabledtrueОрда заходит с двух дальних краёв карты на каждой высадке.
Horde.EnemyMaskedКто именно приходит — внутриигровое имя врага.
Horde.CountPerSide5Сколько появится у каждого из двух краёв.
Horde.DelaySeconds240Через сколько секунд после посадки они приходят.
Horde.RepeatSeconds00 — одна волна за высадку, иначе промежуток между волнами.
Horde.AnnouncetrueОбъявлять каждую волну в чате.
У каждого спавнящегося врага есть своя секция — [Enemy.Flowerman], [Enemy.Bunker Spider] и так далее — с параметрами Enabled, SpawnWeight, MinSpawnCount и MaxSpawnCount. Значение MaxSpawnCount по умолчанию высокое, поэтому единственным ограничением остаётся GlobalCap, пока вы сами не ограничите конкретный тип. Тонкая настройка (MinDistanceFromPlayers, AINodeCount, RequireIndoorPoints, MaintenanceInterval) находится в разделе Advanced.

ИНТЕГРАЦИИ И СОВМЕСТИМОСТЬ

  • ToilHead — отдельные шансы турели для Coil-Head, Manticoil и Masked, включая варианты Slayer.
  • StarlancerAIFix — определяется автоматически; его фикс применяется к заспавненным врагам, а назначение интерьерных нод этим модом выполняется после него.
  • BrutalCompanyMinus (ExtraReborn) — делит общий лимит врагов через CountForeignEnemies, поэтому суммарная популяция не превысит ваш кап. А ещё приводит на Гордион свои ивенты, чего сам BCMER не делает никогда: его хук уровня выходит на этой луне досрочно, поэтому здесь бессильны и настройки, и белые списки лун у ивентов, и даже команда MEVENT. При EnableStockEvents мод раз за высадку разыгрывает один ивент из отобранного списка тех, что работают без подземелья, и передаёт его обратно BCMER на исполнение — все решения по-прежнему за вашим конфигом BCMER, от галочки у ивента до весов типов. Список собран чтением кода каждого ивента, а не описаний: проверки пригодности в BCMER часто не связаны с самим ивентом — Warzone и Trees оба отказываются работать, если у луны нет турели в таблице опасностей, а у Гордиона её нет никогда.
  • WeatherGordion — нужен для ивента AllWeather. Тот отказывается работать, если в пуле луны меньше трёх погод, а у Гордиона он в ванили пуст; наполняет его именно WeatherGordion. Без него ивент отклоняет сам себя и пишет об этом в лог.
  • Все интеграции определяются в рантайме через рефлексию, поэтому мод работает и с ними, и без них, и не привязан жёстко к их версиям.
  • Модовые враги появляются в конфиге автоматически, но остаются выключенными, пока вы сами их не включите.

СБОРКА

dotnet build MonstersGordion.csproj -c Release

Результат: bin/Release/netstandard2.1/MonstersGordion.dll. Сборки игры подключены через NuGet-пакет LethalCompany.GameLibs.Steam только для компиляции (PrivateAssets="all") — файлы игры не распространяются.

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

  • Solo00n — автор.
  • Построено на BepInEx и HarmonyX.
  • Требуется NavMeshInCompanyRedux от T-Rizzle для интерьерного навмеша.
  • Идея выращивания вайншраудов вдохновлена модом FoxLover от ButteryStancakes.
  • Лицензия MIT.

CHANGELOG

Changelog

1.9.0

  • Outdoor hazard events actually place something now. OutsideTurrets, OutsideLandmines and the tree events only ever queued their objects; the placing is done by BrutalCompanyMinus from a postfix on RoundManager.FinishGeneratingLevel, and the game calls that solely inside if (currentLevel.spawnEnemiesAndScrap) — false at the Company. The queue was filled every landing and never read. Its own placer would not have helped either: it requires ground tagged as terrain and keeps clear of spawn-denial points, and this moon has neither. The mod now drains the queue and places the objects on the navmesh it already trusts, then removes them when the ship leaves.
  • Two new settings for it. HazardDensityMultiplier scales the result, and HazardMaxPerEvent caps it. The count comes from BCMER's own density — objects per square metre — times the walkable area actually measured here, and every number is logged so it can be tuned.
  • Events no longer announce themselves in chat. Since 1.6.1 the chosen event is published to BCMER's own event list, which its panel and overlays such as LCBridgeOverlay read, so the chat line was saying the same thing twice. The AnnounceEvents setting is gone with it. The horde still announces itself — it is not an event, so nothing else reports it.

1.8.0

  • The stock event list was rebuilt by reading each event's code. The 1.6.0 list was picked from event descriptions and general reasoning; this one comes from the decompiled AddEventIfOnly() and Execute() of every candidate. BCMER's eligibility checks are frequently unrelated to what the event does, so a description is not enough to tell whether something can work here.
  • Warzone removed — it can never fire on this moon. Its own check wants a turret or a landmine already present in the level's hazard table, and Gordion's is empty. It had been declining itself on every landing since 1.6.0.
  • Six events added: DoorFailure and ShipLightsFailure (ship-side, no preconditions, and the lights come back on departure), ManualCameraFailure (kills the map screen), IsMetal (makes everything conductive, which pairs with the storms a weather mod can bring here), and LeaflessTrees / LeaflessBrownTrees (dead trees outdoors, which suits Feiopar's tree hunting).
  • Existing whitelists are migrated. BepInEx never overwrites a value that already exists, so an upgrade would have silently kept the old seven names. A whitelist still identical to the 1.6.0 default is replaced with the new one; an edited one is left alone.
  • The README no longer suggests Trees as an optional addition — it is blocked by the same empty hazard table as Warzone.

1.7.0

  • The horde is now a standing feature of the moon, not a random event. It used to compete in the [BrutalCompany] roll, so most landings never saw it and one that did saw no BCMER event. It now runs on every landing, independently, under its own [Horde] section — a landing can have both a horde and an event.
  • The horde is configurable. Enemy picks who arrives by in-game name rather than always Masked, CountPerSide sets the size of each flank, DelaySeconds the wait after landing, RepeatSeconds turns a single wave into repeating ones, and Announce is its own toggle so the event setting no longer silences it.
  • EnableCustomEvents is gone. The horde was the only thing it controlled, and the horde is no longer an event; [Horde] Enabled replaces it.

1.6.1

  • Events now show up in overlays and in BrutalCompanyMinus's own panel. The event ran, but every display insisted nothing had happened: anything reporting the round's events reads EventManager.currentEvents, and running an event through MEvent.Execute() does not put it there — BCMER fills that list in ChooseEvents, which never executes on this moon. The mod now publishes the chosen event to that list itself, and clears it when nothing was chosen so a leftover from the previous moon cannot be shown here.
  • The Executed flag is deliberately left untouched. BCMER sets it in ApplyEvents and never resets it anywhere, and ApplyEvents skips any event already carrying it — marking one here would have silently barred that event from every other moon for the rest of the session.

1.6.0

  • BrutalCompanyMinus events now happen on Gordion. BCMER never ran a single event on the Company moon, and no setting could change that: its LoadNewLevel hook returns early on this moon, before the event roll is reached, so the moon blacklist, the per-event moon whitelists and even the MEVENT terminal command were all bypassed. The mod now performs the roll itself and hands the chosen event back to BCMER to execute.
  • Only events that can actually work here are eligible. The moon has no dungeon, no scrap generation, and BCMER skips its own enemy-list snapshot pass on it — so any event that edits the level's enemy lists would change them with nothing to restore from. The curated default list is therefore built from events that touch none of that: Nothing, Gloomy, Meteors, OutsideLandmines, OutsideTurrets, Warzone and AllWeather. Edit StockEventWhitelist to narrow or widen it.
  • Your BCMER config is always obeyed. An event is skipped when its Event Enabled? is off, when its type has weight 0 in Difficulty_Settings.cfg, when it is a Special or Beta event you have not enabled, when its moon lists exclude Gordion, or when its own AddEventIfOnly() check fails. Every skip is logged with the reason, so a no-show is never a mystery.
  • New event, Masked Horde. After a long stay on the moon, a group of Masked closes in from both far edges of the map at once. The edges are derived from the navmesh at runtime rather than hardcoded, so moon overhaul mods that reshape the outdoor area cannot strand them. It ignores GlobalCap on purpose — a horde a cap could shave down to two would not be one.
  • WeatherGordion makes AllWeather possible. That event requires at least three weathers in the moon's pool, and Gordion's is empty in vanilla. WeatherGordion fills it; without that mod the event politely declines itself and says why.
  • Both event groups are off by default (EnableStockEvents, EnableCustomEvents).

1.5.5

  • Old per-enemy caps no longer survive an upgrade. 1.5.0 raised the default MaxSpawnCount so only GlobalCap limits the moon, but BepInEx never overwrites values that already exist in a config file — so anyone upgrading kept the old caps of 1-3 and saw, for example, at most 2 Masked with GlobalCap = 10. The mod now performs a one-time migration on first run: any MaxSpawnCount still sitting on its old per-enemy default is raised to the new one, every change is logged, and values you tuned yourself are left alone.

1.5.4

  • New icon and a fully restyled mod page: bilingual English/Russian README matching the standard layout used across these mods, with the demo GIF at the top and a complete configuration table. No gameplay changes.

1.5.3

  • New icon and a rewritten mod page: a demo GIF at the top, a gameplay screenshot, a clearer monster list and integration table. No gameplay changes.

1.5.2

  • Feiopar's trees are now on the lower floor only (and a touch taller). The upper level is a thin edge strip where trees lined up and the leopard dropped over the side to a lower floor; the roomy lower floor scatters them properly and there is no level below to fall through.

1.5.1

  • Trees are no longer placed on ledge edges, which is what let Feiopar drop/leap over the side to a lower floor. A tree spot now requires solid navmesh at the tree's own height all the way around it (4 m ring), keeping the leopard's perch and drop on the same level.

1.5.0

  • No per-monster cap by default. Each type's MaxSpawnCount now defaults high (40), so only GlobalCap limits the moon's population out of the box — set a lower MaxSpawnCount on a specific enemy if you want to cap that type. MinSpawnCount/MaxSpawnCount ranges widened to 40.
  • Feiopar's trees now grow tall on the open upper floor. Trees are biased to the ship-landing level (no ceiling there), where they're scaled up to ~14 m for a proper forest look; any on a lower level stay ~8 m. More trees by default (14).
  • Trees are scattered, not lined up, and never inside walls/props. Placement now spaces trees apart, rejects spots where the trunk would clip a wall or object, and keeps open floor around each so Feiopar's perch stays reachable.

1.4.5

  • Feiopar now actually leaps onto trees. The real blocker (found in PumaAI.StartLeapToTree): before leaping it raycasts the tree's layer-25 collider upward and rejects the tree as "too short" unless it reaches ~14 m — our collider was only 4 m, so every tree was rejected and the leopard just ran in place underneath. The tree collider is now a tall thin capsule (16 m), which passes the check and sets the perch near the top; the visible tree is scaled to ~8 m so its top is near where the leopard sits.
  • Trees are spread out (minimum spacing) instead of clustering in one spot.

1.4.4

  • Dead trees stand upright. When reusing a real in-game tree mesh, the mesh's "up" axis is baked into the source object's transform (LC tree meshes are authored Z-up), so applying it with identity rotation laid it on its side. The mod now captures and applies the source's world rotation and scale, normalises height to ~5 m, and drops the tree so its base sits on the floor.
  • Trees are placed in open spots. Feiopar's ambush perch is ~4 m from the tree, so a tree jammed against a wall put the perch behind it and the leopard pathed into a corner. Tree spots now require open navmesh around them (6 of 8 surrounding probes) so the perch is reachable.
  • The idle-nudge is unchanged and does not affect Feiopar (it is exempt as an ambusher); it remains only a safety net for other enemies.

1.4.3

  • Feiopar actually stalks now. The dead trees were split across two objects, so PumaAI's physics tree search never matched: it finds trees with OverlapSphere on layer 25 and needs that same collider's object to be tagged Tree and present in AllTreeNodes. Each tree is now a single vanilla-style object — tagged Tree, on layer 25, with a non-trigger collider — plus a canopy collider ~16 m up for the validation CheckSphere. Feiopar perches on a tree and pounces players that approach, instead of just wandering.
  • Dead trees now use a real in-game tree mesh when one is loaded, else an improved procedural dead tree (trunk + angled branches) with the HDRP material.
  • Cadaver Growths is documented as intentionally unsupported — it hard-requires a DunGen dungeon the Company building doesn't have (even BrutalCompanyMinus's Cadaver event can't bypass it). Use the Cadaver Bloom traps for a working cadaver on Gordion.

1.4.2

  • Dead trees are visible now. The trunks were built from a Unity primitive, whose default Standard-shader material renders invisible under the game's HDRP pipeline. The mod now clones a real HDRP material from the scene and tints it, so Feiopar's trees show.
  • Feiopar no longer gets yanked off its ambush. It stalks by perching motionless on a tree, but the idle-nudge treated that as "stuck" and moved it every 25 s, so it never hunted — it's now exempt from the nudge.
  • Vain shrouds only grow when the Kidnapper Fox can actually spawn (enabled and in the pool). Previously an explicit VainShroudIterations or a leftover-enabled Fox grew weeds even when only, say, Cadaver Bloom was active — weeds are a Fox-only feature.
  • Docile Locust Bees (Roaming Locust) disabled by default — not useful/visible indoors.

1.4.1

  • AllowHarmlessCreatures (renamed from AllowDaytimeEnemies) now governs only the two genuinely harmless ambient creatures — Manticoil and the Roaming/Docile Locust swarm. Tulip Snake (which can grab players) is no longer swept up by it and always stays in the normal spawn pool.

1.4.0

Ambient swarms, a harmless-creature master switch, and working versions of the three previously-broken monsters — each traced to its exact cause in the game code.

  • Ambient swarms enabled at low weight by default: Docile Locust Bees (harmless), Red Locust Bees and Butler Bees.
  • [Balance] AllowHarmlessCreatures (default true): one switch to keep the building free of the harmless ambient creatures (Manticoil and the Roaming/Docile Locust swarm).
  • Earth Leviathan (worm) now attacks. SandWormAI.StartEmergeAnimation only emerges where the surface is "natural" (a naturalSurfaceTags tag), and with no Terrain on the Company moon it cancelled every emerge and roamed under the floor forever. New [Balance] EarthLeviathanFloorEmerge adds the interior floor tag(s) to naturalSurfaceTags so it breaches up through the floor (restored on leave).
  • Feiopar (leopard) now stalks. PumaAI hunts only from Tree-tagged objects and perches ~3 m above ground next to them (it does not climb a mesh). [Integration] FeioparDeadTrees grows visible dead-tree trunks on the navmesh, each with the canopy collider PumaAI validates, so it stalks and jumps between them. FeioparTreeCount controls how many.
  • Cadaver Bloom now works without a dungeon. The Growth master hard-requires a DunGen dungeon (impossible in the Company building); the Bloom does not. [Integration] CadaverBloomTraps plants Blooms directly at random spots and bursts them when a player comes within CadaverBloomTriggerRange, so they act as standalone corpse traps. Cadaver Growths remains unsupported (needs a dungeon).
  • Experimental monster fixes are host-side and off by default; enable per-enemy to test.

1.3.2

  • Vain shrouds no longer grow in the same place every time. 1.3.1 spread them from the navmesh anchor, which is computed deterministically, so the Fox's nest always landed on the exact same spot. The origin is now a fresh random reachable point on the interior navmesh each landing (50/50 between floors, clear of where players stand when the ship lands). Since GenerateMold seeds its spread from that position, the shape of the patch changes too.
  • New [Integration] VainShroudPatches (default 1, max 4) grows several separate overgrown areas, each at its own random spot.

1.3.1

  • Vain shrouds are now grown directly, so Bush Wolf finally works. 1.3.0 seeded the level's moldSpreadIterations and relied on the vanilla level-load pipeline to generate the weeds — but in LethalLevelLoader modpacks that pipeline never runs on Gordion (neither our hooks nor the game's own mold logging appear at all). The mod now calls MoldSpreadManager.GenerateMold itself on landing. That call is self-contained: it places the mold props and then runs grassInstancer.BatchChildren() and GetBiggestWeedPatch(), which is exactly what BushWolfEnemy's GetWeeds() check reads, so the Fox survives instead of despawning.
  • The LoadPlanetsMoldSpreadData hook from 1.3.0 is kept for setups where the vanilla path does work; the direct call is the fallback that makes it reliable here.
  • Weed generation is host-side. The host decides whether the Fox lives, so it works — but other players may not see the weed props themselves.

1.3.0

  • Vain shrouds now actually grow on Gordion, so the Kidnapper Fox (Bush Wolf) can hide and survive. Replaced the old RoundManager.LoadNewLevel hook (which LethalLevelLoader bypassed, so it never fired) with a postfix on StartOfRound.LoadPlanetsMoldSpreadData — the canonical, core save-load method where the game decides weed amounts, the same hook the FoxLover mod uses. The Company moon ships with canSpawnMold = false; the mod flips it on and seeds moldSpreadIterations, then the vanilla pipeline generates and network-syncs the weeds on landing. Controlled by [Integration] VainShroudIterations (0 = auto, grows weeds only when Bush Wolf is enabled). Set it and reload the save / fly fresh — weeds are decided at save load, not mid-round.
  • Original implementation written from the decompiled game API; credit to ButteryStancakes' FoxLover (GPL) for demonstrating the hook. No FoxLover code is included.

1.2.1

  • New icon: a red bestiary-scan look (dark red scanlines, vignette, corner viewfinder brackets, blood glow). No code changes — republished so the store page shows the new artwork.

1.2.0

  • Per-enemy ToilHead settings for every turret-capable enemy. ToilHead can put a turret on three enemies — Coil-Head, Manticoil and Masked — and each has a regular and a Slayer (minigun) variant. Previously only Coil-Head and Manticoil shared a single chance and Masked could not be configured at all. The old [Integration] ToilHeadSpawnChance / ToilSlayerChance are replaced by a [ToilHead] section: CoilHeadTurretChance/CoilHeadSlayerChance, ManticoilTurretChance/ManticoilSlayerChance, MaskedTurretChance/MaskedSlayerChance. Masked support was added to the reflection bindings (SetToilMaskedOnServer / SetSlayerMaskedOnServer).

1.1.1

  • Giant Kiwi enabled by default — confirmed working: it is nest-requiring and the mod already places its nest on the interior navmesh automatically (the 1.1.0 notes wrongly listed it as unconfirmed).
  • Removed the stale Old Bird note ("cause not yet confirmed") — its instant-death was the missing nest, which automatic nest placement fixed; working enemies no longer log warning-level notes on every landing.

1.1.0

First stable release. Bundles every fix from the 1.0.x line and ships a curated default roster of enemies that work correctly inside the Company building.

  • Enabled by default: all interior enemies plus Stingray and Tulip Snake, and the outdoor threats that path fine indoors — Baboon Hawk, Eyeless Dog, Forest Keeper and Old Bird (the Old Bird has its nest placed automatically and is locked to the upper floor).
  • Disabled by default (they don't work correctly on Gordion yet, but remain in the config/code and on the experimental git branch): Feiopar, Cadaver Growths, Cadaver Bloom, Bush Wolf, Earth Leviathan, Giant Kiwi, Manticoil and the bees. The experimental FeioparFakeTrees also defaults off.
  • Includes: enemy targeting fix (TreatEnemiesAsOutside), reachability-checked spawns with upper/lower floor balance, whitelist mode, per-mod foreign-enemy policy, automatic nest placement for nest-requiring enemies, the maintenance pass (AI re-apply, stranded-enemy rescue, idle-stalker nudge), auto-disable of types that keep dying instantly, and full spawnability logging.

1.0.12

  • Diagnostic for the vain-shroud hook. RoundManager.LoadNewLevel is patched to grow weeds, but its log never appeared — the hook may be bypassed (LethalLevelLoader reworks level loading) or bail on the level check. The prefix now logs unconditionally at entry (planet, scene, levelID, isCompany) so the next landing shows exactly whether it fires and why weed generation is or isn't happening.

1.0.11

  • No more spawn spam from enemies that can't survive here. Some enemies destroy themselves on spawn via Destroy() (not KillEnemy), so the counter never rose and they were re-spawned endlessly — most visibly Cadaver Growths (CadaverGrowthAI logs "Found no dungeon" and self-destructs). The mod now watches spawns and, after a type dies within a few seconds twice, disables it for the rest of the landing with a clear log line. Cadaver Growths and Cadaver Bloom are also disabled by default now.
  • Idle-stalker nudge. An owned enemy that stands essentially still for ~25 s is re-pathed to a fresh reachable point — this unsticks Feiopar (which parks on a fake tree and stops) and any other stalled enemy. Ambush-by-design enemies (Bracken, Coil-Head, Barber, Jester, Ghost Girl, Cadaver Bloom) are exempt so they behave normally.
  • Vain shroud diagnostics. The level-load weed setup now always logs the Bush Wolf enabled state, the configured and resolved iteration counts, and the level's current moldSpreadIterations, so a failed weed generation can be diagnosed from the log.

1.0.10

  • Whitelist mode. New [Advanced] ExcludedEnemiesIsWhitelist (default false): flip it and the ExcludedEnemies list becomes an allow-list — only the listed types may spawn, everything else is excluded. Lasso and Red pill stay excluded regardless, and an empty list in whitelist mode logs a warning (nothing would spawn). It also feeds ForeignEnemies=RemoveExcluded, so whitelist + that policy strips any non-listed enemy other mods spawn, letting you pin the whole moon to a chosen set of enemies.

1.0.9

  • Old Bird upper-floor lock. New [Balance] OldBirdUpperFloorOnly (default true): the Old Bird (RadMech) spawns only on the ship-landing level, ignoring UpperFloorSpawnShare. It is huge and the basement is cramped, so it fights far better upstairs.
  • Feiopar (PumaAI) can stalk again — experimental. PumaAI only stalks from objects tagged Tree; the Company building has none, so ChooseTargetTree finds nothing and Feiopar never sets a destination (it just stands there). New [Integration] FeioparFakeTrees (default true) fabricates tree nodes on the interior navmesh, each with the overhead canopy collider (layer 25) that PumaAI.Start validates against, and clears PumaAI's static tree cache so it adopts them. It may perch oddly near the ceiling — set the flag to false if it looks broken.

1.0.8

  • Corrected the nest attribution. The nest-requiring enemy in vanilla v81 is the Giant Kiwi (GiantKiwiAI, birdNestPrefab), not the Old Bird — the 1.0.7 notes were wrong. The nest feature is data-driven off the EnemyType flags, so it already served the correct enemy; only the documentation is fixed.
  • Old Bird (RadMech) instant-death is still open. It does not use a nest, so 1.0.7 did not address it. Added an early-death diagnostic: when an enemy we spawned dies within 4 s, the log records its AI class and a stack trace naming whatever called KillEnemy, so the real cause can be identified from one landing instead of guessed.

1.0.7

  • Nest-requiring enemies work now. EnemyAI.Start contains if (!foundNest && enemyType.requireNestObjectsToSpawn) { isEnemyDead = true; Destroy(gameObject); }, and Gordion places no nests during level generation, so such an enemy destroyed itself one frame after spawning. The mod now places the enemy's own nest prefab on the interior navmesh (properly network-spawned) before spawning it; the enemy finds it, teleports onto it via UseNestSpawnObject and lives inside the building. Nests are cleaned up when the ship leaves. (In v81 this is the Giant Kiwi — see 1.0.8; the 1.0.7 notes mis-named it the Old Bird.)
  • If a nest cannot be placed, the enemy is skipped with a logged reason naming its AI class instead of being spawned into an instant self-destruct.

1.0.6

  • Vain shrouds can now be grown on Gordion, which makes the Kidnapper Fox (Bush Wolf) playable instead of excluded. New [Integration] VainShroudIterations: the mod sets the level's own moldSpreadIterations before load, so weeds are generated and network-synced through the vanilla path (clients need no mod). 0 = automatic — weeds grow only when Bush Wolf is enabled. Bush Wolf is no longer force-excluded; it is simply skipped, with a logged explanation, if no weeds exist on the moon.
  • Correct defaults for the v81 vanilla enemies that previously fell through to the "unknown, disabled" fallback: Feiopar (PumaAI), Cadaver Growths (CadaverGrowthAI), Cadaver Bloom (CadaverBloomAI), Stingray (StingrayAI) and GiantKiwi (GiantKiwiAI).
  • Spawnability report in the log. Every landing now lists the resulting spawn pool and, for anything that will not spawn, the enemy name, its AI class and the concrete reason (no prefab, blacklisted, Enabled = false, SpawnWeight = 0, MaxSpawnCount = 0, or an unmet map requirement).
  • Enabled enemies with known map caveats now log them: Bush Wolf's weed requirement, Cadaver Bloom being a dormant seed that only Cadaver Growths plants and wakes (enable Cadaver Growths instead of spawning Blooms directly), Feiopar's tree stalking, and Earth Leviathan's burrowing.

1.0.5

  • Enemies can finally see, chase and kill you. EnemyAI.PlayerIsTargetable requires player.isInsideFactory != enemy.isOutside, and players inside the Company building are not flagged as being in a factory (there is no EntranceTeleport there). Enemies were being flagged as interior, so the check failed for every player — Masked walked up and calmly walked away, MeetsStandardPlayerCollisionConditions refused every kill, and many AIs had no valid target to path toward. Spawned enemies are now flagged as outdoor enemies ([Advanced] TreatEnemiesAsOutside, default true) while still being pointed at interior patrol nodes.
  • Patrol nodes are now created twice per position, tagged AINode and OutsideAINode, so an AI that re-resolves its nodes lands inside the building either way instead of trekking to the outdoor node field.
  • New maintenance pass ([Advanced] MaintenanceInterval, default 3 s): re-applies AI flags and node sets to spawned enemies, and teleports any enemy that ended up somewhere unreachable back onto the interior navmesh.
  • The blacklist now applies to the whole moon: [Advanced] ForeignEnemies (default RemoveExcluded) despawns blacklisted enemy types even when another mod spawned them (vanilla spawn cycles, BrutalCompanyMinus, MoreEnemies), which is why blacklisted baboon hawks and worms could still appear. Ignore restores the old behaviour; RemoveNotEnabled also removes types with Enabled = false. Enemies in a kill animation are never removed.
  • Bush Wolf (Kidnapper Fox) is now excluded automatically with a logged reason: BushWolfEnemy.Start() kills itself immediately when the map has no vain shrouds to hide in, and Gordion has none.

1.0.4

  • No gameplay changes: version bump for Thunderstore (1.0.3 was already published there) with the website_url pointing to the GitHub repository.

1.0.3

  • Manticoil is now disabled by default (it behaves erratically on Gordion); enable it in [Enemy.Manticoil] if you want it back — the ToilHead "Manti-Toil" integration still applies.
  • Floor balance: new [Balance] UpperFloorSpawnShare (default 70) — percentage of spawns placed at the ship-landing level; the rest go to the basement. Previously the much larger basement floor dominated the area-weighted pick and acted as a funnel.
  • Outdoor/indoor pools: new [Balance] OutsideEnemyShare (default 50) — each spawn first rolls whether to pick from outdoor enemy types (dogs, giants, baboon hawks, Old Birds...) or indoor ones, then runs the weighted random within that pool.
  • Region filtering relaxed: all navmesh regions with a complete path to the main-hall anchor are now eligible (previously only the single largest region), so a legitimately connected upper floor can no longer be discarded wholesale.

1.0.2

  • Reachability check: spawn points and patrol nodes are now validated with connected-region analysis plus NavMesh.CalculatePath to a main-hall anchor. Enemies can no longer spawn on roof patches, in pits or other one-way spots they cannot walk out of (fixes the vanilla "eliminated all possible nodes" AI error).
  • Fixed ToilHead and StarlancerAIFix being reported as "not detected" even when installed: detection no longer relies on PluginInfo.Instance and falls back to scanning loaded assemblies.
  • ToilHead integration bound to the exact ToilHead 1.9.1 API (Api.SetToilHeadOnServer / Api.SetMantiToilOnServer); added [Integration] ToilSlayerChance (default 0) for the minigun turret variant.
  • StarlancerAIFix is intentionally no longer invoked manually: its EnemyAI.Start postfix runs automatically, and this mod's interior node assignment executes afterwards so it takes precedence on the surface-level Company moon.

1.0.1

  • Landing detection rewritten from a Harmony hook on the doors-opening sequence to polling StartOfRound.shipHasLanded (LandingWatcher) — robust against other mods transpiling the landing coroutine; includes a 20 s fallback trigger.
  • Explicit landing diagnostics in the log (planet, scene, host flag, company-moon flag), including a clear message when the session is not the host.

1.0.0

  • Initial release: timer-driven weighted spawning of vanilla enemies inside the Company building on the NavMeshInCompanyRedux navmesh, with per-enemy Enabled/weight/min/max, global cap, RespawnOnLoad, debug logging, generated interior patrol nodes, and host-only network-authoritative spawning.