From 31042a9039f720ccdadc536eb4442cf69919bdd1 Mon Sep 17 00:00:00 2001 From: Ne_Eo Date: Fri, 16 May 2025 01:00:22 +0200 Subject: [PATCH] Allow addons in mods folder This allows people to add addons using `mods//addons//` --- source/funkin/backend/system/MainState.hx | 80 ++++++++++++++++++----- 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/source/funkin/backend/system/MainState.hx b/source/funkin/backend/system/MainState.hx index a5011d6d..2465a357 100644 --- a/source/funkin/backend/system/MainState.hx +++ b/source/funkin/backend/system/MainState.hx @@ -8,6 +8,13 @@ import funkin.menus.TitleState; import funkin.menus.BetaWarningState; import funkin.backend.chart.EventsData; import flixel.FlxState; +import haxe.io.Path; + +@dox(hide) +typedef AddonInfo = { + var name:String; + var path:String; +} /** * Simple state used for loading the game @@ -32,25 +39,64 @@ class MainState extends FlxState { Paths.assetsTree.reset(); #if MOD_SUPPORT - var _lowPriorityAddons:Array = []; - var _highPriorityAddons:Array = []; - var _noPriorityAddons:Array = []; - if (FileSystem.exists(ModsFolder.addonsPath) && FileSystem.isDirectory(ModsFolder.addonsPath)) { - for(i=>addon in [for(dir in FileSystem.readDirectory(ModsFolder.addonsPath)) if (FileSystem.isDirectory('${ModsFolder.addonsPath}$dir')) dir]) { - if (addon.startsWith("[LOW]")) _lowPriorityAddons.insert(0, addon); - else if (addon.startsWith("[HIGH]")) _highPriorityAddons.insert(0, addon); - else _noPriorityAddons.insert(0, addon); - } - for (addon in _lowPriorityAddons) - Paths.assetsTree.addLibrary(ModsFolder.loadModLib('${ModsFolder.addonsPath}$addon', StringTools.ltrim(addon.substr("[LOW]".length)))); - } - if (ModsFolder.currentModFolder != null) - Paths.assetsTree.addLibrary(ModsFolder.loadModLib('${ModsFolder.modsPath}${ModsFolder.currentModFolder}', ModsFolder.currentModFolder)); + inline function isDirectory(path:String):Bool + return FileSystem.exists(path) && FileSystem.isDirectory(path); - if (FileSystem.exists(ModsFolder.addonsPath) && FileSystem.isDirectory(ModsFolder.addonsPath)){ - for (addon in _noPriorityAddons) Paths.assetsTree.addLibrary(ModsFolder.loadModLib('${ModsFolder.addonsPath}$addon', addon)); - for (addon in _highPriorityAddons) Paths.assetsTree.addLibrary(ModsFolder.loadModLib('${ModsFolder.addonsPath}$addon', StringTools.ltrim(addon.substr("[HIGH]".length)))); + inline function ltrim(str:String, prefix:String):String + return str.substr(prefix.length).ltrim(); + + inline function loadLib(path:String, name:String) + Paths.assetsTree.addLibrary(ModsFolder.loadModLib(path, name)); + + var _lowPriorityAddons:Array = []; + var _highPriorityAddons:Array = []; + var _noPriorityAddons:Array = []; + + var addonPaths = [ + ModsFolder.addonsPath, + ( + ModsFolder.currentModFolder != null ? + ModsFolder.modsPath + ModsFolder.currentModFolder + "/addons/" : + null + ) + ]; + + for(path in addonPaths) { + if (path == null) continue; + if (!isDirectory(path)) continue; + + for(addon in FileSystem.readDirectory(path)) { + if(!FileSystem.isDirectory(path + addon)) { + switch(Path.extension(addon).toLowerCase()) { + case 'zip': + addon = Path.withoutExtension(addon); + default: + continue; + } + } + + var data:AddonInfo = { + name: addon, + path: path + addon + }; + + if (addon.startsWith("[LOW]")) _lowPriorityAddons.insert(0, data); + else if (addon.startsWith("[HIGH]")) _highPriorityAddons.insert(0, data); + else _noPriorityAddons.insert(0, data); + } } + + for (addon in _lowPriorityAddons) + loadLib(addon.path, ltrim(addon.name, "[LOW]")); + + if (ModsFolder.currentModFolder != null) + loadLib(ModsFolder.modsPath + ModsFolder.currentModFolder, ModsFolder.currentModFolder); + + for (addon in _noPriorityAddons) + loadLib(addon.path, addon.name); + + for (addon in _highPriorityAddons) + loadLib(addon.path, ltrim(addon.name, "[HIGH]")); #end MusicBeatTransition.script = "";