You are viewing a potentially older version of this package. View all versions.
IAmBatby-LethalLevelLoader-1.1.6 icon

LethalLevelLoader

A Custom API to support the manual and dynamic integration of custom levels and dungeons in Lethal Company.

Date uploaded 3 months ago
Version 1.1.6
Download link IAmBatby-LethalLevelLoader-1.1.6.zip
Downloads 1515889
Dependency string IAmBatby-LethalLevelLoader-1.1.6

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
Evaisa-FixPluginTypesSerialization-1.1.1 icon
Evaisa-FixPluginTypesSerialization

Fix custom Serializable structs and such not properly getting deserialized by Unity.

Preferred version: 1.1.1
Evaisa-LethalLib-0.15.1 icon
Evaisa-LethalLib

Personal modding tools for Lethal Company

Preferred version: 0.15.1
MaxWasUnavailable-LethalModDataLib-1.2.2 icon
MaxWasUnavailable-LethalModDataLib

A library for Lethal Company, providing a standardised way to save and load modded data.

Preferred version: 1.2.2

README

LethalLevelLoader

A Custom API to support the manual and dynamic integration of custom levels and dungeons in Lethal Company.

Thunderstore Link: https://thunderstore.io/c/lethal-company/p/IAmBatby/LethalLevelLoader/

Discord Thread: https://discord.com/channels/1168655651455639582/1193461151636398080

Description

1.1.0 Has Released! Read The Devlog Here: https://github.com/IAmBatby/LethalLevelLoader/wiki/Dev-Logs

LethalLevelLoader is a custom API to support the manual and dynamic integration of custom levels and dungeons in Lethal Company. Mod Developers can provide LethalLevelLoader with their custom content via code or via automatic assetbundle detection, From there LethalLevelLoader will seamlessly load it into the game.

This API is dependant on LethalLib, As it was originaly intended to be a direct update to Evaisa & SkullCrusher's mod. It has temporaily been split into this secondary release to allow for more unstable releases, in order to stress test it's systems and collect bug reports from active developers and players.

Currently all Item & Scrap related systems have not been implemented in this mod and should use LethalLib's systems instead.

This Mod is Likely To Be Incompataible with LethalExpansion, Due To The inherit conflicts involved in changing the same systems.

How To Use (Users / Players)

Simply install LethalLevelLoader and LethalLib.

If a mod using LethalLevelLoader supplies a .lethalbundle file, LethalLevelLoader will automatically find and load it’s content as long as it’s in the /plugins/ folder (Subfolders will be detected)

How To Use (Modders / Developers)

Please refer to the LethalLevelLoader Wiki for documentation on utalising this API for your custom content https://github.com/IAmBatby/LethalLevelLoader/wiki

Features Currently Supported

  • Manual Custom SelectableLevel (Moon) Integration & Injection
  • Automatic Custom SelectableLevel (Moon) Integration & Injection Via AssetBundles
  • Manual Custom DungeonFlow (Dungeon) Integration & Injection
  • Automatic TerminalKeyword & TerminalNode creation for Custom SelectableLevels’s
  • Automatic Injection Of DungeonFlows Into SelectableLevel's Based On Level Tags, Author, Level Name & Route Price
  • Controllable Overriding Of Dungeon Size Multiplier
  • Automatic Custom SelectableLevel Content NetworkObject Registration
  • Manual Custom DungeonFlow Content NetworkObject Registration
  • Automatic Custom SelectableLevel Content Re-Assigning For References To Vanilla Content
  • Automatic Custom DungeonFlow Content Re-Assigning For References To Vanilla Content
  • Automatic Warmup Of Shaders Found In Custom SelectableLevel's And Custom DungeonFlow's

Features Currently Unsupported (Upcoming)

  • Generation Of Multiple Dungeons In A Single SelectableLevel
  • Dynamic Injection Of Custom Scrap Based On Tags, Author, Level Name & Route Price
  • Custom DunGen Archetype Injection
  • Custom DunGen Line Injection
  • Custom DunGen Node Injection
  • Custom DunGen Tile Injection
  • Custom Weather Integration
  • More Config Options

Known Issues

  • Custom ItemGroups will not be found when parsed via the dynamic config.
  • Issues with March may exist.

