diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 285e9e2526..7a406d968d 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -50,6 +50,7 @@ public class Mods implements Loadable{ private ModClassLoader mainLoader = new ModClassLoader(getClass().getClassLoader()); Seq mods = new Seq<>(); + private Seq newImports = new Seq<>(); private ObjectMap, ModMeta> metas = new ObjectMap<>(); private boolean requiresReload; @@ -422,6 +423,7 @@ public class Mods implements Loadable{ return; } mods.remove(mod); + newImports.remove(mod); mod.dispose(); requiresReload = true; } @@ -648,53 +650,57 @@ public class Mods implements Loadable{ } //show list of missing dependencies - if(mods.contains(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies())){ + Seq toCheck = mods.select(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies()); + if(!toCheck.isEmpty()){ ui.loadfrag.hide(); - new Dialog(""){{ - setFillParent(true); - cont.margin(15); - cont.add("@mod.dependencies.error").colspan(2); - cont.row(); - cont.image().width(300f).colspan(2).pad(2).height(4f).color(Color.scarlet); - cont.row(); - cont.pane(p -> { - mods.each(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies(), mod -> { - p.add(mod.meta.displayName).wrap().growX().left().labelAlign(Align.left); - p.row(); - p.table(d -> { - mod.missingDependencies.each(dep -> { - d.add(dep).wrap().growX().left().labelAlign(Align.left); - d.row(); - }); - }).growX().padBottom(8f).padLeft(12f); - p.row(); - }); - }).fillX().colspan(2); - - cont.row(); - - cont.button("@ok", this::hide).size(150, 50); - cont.button("@mod.dependencies.download", () -> { - hide(); - Seq toImport = new Seq<>(); - mods.each(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies(), mod -> { - mod.missingDependencies.each(toImport::addUnique); - }); - downloadDependencies(toImport, true); - }).size(150, 50); - }}.show(); + checkDependencies(toCheck); } } - private void downloadDependencies(Seq toImport, boolean startup){ + private void checkDependencies(Seq toCheck){ + new Dialog(""){{ + setFillParent(true); + cont.margin(15); + cont.add("@mod.dependencies.error").colspan(2); + cont.row(); + cont.image().width(300f).colspan(2).pad(2).height(4f).color(Color.scarlet); + cont.row(); + cont.pane(p -> { + toCheck.each(mod -> { + p.add(mod.meta.displayName).wrap().growX().left().labelAlign(Align.left); + p.row(); + p.table(d -> { + mod.missingDependencies.each(dep -> { + d.add(dep).wrap().growX().left().labelAlign(Align.left); + d.row(); + }); + }).growX().padBottom(8f).padLeft(12f); + p.row(); + }); + }).fillX().colspan(2); + + cont.row(); + + cont.button("@ok", this::hide).size(150, 50); + cont.button("@mod.dependencies.download", () -> { + hide(); + Seq toImport = new Seq<>(); + toCheck.each(mod -> mod.missingDependencies.each(toImport::addUnique)); + downloadDependencies(toImport); + }).size(150, 50); + }}.show(); + } + + private void downloadDependencies(Seq toImport){ Seq remaining = toImport.copy(); ui.mods.importDependencies(remaining, () -> { toImport.removeAll(remaining); - displayDependencyImportStatus(remaining, toImport, startup); + if(toImport.any()) requiresReload = true; + displayDependencyImportStatus(remaining, toImport); }); } - private void displayDependencyImportStatus(Seq failed, Seq success, boolean startup){ + private void displayDependencyImportStatus(Seq failed, Seq success){ new Dialog(""){{ setFillParent(true); cont.margin(15); @@ -730,7 +736,7 @@ public class Mods implements Loadable{ }).fillX(); cont.row(); - if(startup && success.any()){ + if(success.any()){ cont.image().width(300f).pad(2).height(4f).color(Color.lightGray); cont.row(); cont.add("@mods.reloadexit").center(); @@ -746,11 +752,13 @@ public class Mods implements Loadable{ }}.show(); } - private void reload(){ - ui.showInfoOnHidden("@mods.reloadexit", () -> { + public void reload(){ + if(newImports.any()){ + checkDependencies(newImports); + }else{ Log.info("Exiting to reload mods."); Core.app.exit(); - }); + } } public boolean hasContentErrors(){ @@ -978,19 +986,13 @@ public class Mods implements Loadable{ } /** Checks if a newly imported mod's dependencies are already added. */ - public void checkImportDependencies(LoadedMod mod){ + public void loadImportDependencies(LoadedMod mod){ if(mod.meta.dependencies.isEmpty()) return; Seq missing = mod.meta.dependencies.select(m -> getMod(m) == null); if(missing.isEmpty()) return; - StringBuilder list = new StringBuilder(); - for(int i = 0; i < missing.size; i++){ - if(i > 0) list.append("\n"); - list.append(missing.get(i)); - } - ui.showConfirm("@mod.dependencies.imported", list.toString(), () -> { - downloadDependencies(missing, false); - }); + mod.missingDependencies = missing; + newImports.add(mod); } private boolean resolve(String element, ModResolutionContext context){ diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index bd4cda3ef1..f69dce3b16 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -362,10 +362,7 @@ public class ModsDialog extends BaseDialog{ } private void reload(){ - ui.showInfoOnHidden("@mods.reloadexit", () -> { - Log.info("Exiting to reload mods."); - Core.app.exit(); - }); + ui.showInfoOnHidden("@mods.reloadexit", () -> mods.reload()); } private void showMod(LoadedMod mod){ @@ -626,7 +623,7 @@ public class ModsDialog extends BaseDialog{ var mod = mods.importMod(file); mod.setRepo(repo); - mods.checkImportDependencies(mod); + mods.loadImportDependencies(mod); file.delete(); Core.app.post(() -> {