diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LaunchingUIDaemon.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LaunchingUIDaemon.java index 161599c6e..6f73d5d35 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/LaunchingUIDaemon.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/LaunchingUIDaemon.java @@ -153,6 +153,8 @@ public class LaunchingUIDaemon { case DecompressingNatives: message = "launch.state.decompressing_natives"; break; + case Done: + return; } MainFrame.INSTANCE.showMessage(C.i18n(message)); }; diff --git a/HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DecompressLibrariesEvent.java b/HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DecompressLibrariesEvent.java deleted file mode 100644 index bd5dccadc..000000000 --- a/HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DecompressLibrariesEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2013 huangyuhui - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hmcl.api.event.launch; - -import org.jackhuang.hmcl.api.game.DecompressLibraryJob; -import org.jackhuang.hmcl.api.event.ResultedSimpleEvent; - -/** - * This event gets fired when we are launching a game and going to decompress natives. - *
- * This event is {@link org.jackhuang.hmcl.api.event.ResultedEvent} - * If this event is failed, the launching process will be terminated. - *
- * This event is fired on the {@link org.jackhuang.hmcl.api.HMCLApi#EVENT_BUS} - * @param source {@link org.jackhuang.hmcl.core.launch.GameLauncher} - * @param DecompressLibraryJob libraries to be decompressed - * @author huangyuhui - */ -public class DecompressLibrariesEvent extends ResultedSimpleEvent { - - public DecompressLibrariesEvent(Object source, DecompressLibraryJob value) { - super(source, value); - } - -} diff --git a/HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DownloadLibrariesEvent.java b/HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DownloadLibrariesEvent.java deleted file mode 100644 index da50de567..000000000 --- a/HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DownloadLibrariesEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Hello Minecraft! Launcher. - * Copyright (C) 2013 huangyuhui - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see {http://www.gnu.org/licenses/}. - */ -package org.jackhuang.hmcl.api.event.launch; - -import java.util.List; -import org.jackhuang.hmcl.api.event.ResultedSimpleEvent; - -/** - * This event gets fired when we are launching a game and there are some libraries to be downloaded. - *
- * This event is {@link org.jackhuang.hmcl.api.event.ResultedEvent} - * If this event is failed, the launching process will be terminated. - *
- * This event is fired on the {@link org.jackhuang.hmcl.api.HMCLApi#EVENT_BUS} - * @param source {@link org.jackhuang.hmcl.core.launch.GameLauncher} - * Passed value List<DownloadLibraryJob>: libraries to be downloaded. - * @author huangyuhui - */ -public class DownloadLibrariesEvent extends ResultedSimpleEvent> { - - public DownloadLibrariesEvent(Object sender, List lists) { - super(sender, lists); - } -} diff --git a/HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DownloadLibraryJob.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/DownloadLibraryJob.java similarity index 68% rename from HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DownloadLibraryJob.java rename to HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/DownloadLibraryJob.java index 0b89e8e88..91c3bc00a 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hmcl/api/event/launch/DownloadLibraryJob.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/DownloadLibraryJob.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see {http://www.gnu.org/licenses/}. */ -package org.jackhuang.hmcl.api.event.launch; +package org.jackhuang.hmcl.core.download; import java.io.File; import org.jackhuang.hmcl.api.game.IMinecraftLibrary; @@ -36,17 +36,17 @@ public class DownloadLibraryJob { path = p; } - public DownloadLibraryJob parse() { + public DownloadLibraryJob parse(DownloadType type) { String name = lib.getName(); - if (name.startsWith("net.minecraftforge:forge:")) { + if (name.startsWith("net.minecraftforge:forge:") && url == null) { String[] s = name.split(":"); if (s.length == 3) - url = "http://files.minecraftforge.net/maven/net/minecraftforge/forge/" + s[2] + "/forge-" + s[2] + "-universal.jar"; + url = type.getProvider().getParsedDownloadURL("http://files.minecraftforge.net/maven/net/minecraftforge/forge/" + s[2] + "/forge-" + s[2] + "-universal.jar"); } - if (name.startsWith("com.mumfrey:liteloader:")) { + if (name.startsWith("com.mumfrey:liteloader:") && url == null) { String[] s = name.split(":"); if (s.length == 3 && s[2].length() > 3) - url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + s[2].substring(0, s[2].length() - 3) + "/liteloader-" + s[2] + ".jar"; + url = type.getProvider().getParsedDownloadURL("http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + s[2].substring(0, s[2].length() - 3) + "/liteloader-" + s[2] + ".jar"); } return this; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/MinecraftDownloadService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/MinecraftDownloadService.java index b20a48a54..1f29886da 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/MinecraftDownloadService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/download/MinecraftDownloadService.java @@ -17,7 +17,6 @@ */ package org.jackhuang.hmcl.core.download; -import org.jackhuang.hmcl.api.event.launch.DownloadLibraryJob; import org.jackhuang.hmcl.core.service.IMinecraftDownloadService; import com.google.gson.JsonSyntaxException; import java.io.File; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/DefaultGameLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/DefaultGameLauncher.java index 04fe63fff..bdc37c58c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/DefaultGameLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/DefaultGameLauncher.java @@ -21,11 +21,7 @@ import org.jackhuang.hmcl.api.game.LaunchOptions; import java.io.IOException; import java.util.HashSet; import java.util.List; -import org.jackhuang.hmcl.api.HMCLApi; -import org.jackhuang.hmcl.api.event.ResultedSimpleEvent; -import org.jackhuang.hmcl.api.event.launch.DecompressLibrariesEvent; -import org.jackhuang.hmcl.api.event.launch.DownloadLibrariesEvent; -import org.jackhuang.hmcl.api.event.launch.DownloadLibraryJob; +import org.jackhuang.hmcl.core.download.DownloadLibraryJob; import org.jackhuang.hmcl.api.auth.LoginInfo; import org.jackhuang.hmcl.core.service.IMinecraftService; import org.jackhuang.hmcl.util.C; @@ -35,47 +31,45 @@ import org.jackhuang.hmcl.util.sys.CompressingUtils; import org.jackhuang.hmcl.util.task.ParallelTask; import org.jackhuang.hmcl.util.task.TaskWindow; import org.jackhuang.hmcl.api.auth.IAuthenticator; - +import org.jackhuang.hmcl.api.game.DecompressLibraryJob; public class DefaultGameLauncher extends GameLauncher { public DefaultGameLauncher(LaunchOptions options, IMinecraftService service, LoginInfo info, IAuthenticator lg) { super(options, service, info, lg); - register(); } - private void register() { - HMCLApi.EVENT_BUS.channel(DownloadLibrariesEvent.class).register(t -> { - ResultedSimpleEvent> event = (ResultedSimpleEvent) t; - final TaskWindow.TaskWindowFactory dw = TaskWindow.factory(); - ParallelTask parallelTask = new ParallelTask(); - HashSet names = new HashSet<>(); - for (DownloadLibraryJob s : t.getValue()) { - if (names.contains(s.lib.getName())) - continue; - names.add(s.lib.getName()); - parallelTask.addTask(new LibraryDownloadTask(s)); + @Override + public boolean downloadLibraries(List jobs) { + final TaskWindow.TaskWindowFactory dw = TaskWindow.factory(); + ParallelTask parallelTask = new ParallelTask(); + HashSet names = new HashSet<>(); + for (DownloadLibraryJob s : jobs) { + if (names.contains(s.lib.getName())) + continue; + names.add(s.lib.getName()); + parallelTask.addTask(new LibraryDownloadTask(s, service.getDownloadType())); + } + dw.append(parallelTask); + boolean flag = true; + if (jobs.size() > 0) + flag = dw.execute(); + if (!flag && MessageBox.show(C.i18n("launch.not_finished_downloading_libraries"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) + flag = true; + return flag; + } + + @Override + public boolean decompressLibraries(DecompressLibraryJob job) { + if (job == null) + return false; + for (int i = 0; i < job.decompressFiles.length; i++) + try { + CompressingUtils.unzip(job.decompressFiles[i], job.getDecompressTo(), job.extractRules[i]::allow, false); + } catch (IOException ex) { + HMCLog.err("Unable to decompress library: " + job.decompressFiles[i] + " to " + job.getDecompressTo(), ex); } - dw.append(parallelTask); - boolean flag = true; - if (t.getValue().size() > 0) - flag = dw.execute(); - if (!flag && MessageBox.show(C.i18n("launch.not_finished_downloading_libraries"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) - flag = true; - t.setResult(flag); - }); - HMCLApi.EVENT_BUS.channel(DecompressLibrariesEvent.class).register(t -> { - if (t.getValue() == null) { - t.setResult(false); - return; - } - for (int i = 0; i < t.getValue().decompressFiles.length; i++) - try { - CompressingUtils.unzip(t.getValue().decompressFiles[i], t.getValue().getDecompressTo(), t.getValue().extractRules[i]::allow, false); - } catch (IOException ex) { - HMCLog.err("Unable to decompress library: " + t.getValue().decompressFiles[i] + " to " + t.getValue().getDecompressTo(), ex); - } - }); + return true; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/GameLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/GameLauncher.java index af5183fb5..f2a1a1734 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/GameLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/GameLauncher.java @@ -25,9 +25,7 @@ import java.io.IOException; import java.io.OutputStreamWriter; import java.util.List; import org.jackhuang.hmcl.api.HMCLApi; -import org.jackhuang.hmcl.api.event.launch.DecompressLibrariesEvent; import org.jackhuang.hmcl.api.game.DecompressLibraryJob; -import org.jackhuang.hmcl.api.event.launch.DownloadLibrariesEvent; import org.jackhuang.hmcl.api.event.launch.LaunchEvent; import org.jackhuang.hmcl.api.event.launch.LaunchSucceededEvent; import org.jackhuang.hmcl.api.event.launch.LaunchingState; @@ -49,8 +47,9 @@ import org.jackhuang.hmcl.util.sys.FileUtils; import org.jackhuang.hmcl.util.sys.JavaProcess; import org.jackhuang.hmcl.util.sys.OS; import org.jackhuang.hmcl.api.auth.IAuthenticator; +import org.jackhuang.hmcl.core.download.DownloadLibraryJob; -public class GameLauncher { +public abstract class GameLauncher { LaunchOptions options; IMinecraftService service; @@ -128,18 +127,22 @@ public class GameLauncher { if (!options.isNotCheckGame()) { HMCLog.log("Detecting libraries..."); HMCLApi.EVENT_BUS.fireChannel(new LaunchingStateChangedEvent(this, LaunchingState.DownloadingLibraries)); - if (!HMCLApi.EVENT_BUS.fireChannelResulted(new DownloadLibrariesEvent(this, service.download().getDownloadLibraries(loader.getMinecraftVersion())))) + if (!downloadLibraries(service.download().getDownloadLibraries(loader.getMinecraftVersion()))) throw new GameException("Failed to download libraries"); } HMCLog.log("Unpacking natives..."); HMCLApi.EVENT_BUS.fireChannel(new LaunchingStateChangedEvent(this, LaunchingState.DecompressingNatives)); DecompressLibraryJob job = service.version().getDecompressLibraries(loader.getMinecraftVersion()); - if (!HMCLApi.EVENT_BUS.fireChannelResulted(new DecompressLibrariesEvent(this, job))) + if (!decompressLibraries(job)) throw new GameException("Failed to decompress natives"); HMCLApi.EVENT_BUS.fireChannel(new LaunchSucceededEvent(this, loader.makeLaunchingCommand())); } + + public abstract boolean downloadLibraries(List jobs); + + public abstract boolean decompressLibraries(DecompressLibraryJob job); /** * Launch the game "as soon as possible". diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/LibraryDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/LibraryDownloadTask.java index b025288f2..690bb0301 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/LibraryDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/launch/LibraryDownloadTask.java @@ -18,7 +18,8 @@ package org.jackhuang.hmcl.core.launch; import org.jackhuang.hmcl.util.C; -import org.jackhuang.hmcl.api.event.launch.DownloadLibraryJob; +import org.jackhuang.hmcl.core.download.DownloadLibraryJob; +import org.jackhuang.hmcl.core.download.DownloadType; import org.jackhuang.hmcl.util.net.FileDownloadTask; /** @@ -29,8 +30,8 @@ public class LibraryDownloadTask extends FileDownloadTask { DownloadLibraryJob job; - public LibraryDownloadTask(DownloadLibraryJob job) { - super(job.parse().url, job.path); + public LibraryDownloadTask(DownloadLibraryJob job, DownloadType downloadType) { + super(job.parse(downloadType).url, job.path); this.job = job; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/service/IMinecraftDownloadService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/service/IMinecraftDownloadService.java index 3d0126bba..bffb99d22 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/core/service/IMinecraftDownloadService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/core/service/IMinecraftDownloadService.java @@ -20,7 +20,7 @@ package org.jackhuang.hmcl.core.service; import java.io.File; import java.util.List; import org.jackhuang.hmcl.core.GameException; -import org.jackhuang.hmcl.api.event.launch.DownloadLibraryJob; +import org.jackhuang.hmcl.core.download.DownloadLibraryJob; import org.jackhuang.hmcl.core.version.MinecraftVersion; import org.jackhuang.hmcl.util.task.Task;