Credits

  • Evaisa (This Mod is directly based from LethalLib's codebase and could have been made without it's pre-existing foundations.)
  • SkullCrusher (This Mod is directly based from SkullCrusher's LethalLib' Fork and could have been made without it's pre-existing foundations.)
  • HolographicWings (This Mod was inspired by LethalExpansion and could not have been made without HolographicWing's support and research.)
  • KayNetsua (This Mod was internally tested using KayNetsua's "E Gypt" Custom Level and KayNetsua assisted in testing LethalLevelLoader's usage)
  • Badhamknibb (This Mod was internally tested using Badhamknibb's "SCP Foundation" Custom Dungeon and Badhamknibb's assisted in testing LethalLevelLoader's usage)
  • Scoopy (This Mod was internally tested using Scoopy's "LethalExtension Castle" Custom Dungeon and Scoopy assisted in testing LethalLevelLoader's usage)
  • Xilo (Xilo provided multiple instances of Bepinex & Unity.Netcode related support during the development of this Mod.)
  • Lordfirespeed (Lordfirespeed provided multiple instances of Bepinex & Unity.Netcode related support during the development of this Mod.)
  • onionymous (Onionymous provided a preview build of their Networked Scene Patcher API, allowing for dynamic, networked scene injection)
  • Game-Icons.net (For the artwork used for the mod's logo)

Changelog

Version 1.1.6

  • Hotfixed oversight were game would fail to load if LethalLevelLoader had no AssetBundles to load.
  • Fixed oversight were vanilla SelectableLevel object names were being modified.

Version 1.1.5

  • Partially refactored the AssetBundle loading system to pause attempts to skip to the main menu before bundles have finished loading.
  • Implemented a safe guard to prevent the game breaking when loading a previous save that had a custom level as the current level.
  • Added a quick fix to retain Lethal Expansion route prices.
  • Fixed oversight were custom levels with spaces in their names were not routing correctly.
  • Fixed oversight were custom Levels with spaces in their names could not be simulated.
  • Fixed oversight were ItemGroup's were only partially being extracted from the base game.
  • Implemented a sanitization system to ensure Level assets and their relevant config entries are cleaned of illegal characters that could break the game.
  • Added a $ to the "preview price" keyword to improve consistency with base game terminal nodes.

Version 1.1.4

  • Fixed an issue where inside enemies where being applied outside when using the automatic ExtendedLevel configuration files.

Version 1.1.3

  • Introduced initial support for LethalExpansion moons.
  • Fixed oversight were Dungeons were not correctly being patched over multiple playthroughs in a single session.
  • Fixed oversight were the LethalLevelLoader NetworkManager was not being created on subsequent playthroughs in a single session.
  • Fixed an issue were the Terminal would break if filters reduced the MoonsCatalogue to one or zero listings.

Version 1.1.2

  • Fixed an issue where LethalLevelLoader and LethalLib were attempting to modify similar aspects of the base game at the same time, preventing travel to base game Moons.

Version 1.1.1

  • Fixed an issue where null CompatibleNoun arrays prevented LethalLevelLoader from correctly initializing when used with mods that add new Item's via LethalLib.
  • Fixed an issue where deprecated LethalLevelLoader functions where deprecated before usage of them had been updated.
  • Fixed an issue where Restoring references to base game content incorrectly destroyed base game content.

Version 1.1.0

Features

Terminal >preview Keyword * *LethalLevelLoader now has a new feature added to the Terminal which allows users to change what information is previewed adjacent to each Moon listed in the `MoonsCatalogue`. This can be toggled via the `preview` verb keyword followed by one of the following options. (LethalLevelLoader also includes a configuration option to set which information type is used by default.)*
    • preview weather
    • preview difficulty
    • preview history
    • preview all
    • preview none
    • preview vanilla
Terminal >sort Keyword * *LethalLevelLoader now has a new feature added to the Terminal which allows users to decide how Moons are sorted when listed in the `MoonsCatalogue`. This can be toggled via the `sort` verb keyword followed by one of the following options. (LethalLevelLoader also includes a configuration option to set which sorting type is used by default.)*
    • sort price
    • sort difficulty
    • sort tag
    • sort quota
    • sort run
    • sort none
Terminal >filter Keyword * *LethalLevelLoader now has a new feature added to the Terminal which allows users to decide which Moons are listed in the `MoonsCatalogue`. This can be toggled via the `filter` verb keyword followed by one of the following options. (LethalLevelLoader also includes a configuration option to set which filtering type is used by default.)*
    • filter price
    • filter weather
    • filter tag
    • filter last travelled
    • filter none
Terminal >simulate Keyword * *LethalLevelLoader now has a new feature added to the Terminal which allows users to "Simulate" landing on a Moon. This provides a presentable, lore friendly way to view the possible `DungeonFlow` choices with accurate rarity via the Terminal. To use this feature, use `simulate` and a Moon's name, the same way you would use `route`. LethalLevelLoader now includes a configuration option to switch between viewing the `DungeonFlow`'s rarity via raw value or calculated percentage.*
LevelHistory * *LethalLevelLoader now has an experimental `LevelHistory` feature that stores notable information regarding each day in the current save. This includes information such as the Level, DungeonFlow, Weather and more. This feature allows modders and future updates to LethalLevelLoader to create mechanics and systems dependant on the history of the current play session.*
ExtendedDungeonFlow: Host Decides DungeonFlow & DungeonSize * *LethalLevelLoader now modifies the way Lethal Company selects the random `DungeonFlow` and it's dungeon size so only the Host client selects these values which is then sent to the remaining non host clients. This is to help prevent game-breaking dungeon desync when players have mismatching dungeon configuration settings.*
ExtendedDungeonFlow: Dynamic Weather Rarity Injection * *ExtendedDungeonFlow's now contain a `StringWithRarity` list which allows dungeon developers to dynamically inject their dungeon into the current `SelectableLevel`'s possible `DungeonFlow` options.*
ExtendedDungeonFlow: GlobalProp Dynamic Scaling * *ExtendedDungeonFlow's now contain a `GlobalPropCountOverride` list which allows dungeon developers to dynamically increase or increase a `GlobalProp`'s minimum and maximum values based on the currently used dungeon size.*
ExtendedLevel: MoonCataloguePages & ExtendedLevelGroups * *LethalLevelLoader now completely overhauls how the `MoonsCatalogue` TerminalNode functions internally. `ExtendedLevel`'s are now stored in groups via a class named `ExtendedLevelGroup`, These `ExtendedLevelGroup`'s are then stored in groups via a class named `MoonsCataloguePage`. This overhaul allows other mods and future updates to LethalLevelLoader to control and store `ExtendedLevel`s in many ways that were previously limited.*
ExtendedLevel: Lock Route * *ExtendedLevel's now contain a `isLocked` bool and `lockedNodeText` string that controls whether the Level can currently be routed to via the Terminal. When locked the Terminal will display the `lockedNodeText` string as failed routing response on the Terminal (Or a generic response if the string is left empty)*
ExtendedLevel: Hide Level * *ExtendedLevel's now contain a `isHidden` bool that controls whether the Level is displayed in the >Moons Terminal page*
ExtendedLevel: New Story Log Support * *ExtendedLevel's can now add their own custom Story Log's, Without the need of custom code. ExtendedLevel's now contain a `List<StoryLogData>` that takes in a level-dependent `storyLogID` int, a `terminalWord`string, a `storyLogTitle` string and a `storyLogDescription` string.*
ExtendedLevel: Provide Level Info Description * *By default ExtendedLevel's have their >info display text generated using their `SelectableLevel.LevelDescription` string, ExtendedLevel's now have an optional `infoNodeDescription` string if they wish to write their text manually.*
ExtendedLevel Events * *ExtendedLevel's now contain gameplay specific `ExtendedEvent`'s that will Invoke when these events happen while playing the relevant ExtendedLevel.*
    • onLevelLoaded
    • onDaytimeEnemySpawn(EnemyAI)
    • onNighttimeEnemySpawn(EnemyAI)
    • onStoryLogCollected(StoryLog)
    • onApparatusTaken(LungProp)
    • onPlayerEnterDungeon(EntranceTeleport, PlayerControllerB)
    • onPlayerExitDungeon(EntranceTeleport, PlayerControllerB)
    • onPowerSwitchToggle(bool)
ExtendedDungeonFlow Events * *ExtendedLevel's now contain gameplay specific `ExtendedEvent`'s that will Invoke when these events happen while playing the relevant ExtendedLevel.*
    • onBeforeDungeonGenerate(RoundManager)
    • onSpawnedSyncedObjects(List<GameObject>)
    • onSpawnedMapObjects(List<GameObject>)
    • onSpawnedScrapObjects(List<GrabbableObject>)
    • onEnemySpawnedFromVent(EnemyVent, EnemyAI)
    • onApparatusTaken(LungProp)
    • onPlayerEnterDungeon(EntranceTeleport, PlayerControllerB)
    • onPlayerExitDungeon(EntranceTeleport, PlayerControllerB)
    • onPowerSwitchToggle(bool)
Default Configuration Options * *LethalLevelLoader now provides five new global configuration options.*
  • Default PreviewInfo Toggle
    • Controls which Preview Info setting is used when previewing moons via the Terminal MoonCatalogue.
  • Default SortInfo Toggle
    • Controls which Sort Info setting is used when previewing moons via the Terminal MoonCatalogue.
  • Default FilterInfo Toggle
    • Controls which Filter Info setting is used when previewing moons via the Terminal MoonCatalogue.
  • Default SimulateInfo Toggle
    • Controls whether rarity is displayed as it's raw value or a calculated percentage while using the >simulate Terminal keyword.
  • All DungeonFlows Require Matching
    • Experimental setting that forces DungeonFlow's requested by a SelectableLevel to have a valid dynamic match. false by default.
ExtendedLevel Automatic Configuration Options * *LethalLevelLoader now provides automatically generated configuration options for all `ExtendedLevel`'s. This can be disabled by the author of the `ExtendedLevel` if they wish to provide these options themselves.*
    • enableContentConfiguration
    • routePrice
    • daySpeedMultiplier
    • enablePlanetTime
    • isLevelHidden
    • isLevelRegistered
    • minimumScrapItemSpawnsCount
    • maxiumumScrapItemSpawnsCount
    • scrapSpawnsList
    • maximumInsideEnemyPowerCount
    • maxiumumOutsideDaytimeEnemyPowerCount
    • maximumOutsideNighttimeEnemyPowerCount
    • insideEnemiesList
    • outsideDaytimeEnemiesList
    • outsideNighttimeEnemiesList
ExtendedDungeonFlow Automatic Configuration Options * *LethalLevelLoader now provides automatically generated configuration options for all `ExtendedDungeonFlow`'s. This can be disabled by the author of the `ExtendedDungeonFlow` if they wish to provide these options themselves.* * * * `EnableContentConfiguration` * * `manualContentSourceNameReferenceList` * * `manualPlanetNameReferenceList` * * `dynamicLevelTagsReferenceList` * * `dynamicRoutePriceReferenceList` * * `enableDynamicDungeonSizeRestriction` * * `minimumDungeonSizeMultiplier` * * `maximumDungeonSizeMultiplier` * * `restrictDungeonSizeScaler`
Content Config Helper Functions * *LethalLevelLoader now provides a variety of helper functions for parsing configuration strings into usuable data. These are used in the `ExtendedLevel` and `ExtendedDungeonFlow` automatic configuration options to ensure standardization.*
    • List<StringWithRarity> ConvertToStringWithRarityList(string inputString, Vector2 clampRarity)
    • List<Vector2WithRarity> ConvertToVector2WithRarityList(string inputString, Vector2 clampRarity)
    • List<SpawnableEnemyWithRarity> ConvertToSpawnableEnemyWithRarityList(string inputString, Vector2 clampRarity)
    • List<SpawnableItemWithRarity> ConvertToSpawnableItemWithRarityList(string inputString, Vector2 clampRarity)
    • (string, string) SplitStringByIndexSeperator(string inputString)
    • (string, string) SplitStringByKeyPairSeperator(string inputString)
    • (string, string) SplitStringByVectorSeperator(string inputString)
Extensions * *LethalLevelLoader now provides a variety of helper extensions to assist in creating content in Lethal Company.*
    • DungeonFlow List<Tile>GetTiles()
    • DungeonFlow List<RandomMapObject>GetRandomMapObjects()
    • DungeonFlow List<SpawnSyncedObject>GetSpawnSyncedObjects()
    • CompatibleNoun AddReferences(TerminalKeyword, TerminalNode)
    • TerminalKeyword AddCompatibleNoun(TerminalKeyword, TerminalNode)
    • TerminalNode AddCompatibleNoun(TerminalKeyword, TerminalNoun)
Async AssetBundle Loading * *LethalLevelLoader now loads `.lethalbundle`s asynchronously to improve load times while starting Lethal Company. The progress of the AssetBundle loading can be viewed on the initial game launch options screen.*

Fixes

  • The entire codebase has been refactored to streamline functionality, improve stability and reduce errors.
  • As a safety fallback, LethalLevelLoader will now select the Facility DungeonFlow if there are no DungeonFlow's for the game to select from.
  • Fixed a Lethal Company bug where game breaks for all clients if a client doesn't finish generating Dungen in one frame
  • LethalLevelLoader now correctly restores references to base game ItemGroup's found in Custom DungeonFlow's
  • LethalLevelLoader now correctly restores references to base game ReverbPresets's found in Custom SelectableLevel's and DungeonFlow's
  • LethalLevelLoader now correctly restores references to base game AudioMixers's found in Custom SelectableLevel's and DungeonFlow's
  • LethalLevelLoader now correctly restores references to base game AudioMixerController's found in Custom SelectableLevel's and DungeonFlow's
  • LethalLevelLoader now correctly restores references to base game AudioMixerSnapshots's found in Custom SelectableLevel's and DungeonFlow's
  • LethalLevelLoader now injects it's random DungeonFlow selection into Lethal Company's random DungeonFlow selection function to improve natural compatibility with other mods. (Thank you BananaPatcher714)
  • LethalLevelLoader now injects custom DungeonFlow's into Lethal Company's DungeonFlowTypes array to improve natural compatibility with other mods. (Thank you BananaPatcher714)
  • LethalLevelLoader now injects custom firstTimeDungeonAudio's into Lethal Company's DungeonAudios array to improve natural compatibility with other mods. (Thank you BananaPatcher714)
  • LethalLevelLoader's dynamic dungeon rarity matching system was overhauled to ensure the highest matching rarity is used, rather than the first matching rarity.
  • ExtendedLevel's routePrice value is now automatically synced with it's associated TerminalNode to ensure dynamic updates to route price are correctly set and reflected on the Terminal.
  • After references to base game content are restored by LethalLevelLoader, they are now destroyed to avoid issues with other mods obtaining assets via Resources.FindObjectsOfType()
  • Fixed an issue where Custom ExtendedLevel's failed to integrate into the game due to lacking "FAUNA" and "CONDITIONS" in their SelectableLevel.LevelDescription
  • Modified how LethalLevelLoader accesses the Terminal in order to improve safety and stability in larger modpacks.
  • Modified how LethalLevelLoader accesses TerminalNode's to avoid errors when playing Lethal Company in different languages. (Thanks Paradox75831004)
  • *Fixed a Lethal Company bug where AudioSource's unintentionally log harmless AudioSpatializer related warnings in the console.
  • Fixed an issue where LethalLevelLoader's dynamic dungeon size clamping was unintentionally being applied.
  • Fixed an oversight where LethalLevelLoader was logging via Unity rather than Bepinex.
  • Fixed an issue where GetTiles() could potentially trigger null reference exception errors.
  • Fixed major oversight where Game-Icons.net was not correctly attributed for LethalLevelLoader's logo

Version 1.0.7

  • Overhauled Custom Level system to use dynamically injected scenes rather than dynamically injected prefabs (Thanks onionymous!)

Version 1.0.6

  • Moved all logs from Unity.Debug() to BepInEx.ManualLogSauce.LogInfo()
  • Modified Custom ExtendedLevel loading to initially disable all MeshColliders then reenable them asynchronously to vastly improve load times
  • Slightly improved manualPlanetNameReferenceList comparison to improve suggested edgecases
  • Fixed oversight were Terminal moonsListCatalogue was being displayed inaccurately compared to base game implementation
  • Fixed issue were the NavMesh was incorrectly attempting to bake the Player Ship

Version 1.0.5

  • Fixed issue related to SelectableLevel: March not being correctly loaded with it's intended DungeonFlow on additional visits
  • Revamped manualPlanetNameReferenceList comparison to increase the likelyhood of user inputs working as intended

Version 1.0.4

  • Updated LethalLib dependancy from 0.10.1 to 0.11.0
  • Fixed issues related to SelectableLevel: March not being correctly loaded with it's intended DungeonFlow
  • Fixed oversight were Custom DungeonFlow's were not having all SpawnSyncedObject's correctly restored
  • Modified DungeonFlow_Patch levelTags check to increase odds of correctly matching user input
  • Removed deprecated debug logs

Version 1.0.3

  • Fixed issues caused by the v47 and v48 updates, specific changes will be listed below
  • Fixed an oversight were ExtendedDungeonFlow dungeonID's were not being assigned correctly
  • Changed ExtendedDungeonFlow.dungeonRarity variable name to ExtendedDungeonFlow.dungeonDefaultRarity for improved clarity
  • Moved Prefix Patch Targets From RoundManager to StartOfRound to account for the order of execution changes made in v47
  • Improved the EntranceTeleport patch to re-organise entranceID settings to avoid user error
  • Fixed an oversight were PatchDungeonSize() incorrectly checked if the compared values were identical
  • Moved a majority of public access modifiers to internal to prevent unintential use of internal classes
  • Fixed an issue were DungeonFlow SpawnSyncObject's were failing to restore their Vanilla reference
  • Changed ExtendedDungeonFlow.dungeonSizeMin and ExtendedDungeonFlow.dungeonSizeMaz to floats to improve usability
  • Changed the way the basegame's internal variables are patched to resolve an issue where leaving the game would corrupt saves
  • Improved debug logs for clarity

Version 1.0.2

  • All Registering of Custom Content has been moved from the GameNetworkManager.Awake() Prefix to the GameNetworkManager.Start() Prefix to give developers safe access to Awake() if needed.
  • AssetBundleLoader.specifiedFileExtension has now been changed to a public const to allow for improved referencing.
  • ExtendedDungeonFlow's are now automatically registered with the Network when added using AssetBundleLoader.RegisterExtendedDungeonFlow()
  • sourceName in ExtendedLevel and ExtendedDungeonFlow have been changed to contentSourceName, to improve clarity.
  • Fixed an oversight where dungeonSizeMin was not being considered.
  • Removed deprecated variables from ExtendedDungeonPreferences.
  • Vector2WithRarity now correctly uses a Vector2, Allowing for improved usability in the Unity inspector.
  • Variables in ExtendedDungeonPreferences have now been protected with properties, to allow for future validation options.
  • Removed ExtendedDungeonPreferences, This has now been combined into ExtendedDungeonFlow for better usability and more streamlined referencing.
  • Refactored ExtendedDungeonFlow to improve on visual organisation when viewed in the Unity inspector.
  • Refactored ExtendedLevel to improve on visual organisation when viewed in the Unity inspector.
  • Introduced ConfigHelper.ConvertToStringWithRarity() To assist with developers configeration creation.
  • Cached Terminal.allTerminalKeywords for improved reference safetey.
  • Adjusted Harmony Patch Priority Orders from 0 to 350.

Version 1.0.1

  • Updated README

Version 1.0.0

  • Initial Release

CHANGELOG

Changelog

Version 1.2.2

Fixes

  • Fixed issue where vanilla items were being incorrectly destroyed when playing multiple lobbies during the same game session
  • Restored functionality of the ExtendedLevel.IsRouteLocked feature
  • Added safety check to help prevent saves made in pre 1.2.0 LethalLevelLoader modpacks from corrupting when being used
  • Fixed issues with ExtendedDungeonFlow.DynamicDungeonSize related settings incorrectly applying after version 50 changes
  • Removed ExtendedMod.ContentTagAsStrings() function
  • Added ExtendedMod.TryGetTag(string tag) function
  • Added ExtendedMod.TryGetTag(string tag, out ContentTag contentTag) function
  • Added ExtendedMod.TryAddTag(string tag) function

Version 1.2.1

Fixes

  • Updated LICENSE
  • Changed accessor for ExtendedDungeonFlow.GenerateAutomaticConfigurationOptions from internal to public
  • Fixed issue where ExtendedDungeonFlow.GenerationAutomaticConfigurationOptions was defaulting to false
  • Changed accessor for EnemyManager.RefreshDynamicEnemyTypeRarityOnAllExtendedLevels from internal to public
  • Changed accessor for EnemyManager.InjectCustomEnemyTypesIntoLevelViaDynamicRarity from internal to public
  • Changed accessor for ItemManager.RefreshDynamicItemRarityOnAllExtendedLevels from internal to public
  • Changed accessor for ItemManager.InjectCustomItemsIntoLevelViaDynamicRarity from internal to public
  • Changed ConfigLoader default dungeon binding to list current level matching values as default values
  • Added "Killable" ContentTag to Forest Giant
  • Added "Chargable" ContentTag to Jetpack
  • Added "Weapon" ContentTag to Knife
  • Added additional developer debug logging for the scene validation and selection process

Version 1.2.0

Features

  • Updated mod for Lethal Company version 50
General
  • Added ExtendedMod

  • Added ExtendedEnemyType

  • Added ExtendedItem

  • Added ExtendedStoryLog

  • Added ExtendedFootstepSurface (WIP)

  • Added ExtendedWeatherEffect (WIP)

  • Added LevelMatchingProperties

  • Added DungeonMatchingProperties

  • Added ContentTags

  • Added Global LevelEvents Instance (Thanks mrov)

  • Added Global DungeonEvents Instance (Thanks mrov)

  • Added IsSetupComplete bool for modders to reference.

  • Added onBeforeSetup event for modders to reference

  • Added onSetupComplete event for modders to reference

  • Revamped DebugLogs and provided a configurable debuglog setting in the config to allow Users to only receive relevant logs by default.

  • Moved AssetBundleLoading earlier to help speed up load time

  • Revamped debug logs when trying to load a level or simulate the loading of a level

  • Revamped Moons Catalogue display to split custom moons into groups similar to the basegame moon listings.

  • Revamped Moons Catalogue display to order custom moon groups by average risk level

  • Revamped Moons Catalogue display to order custom moons inside groups by risk level

  • Revamped Moons Catalogue display to prefer to group custom moons created by the same author

  • Revamped Moons Catalogue display to dynamically adjust font size depending on the amount of Moons being displayed

  • Probably a lot more!

ExtendedLevel
  • Added string value to allow Authors to use custom route node display text to their levels
  • Added string value to allow Authors to use custom route confirmation node display text to their levels By default SelectableLevel.riskLevel is now automatically assigned using calculations and comparisons of SelectableLevel values between both Custom and Vanilla levels. This can be manually overridden.
  • Added an OverrideQuicksandPrefab value to allow authors to modify the Quicksand used on their level
  • Added ShipFlyToMoonClip & ShipFlyFromMoonClip AnimationClip values to allow authors to modify the AnimationClips used when the Ship lands to and from their level (Currently disabled until bug is resolved with Unity Assetrip Fixer)
  • Overhauled the way Scene’s are correlated with Levels by implementing a new weight based system built into ExtendedLevel to allow authors to randomly switch between multiple variant scenes for a single level.
ExtendedDungeonFlow
  • Added an OverrideKeyPrefab value to allow authors to modify the Key prefab used in their Dungeon
  • Added a MapTileSize value to allow authors to set a correlated MapTileSize value that is used in new basegame functions implemented in Version 50.
  • Added a new SpawnableMapObjects list value to allow authors to inject custom RandomMapObjects in their Dungeon
ExtendedItem
  • Custom Item support has now been added.
  • Added a PluralisedItemName string value to allow developers to change how their item name is parsed when being referenced as a plural (eg. when buying multiple of them from the store)
ExtendedEnemyType
  • Custom Enemy support has now been added.
ExtendedStoryLog
  • Custom StoryLog support has now been added.
ExtendedFootstepSurfaces
  • Custom FootstepSurface support has now been added. (Currently disabled)
ExtendedWeatherEffect
  • Custom WeatherEffect support has now been added. (Currently disabled)
ContentTags & MatchingProperties
  • Created integrated ContentTag system that allows developers to put relevant string tags on all types of custom content (with an optional correlating colour). Developers can access groups of content based on a specific content tag as well as match their content with other pieces of content dynamically using the built in LevelMatchingProperties and DungeonMatchingProperties.
  • All Vanilla content has been manually assigned Content Tags to allow developers to reference vanilla content via tags the same way they would custom content, You can find those tags here: https://docs.google.com/spreadsheets/d/1WO77KGJplIEC64qmBClOgfEEoFxrhMurCEqe9FKod8I/edit?usp=sharing

Fixes

  • Fixed switch Terminal command incorrectly working
  • Fixed Weather selection desyncing
  • Fixed Dungeon selection desyncing
  • Fixed Config duplicating entities (Credit to mrov)
  • Added safety checks to correctly save and restore previously selected route and prevent previous routes to disabled levels from breaking
  • Added safety checks to prevent invalid Foggy weather level values from breaking the game
  • Added safety checks to prevent Levels & Dungeons having incorrect SpawnableMapObject setups from breaking the game
  • Added safety check to prevent level missing MapPropsContainer tagged object from breaking the game
  • Added safety check to prevent level with .SpawnScrapAndEnemies enabled and no spawnable scrap listed from breaking the game
  • Fixed LevelEvents & DungeonEvents EntranceTeleport events behaving incorrectly (credit to mrov)
  • Added custom code to optimize specific internal code used in DunGen generation (Credit to LadyRaphtalia)
  • Made LogDayHistory function safer to allow DunGen generation in editor while using LethalLevelLoader to correctly work
  • Fixed issue where specific special items (Shotgun, Shells, Hive, Knife) were not being collected
  • Fixed issue where LethalLevelLoader was destroying assets in mods with multiple levels before it could correctly restore all those references first
  • Probably a lot more!

Version 1.1.0

Features

Terminal >preview Keyword * *LethalLevelLoader now has a new feature added to the Terminal which allows users to change what information is previewed adjacent to each Moon listed in the `MoonsCatalogue`. This can be toggled via the `preview` verb keyword followed by one of the following options. (LethalLevelLoader also includes a configuration option to set which information type is used by default.)*
    • preview weather
    • preview difficulty
    • preview history
    • preview all
    • preview none
    • preview vanilla
Terminal >sort Keyword * *LethalLevelLoader now has a new feature added to the Terminal which allows users to decide how Moons are sorted when listed in the `MoonsCatalogue`. This can be toggled via the `sort` verb keyword followed by one of the following options. (LethalLevelLoader also includes a configuration option to set which sorting type is used by default.)*
    • sort price
    • sort difficulty
    • sort tag
    • sort quota
    • sort run
    • sort none
Terminal >filter Keyword * *LethalLevelLoader now has a new feature added to the Terminal which allows users to decide which Moons are listed in the `MoonsCatalogue`. This can be toggled via the `filter` verb keyword followed by one of the following options. (LethalLevelLoader also includes a configuration option to set which filtering type is used by default.)*
    • filter price
    • filter weather
    • filter tag
    • filter last travelled
    • filter none
Terminal >simulate Keyword * *LethalLevelLoader now has a new feature added to the Terminal which allows users to "Simulate" landing on a Moon. This provides a presentable, lore friendly way to view the possible `DungeonFlow` choices with accurate rarity via the Terminal. To use this feature, use `simulate` and a Moon's name, the same way you would use `route`. LethalLevelLoader now includes a configuration option to switch between viewing the `DungeonFlow`'s rarity via raw value or calculated percentage.*
LevelHistory * *LethalLevelLoader now has an experimental `LevelHistory` feature that stores notable information regarding each day in the current save. This includes information such as the Level, DungeonFlow, Weather and more. This feature allows modders and future updates to LethalLevelLoader to create mechanics and systems dependant on the history of the current play session.*
ExtendedDungeonFlow: Host Decides DungeonFlow & DungeonSize * *LethalLevelLoader now modifies the way Lethal Company selects the random `DungeonFlow` and it's dungeon size so only the Host client selects these values which is then sent to the remaining non host clients. This is to help prevent game-breaking dungeon desync when players have mismatching dungeon configuration settings.*
ExtendedDungeonFlow: Dynamic Weather Rarity Injection * *ExtendedDungeonFlow's now contain a `StringWithRarity` list which allows dungeon developers to dynamically inject their dungeon into the current `SelectableLevel`'s possible `DungeonFlow` options.*
ExtendedDungeonFlow: GlobalProp Dynamic Scaling * *ExtendedDungeonFlow's now contain a `GlobalPropCountOverride` list which allows dungeon developers to dynamically increase or increase a `GlobalProp`'s minimum and maximum values based on the currently used dungeon size.*
ExtendedLevel: MoonCataloguePages & ExtendedLevelGroups * *LethalLevelLoader now completely overhauls how the `MoonsCatalogue` TerminalNode functions internally. `ExtendedLevel`'s are now stored in groups via a class named `ExtendedLevelGroup`, These `ExtendedLevelGroup`'s are then stored in groups via a class named `MoonsCataloguePage`. This overhaul allows other mods and future updates to LethalLevelLoader to control and store `ExtendedLevel`s in many ways that were previously limited.*
ExtendedLevel: Lock Route * *ExtendedLevel's now contain a `isLocked` bool and `lockedNodeText` string that controls whether the Level can currently be routed to via the Terminal. When locked the Terminal will display the `lockedNodeText` string as failed routing response on the Terminal (Or a generic response if the string is left empty)*
ExtendedLevel: Hide Level * *ExtendedLevel's now contain a `isHidden` bool that controls whether the Level is displayed in the >Moons Terminal page*
ExtendedLevel: New Story Log Support * *ExtendedLevel's can now add their own custom Story Log's, Without the need of custom code. ExtendedLevel's now contain a `List<StoryLogData>` that takes in a level-dependent `storyLogID` int, a `terminalWord`string, a `storyLogTitle` string and a `storyLogDescription` string.*
ExtendedLevel: Provide Level Info Description * *By default ExtendedLevel's have their >info display text generated using their `SelectableLevel.LevelDescription` string, ExtendedLevel's now have an optional `infoNodeDescription` string if they wish to write their text manually.*
ExtendedLevel Events * *ExtendedLevel's now contain gameplay specific `ExtendedEvent`'s that will Invoke when these events happen while playing the relevant ExtendedLevel.*
    • onLevelLoaded
    • onDaytimeEnemySpawn(EnemyAI)
    • onNighttimeEnemySpawn(EnemyAI)
    • onStoryLogCollected(StoryLog)
    • onApparatusTaken(LungProp)
    • onPlayerEnterDungeon(EntranceTeleport, PlayerControllerB)
    • onPlayerExitDungeon(EntranceTeleport, PlayerControllerB)
    • onPowerSwitchToggle(bool)
ExtendedDungeonFlow Events * *ExtendedLevel's now contain gameplay specific `ExtendedEvent`'s that will Invoke when these events happen while playing the relevant ExtendedLevel.*
    • onBeforeDungeonGenerate(RoundManager)
    • onSpawnedSyncedObjects(List<GameObject>)
    • onSpawnedMapObjects(List<GameObject>)
    • onSpawnedScrapObjects(List<GrabbableObject>)
    • onEnemySpawnedFromVent(EnemyVent, EnemyAI)
    • onApparatusTaken(LungProp)
    • onPlayerEnterDungeon(EntranceTeleport, PlayerControllerB)
    • onPlayerExitDungeon(EntranceTeleport, PlayerControllerB)
    • onPowerSwitchToggle(bool)
Default Configuration Options * *LethalLevelLoader now provides five new global configuration options.*
  • Default PreviewInfo Toggle
    • Controls which Preview Info setting is used when previewing moons via the Terminal MoonCatalogue.
  • Default SortInfo Toggle
    • Controls which Sort Info setting is used when previewing moons via the Terminal MoonCatalogue.
  • Default FilterInfo Toggle
    • Controls which Filter Info setting is used when previewing moons via the Terminal MoonCatalogue.
  • Default SimulateInfo Toggle
    • Controls whether rarity is displayed as it's raw value or a calculated percentage while using the >simulate Terminal keyword.
  • All DungeonFlows Require Matching
    • Experimental setting that forces DungeonFlow's requested by a SelectableLevel to have a valid dynamic match. false by default.
ExtendedLevel Automatic Configuration Options * *LethalLevelLoader now provides automatically generated configuration options for all `ExtendedLevel`'s. This can be disabled by the author of the `ExtendedLevel` if they wish to provide these options themselves.*
    • enableContentConfiguration
    • routePrice
    • daySpeedMultiplier
    • enablePlanetTime
    • isLevelHidden
    • isLevelRegistered
    • minimumScrapItemSpawnsCount
    • maxiumumScrapItemSpawnsCount
    • scrapSpawnsList
    • maximumInsideEnemyPowerCount
    • maxiumumOutsideDaytimeEnemyPowerCount
    • maximumOutsideNighttimeEnemyPowerCount
    • insideEnemiesList
    • outsideDaytimeEnemiesList
    • outsideNighttimeEnemiesList
ExtendedDungeonFlow Automatic Configuration Options * *LethalLevelLoader now provides automatically generated configuration options for all `ExtendedDungeonFlow`'s. This can be disabled by the author of the `ExtendedDungeonFlow` if they wish to provide these options themselves.* * * * `EnableContentConfiguration` * * `manualContentSourceNameReferenceList` * * `manualPlanetNameReferenceList` * * `dynamicLevelTagsReferenceList` * * `dynamicRoutePriceReferenceList` * * `enableDynamicDungeonSizeRestriction` * * `minimumDungeonSizeMultiplier` * * `maximumDungeonSizeMultiplier` * * `restrictDungeonSizeScaler`
Content Config Helper Functions * *LethalLevelLoader now provides a variety of helper functions for parsing configuration strings into usuable data. These are used in the `ExtendedLevel` and `ExtendedDungeonFlow` automatic configuration options to ensure standardization.*
    • List<StringWithRarity> ConvertToStringWithRarityList(string inputString, Vector2 clampRarity)
    • List<Vector2WithRarity> ConvertToVector2WithRarityList(string inputString, Vector2 clampRarity)
    • List<SpawnableEnemyWithRarity> ConvertToSpawnableEnemyWithRarityList(string inputString, Vector2 clampRarity)
    • List<SpawnableItemWithRarity> ConvertToSpawnableItemWithRarityList(string inputString, Vector2 clampRarity)
    • (string, string) SplitStringByIndexSeperator(string inputString)
    • (string, string) SplitStringByKeyPairSeperator(string inputString)
    • (string, string) SplitStringByVectorSeperator(string inputString)
Extensions * *LethalLevelLoader now provides a variety of helper extensions to assist in creating content in Lethal Company.*
    • DungeonFlow List<Tile>GetTiles()
    • DungeonFlow List<RandomMapObject>GetRandomMapObjects()
    • DungeonFlow List<SpawnSyncedObject>GetSpawnSyncedObjects()
    • CompatibleNoun AddReferences(TerminalKeyword, TerminalNode)
    • TerminalKeyword AddCompatibleNoun(TerminalKeyword, TerminalNode)
    • TerminalNode AddCompatibleNoun(TerminalKeyword, TerminalNoun)
Async AssetBundle Loading * *LethalLevelLoader now loads `.lethalbundle`s asynchronously to improve load times while starting Lethal Company. The progress of the AssetBundle loading can be viewed on the initial game launch options screen.*

Fixes

  • The entire codebase has been refactored to streamline functionality, improve stability and reduce errors.
  • As a safety fallback, LethalLevelLoader will now select the Facility DungeonFlow if there are no DungeonFlow's for the game to select from.
  • Fixed a Lethal Company bug where game breaks for all clients if a client doesn't finish generating Dungen in one frame
  • LethalLevelLoader now correctly restores references to base game ItemGroup's found in Custom DungeonFlow's
  • LethalLevelLoader now correctly restores references to base game ReverbPresets's found in Custom SelectableLevel's and DungeonFlow's
  • LethalLevelLoader now correctly restores references to base game AudioMixers's found in Custom SelectableLevel's and DungeonFlow's
  • LethalLevelLoader now correctly restores references to base game AudioMixerController's found in Custom SelectableLevel's and DungeonFlow's
  • LethalLevelLoader now correctly restores references to base game AudioMixerSnapshots's found in Custom SelectableLevel's and DungeonFlow's
  • LethalLevelLoader now injects it's random DungeonFlow selection into Lethal Company's random DungeonFlow selection function to improve natural compatibility with other mods. (Thank you BananaPatcher714)
  • LethalLevelLoader now injects custom DungeonFlow's into Lethal Company's DungeonFlowTypes array to improve natural compatibility with other mods. (Thank you BananaPatcher714)
  • LethalLevelLoader now injects custom firstTimeDungeonAudio's into Lethal Company's DungeonAudios array to improve natural compatibility with other mods. (Thank you BananaPatcher714)
  • LethalLevelLoader's dynamic dungeon rarity matching system was overhauled to ensure the highest matching rarity is used, rather than the first matching rarity.
  • ExtendedLevel's routePrice value is now automatically synced with it's associated TerminalNode to ensure dynamic updates to route price are correctly set and reflected on the Terminal.
  • After references to base game content are restored by LethalLevelLoader, they are now destroyed to avoid issues with other mods obtaining assets via Resources.FindObjectsOfType()
  • Fixed an issue where Custom ExtendedLevel's failed to integrate into the game due to lacking "FAUNA" and "CONDITIONS" in their SelectableLevel.LevelDescription
  • Modified how LethalLevelLoader accesses the Terminal in order to improve safety and stability in larger modpacks.
  • Modified how LethalLevelLoader accesses TerminalNode's to avoid errors when playing Lethal Company in different languages. (Thanks Paradox75831004)
  • *Fixed a Lethal Company bug where AudioSource's unintentionally log harmless AudioSpatializer related warnings in the console.
  • Fixed an issue where LethalLevelLoader's dynamic dungeon size clamping was unintentionally being applied.
  • Fixed an oversight where LethalLevelLoader was logging via Unity rather than Bepinex.
  • Fixed an issue where GetTiles() could potentially trigger null reference exception errors.
  • Fixed major oversight where Game-Icons.net was not correctly attributed for LethalLevelLoader's logo

Version 1.0.7

  • Overhauled Custom Level system to use dynamically injected scenes rather than dynamically injected prefabs (Thanks onionymous!)

Version 1.0.6

  • Moved all logs from Unity.Debug() to BepInEx.ManualLogSauce.LogInfo()
  • Modified Custom ExtendedLevel loading to initially disable all MeshColliders then reenable them asynchronously to vastly improve load times
  • Slightly improved manualPlanetNameReferenceList comparison to improve suggested edgecases
  • Fixed oversight were Terminal moonsListCatalogue was being displayed inaccurately compared to base game implementation
  • Fixed issue were the NavMesh was incorrectly attempting to bake the Player Ship

Version 1.0.5

  • Fixed issue related to SelectableLevel: March not being correctly loaded with it's intended DungeonFlow on additional visits
  • Revamped manualPlanetNameReferenceList comparison to increase the likelyhood of user inputs working as intended

Version 1.0.4

  • Updated LethalLib dependancy from 0.10.1 to 0.11.0
  • Fixed issues related to SelectableLevel: March not being correctly loaded with it's intended DungeonFlow
  • Fixed oversight were Custom DungeonFlow's were not having all SpawnSyncedObject's correctly restored
  • Modified DungeonFlow_Patch levelTags check to increase odds of correctly matching user input
  • Removed deprecated debug logs

Version 1.0.3

  • Fixed issues caused by the v47 and v48 updates, specific changes will be listed below
  • Fixed an oversight were ExtendedDungeonFlow dungeonID's were not being assigned correctly
  • Changed ExtendedDungeonFlow.dungeonRarity variable name to ExtendedDungeonFlow.dungeonDefaultRarity for improved clarity
  • Moved Prefix Patch Targets From RoundManager to StartOfRound to account for the order of execution changes made in v47
  • Improved the EntranceTeleport patch to re-organise entranceID settings to avoid user error
  • Fixed an oversight were PatchDungeonSize() incorrectly checked if the compared values were identical
  • Moved a majority of public access modifiers to internal to prevent unintential use of internal classes
  • Fixed an issue were DungeonFlow SpawnSyncObject's were failing to restore their Vanilla reference
  • Changed ExtendedDungeonFlow.dungeonSizeMin and ExtendedDungeonFlow.dungeonSizeMaz to floats to improve usability
  • Changed the way the basegame's internal variables are patched to resolve an issue where leaving the game would corrupt saves
  • Improved debug logs for clarity

Version 1.0.2

  • All Registering of Custom Content has been moved from the GameNetworkManager.Awake() Prefix to the GameNetworkManager.Start() Prefix to give developers safe access to Awake() if needed.
  • AssetBundleLoader.specifiedFileExtension has now been changed to a public const to allow for improved referencing.
  • ExtendedDungeonFlow's are now automatically registered with the Network when added using AssetBundleLoader.RegisterExtendedDungeonFlow()
  • sourceName in ExtendedLevel and ExtendedDungeonFlow have been changed to contentSourceName, to improve clarity.
  • Fixed an oversight where dungeonSizeMin was not being considered.
  • Removed deprecated variables from ExtendedDungeonPreferences.
  • Vector2WithRarity now correctly uses a Vector2, Allowing for improved usability in the Unity inspector.
  • Variables in ExtendedDungeonPreferences have now been protected with properties, to allow for future validation options.
  • Removed ExtendedDungeonPreferences, This has now been combined into ExtendedDungeonFlow for better usability and more streamlined referencing.
  • Refactored ExtendedDungeonFlow to improve on visual organisation when viewed in the Unity inspector.
  • Refactored ExtendedLevel to improve on visual organisation when viewed in the Unity inspector.
  • Introduced ConfigHelper.ConvertToStringWithRarity() To assist with developers configeration creation.
  • Cached Terminal.allTerminalKeywords for improved reference safetey.
  • Adjusted Harmony Patch Priority Orders from 0 to 350.

Version 1.0.1

  • Updated README

Version 1.0.0

  • Initial Release