From 00edd7a46dfb8675a71d4358d07f9977cb0d6a77 Mon Sep 17 00:00:00 2001 From: 3arthqu4ke <56741599+3arthqu4ke@users.noreply.github.com> Date: Wed, 13 Nov 2024 22:56:51 +0100 Subject: [PATCH 1/2] Added progress bar for downloads --- .../api/command/line/CommandLine.java | 10 ++++ .../api/command/line/CommandLineReader.java | 7 +++ .../api/command/line/Progressbar.java | 59 +++++++++++++++++++ headlessmc-jline/build.gradle | 3 + .../jline/JLineCommandLineReader.java | 41 +++++++++++++ .../headlessmc/jline/JLineProperties.java | 3 + .../headlessmc/jline/JlineProgressbar.java | 43 ++++++++++++++ .../launcher/command/IntegrityCommand.java | 2 +- .../launcher/command/LaunchCommand.java | 7 +-- .../launcher/download/AssetsDownloader.java | 51 +++++++++++----- .../launcher/download/LibraryDownloader.java | 9 ++- .../launcher/download/ParallelIOService.java | 13 +++- .../launcher/launch/LaunchOptions.java | 1 + .../launcher/launch/ProcessFactory.java | 52 +++++++++++----- 14 files changed, 264 insertions(+), 37 deletions(-) create mode 100644 headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/Progressbar.java create mode 100644 headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JlineProgressbar.java diff --git a/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/CommandLine.java b/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/CommandLine.java index 8dc813d0..9ee52976 100644 --- a/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/CommandLine.java +++ b/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/CommandLine.java @@ -144,6 +144,16 @@ public void setHidingPasswordsSupported(boolean hidingPasswordsSupported) { passwordContext.setHidingPasswordsSupported(hidingPasswordsSupported); } + @Override + public Progressbar displayProgressBar(Progressbar.Configuration configuration) { + CommandLineReader commandLineReader = this.commandLineReader; + if (commandLineReader != null) { + return commandLineReader.displayProgressBar(configuration); + } + + return Progressbar.dummy(); + } + private static final class EmptyCommandContext implements CommandContext { private static final EmptyCommandContext INSTANCE = new EmptyCommandContext(); diff --git a/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/CommandLineReader.java b/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/CommandLineReader.java index 2cf88546..6bc561a6 100644 --- a/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/CommandLineReader.java +++ b/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/CommandLineReader.java @@ -83,4 +83,11 @@ default void close() throws IOException { // see JLineCommandLineReader } + /** + * @return a Progressbar to display progress with. + */ + default Progressbar displayProgressBar(Progressbar.Configuration configuration) { + return Progressbar.dummy(); + } + } diff --git a/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/Progressbar.java b/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/Progressbar.java new file mode 100644 index 00000000..48ec25ce --- /dev/null +++ b/headlessmc-api/src/main/java/me/earth/headlessmc/api/command/line/Progressbar.java @@ -0,0 +1,59 @@ +package me.earth.headlessmc.api.command.line; + +import lombok.Data; + +public interface Progressbar extends AutoCloseable { + void stepBy(long n); + + void stepTo(long n); + + void step(); + + void maxHint(long n); + + boolean isDummy(); + + @Override + void close(); + + static Progressbar dummy() { + return new Progressbar() { + @Override + public void close() { + + } + + @Override + public void stepBy(long n) { + + } + + @Override + public void stepTo(long n) { + + } + + @Override + public void step() { + + } + + @Override + public void maxHint(long n) { + + } + + @Override + public boolean isDummy() { + return true; + } + }; + } + + @Data + class Configuration { + private final String taskName; + private final long initialMax; + } + +} diff --git a/headlessmc-jline/build.gradle b/headlessmc-jline/build.gradle index e37bd5fe..2b1cf54d 100644 --- a/headlessmc-jline/build.gradle +++ b/headlessmc-jline/build.gradle @@ -1,6 +1,9 @@ dependencies { api project(':headlessmc-api') api 'org.jline:jline:3.26.3' + api ('me.tongfei:progressbar:0.9.5') { + exclude module: 'jline' + } implementation 'net.java.dev.jna:jna:5.14.0' // TODO: maybe also package jansi for testing? } diff --git a/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JLineCommandLineReader.java b/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JLineCommandLineReader.java index ee6b257c..ec20e872 100644 --- a/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JLineCommandLineReader.java +++ b/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JLineCommandLineReader.java @@ -6,8 +6,11 @@ import me.earth.headlessmc.api.HeadlessMc; import me.earth.headlessmc.api.command.line.CommandLine; import me.earth.headlessmc.api.command.line.CommandLineReader; +import me.earth.headlessmc.api.command.line.Progressbar; import me.earth.headlessmc.api.config.Property; import me.earth.headlessmc.api.process.InAndOutProvider; +import me.tongfei.progressbar.ProgressBarBuilder; +import me.tongfei.progressbar.ProgressBarStyle; import org.jetbrains.annotations.Nullable; import org.jline.reader.EndOfFileException; import org.jline.reader.LineReader; @@ -48,6 +51,9 @@ public class JLineCommandLineReader implements CommandLineReader { */ protected volatile boolean dumb; + protected volatile boolean enableProgressbar = Boolean.parseBoolean(System.getProperty(JLineProperties.ENABLE_PROGRESS_BAR.getName(), "true")); + protected volatile String progressBarStyle = System.getProperty(JLineProperties.PROGRESS_BAR_STYLE.getName()); + @Override public void read(HeadlessMc hmc) throws IOError { CommandLine commandLine = hmc.getCommandLine(); @@ -99,6 +105,8 @@ public void read(HeadlessMc hmc) throws IOError { @Override public synchronized void open(HeadlessMc hmc) throws IOException { + enableProgressbar = hmc.getConfig().get(JLineProperties.ENABLE_PROGRESS_BAR, true); + progressBarStyle = hmc.getConfig().get(JLineProperties.PROGRESS_BAR_STYLE, null); if (hmc.getConfig().get(JLineProperties.PREVENT_DEPRECATION_WARNING, true)) { System.setProperty("org.jline.terminal.disableDeprecatedProviderWarning", "true"); } @@ -140,6 +148,39 @@ public synchronized void close() throws IOException { } } + @Override + public Progressbar displayProgressBar(Progressbar.Configuration configuration) { + Terminal currentTerminal = terminal; + if (currentTerminal == null || !enableProgressbar) { + return Progressbar.dummy(); + } + + ProgressBarBuilder builder = new ProgressBarBuilder(); + builder.setTaskName(configuration.getTaskName()); + builder.setInitialMax(configuration.getInitialMax()); + String style = progressBarStyle; + if (style != null) { + // ProgressBarStyle is not an enum anymore after 0.10.0 + switch (style) { + case "COLORFUL_UNICODE_BLOCK": + builder.setStyle(ProgressBarStyle.COLORFUL_UNICODE_BLOCK); + break; + case "COLORFUL_UNICODE_BAR": + builder.setStyle(ProgressBarStyle.COLORFUL_UNICODE_BAR); + break; + case "UNICODE_BLOCK": + builder.setStyle(ProgressBarStyle.UNICODE_BLOCK); + break; + case "ASCII": + builder.setStyle(ProgressBarStyle.ASCII); + break; + default: + } + } + + return new JlineProgressbar(builder.build()); + } + protected Terminal buildTerminal(HeadlessMc hmc, boolean dumb, String providers, InAndOutProvider io) throws IOException { return buildTerminalBuilder(hmc, dumb, providers, io).build(); } diff --git a/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JLineProperties.java b/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JLineProperties.java index a5b789a7..aa8abdc4 100644 --- a/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JLineProperties.java +++ b/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JLineProperties.java @@ -28,4 +28,7 @@ public interface JLineProperties { Property EXEC = PropertyTypes.bool("hmc.jline.exec"); Property SYSTEM = PropertyTypes.bool("hmc.jline.system"); + Property ENABLE_PROGRESS_BAR = PropertyTypes.bool("hmc.jline.enable.progressbar"); + Property PROGRESS_BAR_STYLE = PropertyTypes.string("hmc.jline.progressbar.style"); + } diff --git a/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JlineProgressbar.java b/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JlineProgressbar.java new file mode 100644 index 00000000..330bbfc5 --- /dev/null +++ b/headlessmc-jline/src/main/java/me/earth/headlessmc/jline/JlineProgressbar.java @@ -0,0 +1,43 @@ +package me.earth.headlessmc.jline; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.earth.headlessmc.api.command.line.Progressbar; +import me.tongfei.progressbar.ProgressBar; + +@Getter +@RequiredArgsConstructor +public class JlineProgressbar implements Progressbar { + private final ProgressBar progressBar; + + @Override + public void stepBy(long n) { + progressBar.stepBy(n); + } + + @Override + public void stepTo(long n) { + progressBar.stepTo(n); + } + + @Override + public void step() { + progressBar.step(); + } + + @Override + public void maxHint(long n) { + progressBar.maxHint(n); + } + + @Override + public void close() { + progressBar.close(); + } + + @Override + public boolean isDummy() { + return false; + } + +} diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/IntegrityCommand.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/IntegrityCommand.java index ac9c5c86..f59c0021 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/IntegrityCommand.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/IntegrityCommand.java @@ -56,7 +56,7 @@ public void execute(Version version, String... args) throws CommandException { private void checkAssets(Version version, int[] values, String...args) throws IOException { if (CommandUtil.hasFlag("-assets", args)) { ctx.log("Checking assets of version " + version.getName()); - AssetsDownloader assetsDownloader = new AssetsDownloader(ctx.getDownloadService(), ctx, ctx.getMcFiles(), version.getAssetsUrl(), version.getAssets()) { + AssetsDownloader assetsDownloader = new AssetsDownloader(ctx.getCommandLine(), ctx.getDownloadService(), ctx, ctx.getMcFiles(), version.getAssetsUrl(), version.getAssets()) { @Override protected void downloadAsset(String progress, String name, String hash, @Nullable Long size, boolean mapToResources) throws IOException { val firstTwo = hash.substring(0, 2); diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/LaunchCommand.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/LaunchCommand.java index 86c17e27..40b7a33f 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/LaunchCommand.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/LaunchCommand.java @@ -51,12 +51,8 @@ public void execute(Version version, String... args) throws CommandException { boolean quit = flag(ctx, "-quit", LauncherProperties.INVERT_QUIT_FLAG, LauncherProperties.ALWAYS_QUIT_FLAG, args); int status = 0; try { - if (!prepare) { - ctx.getCommandLine().close(); - } - status = runProcess(version, files, quit, prepare, args); - } catch (IOException | LaunchException | AuthException e) { + } catch (LaunchException | AuthException e) { status = -1; log.error(e); ctx.log(String.format("Couldn't launch %s: %s", version.getName(), e.getMessage())); @@ -112,6 +108,7 @@ private int runProcess(Version version, FileManager files, boolean quit, boolean .version(version) .launcher(ctx) .files(files) + .closeCommandLine(!prepare) .parseFlags(ctx, quit, args) .prepare(prepare) .build() diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/AssetsDownloader.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/AssetsDownloader.java index ff7c4520..025f60cf 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/AssetsDownloader.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/AssetsDownloader.java @@ -3,7 +3,10 @@ import com.google.gson.JsonObject; import lombok.CustomLog; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.val; +import me.earth.headlessmc.api.command.line.CommandLine; +import me.earth.headlessmc.api.command.line.Progressbar; import me.earth.headlessmc.api.config.HasConfig; import me.earth.headlessmc.launcher.LauncherProperties; import me.earth.headlessmc.launcher.files.FileManager; @@ -25,12 +28,16 @@ public class AssetsDownloader { private final ChecksumService checksumService = new ChecksumService(); private final DummyAssets dummyAssets = new DummyAssets(); + private final CommandLine commandLine; private final DownloadService downloadService; private final HasConfig config; private final FileManager files; private final String url; private final String id; + @Setter + protected boolean shouldLog = true; + public void download() throws IOException { Path index = files.getDir("assets").toPath().resolve("indexes").resolve(id + ".json"); // Why does this file always corrupt on CheerpJ? @@ -51,18 +58,26 @@ public void download() throws IOException { config.getConfig().get(LauncherProperties.ASSETS_BACKOFF, true) ); - objects.getAsJsonObject().entrySet().forEach(entry -> ioService.addTask(progress -> { - JsonObject jo = entry.getValue().getAsJsonObject(); - downloadAsset( - progress, - entry.getKey(), - jo.get("hash").getAsString(), - jo.get("size") == null ? null : jo.get("size").getAsLong(), - jo.get("map_to_resources") != null && jo.get("map_to_resources").getAsBoolean() - ); - })); - - ioService.execute(); + // TODO: provide better ETA, later assets take longer + try (Progressbar progressbar = commandLine.displayProgressBar(new Progressbar.Configuration("Downloading Assets", objects.size()))) { + ioService.setShouldLog(progressbar.isDummy()); + shouldLog = progressbar.isDummy(); + + objects.getAsJsonObject().entrySet().forEach(entry -> ioService.addTask(progress -> { + JsonObject jo = entry.getValue().getAsJsonObject(); + downloadAsset( + progress, + entry.getKey(), + jo.get("hash").getAsString(), + jo.get("size") == null ? null : jo.get("size").getAsLong(), + jo.get("map_to_resources") != null && jo.get("map_to_resources").getAsBoolean() + ); + + progressbar.step(); + })); + + ioService.execute(); + } } protected void downloadAsset(String progress, String name, String hash, @Nullable Long size, boolean mapToResources) throws IOException { @@ -94,7 +109,10 @@ protected void downloadAsset(String progress, String name, String hash, @Nullabl protected byte @Nullable [] download(String firstTwo, String hash, String progress, String name, Path to, @Nullable Long size) throws IOException { val from = URL + firstTwo + "/" + hash; - log.info(progress + " Downloading: " + name + " from " + from + " to " + to); + if (shouldLog) { + log.info(progress + " Downloading: " + name + " from " + from + " to " + to); + } + boolean checkHash = config.getConfig().get(LauncherProperties.ASSETS_CHECK_HASH, true); boolean checkSize = checkHash || config.getConfig().get(LauncherProperties.ASSETS_CHECK_SIZE, true); Long expectedSize = checkSize ? size : null; @@ -115,7 +133,12 @@ protected void copyToLegacy(String name, Path file, String hash, @Nullable Long if ("pre-1.6".equals(id)) { // TODO: old versions have the map_to_resource thing, copy to resources val legacy = files.getDir("assets").toPath().resolve("virtual").resolve("legacy").resolve(name); - log.info("Legacy version, copying to " + legacy); + if (shouldLog) { + log.info("Legacy version, copying to " + legacy); + } else { + log.debug("Legacy version, copying to " + legacy); + } + integrityCheck("Legacy", legacy, hash, size); if (copy && !Files.exists(legacy)) { Files.copy(file, legacy, StandardCopyOption.REPLACE_EXISTING); diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/LibraryDownloader.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/LibraryDownloader.java index 0611de4c..9c8cbd93 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/LibraryDownloader.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/LibraryDownloader.java @@ -2,6 +2,7 @@ import lombok.CustomLog; import lombok.RequiredArgsConstructor; +import lombok.Setter; import me.earth.headlessmc.api.config.HasConfig; import me.earth.headlessmc.launcher.LauncherProperties; import me.earth.headlessmc.launcher.os.OS; @@ -18,10 +19,16 @@ public class LibraryDownloader { private final HasConfig config; private final OS os; + @Setter + private boolean shouldLog = true; + public void download(Library library, Path to) throws IOException { String libPath = library.getPath(os); String url = library.getUrl(libPath); - log.info(libPath + " is missing, downloading from " + url); + if (shouldLog) { + log.info(libPath + " is missing, downloading from " + url); + } + download(url, to, library.getSha1(), library.getSize()); } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/ParallelIOService.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/ParallelIOService.java index a43ed359..1b93b72a 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/ParallelIOService.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/download/ParallelIOService.java @@ -2,6 +2,7 @@ import lombok.CustomLog; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.SneakyThrows; import me.earth.headlessmc.launcher.util.IOConsumer; @@ -21,6 +22,9 @@ public class ParallelIOService { private final boolean parallel; private final boolean backoff; + @Setter + private boolean shouldLog = true; + public void addTask(IOConsumer task) { tasks.add(task); } @@ -38,7 +42,9 @@ public void execute() throws IOException { }); nanos = System.nanoTime() - nanos; - log.info("Download took " + (nanos / 1_000_000.0) + "ms, parallel: " + parallel); + if (shouldLog) { + log.info("Download took " + (nanos / 1_000_000.0) + "ms, parallel: " + parallel); + } if (failed.get() != null) { throw failed.get(); } @@ -49,7 +55,10 @@ public String updateProgress(AtomicInteger count, int total, IOConsumer int downloaded = count.incrementAndGet(); String percentage = String.format("%d", (downloaded * 100 / total)) + "%"; String progress = percentage + " (" + downloaded + "/" + total + ")"; - log.debug(progress + " Checking " + task); + if (shouldLog) { + log.debug(progress + " Checking " + task); + } + return progress; } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java index 83959364..fa2c0990 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java @@ -38,6 +38,7 @@ public class LaunchOptions { private final boolean forceBoot; private final boolean xvfb; private final boolean prepare; + private final boolean closeCommandLine; @SuppressWarnings("unused") public static class LaunchOptionsBuilder { diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java index b3bef283..fde21484 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/ProcessFactory.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.val; +import me.earth.headlessmc.api.command.line.Progressbar; import me.earth.headlessmc.launcher.LauncherProperties; import me.earth.headlessmc.launcher.auth.AuthException; import me.earth.headlessmc.launcher.download.AssetsDownloader; @@ -16,7 +17,6 @@ import me.earth.headlessmc.launcher.instrumentation.Target; import me.earth.headlessmc.launcher.os.OS; import me.earth.headlessmc.launcher.version.Features; -import me.earth.headlessmc.launcher.version.Logging; import me.earth.headlessmc.launcher.version.Rule; import me.earth.headlessmc.launcher.version.Version; import org.jetbrains.annotations.Nullable; @@ -56,7 +56,7 @@ public class ProcessFactory { log.debug("Creating extraction directory"); val natives = options.getFiles().createRelative("extracted"); - val targets = processLibraries(version, natives); + val targets = processLibraries(options, version, natives); addGameJar(version, targets); List classpath = instrumentation.instrument(targets); @@ -68,7 +68,7 @@ public class ProcessFactory { val commandBuilder = configureCommandBuilder(options, version, classpath, natives).build(); val command = commandBuilder.build(); - downloadAssets(config.getMcFiles(), version); + downloadAssets(options, config.getMcFiles(), version); debugCommand(command, commandBuilder); val dir = new File(launcher.getConfig().get(LauncherProperties.GAME_DIR, launcher.getGameDir(version).getPath())); @@ -79,6 +79,10 @@ public class ProcessFactory { return null; } + if (options.isCloseCommandLine()) { + launcher.getCommandLine().close(); + } + if (options.isInMemory()) { inMemoryLaunch(new InMemoryLauncher(options, commandBuilder, version, launcher.getJavaService().getCurrent())); return null; @@ -152,16 +156,16 @@ protected void addGameJar(Version version, List targets) throws IOExcept log.debug("Processed GameJar"); } - protected List processLibraries(Version version, FileManager dlls) throws IOException { + protected List processLibraries(LaunchOptions options, Version version, FileManager dlls) throws IOException { log.debug("Processing libraries..."); // TODO: proper features val features = Features.EMPTY; val targets = new ArrayList(version.getLibraries().size()); Set libPaths = new HashSet<>(); LibraryDownloader libraryDownloader = new LibraryDownloader(downloadService, config.getConfig(), os); + int librariesTODownload = 0; for (val library : version.getLibraries()) { if (library.getRule().apply(os, features) == Rule.Action.ALLOW) { - log.debug("Checking: " + library); String libPath = library.getPath(os); if (!libPaths.add(libPath)) { continue; @@ -177,16 +181,36 @@ protected List processLibraries(Version version, FileManager dlls) throw } if (!Files.exists(path)) { - libraryDownloader.download(library, path); + librariesTODownload++; } + } + } - String absolutePath = path.toAbsolutePath().toString(); - library.getExtractor().extract(absolutePath, dlls); - if (!library.isNativeLibrary()) { - targets.add(new Target(false, absolutePath)); + libPaths.clear(); + try (Progressbar progressbar = options.getLauncher().getCommandLine().displayProgressBar(new Progressbar.Configuration("Downloading Libraries", librariesTODownload))) { + libraryDownloader.setShouldLog(progressbar.isDummy()); + for (val library : version.getLibraries()) { + if (library.getRule().apply(os, features) == Rule.Action.ALLOW) { + log.debug("Checking: " + library); + String libPath = library.getPath(os); + if (!libPaths.add(libPath)) { + continue; + } + + val path = config.getMcFiles().getDir("libraries").toPath().resolve(libPath); + if (!Files.exists(path)) { + libraryDownloader.download(library, path); + progressbar.step(); + } + + String absolutePath = path.toAbsolutePath().toString(); + library.getExtractor().extract(absolutePath, dlls); + if (!library.isNativeLibrary()) { + targets.add(new Target(false, absolutePath)); + } + } else { + log.debug("Ignoring: " + library.getName()); } - } else { - log.debug("Ignoring: " + library.getName()); } } @@ -214,9 +238,9 @@ protected Process run(ProcessBuilder builder) throws IOException { return builder.start(); } - protected void downloadAssets(FileManager files, Version version) throws IOException { + protected void downloadAssets(LaunchOptions options, FileManager files, Version version) throws IOException { log.debug("Downloading Assets"); - new AssetsDownloader(downloadService, config.getConfig(), files, version.getAssetsUrl(), version.getAssets()).download(); + new AssetsDownloader(options.getLauncher().getCommandLine(), downloadService, config.getConfig(), files, version.getAssetsUrl(), version.getAssets()).download(); } /** From 04e4394cfdcc8d4a0e7496d400ce654af2c0bfa4 Mon Sep 17 00:00:00 2001 From: 3arthqu4ke <56741599+3arthqu4ke@users.noreply.github.com> Date: Wed, 13 Nov 2024 23:03:53 +0100 Subject: [PATCH 2/2] Fixed tests --- .../me/earth/headlessmc/launcher/launch/MockProcessFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/MockProcessFactory.java b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/MockProcessFactory.java index 3ddfb5e9..9d85b242 100644 --- a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/MockProcessFactory.java +++ b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/MockProcessFactory.java @@ -41,7 +41,7 @@ protected boolean checkZipIntact(File file) { } @Override - protected void downloadAssets(FileManager files, Version version) { + protected void downloadAssets(LaunchOptions options, FileManager files, Version version) { // dummy }