Some mods may be broken due to the recent Alloyed Collective update.
MoonstormSharedUtils
An API focused with the intention of working in an editor enviroment using ThunderKit, MSU is a modular API system designed for ease of use and simplicity.
| Date uploaded | 2 weeks ago |
| Version | 2.4.3 |
| Download link | TeamMoonstorm-MoonstormSharedUtils-2.4.3.zip |
| Downloads | 63502 |
| Dependency string | TeamMoonstorm-MoonstormSharedUtils-2.4.3 |
This mod requires the following mods to function
RiskofThunder-R2API_StringSerializerExtensions
Increased string serializer support
Preferred version: 1.0.0Smooth_Salad-ShaderSwapper
A lightweight library for upgrading stubbed shaders to actual shaders at runtime.
Preferred version: 1.0.1Nebby-LoadingScreenSpriteFix
API for adding new Loading Sprites to the Loading Screen, also fixes sprite overlapping
Preferred version: 2.0.0RiskofThunder-R2API_Networking
Networking API around the Unity UNet Low Level API (LLAPI)
Preferred version: 1.0.3Rune580-Risk_Of_Options
A convenient API for adding BepInEx ConfigEntry's to a option menu
Preferred version: 2.8.4RiskofThunder-R2API_Skins
R2API Submodule for adding custom Skins and Skin-related utilities to the game
Preferred version: 1.3.1RiskofThunder-R2API_Director
API for easily modifiying the Director (RoR2 monster / interactable spawner) behaviour
Preferred version: 2.3.6RiskofThunder-R2API_Addressables
R2API Submodule for implementing Addressables functionality
Preferred version: 1.1.2README
Moonstorm Shared Utils - Content Loading and General Utility Framework for Large Content Mods.
MoonstormSharedUtils, otherwise known as MSU, is an API designed to work around the ThunderKit system for creating Content Mods.
![]()
Originally part of the API and Framework built for updating Starstorm2 to a ThunderKit setup for a better development experience, it has grown exponentially into it's own separate library so anyone with the desire to create large Content mods with thunderkit can use it.
Goals of the API
MSU strifes for the following goals regarding mod development and management.
- Simple but powerful systems for managing and loading content for the game in an Asynchronous fashion.
- A robust framework built upon modules that allows you to automate various parts of the modding workflow, such as equipment execution, monster and interactable spawning, and more.
- Simplification of the ThunderKit workflow by providing a custom set of CompossableObjects for managing Manifests, Paths and Pipelines.
- A High enphasis on utilizing the systems provided by the game over hooks whenever possible, such as default provided delegates, base item behaviours, and more.
- Utilization of the Existing R2API Framework to power systems such as Director modifications.
- Emphasis on working within the Editor instead of working on code for the creation of assets.
Key Features
The IContentPiece, IContentPieceProvider and Module Framework
While Code only mods create their Content (Prefabs, ScriptableObjects, etc) at Runtime and usually at Awake, this causes the issues known as "Forever Black Screen", where most of the mod's systems are initialized before the Loading Screen of the game starts. this gives the idea that the game is frozen and not responsive to oblivious users. And while this is true, managing the loading and interactions between custom made content from Assetbundles and the game's systems is difficult.
MSU solves this by the triad of the ContentPiece, the ContentPiece Provider, and the Module framework. This triad is utilized to allow mods to Load their assets Asynchronously during the loading screen, and have them working properly with the base game's systems.
IContentPiece
- Represents some form of Content that a mod is adding
- Each ContentPiece is tied to a specific Module which handles loading and the implementation of the Content.
- ContentPieces have Availability systems, which the module uses to know what content to load and initialize.
- A ContentPiece has an Asynchronous loading method which the module uses during initialization, which is used to Asynchronously load assets for your content.
- Being an interface, the API provides further implementations:
IContentPiece<T>, which represents a Content that's tied to a specificUnityEngine.Object.- MSU includes the following interfaces that implement
IContentPiece<T>IArtifactContentPiece, forArtifactDefsIEquipmentContentPieceforEquipmentDefs- A sub-interface called
IEliteContentPiecemanagesEliteDefsassociated to a specific Equipment.
- A sub-interface called
IItemContentPieceforItemDefs.- A sub-interface called
IVoidItemContentPiecemanages the Item Corruption system added in Survivors of the Void.
- A sub-interface called
IItemTierContentPieceforItemTierDefsISceneContentPieceforSceneDefs.
- MSU includes the following interfaces that implement
IGameObjectContentPiece<TComponent>, which represents a Content that's tied to a specific type ofUnityEngine.MonoBehaviour- MSU includes the following interfaces that implement
IGameObjectContentPiece<TComponent>ICharacterContentPieceforCharacterBodies- The sub-interface called
IMonsterContentPiececan be used for managing hostile monsters - The sub-interface called
ISurvivorContentPiececan be used for managing new Survivors.
- The sub-interface called
IInteractableContentPieceforInteractables.
- MSU includes the following interfaces that implement
IVanillaSurvivorContentPiece, which represents modifications for a Vanilla survivor.
IContentPiececlasses can also implement theIContentPackModifier, which is used for directly interfacing with your mod's ContentPack.
Modules
- A Module is a class that manages the loading and interaction of
IContentPiececlasses with the base game. - Each Module handles a specific type of Interface, alongside possible sub-interfaces.
- The Module knows what classes to instantiate and initialize utilizing the
IContentProvidersystem. - Once you provide a
IContentProviderto a module, you can call it'sInitializemethod to get back a Coroutine that'll initialize your content in an Asynchronous fashion. - MSU supplies the following modules:
ArtifactModule, managesIArtifactContentPieces, the ArtifactModule interfaces withR2API.ArtifactCodeto add new Artifact Codes to the game. It'll also handle proper hooking and unhooking of the Artifact, so that only when the artifact is enabled it's hooks are enabled.CharacterModule, managesICharacterContentPiece,ISurvivorContentPieceandIMonsterContentPiece, the module interfaces withR2API.Directorto handle the spawning of Monsters for the stages of the game.EquipmentModule, managesIEquipmentContentPieceandIEliteContentPiece, the module utilizes a single hook for managing the Execution calls for the Equipments.InteractableModule, managesIInteractableContentPiece, the module interfaces withR2API.Directorto handle the spawning of Interactables for the stages of the game.ItemModule, managesIItemContentPieceandIVoidItemContentPiece. It automatically handles item corruptions.IItemTierModule, managesIItemTierContentPiece, it automatically creates at run start collections of the available drop list for the tier.SceneModule, managesISceneContentPiece, it interfaces withR2API.Stagesto handle the addition of a Stage to the game.VanillaSurvivorModule, managesIVanillaSurvivorContentPiece. which is used to add new content to the base game's survivors (Skins, skills, etc.)
IContentPieceProvider
- For a module to know what content pieces to create, load and initialize. MSU utilizes the
IContentPieceProviderto provideIContentPieces to modules.- While you can create your own implementations of the
IContentPieceProviderinterface to manage availability scenarios, MSU'sContentUtilclass contains methods for creating them from scratch, by only analyzing your Assembly.
- While you can create your own implementations of the
RoR2 Friendly Systems
One of the key goals of MSU is working alongside the Risk of Rain 2 systems, making content that works with it instead of forcing the base game's systems to work with ours. As such, MSU provides a robust system to interact alongside the game's key systems such as equipments, buffs, items, and more.
Interfaces for Components
To avoid unecesary hooking for commonly used types, MSU provides interfaces that can be used inside components for the following systems:
IOnIncomingDamageOtherServerReciever, it works as a hook on TakeDamage, which can be utilized to modify the incoming damage for a victim.IStatItemBehaviour, an interface that works as an On hook for Recalculate Stats, containing methods for running before and after stat recalculations.IBodyStatArgModifier, an interface that works as an implementation ofR2API.RecalculateStats's GetStatCoefficient delegate.
BaseItemMasterBehaviour
The BaseItemMasterBehaviour, much like it's Body counterpart (BaseItemBodyBehaviour) is utilized for creatinng a behaviour that's added to a CharacterMaster when a specified item is obtained.
BaseBuffBehaviour
The BaseBuffBehaviour is a component that can be used for managing the effects of a Buff. For performance reasons, BaseBuffBehaviours are not destroyed when the buff gets removed, instead, when the buff is first obtained by a body, the behaviour is added, when the buff stacks are depleted, the behaviour is disabled, afterwards, when the body recieves the buff again, the behaviour is enabled. this reduces the workload of the GarbageCollector and overall improves the performance of the system.
Improved Thunderkit Workflow:
As MSU's goals revolve around working in the Editor, MSU comes bundled with a multitude of utilities regarding the creation of content for the game.
WWise Support
MSU provides a custom ImportExtension that can be used to blacklist the WWise assemblies from the game, allowing you to use the WWise Integration system for your project.
Scriptable Objects
MSU provides the following ScriptableObjects that allows for the creation of "runtime only" content at Editor time.
AchievableUnlockableDef, works as an abstraction of the UnlockableDef and AchievementDef system, its anUnlockableDefthats unlocked via an achievement.DotBuffDef, works as an abstraction of the DotDef, and automatically assigns a DotDef to its specified BuffDef.ExtendedEliteDef, works as an extension of theEliteDefclass, supporting automatic addition to base game tiers, elite ramps, overlay materials, and more.InteractableCardProvider, a ScriptableObject that contains the metadata needed for spawning Interactables in stages, multiple stages can be assigned to a single card.MonsterCardProvider, a ScriptableObject that contains the metadata needed for spawning Monsters in stages, multiple stages can be assigned to a single card.ItemDisplayDictionary, a ScriptableObject that works akin toR2API.Items's ItemDisplayDictionary system, it can be used for adding multiple RuleGroups to existingItemDisplayRuleSets, the key assets and display prefabs are powered by theItemDisplayCatalogsystem within MSU.NamedItemDisplayRuleSet, a ScriptableObject that can be used for creating a completeItemDisplayRuleSetfor character models. the key assets and display prefabs are powered by theItemDisplayCatalogsystem within MSU.SerializableEliteTierDef, works as an Abstraction of theEliteTierDefsystem within the game, can assign a cost multiplier, addressable references to base game elite tiers and mode.UberSkinDef, works as a catch-all utility for SkinDefs, implementing support for R2API's SkinVFX system and adding skins to vanilla character
Prebuilt CompossableObjects
Since MSU was created with thunderkit in mind, MSU provides the following CompossableObjects to your project:
- A simple
Manifestwith the necesaryManifestDatumsfor declaring your mod - A setup of
PathReferences that's used for clean building and releasing of your mod - A highly configurable Pipeline system:
- A release pipeline that automatically builds a zip file ready for release of your mod.
- Generic pipelines, which can be used to build your assembly, build your assetbundles either compressed or uncompressed, and staging your mod's StreamingAssets.
- A Contributor pipeline setup, which contributors can use to easily setup a pipeline for building your mod.
Management of Configurations and Tokens
Creating configuration for your mod can be extremely verbose using the default BepInEx implementations, MSU implements a Configuration system on top of BepInEx that allows you to easily configure anything.
ConfigureField, ConfiguredVariable, and Risk of Options
MSU provides the following abstraction of the BepInEx Config System:
-
ConfigureField- A custom attribute that can be applied to static fields to automatically configure them.
- The configuration process utilizes a unique string ID that you assign to a custom ConfigFile to tie the configuration to the ConfigFile.
- The
ConfigSectionandConfigNamesare not necesary to be implemented, MSU by default utilizes theMemberInfo's name as theConfigName, and theDeclaringType's name as theConfigSection - A "RiskOfOptions" version of the ConfigureField exists, which automatically creates options utilizing the RiskofOptions API. These options however cannot be heavily customized due to the limitation of attributes.
-
ConfiguredVariable- The ConfiguredVariable is a class that represents a Variable that can be Configured.
- it can be used for creating complex configuration scenarios with Risk of Options.
The FormatToken system
Tying Configuration changes to Token values is one of the best parts of creating tokens using code, however, translation of these tokens can be difficult to manage as it requires translators to code the translations directly into the C# source file.
MSU provides the FormatToken system, you can now write your token's values utilizing the String Formatting system of C#. With this, you can properly levrage JSON langauge files, which translators can easily use for translations as long as they keep the proper order of indexing.
Documentation and Sourcecode
- The Documentation and Sourcecode can be found in MoonstormSharedUtil's Github Repository, which can be found here
Donations
MSU is a passion project from one of TeamMoonstorm's members, Nebby. as such, he works in his free time on this to allow the rest of the community to create amazing and awe-inspiring content.
MSU will forever be free to use and never gated behind paywalls, however, donations are incredibly appreciated.
Mods Utilizing MSU
(Click me!)
(Note: click the icon to open a new tab to the Mod!)
Thanks and Credits
- Twiner for the creation of ThunderKit.
- IDeath and Harb for helping out with various coding questions.
- KingEnderBrine and RuneFox237 for the RoR2SkinBuilder, which was used as a base for the VanillaSkinDef system.
- GrooveSalad for helping out during the conceptualization of the module system and providing the StubbedShaders.
- UnknownGlaze for MSU's Logo
- The Starstorm 2 Team, for allowing nebby to go off the deep end and create MSU in the first place.
- The Fortunes from the Scrapyard team, for believing in my goals and utilizing MSU for their mod.
- KevinFromHPCustomerService, for creating the original modules systems that eventually became MSU 2.0
- Everyone from the Risk of Rain 2 community for appreciating my work.
CHANGELOG
'2.4.3' - Bugfixes
- Thanks @MysticalChicken for the fixes regarding content addition of DroneDefs and CraftableDefs!
Runtime
- ConfiguredVariable's configHash is now calculated using
HashCode.Combine - Added ability to Disable a drone in
ContentUtil.cs ContentUtil.HandleAssetAdditionnow properly handlesDroneDefandCraftableDef- Fixed an issue with ProperSave where language loading could cause exceptions at runtime
Editor
- Updated RoR2EditorKit dependency to at least 5.6.0
'2.4.2' - I'm tired man
- Updated because github version was pointing to the wrong commit hash :D
- Erros will be fixed on 2.4.3 as a result.
'2.4.1' - Alloyed Peaklective
- Updated to Alloyed Collective (1.4.0)
- Note: This is being released in this state due to the maintainer going on vacation for thanksgiving week, any errors will be fixed on 2.4.2
Runtime
- Added the UberSkinDef, the all in one skin solution for both regular and vanilla characters
- Contains support for creating skins for both Vanilla characters and Custom characters utilizing the rootTransform field
- Has built-in support for R2API.Skin's SkinVFXInfo
- Meant to replace VanillaSkinDef
- Added a SerializableStaticMethod, which can be utilized to Serialize a Static Method... duh
- Specify arguments utilizing the RequiredArguments attribute
- Decorate a method with the MethodDetector attribute so it can be detected by the editor scripts
- Added a TransformPathAttribute, which can be utilize to serialize a transform path into a string field
- Specify the name of a property in the SerializedObject which contains teh reference to the root object itself.
- Supports GameObjects, AssetReferenceT<GameObject> and AddressReferencedPrefab
- AddressReferencedSkinDef can now specify wether it can load a skin via the Catalog
- Fixed a bug where buff behaviours could modify state prior to being added to the internal dictionary
Editor
- Fix the AddressReferencedSkinDefDrawer checking for a nonexistent define
- Added a SkinDefMigrationWizard... which doesnt work :D
'2.3.2' - Improvements
Runtime
- Added
TargetAssetNameAttributesupport toContentUtil.PopulateTypeFields()- Thanks MysticalChicken 🐤
ContentUtil.PopulateTypeFieldsnow has a prefered Overload that includes the base gameFunc<string, string> fieldNameToAssetNameConverter- Updated the ExtendedEliteDef to support adding to multiple, or singular elite tiers from the base game.
- This is because ExtendedEliteDef only allowed you to add to both 1 and 1.5 tiers, instead of exclusively tier 1.5, making "1.5" elites more difficult to add than necesary.
- Fixes #74 as a result
'2.3.1' - Interactables
Runtime
- Fix interactable module failing to add interactables
'2.3.0' - Memory Optimization
- Updated to 1.3.9 (Memopt)
Runtime
- Marked vanilla skin defs as deprecated.
- Stubbed the methods as a result.
- System will be replaced by a new one utilizing SkinDefParams.
- The CharacterModule will now ensure that a survivor's DisplayPrefab and BodyPrefab have the same skins array.
'2.2.3' - False Son if it was a fun boss
Runtime
- Updated to BalancePatch2
- Character and Interactable module now only add their Cards to the always available standard category rather than all categories
- This was done to accomodate the new "DCCS Blender" system
- Fixed the Prerequisite achievment system of AchievableUnlockableDef not working properly
- This however breaks achievement collection... oops, we recommend using realer cheat unlocks to re-unlock everything
- Fixed the EquipmentCatalog adding elites to the wrong tiers
- Fix ItemTierPickupDisplayHelper spawning the displays at position 0 and unparented
- ItemTierModule should now properly assign the ItemTierDef's darkColorIndex to the correct value
Legacy Runtime
- The legacy runtime assembly now only enables if the game has been imported
'2.2.2' - Loading Screen Sprite Changes
Runtime
- Added dependency to
LoadingScreenSpriteFix - Marked the
LoadingScreenSpriteUtilityclass as obsolete- Using the LoadingScreenSpriteFix's API is encouraged instead of using this class
- Methods now just call the LoadingScreenSpriteFix methods to avoid backwards compat breaking
'2.2.1' - Hotfix
Runtime
- Fixed an oversight which caused the
BaseMasterItemBehavioursystem to always be disabled.
'2.2.0' - Material Variants
Runtime:
- Added the
MaterialVariantsystem- A MaterialVariant is a custom
ScriptableObjectthat allows you to create a Variant of an existing material. - By supplying an original material, you're able to override specific shader properties of said material.
- Works with both regular shaders and the
AddressableMaterialShadersystem
- A MaterialVariant is a custom
- Added new features to
ExtendedEliteDefExtendedEliteDefcan now replace the light color of CharacterBodies.ExtendedEliteDefcan now specify a material override for particle system renderers in a CharacterBody
- Most modules will no longer apply hooks when there's no content ingame utilizing said modules.
- Added a new method for adding a standalone
SimpleSpriteAnimationinLoadingScreenSpriteUtility- The
SimpleSpriteAnimationwill get destroyed when the loading screen is over.
- The
- Marked
ParallelMultiStartCoroutineas Obsolete.- All usages of
ParallelMultiStartCoroutinehave been replaced byParallelCoroutine
- All usages of
Editor:
- The
ShaderDictionarysystem now exists in the main assembly alongside other shader related qualities- This is due to the new
MaterialVariantsystem
- This is due to the new
Legacy:
- Marked all classes and structs as
[Obsolete]
'2.1.0' - Fixes and Async Additions
Runtime:
- Adjusted the
ShaderUtilclass to also copy over the render queue for addressable material shaders - Addressable Material Shaders now work properly in the editor again
- Removed accidental
[Obsolete]attributes from ItemModule - Fixed an issue where the
MSUEliteBehaviourwould spawn multiple effect prefabs. - Fixed an issue where the
MSUEliteBehaviourwould not destroy itself when theMSUContentManagerbehaviour was destroyed, causing effects to linger on - Fixed an issue where the
FormatTokenattribute wouldnt properly retrieve the corrent formatting value. - Fixed an Issue where
ConfiguredVariable.configFileIdentifierwas being treated as ReadOnly Before the config was bound. - Added log methods when an end user attempts to change a now read only property of a
ConfiguredVariable - Added an instance property to
MSUMain - Added a boolean property to the
ConfigSystemto check if the Configuration systems have been bound - Fixed various issues with the
LoadingScreenSpriteUtility - Changed around how language is loaded.
- LanguageFiles are now loaded by the
LanguageFileLoader - Loading can either be synchronous or asynchronous.
- Language tokens are added directly to the currently loaded language.
- This fixes an issue where MSU would wrongfully unload the english language, causing issues with other mods.
- LanguageFiles are now loaded by the
Legacy:
- Removed all the classes that do not inherit from
UnityEngine.Object. - All the classes and structs left have been marked as
Obsolete.
'2.0.0' - Seekers of the API
General
- Updated to version
1.3.Zof the Game, otherwise known as the Seekers of the Storm release. - Updated to version
2021.3.33of Unity. - A Complete ground up rewrite of the API, Moonstorm Shared Utils version 2.0 is the most stable and performant version created yet.
- While there have been hundreds, if not thousands of changes below the hood, you can look below for the main changes MSU 2.0 brings.
Runtime
Major Changes:
- Asset loading is now completely asynchronous, utilization of the
IContentPackProvidersystem and understanding ofCoroutinesis heavily encouraged for initializing your content. - Most of the API marked as obsolete has been removed.
- Classes have been changed their names to better reflect what they do (
TokenModifierhas been renamed toFormatToken) - The old API, now called "MoonstormSharedUtils.Legacy" internally, is still included in the GithubRepo, this was done to allow a "smooth" switch between both versions of the API
- The LegacyAPI will be removed in a future version, and does not work ingame, it exists purely to ensure no references in unity are lost.
"Loader" classes have been removed completely.
Loaderclasses such asAssetLoader,ConfigLoader,LanguageLoaderand others where confusing to utilize and obfuscated too much code of what was going on behind the scenes.- We recommend utilizing the
MSUTemplategithub repo (coming soon) to create new mods utilizing MSU, the Template already comes with prebuilt static classes that handle Assets, Configs, Logging andIContentPackProviderclasses that replace the now defunct "Loader" classes. - For language loading, you can now use the
LanguageFileLoaderclass. - Most of the methods relating to the ConfigurationSystem has been consolidated into the
ConfigFactoryclass.
- We recommend utilizing the
Modules and Content Classes have changed drasticly
-
Modules are no longer instantiable and are now static.
- This has been done to avoid the confusing system of "inheriting" from a module to utilize it's functionality.
- For curated process of content initialized and added to the game, you can utilize the
IContentProvidersystem from the API.
-
ContentBase classes and it's subclasses have been replaced.
- This system was replaced by the IContentPiece system. a "Content Piece" is any type of Asset or Object that adds new features to the game.
- Loading of assets on the constructor level is now discouraged, as
IContentPiececontains a coroutine method that'll be called by its module to load it's asset asynchronously in parallel. IContentPieces still rely on modules for initialization. To initialize your mod's content you can utilize it's respective module'sInitializemethod, which works as a coroutine that you can await in your ContentPackProvider.
-
Added the IContentPieceProvider system.
- A ContentPieceProvider, like its name says, provides IContentPiece instances to a MSU Module.
- You can either create the provider manually, or utilize the methods inside
ContentUtilto automatically scan and create a provider for your content.
-
The following modules and content classes have been removed:
EliteModuleBase&&EliteBase- The functionality of the module has been assigned to the
EquipmentModule, while now you can use theIEliteContentPieceto create elite equipments.
- The functionality of the module has been assigned to the
BuffModuleBase&&BuffBase- Buff overlays have been assigned to a new class called the
BuffOverlaysclass.
- Buff overlays have been assigned to a new class called the
DamageTypeModuleBase&&DamageTypeBaseProjectileModuleBase&&ProjectileBaseUnlockablesModuleBase&&UnlockableBase- The removed classes with no alternatives have been removed because the type of "Content" they managed cannot exist "by themselves". For example, a "DamageType" does not exist on its own, it's always related to a proper content piece such as a Character.
Events have been reworked completely.
- The
EventDirectorsystem, while it had good intentions, it proved to be difficult to work with and not scalable for bigger projects, as such, the Event system has been replaced by theGameplayEventsystem.GameplayEvents are custom GameObjects that change how the game's played in a temporary fashion, the modStarstorm2showcases what's possible with this framework. Events being GameObjects means you can properly utilize the Component framework that unity provides.GameplayEventare no longer spawned automatically by MSU, instead, the mod author must utilize theGameplayEventManagerfor spawning new events according to their desired functionality.- The
GameplayEventsystem also has theGameplayEventRequirementcomponent, a component that can be inherited to specify custom requirements for aGameplayEventto be spawned succesfully using theGameplayEventManager. - The EventText system has been rewritten, and now no longer overlaps texts and supports more features.
- EntityState based events are still supported, as
GameplayEventsare NetworkBehaviours and as such can utilize the EntityStateMachine system.
Buff Behaviours are no longer Ephemeral.
- While the BuffBehaviour system allowed modders to create complex monobehaviours when buffs where applied, it had the fatal flaw of Buffs not being something "constant" for a body (they can be timed). This in turn caused issues related to GarbageCollection and FrameDrops for potentially constant creation and destruction of Components.
- To remedy this, BuffBehaviours are now static and will never be removed from the body, instead, the behaviours will be dynamically enabled and disabled depending on the amount of buffs the body has.
'1.6.2' - Whoops
Runtime
- Removed "Error On Obsolete" setting for MSDirectorCardCategorySeleection and MSDCCSPool
Editor
- Fixed Inspectors still showing the deprecated fields instead of the new ones
'1.6.1' - Dependency changes and Rectifications
- Added Onboarding and Documentation to begin developping a PR for MSU, Thanks Buns!
Runtime:
- Now Dependant on
R2API_Addressables - Deprecated the following classes:
AddressableAssetAddressableBuffDefAddressableEliteDefAddressableEquipmentDefAddressableExpansionDefAddressableGameObjectAddressableItemDefAddressableSpawnCardAddressableUnlockableDef- These have been replaced by the AddressReferencedAsset system from
R2API_Addressables - Any ScriptableObject affected by these changes now have a ContextMenu for upgrading to their new versions.
- These have been replaced by the AddressReferencedAsset system from
MSDCCSPoolMSDirectorCardCategorySelection- These have been replaced by the
AddressableDCCSPoolandAddressableDirectorCardCategorySelectionfromR2API_Director
- These have been replaced by the
InteractableBaseandMonsterBasecan now specify multiple Cards.InteractableBaseandMonsterBasecan now implement custom IsAvailable methods, which will determine if the Monster or Interactable will be added to the stage- Added
IEqualityComparersforMSMonsterDirectorCardandMSInteractableDirectorCard, used for comparing equality between card prefabs. AddressableInjectornow only shows fields which are of typeUnityEngine.Object, largely cutting the amount of invalid options- Fixed issues where
AddressableInjector,CameraInstantiator,InstantiateAddressablePrefabandSurfaceDefInjectorwould cause invalid GUIDs on scenes - Attempted to fix an issue where MSU would create multiple reflection type objects during dependent mod initializations
- Fixed issue where the EventDirector would sometimes fail to find the required state machine
Debug Build Exclusive
- MSU now only breaks when a fatal log is reached.
Editor
- Removed property drawers for AddressableAsset related classes.
'1.6.0' - LogLoader and Utilities
- Reformatted the Readme
Runtime:
- Modified the
EventDirectorscaling system to no longer be exponential.- New scaling formula is
PlayerTeamLevel * (currentStageCount / 5) * DifficultyScalingValue
- New scaling formula is
- Fixed issue where CharacterBase classes wouldnt be added to the CharacterModule's Dictioanries.
- Added
LogLoader, a Logging system for mods- Based off the
MSULogclass - Uses the
BepInExManualLogSource - Contains static methods for logging level
Info,Message,Debug,Warning,Error,Fatal - On the
UnityEditor, these static methods use theUnityEngine.Debugclass' methods to avoid exceptions
- Based off the
- ConfigFiles created with
ConfigLoadercan now specify if they show as separate entries in the RiskOfOptions ModSettings window - Added missing support for
KeyboardShortcutsonConfigurableFieldAttribute - Added
ConfigurableKeyBind - publicized the
DelegateContainer- With
ConfigurableVariables. Any methods that get invoked when theConfigEntrychanges are stored in a separate object, which allowsConfigurableVariablesstored in temporary fields to be garbage collected. - A
DelegateContainerstores these invoked methods, can be used to manually raise said methods.
- With
- Deprecated
ConfigurableString MakeConfigurableInt(string, Action<ConfigurableString>)as it was wrongly named.- Added a new method with the correct name to rectify this
- Fixed an issue where
MSInteractableDirectorCardandMSMonsterDirectorCardcouldn't specify the custom category's Weights.
Debug Build Exclusive:
- Removed the Material Tester. We recommend you use this instead
LogLoaderhas a property to specify what level of severity of Debug.Log can cause aDebuggertoBreak.- Debugging related config entries for MSU are now stored on a separate
ConfigFile. TheConfigEntriesin thisConfigFilealso appears as a separate entry on RiskOfOptions's ModSettings window - You can now toggle the
Self Connectdebugging feature - Changed how Run-Start Command Invoking works.
- Made each Command toggleable with a ConfigEntry
- Added ability to automatically invoke the command
god - Added automatic invoke for command
give_item extralife 100
- Added Utility keybinds that can be triggered with key presses. The following commands are:
next_stagekill_allspawn_ai lemurian 1(parameters can be changed in a config entry)teleport_on_cursorrespawnremove_all_itemsnoclip
- Added a utility method on
MSUtilto invoke commands
Editor:
- Fixed general instability with the IDRS related inspectors and windows
'1.5.5' - That was a lie
- Fixed issue with ConfigurableVariables
- ConfigLoader no longer throws null reference exceptions on Editor reload
'1.5.4' - Config Update End
Runtime:
TokenModifierManagerreformats tokens when the Risk of Options menu is closed- This in turn makes it so tokens are always updated with the proper values from configurations.
TokenModifierAttributenow works withConfigurableVariableclassesTokenModifierAttributecan now haveModuloNstat type- Non assigned
ConfigurableVariablesnow get collected by the Garbage Collector, while keeping any of theirOnConfiguredactions in memory - Added a
ConfigEntryBaseproperty toConfigurableVariable - Added a
ConfigHashproperty toConfigurableVariable OnConfigChangedevent inConfigurableVariablenow becomes ReadOnly once its configured- Increased verbosity of
ToString()method ofConfigurableVariable - Deprecated
SetOnConfigChanged(OnConfigChangedDelegate)on the following ConfigurableVariables- ConfigurableString
- ConfigurableInt
- ConfigurableFloat
- ConfigurableEnum
- ConfigurableColor
- ConfigurableBool
- (These have been replaced by
AddOnConfigChanged(OnConfigChangedDelegate)to ensure method chaining works properly.)
- Made all of the dictionary that have string keys to be case insensitive
'1.5.3' - That was stupid
Runtime:
- Constructor for ConfigurableVariable no longer attempts to set the
ModGUIDandModNameto the Calling Assembly'sBaseUnityPlugin - Added Factory methods to
ConfigLoader<T>to create ConfigurableVariables and their built in inheriting classes.- Factory methods require an instance of your ConfigLoader to work
- Factory methods automatically set the ConfigurableVariable's
ModGUIDandModName - Factory methods contain an optional
Action<ConfigurableVariableType>to initialize the configurable variable, as a near identical implementation of initializing them using theObjectInitializerpattern
'1.5.2' - ConfigurableVariable improvements
Runtime:
- Constructor for
ConfigurableVariableattempts to automatically sets theModGUIDandModNameto the Calling Assembly'sBaseUnityPlugin - Added a
ToString()override toConfigurableVariable<T>
'1.5.1' - De(eznuts)stroyImmediate
Runtime:
- Fixed certain components and code using
Object.DestroyImmediate()outside of anUnityEditorenviroment.
'1.5.0' - Config Update May
- Now dependant on Risk of Options
- Cleaned up the source code
Runtime:
- Deprecated
TokenModifierAttribute.extraData, replaced byoperationData - Reworked the Configuration systems of MSU
- Deprecated
ConfigurableFieldManager, replaced by theConfigSystemclass. - Deprecated
ConfigLoader.identifierToConfigFile - Added
OnConfiguredmethod to theConfigurableFieldAttribute. - Added
RooConfigurableFieldAttribute- Allows for very basic Risk of Options implementation.
- Supports
bool, float, int, string, UnityEngine.Color, Enum
- Added
ConfigurableVariable<T>class- Represents a variable that can be configured using the bepinex config system
- Works as fields and properties.
- a
ConfigFilecan be assigned directly or via the identifier system of theConfigSystem - Just like
ConfigurableFieldAttribute, if aSectionandKeyare not specified, it uses a nicified string of theDeclaringTypeandMemberInfonames - ConfigurableVariables can be created with method chaining or Object Initialization
- ConfigurableVariables can be bound immediatly, or bound automatically when RoR2 loads
- Doesnt support Risk of Options by itself
- Added the following classes that inherit from
ConfigurableVariable:ConfigurableBoolConfigurableColorConfigurableEnum<TEnum>ConfigurableFloatConfigurableIntConfigurableString
- These classes automatically gets implemented into your mod's RiskOfOptions configuration page.
- Allows for complexity with the OptionConfig system of Risk of Options
- Implemented Risk of Options support for MSU's config
Editor:
- Added
InstallRiskOfOptionsimport extension`
'1.4.3' - No one will ever know!
Runtime:
- Added a Return statement on EventDirector's FindIdleStateMachine when the event card's event flags has the WeatherRelated flag.
'1.4.2' - Fixes and Improvements
Runtime:
- Fixed issue where instantiate addressable prefab wouldnt properly instantiate the prefab under multiplayer circumstances
- AddressableInjector, CameraInstantiator and SurfaceDefInjector now properly wont save the instantiated assets
- Fixed interactable and monster director cards not working properly
- Made the
bool IsAvailable()method of Interactable and Monster director cards virtual - Added new stubbed speed tree shaders
- Deprecated
EventFlags.WeatherRelated - Event Cards can now specify the name of the entity state machine it must play on
- Added a method to the EventDirectorClass to add new EntityStateMachines.
- Fixed issue where the Event director wouldn't pick new cards after getting a valid one. causing repeating events without checking availability
Debug Build Exclusive:
- Prefixed debug commands and convars with
ms - Fixed the MoonstormIDH component not working properly
- Fixed MSUDebug having an unintended dependency on DebugToolkit
- Added back the EnableEvents conVar
- Added
ms_enable_event_loggingBoolConVar - Added
ms_play_eventcommand, which tries to play an event while following the regular availability checks - Added
ms_add_creditscommand, which allows you to add or subtract credits from the Event Director.
Editor:
- Fixed general issues with the NamedIDRS and ItemDisplayDictionary editor windows
- Removed InstallDebugToolkit import extension
'1.4.1' - Whoops
- Fixed an NRE that could occur under specific circumstances caused by the ItemDisplayCatalog
'1.4.0' - IDRS Utility and Stabilization
- Finally updated the
package.jsonfile to properly display the Runtime version
Runtime:
- Objects loaded/instantiated by the AddressableComponents no longer save in editor and builds. theyre not editable but do show up in the hierarchy
- Fixed an issue where the
ItemTierPickupDisplayHelperwould throw an NRE under specific situations - Added HOLY.dll support
- Internally fixes issues where interfaces implementing
IStatItemBehaviour.RecalculateStatsStart()would run afterorig(self)
- Internally fixes issues where interfaces implementing
- Added an
AsValidOrNullextension method which allows the ussage of the?.and??operators with unity objects - Improved the
InstantiateAddressablePrefab(thanks Caxapexac) - Marked
AddressableKeyAssetandAddressableIDRSas Obsolete - Marked
NamedIDRS.AddressNamedRuleGroup.keyAssetandNamedIDRS.addressNamedDisplayRule.displayPrefabas Obsolete ItemDisplayDictionarycan now have multiple display prefabs, the selected one is chosen via indices.- Marked
ItemDisplayDictionary.NamedDisplayDictionary.idrsandItemDisplayDictionary.displayPrefabsas Obsolete - Added
ItemDisplayCatalog- The
ItemDisplayCatalogis used at Runtime for appending the item display data ofItemDisplayDictionaryandNamedIDRSto their respective target - This is done via collecting all the IDRS in the game and assigning string keys, alongside collecting all the display prefabs, and assigning string keys that correspond to their key asset
- In
DEBUGmode, the ItemDisplayCatalog serializes all the data collected into anItemDisplayCatalog.json - The
ItemDisplayCatalog.jsonis then used in the Editor for adding data and manipulating existingItemDisplayDictionaryandNamedIDRSassets
- The
- Added ContextMenus for
ItemDisplayDictionaryandNamedIDRSfor updating to theItemDisplayCatalogsystem- This is also ran at runtime awake to ensure previous, non updated mods dont break.
- Fixed issue where moduleAvailability didnt work at all
Editor:
- Updated to use RoR2EK 4.0.1
- Fixed issue where
BasicBuildwould Stage Assetbundles before Staging the Assembly - Fixed issue where the
GenericContributorBuildwouldn't have MSU in its whitelist - Stubbed Shaders are now included in the MSU AssetBundle to avoid duplicate assets across multiple bundles
CameraInstantiatornow doesnt save in Editor (thanks Cacapexac)- Added
ItemDisplayCatalogclass, which is populated by theItemDisplayCatalog.jsonwhich is created at Run time when building MSU in Debug mode. - Added a new and improved version of the NamedIDRS window that uses the ItemDisplayCatalog
- Added a new and improved version of the ItemDisplayDictionary window that uses ItemDisplayCatalog
- Fixed issue where
DecaliciousDeferredDecalwould have the wrong shader name
'1.3.0' - Stage Creation Utilities
- Removed MSUTests, as it wasnt an actual tests package, it'll come back soon(tm)
- Github package updated to use ThunderKit version 7.0.0 or Greater
Runtime:
- Fixed issue where
BaseBuffBodyBehaviourwould throw exceptions under certain circumstances. - Added a
GetEnabledExpansionsmethod thatt returns all the enabled expansions for a run inside MSUtil - Fixed mutliple isssues with EventtCard's IsAvailable() method
- Added Implicit
boolandUnityEngine.Objectcasts to AddressableAssets - Added components for creating and manipulating vanilla assets inside scenes
AddressableInjector, for injecting an AddressableAsset to a component's fieldCameraInstantiator, which instantiates the ror2 camera prefab for using PostProcessing- This component should exist in editor only and not on release builds.
InstantiateAddressablePrefab, for Instantiating prefabsSurfaceDefInjector, for injecting a surface def address to multiple GameObjects- These are untested, report bugs if necesary
- Removed a large amount of Debug related code, which now exists in Debug development builds.
- Added missing
EventDirectorCategorySelectionfor Artifact Reliquary - Marked event Actions on module bases as obsolete, replaced by
ResourceAvailability. - Marked
RemoveIfNottInCollectionmethod as obsolete, as its wrongly named. - Removed config option for enabling debug features, as to obtain them you must build MSU on Debug mode
- Added
MSDCCSPoolandMSDirectorCardCategorySelection&AddressableSpawnCard- These are used for creating DCCSPools and DirectorCardCategorySelection respectively for custom stages.
- Untested, report bugs if necesary
- Added a field to
Eventcardto specify a cost multiplier if the event has already played on a stage - Fixed an issue where Events that should only play once per run could play multiple times
Editor:
- Added inspectors for
AddressableInjector,InstantiateAddressablePrefab - Added a pipeline to change the BuildMode for StageAssemblies jobs on a Pipeline, which allows to build mods on Debug or Release mode.
- Added ChangeAssemblyBuildMode to
Release&GenericContributorBuildpipelines - Added MSU's R2API hard dependencies JSON file into the Editor folder of the package, use this when setting up a MSU project in ThunderKit
- Added a PropertyDrawer for
AddressableSpawnCard - Fixed issue where
SwapShadersAndStageAssetBundleswould still add .yaml shaders into the finished bundle.
'1.2.0' - Item Tier Support
Runtime:
- Updated to use the R2API Split Assemblies update.
- Added ItemTier support
- Support is in the form of the ItemTierModule and ItemTierBase
- ItemTierModule handles loading of ItemTierBases, and implements custom lists that contain the amount of items using said tier, and the current available items in a run.
- ItemTierBase can be used to specify custom Color entries using R2API's ColorsAPI, alongside a custom pickup display VFX
- Added a deconstruct method for key value pairs.
- Added a nicify string method to MSUtils
- Marked MaterialCopier as Deprecated
- Elites now properly have their ramps set ingame.
- Added the AddressableMaterialShader shader
- replacement for MaterialCopier
- Contains a custom field where the address can be inputed
- Calling "FinalizeMaterialsWithAddressableMaterialShader" method in your assetloader copies the addressable material's properties and shaders to your custom instance.
- Event Related
- Removed the requiredExpansionDef field from EventCard
- EventCard's selection weight now ranges between 0 and 100
- Fixed a major issue where the EventDirector prefab was set to server only (this fix makes events actually network.)
- Fixed TokenModifiers and ConfigurableFields crashing the game if no instance of either was found.
- When a field configurable by ConfigurableFied gets it's value changed, Configurablefield will now apply the new value. (this allows ConfigurableField to work with ROO)
- Added missing XML documentation
'1.1.2' - Hotfix
Runtime:
- Fixed issue where event messages wouldnt display properly.
'1.1.1' - Bug Fixes
Runtime:
- Event Related:
- Fixed null reference exception issue with the Event Director on Custom Stages.
- SetupWeatherController no longer causes issues with Custom Stage
- Added an X offset for the event messages
- Event director wont instantiate new events when the teleporter is charged, or when it's charging percent is over 25%
- Event Cards can now have multiple required Expansion Defs.
- Added missing EventDirectorCategorySelection for Gilded Coast
- Fixed most Properties in VanillaEventDirectorCategorySelection returning null
- Token Modifier changes:
- Marked "AddMod" method as obsolete
- Now inherits from SearchableAttribute
- Now works on Properties and Fields
- Marked StatTypes.Percentage and StatTypes.DivideBy2 as obsolete
- Added the following StatTypes:
- DivideByN
- MultiplyByN
- AddN
- SubtractN
- added a new field for representing the N in the new stat types, this allows mod creators to have a lot more control on the displayed values.
- ConfigurableField attribute now uses SearchableAttribute
- AddressableAssets changes:
- AddressableAssets' OnAddressableAssetsLoaded no longer runs before initialized sets to true.
- Added constructors for the bundled in AddressableAssets
Editor:
- Shader Dictionary now is kept loaded in static memory on domain reloads.
- SwapShadersAndStageAssetbundles will now revert swapped shaders back to normal if an exception is thrown
'1.1.0' - Void Items
General:
- Added Tests for MSU
- Not bundled with the Thunderstore Release
- Contains classes for testing out the systems of MSU and the API as a whole
Runtime:
- AddressableAssets now have a bool to check if it uses a direct reference rather than an addressable reference
- Added a VoidItemBase, for creating Void items
- Added the following extensions:
- Play for NetworkSoundEventDefs
- GetItemCount for CharacterBodies
- Event announcements now are properly networked
- Added configuration options for the Event Announcements
- Opacity reduced to 75%
- Message size set to 40
- Y position Offset of 225 (Messages appear right below boss health bars)
- Added a Tri-Planar and CalmWater material controlers, courtesy of jaceDaDorito
- Added missing documentation
- Removed most weather related components, these have been migrated to Starstorm2
Editor:
- Added a custom property drawer for AddressableAssetDrawers
- Added a Constants file
- Updated ShaderDictionary to use the SerializableShaderWrapper from RoR2EK
- MaterialShaderManager's Upgrade and Downgrade methods now use the correct dictionary
'1.0.0' - Official Release
-
MSU is now a "PackageRepo" in github! this means that it is now heavily recommended to use the repository for creating mods with MSU instead of this release version.
-
Updated to Survivors Of The Void (Version 1.2.4)
-
Complete Refactoring of the entire codebase.
- Some names have changed
- Some systems have been redone or checked up.
- A lot of internal changes on how things work.
- This just means that 1.0.0 marks the begining of LTS, which means future versions shouldnt break compatibility with older versions.
-
Events are now considered to be in a Finished, usable state.
-
Complete XML Documentation for all classes except some components
-
Improved experience with Scriptable Objects.
-
Added a custom Addressables Solution
-
Removed redundant features with newest version of R2API
-
Removed already deprecated classes.
-
Deprecated some existing classes
-
Improved loader systems.
-
Way, way too many more changes i cant remember currently, a more complete changelog can be found here!
'0.8.0'
- Additions:
- Added a method on MSUtil for playing a networked sound event def
- The HGCloudRemap controller now has the option to modify the Src and Dst blend enums.
- Revamped the CharacterModuleBase class
- Now allows for proper implementation of Monsters, including having them spawn on stages
- Added the MonsterDirectorCard scriptable object
- Fixes:
- Added missing Submodule dependency for UnlockableAPI and DirectorAPI
- Other:
- Moved the entire codebase and project to the github, instead of being inside Starstorm2's Github
- Rewrote parts of the ReadMe
'0.7.0'
-
Additions:
- Now finally comes bundled with proper XML based documentation, huzzah!
- Added Assets, Content and Language Loaders
- These classes handle external loading of assets, such as assetbundles and language files
- ContentLoader works as a simplified version of a class implementing IContentPackProvider, and helps with loading content Asynchronously
-
Changes:
- The AchievementDefs are now added directly to the game using R2API
'0.6.0'
-
Changes:
- MSU no longer has any kind of dependency on AspectAbilities
- MSU no longer handles the implementation of an aspect ability by itself
- Removed dependency on Microsoft.Csharp
- Event Director:
- No longer should gain negative amounts of credits on custom difficulties with indexes on the negatives.
-
Additions
- Interfaces:
- Added IBodyStatArgModifier Interface
- Used for interacting with R2Api's RecalculateStatsAPI
- Added IBodyStatArgModifier Interface
- Unlockables:
- Added an Unlockables Module
- Unlockables module handles the implementation of UnlockableDefs and the creation of AchievementDefs
- UnlockableDefs and Achievementdefs are made inside the MSUnlockableDef class
- Unlockables are registered inside UnlockableBase classes. the norm is also having it's related Achievement as a nested class
- Unlockables can have dependencies on other ContentBases
- If a dependency is not enabled, the unlockable will not be added to the game
- In case the dependency is a custom made content base, you can override OnFailedToCheck() method to handle it.
- Interactables:
- Added an Interactables Module
- Interactable Module handles the implementation of custom Interactables to the game
- Interactables are created from the MSInteractableDirectorCard, which itself inherits from the InteractableSpawnCard
- Interactablkes are automatically added to stages via DirectorAPI
- Interfaces:
'0.5.1'
-
Fixed the Damn Readme file.
-
Changes:
- EventAPI
- Fixed the Director trying to spawn events when there where no available events.
- Director no longer spawns when there are no events registered.
- ItemDisplayModuleBase
- Changed how vanilla IDRS are populated, theyre not taken directly from the BodyCatalog when its initialized.
- This in turn enables people to add IDRS to other characterBodies from mods.
- Deprecated "PopulateVanillaIDRSFromAssetBundle()"
- MSIDRSUtil
- Deprecated as we're trying to change the standard on how modded IDRS are done
- EventAPI
'0.5.0'
* Additions:
* Added Event system API (*Look, I normally don't do this, okay? I don't really know what else has been done , but this is Starstorm 2's Event API, forcefully ripped out and put in a place where YOU can use it. There is NO documentation. I don't even know if it works. But you can (probably) use it to do cool stuff!
...I hope Nebby forgives me for this one.)
No, I do not.
Actual changelog:
- Additions:
- Added the ability to extend from the MoonstormItemManager component.
- Extending from the manager requires you to extend from the "ManagerExtension" component.
- Immediate References to the characterBody attatched to the manager extension, the manager itself as well.
- Virtual methods for GetInterfaces, CheckForItems and CheckForBuffs.
- Added the EventAPI from Starstorm2Nightly into MSU.
- The Event API itself is not documented and very much WIP.
- EventAPI should have everything to add custom events.
- EventAPI works via a custom director, events themselves are simply entity states.
- All Events should inherit from the GenericEvent entitystate, which is found in the EntityStates.Events namespace.
- Added the ability to extend from the MoonstormItemManager component.
- Changes
- Artifact Content Base:
- Added OnArtifactEnabled() and OnArtifactDisabled() abstract methods, subscribe and unsuscribe from hooks in these methods. System closely resembles how the Artifact Managers of RoR2 Work.
- Added an Abstract field for an ArtifactCode from R2API's ArtifactCodeAPI, can be left null.
- Artifact Module Base:
- Added some actual hooks onto the RunArtifactManager.
- Pickups Module Base: Added an Event when the ItemManager is added.
- Material Tester:
- Can no longer be spawned outside of runs
- Renderer is no longer null by default
- Can now be destroyed easily by enabling the "DestroyOnEnable" component.
- Artifact Content Base:
'0.4.1'
- Additions:
- Added the StageModuleBase & StageBase
- Used for handling custom stages
- Compatible with ROS
- Added the StageModuleBase & StageBase
- Changes:
- Marked the MSAspectAbilityDataHolder as Deprecated, will be removed on the next major update.
- Now Dependant on Microsoft CSharp
- Changed how Elite Equipments get initialized
- This Retroactively fixes an issue where, if the Elite Equipment Base overrides the AddItemBehavior method, but its not fully initialized (like disabling it from a config) it would add the item behavior regardless ((Example on the issue)[https://github.com/swuff-star/LostInTransit/issues/2])
- Completely Revamped the Dynamic Description attribute.
- Now called the "TokenModifier" attribute.
- Used on Fields that are public & static
- Requires the following arguments
- String: the Token to modify
- StatType: Used for modifying the value held in the field
- Default: No changes are made
- Percentage: The value on the field is multiplied by 100
- DivideBy2: The value on the field is divided by 2
- If you need a specific stat type, ask it in the starstorm discord and we might add it.
- FormatIndex: the index used for formatting.
- Should technically work with any mod.
- Not usable on mods that load their language via LanguageAPI (Due to languageAPI's string by tokens dictionaries being private.)
- Bug Fixes:
- Fixed an issue where moonstorm dependant mods would try to access MSUtil on the Moonstorm.Utilities namespace despite being on the Moonstorm namespace
'0.4.0'
- Added ConfigurableField attribute
- Used for automatically creating config options for fields.
- Added DynamicDescription attribute
- Used for dynamically modifying the description of an item via the use of formatting, and provided fields.
'0.3.0'
- Rewrote a lot of the Elite related code to allow for more pleasant and balanced behaviors.
- Fixed Elite Ramps not Reseting properly when grabbing an MSEliteEquipment and then grabbing a vanilla one.
- Added Tooltips for the MSEliteDef
- Added an Opaque Cloud Remap runtime editor. (OCR are deprecated, ghor recommends using regular cloud remaps instead).
- Projectiles with CharacterBody components now get added to the Serializable Content Pack's CharacterBody prefabs.
- Added IOnIncomingDamageOtherServerReceiver
- Used to modify the incoming damage of soon to be Victims in the damage report, it is similar to the IOnIncomingDamage interface.
- Almost all classes are now documented, However, MSU does not come with XML documentation yet.
- Made MoonstormEditorUtils Dependant on MoonstormSharedUtils.
- Changes to the IDRS System.
- The ItemDisplayPrefab scriptable object has been revamped to a key asset display pair holder.
- The KeyAssetDisplayPairHolder can be given to the IDRS module and it'll populate both the key asset dictionary and the display prefab dictionary.
- This can be used for external mods that dont directl depend on MSU to populate the item display dictionary.
'0.2.1'
- Re-Added the MSAspectAbility, now named "MSAspectAbilityDataHolder"
- Only holds data, doesnt use aspect abilities at all.
- Used for elite equipments.
- Fixed an issue where the EliteModuleBase wouldnt register new elites.
- Fixed an issue where the ItemManager would not properly obtain new StatItemBehavior interfaces on buff removal.
- Removed EditorUtils until further notice.
- General internal changes
'0.2.0'
- Deprecated MSAspectAbility due to issues with initalization of the mod.
- It has been replaced by an Animation curve asset and a simple float for AIMaxUseDistance
- Fixed an issue where MSIDRS/SIDRS would not be able to retrieve their display prefab correctly.
- Changed any references to definitions adding to content pack to use the content pack's name.
- Added more material controllers, courtesy of Vale-X
- Removed abstract field from module abses
- Module bases now use SystemInitializer attribute
'0.0.1'
- Initial Release





