From 7c0f19a5207166f723aec414c7b60669a18ecb76 Mon Sep 17 00:00:00 2001 From: Cardillan <122014763+cardillan@users.noreply.github.com> Date: Wed, 2 Sep 2026 22:31:31 +0200 Subject: [PATCH] Allow automatically disabled mods to be restored (#12263) * Allow automatically disabled mods to be restored * Indicate failed status * Apply suggestion from @Anuken * Update bundle.properties --------- Co-authored-by: Anuken --- core/assets/bundles/bundle.properties | 4 +++- core/src/mindustry/mod/Mods.java | 8 ++++++++ core/src/mindustry/ui/dialogs/ModsDialog.java | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 5fcc79affa..f3294a9d43 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -144,6 +144,7 @@ mods.initfailed = [red]\u26A0[] The previous Mindustry instance failed to initia mods = Mods mods.name = Mod: mods.none = [lightgray]No mods found! +mods.restore = Restore Failed mods.guide = Modding Guide mods.report = Report Bug mods.openfolder = Open Folder @@ -162,6 +163,7 @@ mod.installed = [[Installed] mod.display = [gray]Mod:[accent] {0} mod.enabled = [lightgray]Enabled mod.disabled = [red]Disabled +mod.failed = [red]Failed mod.multiplayer.compatible = [gray]Multiplayer Compatible mod.disable = Disable mod.version = Version: @@ -3578,4 +3580,4 @@ name.token.explosions = Explosions name.token.loops = Loops name.token.movement = Movement name.token.shoot = Shoot -name.token.ui = UI \ No newline at end of file +name.token.ui = UI diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index dd0b5b9a27..4598ec571d 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -132,6 +132,7 @@ public class Mods implements Loadable{ lastOrderedMods = null; requiresReload = true; //enable the mod on import + Core.settings.put("mod-" + loaded.name + "-failed", false); if(forceEnable) Core.settings.put("mod-" + loaded.name + "-enabled", true); sortMods(); //try to load the mod's icon so it displays on import @@ -953,6 +954,7 @@ public class Mods implements Loadable{ public void setEnabled(LoadedMod mod, boolean enabled){ if(mod.enabled() != enabled){ Core.settings.put("mod-" + mod.name + "-enabled", enabled); + Core.settings.put("mod-" + mod.name + "-failed", false); requiresReload = true; mod.state = enabled ? ModState.enabled : ModState.disabled; mods.each(this::updateDependencies); @@ -1200,7 +1202,9 @@ public class Mods implements Loadable{ //skip mod loading if it failed if(skipModLoading()){ + boolean wasEnabled = Core.settings.getBool("mod-" + baseName + "-enabled", true); Core.settings.put("mod-" + baseName + "-enabled", false); + Core.settings.put("mod-" + baseName + "-failed", wasEnabled); } if(!headless && Core.settings.getBool("mod-" + baseName + "-enabled", true)){ @@ -1275,6 +1279,10 @@ public class Mods implements Loadable{ return Core.settings.getBool("mod-" + name + "-enabled", true); } + public boolean failed(){ + return Core.settings.getBool("mod-" + name + "-failed", false); + } + public boolean hasUnmetDependencies(){ return !missingDependencies.isEmpty(); } diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index b4eadd11f9..8eda9fac6f 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -45,6 +45,16 @@ public class ModsDialog extends BaseDialog{ addCloseButton(); buttons.button("@mods.guide", Icon.link, () -> Core.app.openURI(modGuideURL)).size(210, 64f); + + if(mods.list().contains(m -> m.failed())){ + buttons.button("@mods.restore", Icon.power, () -> { + Seq skipped = new Seq<>(); + skipped.selectFrom(mods.list(), LoadedMod::failed); + + skipped.each(m -> mods.setEnabled(m, true)); + setup(); + }); + } if(!mobile){ buttons.button("@mods.openfolder", Icon.link, () -> Core.app.openFolder(modDirectory.absolutePath()));