6.0.0 - Major New Features & Breaking Reworks
Major New Features
Most notable features of this release:
Steam Workshop Support
- ModLoader now has native support for Steam Workshop!
- Special thanks to Blobfish, the developer of Brotato, for layout the groundwork for workshop support.
- Game developers might also like to try Blobfish's mod uploader, Godot Workshop Utility, which was recently updated to support tags.
- More info: #148
New Config System
- Every mod now has its own config JSON file, with a robust system behind the scenes that allows for precise data validation.
- There are lots of new methods for interacting with a mod's configs, enabling modders to create powerful GUIs to alter and save them.
- More info: #237
User Mod Profiles
- User profiles let you decide which mods you want active, letting you swap between different sets of mods as needed.
- More info: #214
Runtime Mod Disabling
- You can now enable or disable mods while running a game!
- This was one of the most requested features, and we're delighted to now support it!
- More info: #203
Inheritance Checks for Script Extensions
- Installing a script extension now follows the parent/child hierarchy correctly, which fixes a roadblock many mods have faced.
- You might never notice this, but it's a much-needed improvement that allows modders to edit a lot more scripts.
- More info: #124, #277
ModLoader Options
- A new panel in the editor lets you tweak lots of settings, to help you develop mods faster and easier. Notable options include:
- Enable/disable all mods.
- Disable certain mods (this lets you keep all your mods in a single project, without them interfering with each other).
- Change the log level to be more or less verbose.
- Override the paths to your mods.
- To edit them, open
res://addons/mod_loader/options
. From here, you can open options.tres in the Inspector, then click the resource name in the "Current Options" setting to expand it and edit the options. - These options also support multiple profiles, by dragging and dropping a profile resource file into the Current Options. Some examples are provided in the profiles directory.
- More info: #145, #160
Logging Changes
- Logs are now stored in memory, and have lots of new API methods via the new
ModLoaderLog
class. - This grants support for modders and developers to do things like creating terminals that display logged messages in-game, with the option to filter by log type (debug, success, info, warning, error).
- More info: #205
Known Issues
- When switching from a profile where a mod is inactive to a profile where the same mod is active, the active state of all other profiles is automatically set to active as well.
Breaking Changes
We've refactored the code to be easier to use, more robust, and give better indications of what's available for public use (everything in the api
directory) vs. what parts are strictly internal (everything else, plus any classes or methods that start with an underscore (_
).
In v6 we've also added new methods for deprecation (#156). This keeps existing mods working, but also provides a warnings if you're using an outdated method, with the warning telling you exactly which method to use instead.
View the Breaking Changes page on the wiki for more details on the changes needed in your mods.
Pull Requests
New Features
- #124 - (
f92b68d1
) ✨ Inheritance checks for script extensions - #137 - (
4399abf4
) ✨ Config JSON: Swap status codes 1 and 2 (closes #131) - #138 - (
01983b7c
) ✨ Config JSON: Only log notice for no custom JSON once - #139 - (
0c304075
) ✨ Addcode_note
func, and use it to show a helpful message inlog_fatal
- #142 - (
00529d01
) ✨ Config JSON: Add API methods for saving data - #143 - (
0a56d516
) ✨ Utility: Add 2 funcs for saving data to files - #145 - (
e01a5d5d
) ✨ ML Options: Add the groundwork for loading custom options - #148 - (
b4d31bcf
) ✨ Workshop Support - #149 - (
3f35b8c9
) ✨ Uncommentcode_note
code in file saving API methods - #156 - (
61132ddf
) ✨ API: Add methods for deprecation + API Folder - #160 - (
eaf52c2b
) ✨ Options: Add option to skip mods by mod ID - #162 - (
90bd4c61
) ✨ Addedget_as_dict()
function to ModManifest Class - #172 - (
4f2ea000
) ✨ ModLoaderStore: New singleton to store data - #175 - (
09cf37e9
) ✨ ModManifest - Addedto_json()
function - #185 - (
7649406a
) ✨ added load_before - #188 - (
ea7e5389
) ✨ Added optional dependencies - #194 - (
28ce51b3
) ✨ Added validation forload_before
- #195 - (
c0a5624f
) ✨ added_reset_extension
- #198 - (
f11fb718
) ✨ added_remove_extension
- #203 - (
d3c35cfe
) ✨ Mod reloading - #205 - (
a14a6325
) ✨ Store Logs + refactor: ♻️ Logging - #207 - (
f8185e05
) ✨ Option to skip deprecated fatal error - #210 - (
f64d8df5
) ✨ Addedonly_once
parameter to all log funcs - #214 - (
b9ad9a5c
) ✨ Add user profiles - #222 - (
36472bb2
) ✨ AddedModLoaderDependency
Class
Bug Fixes
- #134 - (
3c19fddf
) 🐛 Validation: Don't allow mods to include themselves as dependencies or incompatibilities - #168 - (
6f9068b8
) ✏️ Fix typo hypen -> hyphen - #176 - (
8f669f09
) ✏️ Fix typo:improt
->import
- #183 - (
40ae4f18
) 🐛 Circular dependency check - #184 - (
93e6cab4
) 🐛 Continue check if circular dep is detected - #201 - (
41b1801c
) 🐛 Self setup chicken and egg problem - #202 - (
80fea721
) 🐛 Check for min length 3 in namespace and name - #215 - (
34bcb833
) 🐛 Check if a modis_loadable
- #234 - (
a8b22394
) 🐛 WrongUNPACKED_DIR
reference - #235 - (
97eda11f
) 🐛 Fix wrong function call - #276 - (
8f030b2
) 🐛 Always use warnings for deprecations in standalone builds - #276 - (
286f296
) 🐛 Transitive Comparator for script sorting - #278 - (
90334fc
) 🐛 log stack only saved for logged_messages.all
Refactors
- #130 - (
8b2ed7b7
) ♻️ Addedis_silent
parameter to validation functions - #155 - (
08270f14
) ♻️ Moveclass_name
to be beforeextends
- #157 - (
dd92e428
) ♻️ API: Move Config to a dedicated class - #158 - (
046f434b
) ♻️ API: Move Steam to a dedicated class - #159 - (
03ddc46a
) ♻️ Move options classes + Renameoptions_current
- #163 - (
02d128bd
) ♻️ ModManifest added type checks - #164 - (
e4020182
) ♻️ Added compatible_mod_loader_version to manifest data - #170 - (
547c437c
) ♻️ Split off dep and inc validation function - #171 - (
dcdbbeff
) ♻️ Addedis_semver_version_array_valid()
- #174 - (
bf5f7058
) ♻️ ModID independencies
andincompatibilities
- #182 - (
2776655f
) ♻️ Move utility funcs out of mod_manifest.gd - #191 - (
4cbdbca4
) ♻️ Split validation functions - #193 - (
7f9afed5
) ♻️validate_distinct_mod_ids_in_arrays()
- #196 - (
b4cf01c3
) ♻️ Check for valid mod_ids inload_before
- #197 - (
0bbf74be
) ♻️ Add mod_id in all validation error messages - #199 - (
429f8c52
) ♻️ Changed mod config dir path touser://configs
- #205 - (
a14a6325
) ♻️ Logging rework - #208 - (
187e5f51
) ♻️ Move main mod API funcs toModLoaderMod
, fromModLoader
- #211 - (
5cff4506
) ♻️ Created setup_log.gd and setup_utils.gd - #218 - (
bec0f522
) ♻️ Movemod_data
ModLoader
->ModLoaderStore
- #220 - (
1d5588b1
) ♻️ Movemod_load_order
toModLoaderStore
- #222 - (
36472bb2
) ♻️ AddedModLoaderDependency
Class - #224 - (
13672ae2
) ♻️ Move remaining vars toModLoaderStore
- #225 - (
4576b8ba
) ♻️ AddedModLoaderScriptExtension
Class - #226 - (
9f4b902f
) ♻️ Split upModLoaderUtils
- #230 - (
5fc7268e
) 🚚 Moved and renamedModLoaderSteam
- #233 - (
60d4f3a7
) ♻️ Move consts fromModLoader
toModLoaderStore
- #283 - (
f5eb5a5
) 🚚 Moved methods handling mod state
Chores
- #217 - (
37f90109
) 🚚 Add.gitattributes
to allow AssetLib downloads - #213 - (
15bc5bc4
) 🚚 Add PR dependency check GitHub action - #223 - (
47d31c18
) 🚚 Copied LICENSE into addons\mod_loader - #229 - (
e88ec1e2
) 📝 initCONTRIBUTING.md
Code Style Changes
- #135 - (
6d5ade43
) ✏️ Cleanup: Remove todo comments - #136 - (
1ccb05f3
) ✏️ Cleanup: Remove trailing whitespace - #177 - (
5f926439
) 🎨 Add\t
indent toJSON.print()
- #232 - (
33f85b7e
) ✏️ rename funcs to match naming convention
Other Changes
Contributors
In addition to changes from our core team, we also had contributions from these lovely people: