feat: implement concept of scan stages to support deferring update checks until after critical information
This commit is contained in:
parent
4e43d43777
commit
1daaf73554
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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) {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue
Block a user