feat: implement concept of scan stages to support deferring update checks until after critical information

This commit is contained in:
Johannes Frohnmeyer 2024-06-22 13:36:45 +02:00
parent 4e43d43777
commit 1daaf73554
Signed by: Johannes
GPG Key ID: E76429612C2929F4
24 changed files with 103 additions and 63 deletions

View File

@ -5,8 +5,7 @@ import io.gitlab.jfronny.commons.throwable.ThrowingBiFunction;
import io.gitlab.jfronny.inceptum.cli.*;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
import io.gitlab.jfronny.inceptum.launcher.system.mds.*;
import io.gitlab.jfronny.inceptum.launcher.util.Unchecked;
import java.io.FileNotFoundException;
@ -51,7 +50,7 @@ public class ModCommand extends Command {
return;
}
System.out.println("Scanning installed mods, this might take a while");
instance.mds().runOnce((path, mod) -> {
instance.mds().runOnce(ScanStage.UPDATE, (path, mod) -> {
boolean hasSources = !mod.getMetadata().sources().isEmpty();
boolean updatable = hasSources && mod.getMetadata().sources().values().stream().anyMatch(Optional::isPresent);
if (filterUpdatable && !updatable) return;
@ -107,9 +106,9 @@ public class ModCommand extends Command {
mods.add(p);
}
ModsDirScanner mds = instance.mds();
if (!ignoreDependencies && !mds.isComplete()) {
if (!ignoreDependencies && !mds.isComplete(ScanStage.DISCOVER)) {
Utils.LOGGER.error("Scanning mods dir to search for dependencies. This might take a while");
mds.runOnce((path, mod) -> System.out.println("Scanned " + path));
mds.runOnce(ScanStage.DISCOVER, (path, mod) -> System.out.println("Scanned " + path));
}
for (Path mod : mods) {
try {
@ -157,9 +156,9 @@ public class ModCommand extends Command {
}
Set<Path> mods = pathSupplier.apply(args, instance.path());
ModsDirScanner mds = instance.mds();
if (!mds.isComplete()) {
if (!mds.isComplete(ScanStage.UPDATE)) {
Utils.LOGGER.error("Scanning mods dir to search for dependencies. This might take a while");
mds.runOnce((path, mod) -> System.out.println("Scanned " + path));
mds.runOnce(ScanStage.UPDATE, (path, mod) -> System.out.println("Scanned " + path));
}
for (Path mod : mods) {
try {

View File

@ -13,10 +13,11 @@ import io.gitlab.jfronny.inceptum.launcher.api.CurseforgeApi
import io.gitlab.jfronny.inceptum.launcher.api.ModrinthApi
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthProjectType
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModManager
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage
import io.gitlab.jfronny.inceptum.launcher.system.source.CurseforgeModSource
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource
import io.gitlab.jfronny.inceptum.launcher.system.source.ModrinthModSource
@ -30,8 +31,8 @@ import java.util.concurrent.ForkJoinPool
import kotlin.jvm.optionals.getOrNull
class ModsTab(window: InstanceSettingsWindow) : SettingsTab<Leaflet, InstanceSettingsWindow>(window, Leaflet()) {
private val instance: Instance
private val mds: ModsDirScanner
private val instance: Instance = window.instance
private val mds: ModsDirScanner = instance.mds
private val listModel: StringList
private val loadingRevealer = LoadingRevealer()
private val descriptionLabel: ILabel
@ -42,9 +43,6 @@ class ModsTab(window: InstanceSettingsWindow) : SettingsTab<Leaflet, InstanceSet
}
init {
instance = window.instance
mds = instance.mds
content.apply {
//TODO consider filter panel via Flap
homogeneous = false
@ -87,7 +85,7 @@ class ModsTab(window: InstanceSettingsWindow) : SettingsTab<Leaflet, InstanceSet
addTickCallback { _, _ ->
val toShow = mutableListOf<String>()
if (page == Page.LOCAL) {
loadingRevealer.setRunning(!mds.isComplete)
loadingRevealer.setRunning(!mds.isComplete(ScanStage.DISCOVER))
val mods = window.instance.mds.mods // avoid instance.mods to allow rendering before MDS is finished
loadingRevealer.setProgress((mods.filter { mds.hasScanned(it) }.size.toDouble() / mods.size))
for (mod in mods) {
@ -99,7 +97,7 @@ class ModsTab(window: InstanceSettingsWindow) : SettingsTab<Leaflet, InstanceSet
}
listModel.replaceAll(mods.map { it.name }.toTypedArray())
} else {
loadingRevealer.setRunning(searchResult == null || !mds.isComplete)
loadingRevealer.setRunning(searchResult == null || !mds.isComplete(ScanStage.CROSSREFERENCE))
if (searchResult != null) {
for (mod in searchResult.orEmpty()) {
this@ModsTab.mods[mod.name] = mod

View File

@ -10,6 +10,8 @@ import io.gitlab.jfronny.inceptum.launcher.api.ModrinthApi;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeMod;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.*;
import io.gitlab.jfronny.inceptum.launcher.system.instance.*;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage;
import io.gitlab.jfronny.inceptum.launcher.system.source.CurseforgeModSource;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModrinthModSource;
@ -83,7 +85,7 @@ public class AddModWindow extends Window {
ImGui.text(mod.description());
ImGui.tableNextColumn();
boolean alreadyPresent = false;
for (Mod mdsMod : instance.getMods()) {
for (Mod mdsMod : instance.getMods(ScanStage.CROSSREFERENCE)) {
alreadyPresent = mdsMod.getMetadata().sources().keySet().stream()
.anyMatch(s -> s instanceof ModrinthModSource ms && ms.getModId().equals(projectId));
if (alreadyPresent)

View File

@ -9,6 +9,7 @@ import io.gitlab.jfronny.inceptum.imgui.window.dialog.ProcessStateWatcherWindow;
import io.gitlab.jfronny.inceptum.launcher.LauncherEnv;
import io.gitlab.jfronny.inceptum.launcher.system.exporter.Exporter;
import io.gitlab.jfronny.inceptum.launcher.system.exporter.Exporters;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage;
import io.gitlab.jfronny.inceptum.launcher.util.ProcessState;
import java.nio.file.Path;
@ -29,7 +30,7 @@ public class ExportTab extends Tab {
window.instance.meta().instanceVersion = instanceVersion.get();
window.instance.writeMeta();
}
if (window.instance.mds().isComplete()) {
if (window.instance.mds().isComplete(ScanStage.DOWNLOAD)) {
for (Exporter<?> exporter : Exporters.EXPORTERS) {
if (ImGui.button(exporter.getName())) {
String defaultName = exporter.getDefaultFileName(window.instance);

View File

@ -7,7 +7,7 @@ import io.gitlab.jfronny.inceptum.imgui.GuiMain;
import io.gitlab.jfronny.inceptum.imgui.control.Tab;
import io.gitlab.jfronny.inceptum.imgui.window.AddModWindow;
import io.gitlab.jfronny.inceptum.launcher.LauncherEnv;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
@ -49,7 +49,7 @@ public class ModsTab extends Tab {
Utils.openFile(window.instance.getConfigDir().toFile());
}
try {
Set<Mod> modSet = window.instance.getMods();
Set<Mod> modSet = window.instance.mds().getMods();
boolean updatesFound = false;
float scannedPercentage = 0;
boolean hasUnScanned = false;

View File

@ -62,7 +62,7 @@ public record ModMeta(
@GPrefer
public ModMeta {}
public static ModMeta of(Path mod) {
public static ModMeta fromJar(Path mod) {
String sha1 = null;
Long murmur2 = null;
if (!Files.isDirectory(mod)) {
@ -84,32 +84,32 @@ public record ModMeta(
);
}
public static ModMeta of(String sha1, Long murmur2, @Nullable ModSource knownSource, String gameVersion) {
public static ModMeta fromDownload(ModDownload download, @Nullable ModSource knownSource, String gameVersion) {
ModMeta res = new ModMeta(
new Sources(),
sha1,
murmur2,
download.sha1(),
download.murmur2(),
new ArrayList<>(),
new ArrayList<>(),
true
);
if (knownSource != null) res.addSource(knownSource, gameVersion);
res.initialize(gameVersion);
if (knownSource != null) res.checkAndAddSource(knownSource, gameVersion);
res.updateCheck(gameVersion);
return res;
}
public boolean initialize(String gameVersion) {
public boolean updateCheck(String gameVersion) {
boolean modrinth = false;
boolean curseforge = false;
for (ModSource source : sources.keySet().toArray(ModSource[]::new)) {
if (source instanceof ModrinthModSource) modrinth = true;
if (source instanceof CurseforgeModSource) curseforge = true;
addSource(source, gameVersion);
checkAndAddSource(source, gameVersion);
}
boolean changed = false;
if (!modrinth) {
try {
addSource(new ModrinthModSource(ModrinthApi.getVersionByHash(sha1).id()), gameVersion);
checkAndAddSource(new ModrinthModSource(ModrinthApi.getVersionByHash(sha1).id()), gameVersion);
changed = true;
} catch (IOException e) {
// not found
@ -119,8 +119,8 @@ public record ModMeta(
try {
FingerprintMatchesResponse.Result cf = CurseforgeApi.checkFingerprint(murmur2);
if (!cf.exactMatches().isEmpty()) {
FingerprintMatchesResponse.Result.Match f = cf.exactMatches().get(0);
addSource(new CurseforgeModSource(f.id(), f.file().id()), gameVersion);
FingerprintMatchesResponse.Result.Match f = cf.exactMatches().getFirst();
checkAndAddSource(new CurseforgeModSource(f.id(), f.file().id()), gameVersion);
changed = true;
}
} catch (IOException | URISyntaxException e) {
@ -130,7 +130,7 @@ public record ModMeta(
return changed;
}
public void addSource(ModSource source, String gameVersion) {
private void checkAndAddSource(ModSource source, String gameVersion) {
try {
sources.put(source, source.getUpdate(gameVersion));
} catch (IOException e) {

View File

@ -5,7 +5,7 @@ import io.gitlab.jfronny.inceptum.common.InceptumConfig;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.model.curseforge.GC_CurseforgeModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.source.CurseforgeModSource;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;

View File

@ -3,7 +3,8 @@ package io.gitlab.jfronny.inceptum.launcher.system.exporter;
import io.gitlab.jfronny.commons.StreamIterable;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage;
import io.gitlab.jfronny.inceptum.launcher.util.ProcessState;
import io.gitlab.jfronny.inceptum.launcher.util.gitignore.IgnoringWalk;
@ -36,7 +37,7 @@ public abstract class Exporter<Manifest> {
Manifest manifest = generateManifests(root, instance, instance.meta().instanceVersion);
if (instance.isFabric()) {
state.incrementStep("Adding mods");
addMods(root, instance, instance.getMods().stream().filter(mod -> {
addMods(root, instance, instance.getMods(ScanStage.CROSSREFERENCE).stream().filter(mod -> {
if (!mod.isEnabled()) return false;
state.updateStep(mod.getName());
return true;

View File

@ -4,7 +4,7 @@ import io.gitlab.jfronny.inceptum.common.GsonPreset;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.GC_ModrinthModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.model.modrinth.ModrinthModpackManifest;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModrinthModSource;

View File

@ -4,7 +4,7 @@ import io.gitlab.jfronny.inceptum.common.GsonPreset;
import io.gitlab.jfronny.inceptum.launcher.model.multimc.GC_MMCPackMeta;
import io.gitlab.jfronny.inceptum.launcher.model.multimc.MMCPackMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import java.io.IOException;
import java.nio.file.Files;

View File

@ -46,7 +46,7 @@ public class CurseForgeImporter extends Importer<CurseforgeModpackManifest> {
CurseforgeModSource source = new CurseforgeModSource(file.projectID(), file.fileID());
state.updateStep("Downloading " + source.getName());
ModDownload download = source.download();
ModMeta imod = ModMeta.of(download.sha1(), download.murmur2(), source, manifest.minecraft().version());
ModMeta imod = ModMeta.fromDownload(download, source, manifest.minecraft().version());
Files.createDirectories(modsPath);
GC_ModMeta.serialize(imod, modsPath.resolve(source.getShortName() + ModPath.EXT_IMOD), GsonPreset.CONFIG);
}

View File

@ -5,7 +5,7 @@ import io.gitlab.jfronny.inceptum.common.GsonPreset;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
import io.gitlab.jfronny.inceptum.launcher.system.mds.*;
import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser;
import io.gitlab.jfronny.inceptum.launcher.util.ProcessUtils;
import org.jetbrains.annotations.NotNull;
@ -75,8 +75,8 @@ public record Instance(String id, Path path, InstanceMeta meta, ModsDirScanner m
return path.resolve("config");
}
public Set<Mod> getMods() throws IOException {
mds.runOnce(R::nop);
public Set<Mod> getMods(ScanStage stage) throws IOException {
mds.runOnce(stage, R::nop);
return mds.getMods();
}

View File

@ -3,6 +3,7 @@ package io.gitlab.jfronny.inceptum.launcher.system.instance;
import io.gitlab.jfronny.inceptum.common.GsonPreset;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModDownload;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
@ -20,7 +21,7 @@ public class ModManager {
}
}
ModDownload md = ms.download();
ModMeta manifest = ModMeta.of(md.sha1(), md.murmur2(), ms, mds.getGameVersion());
ModMeta manifest = ModMeta.fromDownload(md, ms, mds.getGameVersion());
for (ModSource depSrc : ms.getDependencies(mds.getGameVersion())) {
DownloadMeta depMeta = download(depSrc, metaFile.getParent().resolve(depSrc.getShortName() + ModPath.EXT_IMOD), mds);
depMeta.meta.dependents().add(metaFile.getFileName().toString());

View File

@ -11,7 +11,8 @@ import io.gitlab.jfronny.inceptum.launcher.api.account.AuthInfo;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ArtifactInfo;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.*;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage;
import io.gitlab.jfronny.inceptum.launcher.system.setup.steps.DownloadLibrariesStep;
import io.gitlab.jfronny.inceptum.launcher.util.ProcessState;
import io.gitlab.jfronny.inceptum.launcher.util.VersionInfoLibraryResolver;
@ -100,7 +101,7 @@ public class InstanceLauncher {
// Fabric imods
if (instance.isFabric()) {
StringBuilder fabricAddMods = new StringBuilder("-Dfabric.addMods=");
for (Mod mod : instance.getMods()) {
for (Mod mod : instance.getMods(ScanStage.DOWNLOAD)) {
if (mod.isEnabled() && mod.getNeedsInject()) {
fabricAddMods.append(mod.getJarPath());
fabricAddMods.append(File.pathSeparatorChar);

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.inceptum.launcher.system.instance;
package io.gitlab.jfronny.inceptum.launcher.system.mds;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
@ -15,6 +15,8 @@ public abstract class Mod implements Comparable<Mod> {
public abstract Path getJarPath();
public abstract Path getMetadataPath();
public abstract ScanStage getScanStage();
public abstract void delete() throws IOException;
public abstract Path update(ModSource update) throws IOException;
public abstract Set<Mod> getDependencies();

View File

@ -1,7 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.mds;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.noop.NoopMds;
import io.gitlab.jfronny.inceptum.launcher.system.mds.threaded.ThreadedMds;
import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser;
@ -23,7 +22,7 @@ public interface ModsDirScanner extends Closeable {
ThreadedMds.closeAll();
}
boolean isComplete();
boolean isComplete(ScanStage stage);
void start();
@ -45,5 +44,5 @@ public interface ModsDirScanner extends Closeable {
return hasScanned(mod.getMetadataPath());
}
void runOnce(BiConsumer<Path, Mod> discovered);
void runOnce(ScanStage targetStage, BiConsumer<Path, Mod> discovered);
}

View File

@ -0,0 +1,24 @@
package io.gitlab.jfronny.inceptum.launcher.system.mds;
public enum ScanStage {
/**
* The scanner has been initialized and is ready to start scanning
*/
INITIALIZE,
/**
* The mod(s) have been discovered and their metadata has been loaded
*/
DISCOVER,
/**
* The mod(s) have been validated (and downloaded if necessary) and are ready to be used
*/
DOWNLOAD,
/**
* The mod(s) have been cross-referenced with the mod sources
*/
CROSSREFERENCE,
/**
* The mod(s) have been checked for updates
*/
UPDATE
}

View File

@ -1,7 +1,6 @@
package io.gitlab.jfronny.inceptum.launcher.system.mds.noop;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
import io.gitlab.jfronny.inceptum.launcher.system.mds.*;
import java.io.IOException;
import java.nio.file.Path;
@ -14,7 +13,7 @@ public record NoopMds(String gameVersion) implements ModsDirScanner {
}
@Override
public boolean isComplete() {
public boolean isComplete(ScanStage stage) {
return true;
}
@ -47,6 +46,6 @@ public record NoopMds(String gameVersion) implements ModsDirScanner {
}
@Override
public void runOnce(BiConsumer<Path, Mod> discovered) {
public void runOnce(ScanStage targetStage, BiConsumer<Path, Mod> discovered) {
}
}

View File

@ -1,7 +1,8 @@
package io.gitlab.jfronny.inceptum.launcher.system.mds.noop;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
import java.io.IOException;
@ -14,7 +15,7 @@ public class NoopMod extends Mod {
public NoopMod(Path path) {
this.path = path;
this.meta = ModMeta.of(path);
this.meta = ModMeta.fromJar(path);
}
@Override
@ -45,6 +46,11 @@ public class NoopMod extends Mod {
return path;
}
@Override
public ScanStage getScanStage() {
return ScanStage.UPDATE;
}
@Override
public void delete() throws IOException {
}

View File

@ -6,7 +6,7 @@ import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.GC_FabricModJson;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath;
import io.gitlab.jfronny.inceptum.launcher.system.mds.noop.NoopMod;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
@ -35,11 +35,11 @@ public record FileScanTask(ProtoInstance instance, Path file, BiConsumer<Path, M
ModMeta meta;
if (Files.exists(imodPath)) meta = GC_ModMeta.deserialize(imodPath, GsonPreset.CONFIG);
else {
meta = ModMeta.of(jarPath);
meta = ModMeta.fromJar(jarPath);
GC_ModMeta.serialize(meta, imodPath, GsonPreset.CONFIG);
}
boolean modified = false;
if (meta.initialize(gameVersion)) {
if (meta.updateCheck(gameVersion)) {
GC_ModMeta.serialize(meta, imodPath, GsonPreset.CONFIG);
modified = true;
}

View File

@ -5,6 +5,8 @@ import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricModJson;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_ModMeta;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.ModMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.*;
import io.gitlab.jfronny.inceptum.launcher.system.mds.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage;
import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource;
import org.jetbrains.annotations.Nullable;
@ -62,6 +64,11 @@ public class MdsMod extends Mod {
return imodPath;
}
@Override
public ScanStage getScanStage() {
return ScanStage.UPDATE;
}
@Override
public void delete() throws IOException {
Files.delete(imodPath);

View File

@ -4,9 +4,8 @@ import io.gitlab.jfronny.commons.io.JFiles;
import io.gitlab.jfronny.commons.ref.R;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod;
import io.gitlab.jfronny.inceptum.launcher.system.mds.*;
import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
import io.gitlab.jfronny.inceptum.launcher.system.mds.noop.NoopMod;
import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser;
@ -47,7 +46,7 @@ public class ThreadedMds implements ModsDirScanner {
}
@Override
public boolean isComplete() {
public boolean isComplete(ScanStage stage) {
if (!Files.isDirectory(instance.modsDir())) return true;
try {
for (Path path : JFiles.list(instance.modsDir())) {
@ -102,12 +101,12 @@ public class ThreadedMds implements ModsDirScanner {
private void scanTaskInternal() {
while (!disposed) {
runOnce(R::nop);
runOnce(ScanStage.UPDATE, R::nop);
}
}
@Override
public void runOnce(BiConsumer<Path, Mod> discovered) {
public void runOnce(ScanStage targetStage, BiConsumer<Path, Mod> discovered) {
try {
if (!Files.isDirectory(instance.modsDir())) {
return;

View File

@ -5,6 +5,7 @@ import io.gitlab.jfronny.inceptum.common.MetaHolder;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.GC_InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ModsDirScanner;
import io.gitlab.jfronny.inceptum.launcher.system.mds.ScanStage;
import io.gitlab.jfronny.inceptum.launcher.system.setup.SetupStepInfo;
import io.gitlab.jfronny.inceptum.launcher.system.setup.Step;
@ -17,7 +18,7 @@ public class RunMdsStep implements Step {
info.setState("Running MDS");
Path instance = MetaHolder.INSTANCE_DIR.resolve(info.name());
ModsDirScanner.get(instance.resolve("mods"), GC_InstanceMeta.deserialize(instance.resolve(Instance.CONFIG_NAME), GsonPreset.CONFIG))
.runOnce((path, iwModDescription) -> info.setState("Scanned " + path));
.runOnce(ScanStage.DOWNLOAD, (path, iwModDescription) -> info.setState("Scanned " + path));
}
@Override

@ -1 +1 @@
Subproject commit 51000ec505afe15dafc6c9476382a302c5093fd2
Subproject commit 2159562d3cf32e48814e0913481f88e204ba27e9