new secret addons folder??? wdym

This commit is contained in:
Yoshman29
2023-03-27 23:00:56 +02:00
parent d3d3ecc749
commit e4d613200a
7 changed files with 120 additions and 96 deletions
+1
View File
@@ -28,6 +28,7 @@ import haxe.xml.Access;
using StringTools;
@:allow(funkin.mods.ModsFolder)
@:allow(funkin.system.MainState)
class TitleState extends MusicBeatState
{
static var initialized:Bool = false;
+31 -46
View File
@@ -1,5 +1,6 @@
package funkin.mods;
import funkin.system.MainState;
import funkin.menus.TitleState;
import funkin.system.Main;
import openfl.utils.AssetCache;
@@ -28,15 +29,19 @@ class ModsFolder {
* Current mod folder. Will affect `Paths`.
*/
public static var currentModFolder:String = null;
/**
* Map all loaded mods' folder libraries.
*/
public static var loadedMods:Map<String, lime.utils.AssetLibrary> = [];
/**
* Path to the `mods` folder.
*/
public static var modsPath:String = "./mods/";
/**
* Path to the `addons` folder.
*/
public static var addonsPath:String = "./addons/";
/**
* Whenever its the first time mods has been reloaded.
*/
private static var __firstTime:Bool = true;
/**
* Initialises `mods` folder by adding callbacks and such.
*/
@@ -44,56 +49,36 @@ class ModsFolder {
}
/**
* Loads a mod with the specified name.
* @param modName Name of the mod
* @param force Whenever the mod should be reloaded if it has already been loaded
*/
public static function loadMod(mod:String, force:Bool = false) {
#if MOD_SUPPORT
if (mod == null) return null; // may be loading base game
if (FileSystem.exists('${modsPath}$mod.zip'))
return loadedMods[mod] = loadLibraryFromZip('mods/$mod'.toLowerCase(), '${modsPath}$mod.zip', force);
else
return loadedMods[mod] = loadLibraryFromFolder('mods/$mod'.toLowerCase(), '${modsPath}$mod', force);
#else
return null;
#end
}
/**
* Switches mod - unloads all the other mods, then load this one.
* @param libName
*/
public static function switchMod(mod:String) {
unloadMod(ModsFolder.currentModFolder);
Options.lastLoadedMod = ModsFolder.currentModFolder = mod;
Options.save();
if (ModsFolder.currentModFolder == null) return;
Paths.assetsTree.addLibrary(loadMod(ModsFolder.currentModFolder));
Main.refreshAssets();
onModSwitch.dispatch(ModsFolder.currentModFolder);
if (FlxG.sound.music != null && FlxG.sound.music.playing)
FlxG.sound.music.fadeOut(0.25, 0, function(t) {
FlxG.sound.music.stop();
});
DiscordUtil.reloadJsonData();
TitleState.initialized = false;
FlxG.switchState(new TitleState());
Options.lastLoadedMod = currentModFolder = mod;
reloadMods();
}
public static function unloadMod(mod:String) {
if (mod == null) return;
Paths.assetsTree.clearCache();
FlxG.bitmap.reset();
Paths.assetsTree.removeLibrary(loadedMods[mod]);
public static function reloadMods() {
if (!__firstTime)
FlxG.switchState(new MainState());
__firstTime = false;
}
loadedMods[mod] = null;
/**
* Loads a mod library from the specified path. Supports folders and zips.
* @param modName Name of the mod
* @param force Whenever the mod should be reloaded if it has already been loaded
*/
public static function loadModLib(path:String, force:Bool = false) {
#if MOD_SUPPORT
if (FileSystem.exists('$path.zip'))
return loadLibraryFromZip('$path'.toLowerCase(), '$path.zip', force);
else
return loadLibraryFromFolder('$path'.toLowerCase(), '$path', force);
#else
return null;
#end
}
public static function prepareLibrary(libName:String, force:Bool = false) {
+19 -32
View File
@@ -5,9 +5,11 @@ import lime.utils.AssetLibrary;
class AssetsLibraryList extends AssetLibrary {
public var libraries:Array<AssetLibrary> = [];
public var base:AssetLibrary;
public var sourceLibsAmount:Int = 0;
@:allow(funkin.system.Main)
@:allow(funkin.system.MainState)
private var __defaultLibraries:Array<AssetLibrary> = [];
public var base:AssetLibrary;
public function removeLibrary(lib:AssetLibrary) {
if (lib == null) return lib;
@@ -118,40 +120,13 @@ class AssetsLibraryList extends AssetLibrary {
private function shouldSkipLib(k:Int, source:AssetSource) {
return switch(source) {
case BOTH: false;
case SOURCE: k < libraries.length - sourceLibsAmount;
case MODS: k >= libraries.length - sourceLibsAmount;
case SOURCE: k < libraries.length - __defaultLibraries.length;
case MODS: k >= libraries.length - __defaultLibraries.length;
};
}
public override inline function getAsset(id:String, type:String):Dynamic
return getSpecificAsset(id, type, BOTH);
public function clearCache() {
var libs:Array<AssetLibrary> = [for(lib in libraries) lib];
libs.push(this);
for(l in libs) {
var lib:AssetLibrary = l;
if (lib is openfl.utils.AssetLibrary) {
var openflLib = cast(lib, openfl.utils.AssetLibrary);
@:privateAccess
if (openflLib.__proxy != null) lib = openflLib.__proxy;
}
@:privateAccess var cachedAudioBuffers = lib.cachedAudioBuffers;
@:privateAccess var cachedBytes = lib.cachedBytes;
@:privateAccess var cachedFonts = lib.cachedFonts;
@:privateAccess var cachedImages = lib.cachedImages;
@:privateAccess var cachedText = lib.cachedText;
for(buff in cachedAudioBuffers) buff.dispose();
cachedAudioBuffers.clear();
cachedBytes.clear();
cachedFonts.clear();
cachedText.clear();
}
}
public override function isLocal(id:String, type:String) {
return true;
}
@@ -161,7 +136,19 @@ class AssetsLibraryList extends AssetLibrary {
if (base == null)
base = Assets.getLibrary("default");
addLibrary(this.base = base);
sourceLibsAmount++;
__defaultLibraries.push(base);
}
public function reset() {
for(l in libraries)
if (!__defaultLibraries.contains(l))
l.unload();
libraries = [];
// adds default libraries in again
for(d in __defaultLibraries)
addLibrary(d);
}
public function addLibrary(lib:AssetLibrary) {
+5 -13
View File
@@ -102,13 +102,9 @@ class Main extends Sprite
}
addChild(new FunkinGame(gameWidth, gameHeight, null, zoom, framerate, framerate, skipSplash, startFullscreen));
loadGameSettings();
// FlxG.switchState(new TitleState());
FlxG.switchState(new funkin.menus.BetaWarningState());
addChild(new FunkinGame(gameWidth, gameHeight, MainState, zoom, framerate, framerate, skipSplash, startFullscreen));
#if !mobile
// addChild(new FramerateField(10, 3, 0xFFFFFF));
addChild(new funkin.system.framerate.Framerate());
SystemInfo.init();
#end
@@ -144,7 +140,7 @@ class Main extends Sprite
return time = Lib.getTimer();
}
public function loadGameSettings() {
public static function loadGameSettings() {
MemoryUtil.init();
@:privateAccess
FlxG.game.getTimer = getTimer;
@@ -177,13 +173,11 @@ class Main extends Sprite
#elseif linux
trace("Used lime test linux. Switching into source assets.");
#end
Paths.assetsTree.addLibrary(ModsFolder.loadLibraryFromFolder('assets', './${pathBack}assets/', true));
Paths.assetsTree.sourceLibsAmount++;
Paths.assetsTree.__defaultLibraries.push(ModsFolder.loadLibraryFromFolder('assets', './${pathBack}assets/', true));
#end
} else {
#if USE_ADAPTED_ASSETS
Paths.assetsTree.addLibrary(ModsFolder.loadLibraryFromFolder('assets', './assets/', true));
Paths.assetsTree.sourceLibsAmount++;
Paths.assetsTree.__defaultLibraries.push(ModsFolder.loadLibraryFromFolder('assets', './assets/', true));
#end
}
#end
@@ -201,7 +195,6 @@ class Main extends Sprite
FlxG.fixedTimestep = false;
FlxG.scaleMode = scaleMode = new FunkinRatioScaleMode();
Conductor.init();
@@ -215,6 +208,7 @@ class Main extends Sprite
#if MOD_SUPPORT
ModsFolder.switchMod(modToLoad.getDefault(Options.lastLoadedMod));
#end
initTransition();
}
@@ -253,8 +247,6 @@ class Main extends Sprite
openfl.display3D.utils.UInt8Buff._pools.clear();
}
Paths.assetsTree.clearCache();
MemoryUtil.clearMajor();
}
}
+50
View File
@@ -0,0 +1,50 @@
package funkin.system;
import sys.FileSystem;
import funkin.mods.ModsFolder;
import funkin.menus.TitleState;
import funkin.menus.BetaWarningState;
import flixel.FlxState;
/**
* Simple state used for loading the game
*/
class MainState extends FlxState {
public static var initiated:Bool = false;
public static var betaWarningShown:Bool = false;
public override function create() {
super.create();
if (!initiated)
Main.loadGameSettings();
initiated = true;
Options.save();
FlxG.bitmap.reset();
FlxG.sound.destroy(true);
Paths.assetsTree.reset();
#if MOD_SUPPORT
if (ModsFolder.currentModFolder != null)
Paths.assetsTree.addLibrary(ModsFolder.loadModLib('${ModsFolder.modsPath}${ModsFolder.currentModFolder}'));
if (FileSystem.exists(ModsFolder.addonsPath) && FileSystem.isDirectory(ModsFolder.addonsPath))
for(addon in [for(dir in FileSystem.readDirectory(ModsFolder.addonsPath)) if (FileSystem.isDirectory('${ModsFolder.addonsPath}$dir')) dir])
Paths.assetsTree.addLibrary(ModsFolder.loadModLib('${ModsFolder.addonsPath}$addon'));
#end
Main.refreshAssets();
ModsFolder.onModSwitch.dispatch(ModsFolder.currentModFolder);
DiscordUtil.reloadJsonData();
TitleState.initialized = false;
if (betaWarningShown)
FlxG.switchState(new TitleState());
else {
FlxG.switchState(new BetaWarningState());
betaWarningShown = true;
}
}
}
@@ -35,6 +35,8 @@ class OptimizedBitmapData extends BitmapData {
readable = true;
this.image = null;
MemoryUtil.clearMinor();
}
#end
}
+12 -5
View File
@@ -7,11 +7,18 @@ class FlixelInfo extends FramerateCategory {
public override function __enterFrame(t:Int) {
if (alpha <= 0.05) return;
_text = 'State: ${Type.getClassName(Type.getClass(FlxG.state))}';
_text += '\nObject Count: ${FlxG.state.members.length}';
_text += '\nCamera Count: ${FlxG.cameras.list.length}';
@:privateAccess
_text += '\nFlxG.game Childs Count: ${FlxG.game.numChildren}';
@:privateAccess {
var c:Int = 0;
for(_ in FlxG.bitmap._cache.keys())
c++;
_text = 'State: ${Type.getClassName(Type.getClass(FlxG.state))}';
_text += '\nObject Count: ${FlxG.state.members.length}';
_text += '\nCamera Count: ${FlxG.cameras.list.length}';
_text += '\nBitmaps Count: ${c}';
_text += '\nSounds Count: ${FlxG.sound.list.length}';
_text += '\nFlxG.game Childs Count: ${FlxG.game.numChildren}';
}
this.text.text = _text;
super.__enterFrame(t);