From df11dd7a74955793e8d37d9f9091e7e62fef64f8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 21 Feb 2023 10:54:56 -0500 Subject: [PATCH] Fixed issues with #7972 --- core/src/mindustry/mod/Mods.java | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 54f3f14d6d..3277fab470 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -41,9 +41,12 @@ public class Mods implements Loadable{ private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites", "sprites-override"); private int totalSprites; - private static ObjectFloatMap textureResize = new ObjectFloatMap<>(); + private ObjectFloatMap textureResize = new ObjectFloatMap<>(); private MultiPacker packer; + /** Ordered mods cache. Set to null to invalidate. */ + private @Nullable Seq lastOrderedMods = new Seq<>(); + private ModClassLoader mainLoader = new ModClassLoader(getClass().getClassLoader()); Seq mods = new Seq<>(); @@ -106,6 +109,8 @@ public class Mods implements Loadable{ try{ var loaded = loadMod(dest, true, true); mods.add(loaded); + //invalidate ordered mods cache + lastOrderedMods = null; requiresReload = true; //enable the mod on import Core.settings.put("mod-" + loaded.name + "-enabled", true); @@ -463,6 +468,8 @@ public class Mods implements Loadable{ LoadedMod mod = loadMod(file, false, entry.value == ModState.enabled); mod.state = entry.value; mods.add(mod); + //invalidate ordered mods cache + lastOrderedMods = null; if(steam) mod.addSteamID(file.name()); }catch(Throwable e){ if(e instanceof ClassNotFoundException && e.getMessage().contains("mindustry.plugin.Plugin")){ @@ -481,7 +488,7 @@ public class Mods implements Loadable{ mods.each(this::updateDependencies); for(var mod : mods){ // Skip mods where the state has already been resolved - if(mod.state != ModState.enabled)continue; + if(mod.state != ModState.enabled) continue; if(!mod.isSupported()){ mod.state = ModState.unsupported; }else if(!mod.shouldBeEnabled()){ @@ -512,8 +519,15 @@ public class Mods implements Loadable{ /** @return mods ordered in the correct way needed for dependencies. */ public Seq orderedMods(){ - var mapping = mods.asMap(m -> m.meta.name); - return resolveDependencies(mods.map(m -> m.meta)).orderedKeys().map(mapping::get); + //update cache if it's "dirty"/empty + if(lastOrderedMods == null){ + //only enabled mods participate; this state is resolved in load() + Seq enabled = mods.select(LoadedMod::enabled); + + var mapping = enabled.asMap(m -> m.meta.name); + lastOrderedMods = resolveDependencies(enabled.map(m -> m.meta)).orderedKeys().map(mapping::get); + } + return lastOrderedMods; } public LoadedMod locateMod(String name){ @@ -522,8 +536,6 @@ public class Mods implements Loadable{ private void buildFiles(){ for(LoadedMod mod : orderedMods()){ - if(!mod.shouldBeEnabled()) continue; - boolean zipFolder = !mod.file.isDirectory() && mod.root.parent() != null; String parentName = zipFolder ? mod.root.name() : null; for(Fi file : mod.root.list()){