From f0212ea4ebb95fcdc6d0dff8ddc5cfe9b3763a8b Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Thu, 3 Dec 2015 20:11:52 +0800 Subject: [PATCH] Reconstruct codes. --- .../hellominecraft/launcher/Main.java | 2 +- .../launcher/launch/IMinecraftModService.java | 36 ++++ .../launcher/launch/IMinecraftProvider.java | 37 +++- .../launcher/launch/LaunchFinisher.java | 4 +- .../launcher/launch/LaunchScriptFinisher.java | 2 +- .../launcher/launch/LibraryDownloadTask.java | 43 ++-- .../launcher/settings/Profile.java | 28 ++- .../launcher/utils/ModInfo.java | 21 +- .../launcher/utils/assets/IAssetsHandler.java | 9 +- .../utils/installers/InstallerService.java | 88 +++++++++ .../installers/forge/ForgeInstaller.java | 74 +++---- .../liteloader/LiteLoaderInstaller.java | 47 ++--- .../optifine/OptiFineInstaller.java | 46 ++--- .../vanilla/OptiFineDownloadFormatter.java | 20 +- .../launcher/utils/upgrade/Upgrader.java | 30 ++- .../launcher/version/MinecraftModService.java | 109 +++++++++++ .../launcher/version/MinecraftService.java | 55 ++++++ .../version/MinecraftVersionManager.java | 61 +++--- .../launcher/views/GameSettingsPanel.java | 183 ++++-------------- .../launcher/views/LauncherSettingsPanel.java | 7 +- .../launcher/views/MainFrame.java | 6 +- .../launcher/views/MainPagePanel.java | 26 +-- .../hellominecraft/tasks/DoubleTask.java | 31 +++ .../hellominecraft/tasks/ParallelTask.java | 3 +- .../jackhuang/hellominecraft/tasks/Task.java | 21 +- .../hellominecraft/tasks/TaskList.java | 7 +- .../hellominecraft/tasks/TaskRunnable.java | 14 +- .../tasks/TaskRunnableArg1.java | 10 +- .../tasks/download/ContentGetAndShowTask.java | 4 +- .../tasks/download/FileDownloadTask.java | 14 +- .../tasks/download/HTTPGetTask.java | 11 +- .../utils/functions/BiConsumer.java | 2 +- .../svrmgr/views/MainWindow.java | 3 +- 33 files changed, 636 insertions(+), 418 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftModService.java create mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/InstallerService.java create mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftModService.java create mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftService.java create mode 100644 HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/DoubleTask.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java index bc5e52cc9..4b71137b8 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -256,7 +256,7 @@ public final class Main implements Runnable { } public static void invokeUpdate() { - MainFrame.instance.invokeUpdate(); + MainFrame.INSTANCE.invokeUpdate(); } public static ImageIcon getIcon(String path) { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftModService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftModService.java new file mode 100644 index 000000000..2098f95d4 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftModService.java @@ -0,0 +1,36 @@ +/* + * Copyright 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 2 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. + */ +package org.jackhuang.hellominecraft.launcher.launch; + +import java.io.File; +import java.util.List; +import org.jackhuang.hellominecraft.launcher.utils.ModInfo; + +/** + * + * @author huangyuhui + */ +public interface IMinecraftModService { + + List getMods(); + + List recacheMods(); + + boolean addMod(File f); + + void removeMod(int[] index); +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftProvider.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftProvider.java index 5d424613e..ab3676c2b 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/IMinecraftProvider.java @@ -22,8 +22,8 @@ import java.util.List; import org.jackhuang.hellominecraft.launcher.utils.auth.UserProfileProvider; import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.settings.Profile; -import org.jackhuang.hellominecraft.launcher.utils.ModInfo; import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; +import org.jackhuang.hellominecraft.utils.StrUtils; /** * Provide everything of the Minecraft of a Profile. @@ -47,6 +47,10 @@ public abstract class IMinecraftProvider { * @return the run directory */ public abstract File getRunDirectory(String id); + + public File getRunDirectory(String id, String subFolder) { + return new File(getRunDirectory(getSelectedMinecraftVersion().id), subFolder); + } /** * Get the libraries that need to download. @@ -57,13 +61,11 @@ public abstract class IMinecraftProvider { */ public abstract List getDownloadLibraries(DownloadType type); - public abstract void openSelf(String version); - public abstract void open(String version, String folder); public abstract File getAssets(); - - public abstract List listMods(); + + public abstract IMinecraftModService getModService(); /** * Returns the thing like ".minecraft/resourcepacks". @@ -158,6 +160,26 @@ public abstract class IMinecraftProvider { * @return the Minecraft json instance */ public abstract MinecraftVersion getVersionById(String id); + + public MinecraftVersion getSelectedVersion() { + return profile.getSelectedMinecraftVersion(); + } + + public MinecraftVersion getSelectedMinecraftVersion() { + if (StrUtils.isBlank(profile.getSelectedMinecraftVersionName())) { + MinecraftVersion v = getOneVersion(); + if (v == null) + return null; + profile.setSelectedMinecraftVersion(v.id); + return v; + } + MinecraftVersion v = getVersionById(profile.getSelectedMinecraftVersionName()); + if (v == null) + v = getOneVersion(); + if (v != null) + profile.setSelectedMinecraftVersion(v.id); + return v; + } /** * getVersions().size() @@ -170,6 +192,11 @@ public abstract class IMinecraftProvider { * Refind the versions in this profile. */ public abstract void refreshVersions(); + + /** + * Clean redundancy files. + */ + public abstract void cleanFolder(); /** * Install a new version to this profile. diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchFinisher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchFinisher.java index d9491287c..ea0f2c4e3 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchFinisher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchFinisher.java @@ -37,11 +37,11 @@ public class LaunchFinisher implements Event> { if (obj.getProfile().getLauncherVisibility() == LauncherVisibility.CLOSE && !LogWindow.instance.isVisible()) System.exit(0); else if (obj.getProfile().getLauncherVisibility() == LauncherVisibility.KEEP) - MainFrame.instance.closeMessage(); + MainFrame.INSTANCE.closeMessage(); else { if (LogWindow.instance.isVisible()) LogWindow.instance.setExit(TrueFunction.instance); - MainFrame.instance.dispose(); + MainFrame.INSTANCE.dispose(); } JavaProcessMonitor jpm = new JavaProcessMonitor(p); jpm.stoppedEvent.register((sender3, t) -> { diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchScriptFinisher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchScriptFinisher.java index 0cde45448..08d49d705 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchScriptFinisher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LaunchScriptFinisher.java @@ -43,7 +43,7 @@ public class LaunchScriptFinisher implements Event> { MessageBox.Show(C.i18n("mainwindow.make_launch_script_failed")); HMCLog.err("Failed to create script file.", ex); } - MainFrame.instance.closeMessage(); + MainFrame.INSTANCE.closeMessage(); return flag; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LibraryDownloadTask.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LibraryDownloadTask.java index b31a65d9e..ec546233b 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LibraryDownloadTask.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/launch/LibraryDownloadTask.java @@ -46,36 +46,31 @@ public class LibraryDownloadTask extends FileDownloadTask { } @Override - public boolean executeTask() { - try { - File packFile = new File(job.path.getParentFile(), job.path.getName() + ".pack.xz"); - if (job.name.contains("typesafe") && download(new URL(job.url + ".pack.xz"), packFile)) { - unpackLibrary(job.path, packFile); - packFile.delete(); - return true; - } else { - if (job.name.startsWith("net.minecraftforge:forge:")) { - String[] s = job.name.split(":"); - if (s.length == 3) - job.url = "http://files.minecraftforge.net/maven/net/minecraftforge/forge/" + s[2] + "/forge-" + s[2] + "-universal.jar"; - } - if (job.name.startsWith("com.mumfrey:liteloader:")) { - String[] s = job.name.split(":"); - if (s.length == 3 && s[2].length() > 3) - job.url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + s[2].substring(0, s[2].length() - 3) + "/liteloader-" + s[2] + ".jar"; - } - return download(new URL(job.url), job.path); + public void executeTask() throws Throwable { + File packFile = new File(job.path.getParentFile(), job.path.getName() + ".pack.xz"); + if (job.name.contains("typesafe")) { + download(new URL(job.url + ".pack.xz"), packFile); + unpackLibrary(job.path, packFile); + packFile.delete(); + } else { + if (job.name.startsWith("net.minecraftforge:forge:")) { + String[] s = job.name.split(":"); + if (s.length == 3) + job.url = "http://files.minecraftforge.net/maven/net/minecraftforge/forge/" + s[2] + "/forge-" + s[2] + "-universal.jar"; } - } catch (Exception ex) { - setFailReason(ex); - return false; + if (job.name.startsWith("com.mumfrey:liteloader:")) { + String[] s = job.name.split(":"); + if (s.length == 3 && s[2].length() > 3) + job.url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + s[2].substring(0, s[2].length() - 3) + "/liteloader-" + s[2] + ".jar"; + } + download(new URL(job.url), job.path); } } - boolean download(URL url, File filePath) { + void download(URL url, File filePath) throws Throwable { this.url = url; this.filePath = filePath; - return super.executeTask(); + super.executeTask(); } @SuppressWarnings("UnusedAssignment") diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java index 0b791369e..37522b7df 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/settings/Profile.java @@ -20,7 +20,9 @@ import java.io.File; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.launcher.utils.MCUtils; +import org.jackhuang.hellominecraft.launcher.utils.installers.InstallerService; import org.jackhuang.hellominecraft.launcher.version.GameDirType; +import org.jackhuang.hellominecraft.launcher.version.MinecraftService; import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; @@ -94,13 +96,17 @@ public final class Profile { minecraftProvider = new MinecraftVersionManager(this); return minecraftProvider; } + + public String getSelectedMinecraftVersionName() { + return selectedMinecraftVersion; + } public MinecraftVersion getSelectedMinecraftVersion() { if (StrUtils.isBlank(selectedMinecraftVersion)) { MinecraftVersion v = getMinecraftProvider().getOneVersion(); if (v == null) return null; - selectedMinecraftVersion = v.id; + setSelectedMinecraftVersion(v.id); return v; } MinecraftVersion v = getMinecraftProvider().getVersionById(selectedMinecraftVersion); @@ -111,6 +117,10 @@ public final class Profile { return v; } + public void setSelectedMinecraftVersion(String selectedMinecraftVersion) { + this.selectedMinecraftVersion = selectedMinecraftVersion; + } + public String getGameDir() { if (StrUtils.isBlank(gameDir)) gameDir = MCUtils.getInitGameDir().getPath(); @@ -187,7 +197,7 @@ public final class Profile { public File getFolder(String folder) { if (getSelectedMinecraftVersion() == null) return new File(getCanonicalGameDirFile(), folder); - return new File(getMinecraftProvider().getRunDirectory(getSelectedMinecraftVersion().id), folder); + return getMinecraftProvider().getRunDirectory(getSelectedMinecraftVersion().id, folder); } public String getName() { @@ -198,10 +208,6 @@ public final class Profile { this.name = name; } - public void setSelectedMinecraftVersion(String selectedMinecraftVersion) { - this.selectedMinecraftVersion = selectedMinecraftVersion; - } - public String getJavaArgs() { if (StrUtils.isBlank(javaArgs)) return ""; @@ -351,4 +357,14 @@ public final class Profile { public void checkFormat() { gameDir = gameDir.replace('/', OS.os().fileSeparator).replace('\\', OS.os().fileSeparator); } + + final InstallerService is = new InstallerService(this); + public InstallerService getInstallerService() { + return is; + } + + final MinecraftService ms = new MinecraftService(this); + public MinecraftService getMinecraftService() { + return ms; + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/ModInfo.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/ModInfo.java index 89939af19..bf7ba68c5 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/ModInfo.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/ModInfo.java @@ -27,6 +27,7 @@ import java.util.zip.ZipFile; import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.utils.StrUtils; +import org.jackhuang.hellominecraft.utils.Utils; import org.jackhuang.hellominecraft.utils.system.FileUtils; /** @@ -43,6 +44,21 @@ public class ModInfo implements Comparable { return !location.getName().endsWith(".disabled"); } + public void reverseModState() { + File f = location, newf; + if (f.getName().endsWith(".disabled")) + newf = new File(f.getParentFile(), f.getName().substring(0, f.getName().length() - ".disabled".length())); + else + newf = new File(f.getParentFile(), f.getName() + ".disabled"); + if (f.renameTo(newf)) + location = newf; + } + + public void showURL() { + if (url != null) + Utils.openLink(url); + } + @Override public int compareTo(ModInfo o) { return getFileName().toLowerCase().compareTo(o.getFileName().toLowerCase()); @@ -51,13 +67,14 @@ public class ModInfo implements Comparable { public String getName() { return name == null ? FileUtils.removeExtension(location.getName()) : name; } - + public String getAuthor() { if (authorList != null && authorList.length > 0) return StrUtils.parseParams("", authorList, ", "); else if (StrUtils.isNotBlank(author)) return author; - else return "Unknown"; + else + return "Unknown"; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/IAssetsHandler.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/IAssetsHandler.java index 9a4c62c9f..024b09c7c 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/IAssetsHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/assets/IAssetsHandler.java @@ -95,11 +95,9 @@ public abstract class IAssetsHandler { } @Override - public boolean executeTask() { - if (assetsDownloadURLs == null) { - setFailReason(new RuntimeException(C.i18n("assets.not_refreshed"))); - return false; - } + public void executeTask() { + if (assetsDownloadURLs == null) + throw new IllegalStateException(C.i18n("assets.not_refreshed")); int max = assetsDownloadURLs.size(); al = new ArrayList<>(); int hasDownloaded = 0; @@ -132,7 +130,6 @@ public abstract class IAssetsHandler { if (need) al.add(new FileDownloadTask(url, location).setTag(mark)); } - return true; } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/InstallerService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/InstallerService.java new file mode 100644 index 000000000..35133fe4d --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/InstallerService.java @@ -0,0 +1,88 @@ +/* + * Copyright 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 2 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. + */ +package org.jackhuang.hellominecraft.launcher.utils.installers; + +import java.io.File; +import org.jackhuang.hellominecraft.launcher.settings.Profile; +import org.jackhuang.hellominecraft.launcher.settings.Settings; +import org.jackhuang.hellominecraft.launcher.utils.installers.InstallerVersionList.InstallerVersion; +import org.jackhuang.hellominecraft.launcher.utils.installers.forge.ForgeInstaller; +import org.jackhuang.hellominecraft.launcher.utils.installers.liteloader.LiteLoaderInstaller; +import org.jackhuang.hellominecraft.launcher.utils.installers.liteloader.LiteLoaderVersionList; +import org.jackhuang.hellominecraft.launcher.utils.installers.optifine.OptiFineInstaller; +import org.jackhuang.hellominecraft.launcher.utils.installers.optifine.vanilla.OptiFineDownloadFormatter; +import org.jackhuang.hellominecraft.tasks.Task; +import org.jackhuang.hellominecraft.tasks.TaskInfo; +import org.jackhuang.hellominecraft.tasks.TaskWindow; +import org.jackhuang.hellominecraft.tasks.download.FileDownloadTask; +import org.jackhuang.hellominecraft.utils.system.IOUtils; + +/** + * + * @author huangyuhui + */ +public final class InstallerService { + + Profile p; + + public InstallerService(Profile p) { + this.p = p; + } + + public Task downloadForge(InstallerVersion v) { + return new TaskInfo("OptiFine Downloader") { + @Override + public void executeTask() { + File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "forge-installer.jar"); + if (v.installer != null) + TaskWindow.getInstance() + .addTask(new FileDownloadTask(Settings.getInstance().getDownloadSource().getProvider().getParsedLibraryDownloadURL(v.installer), filepath).setTag("forge")) + .addTask(new ForgeInstaller(p.getMinecraftProvider(), filepath, v)) + .start(); + } + }; + } + + public Task downloadOptifine(InstallerVersion v) { + return new TaskInfo("OptiFine Downloader") { + @Override + public void executeTask() { + File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "optifine-installer.jar"); + if (v.installer != null) { + OptiFineDownloadFormatter task = new OptiFineDownloadFormatter(v.installer); + TaskWindow.getInstance().addTask(task) + .addTask(new FileDownloadTask(filepath).registerPreviousResult(task).setTag("optifine")) + .addTask(new OptiFineInstaller(p, v.selfVersion, filepath)) + .start(); + } + } + }; + } + + public Task downloadLiteLoader(InstallerVersion v) { + return new TaskInfo("OptiFine Downloader") { + @Override + public void executeTask() { + File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "liteloader-universal.jar"); + FileDownloadTask task = (FileDownloadTask) new FileDownloadTask(v.universal, filepath).setTag("LiteLoader"); + TaskWindow.getInstance() + .addTask(task).addTask(new LiteLoaderInstaller(p, (LiteLoaderVersionList.LiteLoaderInstallerVersion) v).registerPreviousResult(task)) + .start(); + } + }; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/ForgeInstaller.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/ForgeInstaller.java index c11497b00..ac2dc1146 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/ForgeInstaller.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/forge/ForgeInstaller.java @@ -55,57 +55,47 @@ public class ForgeInstaller extends Task { } @Override - public boolean executeTask() { - try { - HMCLog.log("Extracting install profiles..."); + public void executeTask() throws Exception { + HMCLog.log("Extracting install profiles..."); - ZipFile zipFile = new ZipFile(forgeInstaller); - ZipEntry entry = zipFile.getEntry("install_profile.json"); - String content = NetUtils.getStreamContent(zipFile.getInputStream(entry)); - InstallProfile profile = C.gsonPrettyPrinting.fromJson(content, InstallProfile.class); + ZipFile zipFile = new ZipFile(forgeInstaller); + ZipEntry entry = zipFile.getEntry("install_profile.json"); + String content = NetUtils.getStreamContent(zipFile.getInputStream(entry)); + InstallProfile profile = C.gsonPrettyPrinting.fromJson(content, InstallProfile.class); - File from = new File(gameDir, "versions" + File.separator + profile.install.minecraft); - if (!from.exists()) { - if (MessageBox.Show(C.i18n("install.no_version_if_intall")) == MessageBox.YES_OPTION) { - if (!mp.install(profile.install.minecraft, Settings.getInstance().getDownloadSource())) - setFailReason(new RuntimeException(C.i18n("install.no_version"))); - } else - setFailReason(new RuntimeException(C.i18n("install.no_version"))); - return false; - } + File from = new File(gameDir, "versions" + File.separator + profile.install.minecraft); + if (!from.exists()) + if (MessageBox.Show(C.i18n("install.no_version_if_intall")) == MessageBox.YES_OPTION) { + if (!mp.install(profile.install.minecraft, Settings.getInstance().getDownloadSource())) + throw new IllegalStateException(C.i18n("install.no_version")); + } else + throw new IllegalStateException(C.i18n("install.no_version")); - File to = new File(gameDir, "versions" + File.separator + profile.install.target); - to.mkdirs(); + File to = new File(gameDir, "versions" + File.separator + profile.install.target); + to.mkdirs(); - HMCLog.log("Copying jar..." + profile.install.minecraft + ".jar to " + profile.install.target + ".jar"); - FileUtils.copyFile(new File(from, profile.install.minecraft + ".jar"), - new File(to, profile.install.target + ".jar")); - HMCLog.log("Creating new version profile..." + profile.install.target + ".json"); - /*for (MinecraftLibrary library : profile.versionInfo.libraries) + HMCLog.log("Copying jar..." + profile.install.minecraft + ".jar to " + profile.install.target + ".jar"); + FileUtils.copyFile(new File(from, profile.install.minecraft + ".jar"), + new File(to, profile.install.target + ".jar")); + HMCLog.log("Creating new version profile..." + profile.install.target + ".json"); + /*for (MinecraftLibrary library : profile.versionInfo.libraries) if (library.name.startsWith("net.minecraftforge:forge:")) library.url = installerVersion.universal;*/ - FileUtils.write(new File(to, profile.install.target + ".json"), C.gsonPrettyPrinting.toJson(profile.versionInfo)); + FileUtils.write(new File(to, profile.install.target + ".json"), C.gsonPrettyPrinting.toJson(profile.versionInfo)); - HMCLog.log("Extracting universal forge pack..." + profile.install.filePath); + HMCLog.log("Extracting universal forge pack..." + profile.install.filePath); - entry = zipFile.getEntry(profile.install.filePath); - InputStream is = zipFile.getInputStream(entry); + entry = zipFile.getEntry(profile.install.filePath); + InputStream is = zipFile.getInputStream(entry); - MinecraftLibrary forge = new MinecraftLibrary(profile.install.path); - forge.init(); - File file = new File(gameDir, "libraries/" + forge.formatted); - file.getParentFile().mkdirs(); - try (FileOutputStream fos = new FileOutputStream(file)) { - BufferedOutputStream bos = new BufferedOutputStream(fos); - int c; - while ((c = is.read()) != -1) - bos.write((byte) c); - bos.close(); - } - return true; - } catch (IOException | JsonSyntaxException e) { - setFailReason(e); - return false; + MinecraftLibrary forge = new MinecraftLibrary(profile.install.path); + forge.init(); + File file = new File(gameDir, "libraries/" + forge.formatted); + file.getParentFile().mkdirs(); + try (FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos)) { + int c; + while ((c = is.read()) != -1) + bos.write((byte) c); } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/liteloader/LiteLoaderInstaller.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/liteloader/LiteLoaderInstaller.java index 88a012530..0c4ff5500 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/liteloader/LiteLoaderInstaller.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/liteloader/LiteLoaderInstaller.java @@ -50,41 +50,32 @@ public class LiteLoaderInstaller extends Task implements PreviousResultRegistrar } @Override - public boolean executeTask() { - if (profile == null || profile.getSelectedMinecraftVersion() == null) { - setFailReason(new RuntimeException(C.i18n("install.no_version"))); - return false; - } + public void executeTask() throws Exception { + if (profile == null || profile.getSelectedMinecraftVersion() == null) + throw new IllegalStateException(C.i18n("install.no_version")); if (pre.size() != 1 && installer == null) throw new IllegalStateException("No registered previous task."); if (installer == null) installer = pre.get(pre.size() - 1).getResult(); - try { - MinecraftVersion mv = (MinecraftVersion) profile.getSelectedMinecraftVersion().clone(); - mv.inheritsFrom = mv.id; - mv.jar = mv.jar == null ? mv.id : mv.jar; - mv.libraries = new ArrayList(Arrays.asList(version.libraries)); + MinecraftVersion mv = (MinecraftVersion) profile.getSelectedMinecraftVersion().clone(); + mv.inheritsFrom = mv.id; + mv.jar = mv.jar == null ? mv.id : mv.jar; + mv.libraries = new ArrayList(Arrays.asList(version.libraries)); - MinecraftLibrary ml = new MinecraftLibrary("com.mumfrey:liteloader:" + version.selfVersion); - //ml.url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + version.mcVersion + "/liteloader-" + version.selfVersion + ".jar"; - mv.libraries.add(0, ml); - FileUtils.copyFile(installer, new File(profile.getCanonicalGameDir(), "libraries/com/mumfrey/liteloader/" + version.selfVersion + "/liteloader-" + version.selfVersion + ".jar")); + MinecraftLibrary ml = new MinecraftLibrary("com.mumfrey:liteloader:" + version.selfVersion); + //ml.url = "http://dl.liteloader.com/versions/com/mumfrey/liteloader/" + version.mcVersion + "/liteloader-" + version.selfVersion + ".jar"; + mv.libraries.add(0, ml); + FileUtils.copyFile(installer, new File(profile.getCanonicalGameDir(), "libraries/com/mumfrey/liteloader/" + version.selfVersion + "/liteloader-" + version.selfVersion + ".jar")); - mv.id += "-LiteLoader" + version.selfVersion; + mv.id += "-LiteLoader" + version.selfVersion; - mv.mainClass = "net.minecraft.launchwrapper.Launch"; - mv.minecraftArguments += " --tweakClass " + version.tweakClass; - File folder = new File(profile.getCanonicalGameDir(), "versions/" + mv.id); - folder.mkdirs(); - File json = new File(folder, mv.id + ".json"); - HMCLog.log("Creating new version profile..." + mv.id + ".json"); - FileUtils.write(json, C.gsonPrettyPrinting.toJson(mv)); - - return true; - } catch (Exception e) { - setFailReason(e); - return false; - } + mv.mainClass = "net.minecraft.launchwrapper.Launch"; + mv.minecraftArguments += " --tweakClass " + version.tweakClass; + File folder = new File(profile.getCanonicalGameDir(), "versions/" + mv.id); + folder.mkdirs(); + File json = new File(folder, mv.id + ".json"); + HMCLog.log("Creating new version profile..." + mv.id + ".json"); + FileUtils.write(json, C.gsonPrettyPrinting.toJson(mv)); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/OptiFineInstaller.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/OptiFineInstaller.java index 4e43b24bf..f4e81a328 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/OptiFineInstaller.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/utils/installers/optifine/OptiFineInstaller.java @@ -17,7 +17,6 @@ package org.jackhuang.hellominecraft.launcher.utils.installers.optifine; import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.zip.ZipFile; import org.jackhuang.hellominecraft.C; @@ -50,37 +49,28 @@ public class OptiFineInstaller extends Task implements PreviousResultRegistrar json = new HashMap<>(); File f = getSelf(newestVersion); - try { - if (!f.getParentFile().exists()) - f.getParentFile().mkdirs(); + if (!f.getParentFile().exists()) + f.getParentFile().mkdirs(); - for (int i = 0; f.exists(); i++) - f = new File(BASE_FOLDER, "HMCL-" + newestVersion + (i > 0 ? "-" + i : "") + ".jar"); - f.createNewFile(); + for (int i = 0; f.exists(); i++) + f = new File(BASE_FOLDER, "HMCL-" + newestVersion + (i > 0 ? "-" + i : "") + ".jar"); + f.createNewFile(); - try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(f))) { - Pack200.newUnpacker().unpack(new XZInputStream(new FileInputStream(tempFile)), jos); - } - json.put("ver", newestVersion); - json.put("loc", f.getAbsolutePath()); - String result = C.gson.toJson(json); - FileUtils.write(HMCL_VER_FILE, result); - return true; - } catch (IOException e) { - setFailReason(e); - return false; + try (JarOutputStream jos = new JarOutputStream(new FileOutputStream(f))) { + Pack200.newUnpacker().unpack(new XZInputStream(new FileInputStream(tempFile)), jos); } + json.put("ver", newestVersion); + json.put("loc", f.getAbsolutePath()); + String result = C.gson.toJson(json); + FileUtils.write(HMCL_VER_FILE, result); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftModService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftModService.java new file mode 100644 index 000000000..6402ab99b --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftModService.java @@ -0,0 +1,109 @@ +/* + * Copyright 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 2 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. + */ +package org.jackhuang.hellominecraft.launcher.version; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import org.jackhuang.hellominecraft.HMCLog; +import org.jackhuang.hellominecraft.launcher.launch.IMinecraftModService; +import org.jackhuang.hellominecraft.launcher.utils.ModInfo; +import org.jackhuang.hellominecraft.utils.system.FileUtils; + +/** + * + * @author huangyuhui + */ +public class MinecraftModService implements IMinecraftModService { + MinecraftVersionManager mgr; + + public MinecraftModService(MinecraftVersionManager mgr) { + this.mgr = mgr; + } + + List modCache; + + @Override + public List getMods() { + if (modCache == null) return recacheMods(); + else return modCache; + } + + @Override + public List recacheMods() { + if (mgr.getSelectedMinecraftVersion() == null) + return modCache = new ArrayList<>(); + File modsFolder = mgr.getRunDirectory(mgr.getSelectedMinecraftVersion().id, "mods"); + ArrayList mods = new ArrayList<>(); + File[] fs = modsFolder.listFiles(); + if (fs != null) + for (File f : fs) + if (ModInfo.isFileMod(f)) { + ModInfo m = ModInfo.readModInfo(f); + if (m != null) + mods.add(m); + } else if (f.isDirectory()) { + File[] ss = f.listFiles(); + if (ss != null) + for (File ff : ss) + if (ModInfo.isFileMod(ff)) { + ModInfo m = ModInfo.readModInfo(ff); + if (m != null) + mods.add(m); + } + } + Collections.sort(mods); + return modCache = mods; + } + + @Override + public boolean addMod(File f) { + try { + if (mgr.getSelectedMinecraftVersion() == null) + return false; + if (!ModInfo.isFileMod(f)) + return false; + File modsFolder = mgr.getRunDirectory(mgr.getSelectedMinecraftVersion().id, "mods"); + if (modsFolder == null) + return false; + modsFolder.mkdirs(); + File newf = new File(modsFolder, f.getName()); + FileUtils.copyFile(f, newf); + ModInfo i = ModInfo.readModInfo(f); + modCache.add(i); + return true; + } catch (IOException ex) { + HMCLog.warn("Failed to copy mod", ex); + return false; + } + } + + @Override + public void removeMod(int[] rows) { + Arrays.sort(rows); + for (int idx : rows) { + ModInfo mi = getMods().get(idx); + File f = mi.location; + f.delete(); + } + recacheMods(); + } + +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftService.java new file mode 100644 index 000000000..60947aaca --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftService.java @@ -0,0 +1,55 @@ +/* + * Copyright 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 2 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. + */ +package org.jackhuang.hellominecraft.launcher.version; + +import org.jackhuang.hellominecraft.launcher.settings.Profile; +import org.jackhuang.hellominecraft.launcher.settings.Settings; +import org.jackhuang.hellominecraft.launcher.utils.assets.IAssetsHandler; +import org.jackhuang.hellominecraft.tasks.Task; +import org.jackhuang.hellominecraft.tasks.TaskWindow; + +/** + * + * @author huangyuhui + */ +public class MinecraftService { + + Profile profile; + + public MinecraftService(Profile profile) { + this.profile = profile; + } + + public Task downloadAssets(String mcVersion) { + return new Task() { + + @Override + public void executeTask() throws Throwable { + IAssetsHandler type = IAssetsHandler.ASSETS_HANDLER; + type.getList(profile.getMinecraftProvider().getVersionById(mcVersion), profile.getMinecraftProvider(), (value) -> { + if (value != null) + TaskWindow.getInstance().addTask(type.getDownloadTask(Settings.getInstance().getDownloadSource().getProvider())).start(); + }); + } + + @Override + public String getInfo() { + return "Download Assets"; + } + }; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java index ba1c982c0..b51f1c9b6 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/version/MinecraftVersionManager.java @@ -21,7 +21,6 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -30,6 +29,7 @@ import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.launch.GameLauncher; import org.jackhuang.hellominecraft.launcher.launch.GameLauncher.DownloadLibraryJob; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftLoader; +import org.jackhuang.hellominecraft.launcher.launch.IMinecraftModService; import org.jackhuang.hellominecraft.launcher.launch.IMinecraftProvider; import org.jackhuang.hellominecraft.launcher.launch.MinecraftLoader; import org.jackhuang.hellominecraft.utils.system.FileUtils; @@ -38,7 +38,6 @@ import org.jackhuang.hellominecraft.launcher.utils.auth.UserProfileProvider; import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.launcher.settings.Settings; -import org.jackhuang.hellominecraft.launcher.utils.ModInfo; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.system.MessageBox; import org.jackhuang.hellominecraft.utils.Utils; @@ -224,33 +223,6 @@ public final class MinecraftVersionManager extends IMinecraftProvider { } } - @Override - public List listMods() { - if (profile.getSelectedMinecraftVersion() == null) - return new ArrayList<>(); - File modsFolder = new File(getRunDirectory(profile.getSelectedMinecraftVersion().id), "mods"); - ArrayList mods = new ArrayList<>(); - File[] fs = modsFolder.listFiles(); - if (fs != null) - for (File f : fs) - if (ModInfo.isFileMod(f)) { - ModInfo m = ModInfo.readModInfo(f); - if (m != null) - mods.add(m); - } else if (f.isDirectory()) { - File[] ss = f.listFiles(); - if (ss != null) - for (File ff : ss) - if (ModInfo.isFileMod(ff)) { - ModInfo m = ModInfo.readModInfo(ff); - if (m != null) - mods.add(m); - } - } - Collections.sort(mods); - return mods; - } - @Override public List getDownloadLibraries(DownloadType downloadType) { ArrayList downloadLibraries = new ArrayList<>(); @@ -273,14 +245,12 @@ public final class MinecraftVersionManager extends IMinecraftProvider { return downloadLibraries; } - @Override - public void openSelf(String mv) { - Utils.openFolder(getRunDirectory(mv)); - } - @Override public void open(String mv, String name) { - Utils.openFolder(new File(getRunDirectory(mv), name)); + if (name == null) + Utils.openFolder(getRunDirectory(mv)); + else + Utils.openFolder(new File(getRunDirectory(mv), name)); } @Override @@ -348,4 +318,25 @@ public final class MinecraftVersionManager extends IMinecraftProvider { if (!resourcePacks.exists()) resourcePacks.mkdirs(); } + + @Override + public void cleanFolder() { + for (MinecraftVersion s : getVersions()) { + FileUtils.deleteDirectoryQuietly(new File(profile.getGameDirFile(), "versions" + File.separator + s.id + File.separator + s.id + "-natives")); + File f = getRunDirectory(s.id); + String[] dir = {"logs", "asm", "NVIDIA", "crash-reports", "server-resource-packs", "natives", "native"}; + for (String str : dir) + FileUtils.deleteDirectoryQuietly(new File(f, str)); + String[] files = {"output-client.log", "usercache.json", "usernamecache.json", "hmclmc.log"}; + for (String str : files) + new File(f, str).delete(); + } + } + + final MinecraftModService mms = new MinecraftModService(this); + + @Override + public IMinecraftModService getModService() { + return mms; + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java index 2783abc44..e7d73d419 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/GameSettingsPanel.java @@ -48,14 +48,8 @@ import org.jackhuang.hellominecraft.C; import org.jackhuang.hellominecraft.HMCLog; import org.jackhuang.hellominecraft.launcher.settings.LauncherVisibility; import org.jackhuang.hellominecraft.launcher.utils.MCUtils; -import org.jackhuang.hellominecraft.launcher.utils.assets.IAssetsHandler; import org.jackhuang.hellominecraft.launcher.utils.installers.InstallerVersionList; import org.jackhuang.hellominecraft.launcher.utils.installers.InstallerVersionList.InstallerVersion; -import org.jackhuang.hellominecraft.launcher.utils.installers.forge.ForgeInstaller; -import org.jackhuang.hellominecraft.launcher.utils.installers.liteloader.LiteLoaderInstaller; -import org.jackhuang.hellominecraft.launcher.utils.installers.liteloader.LiteLoaderVersionList.LiteLoaderInstallerVersion; -import org.jackhuang.hellominecraft.launcher.utils.installers.optifine.OptiFineInstaller; -import org.jackhuang.hellominecraft.launcher.utils.installers.optifine.vanilla.OptiFineDownloadFormatter; import org.jackhuang.hellominecraft.launcher.utils.download.DownloadType; import org.jackhuang.hellominecraft.launcher.settings.Profile; import org.jackhuang.hellominecraft.launcher.settings.Settings; @@ -64,10 +58,10 @@ import org.jackhuang.hellominecraft.launcher.utils.ModInfo; import org.jackhuang.hellominecraft.launcher.version.GameDirType; import org.jackhuang.hellominecraft.launcher.version.MinecraftVersion; import org.jackhuang.hellominecraft.tasks.Task; +import org.jackhuang.hellominecraft.tasks.TaskRunnable; import org.jackhuang.hellominecraft.tasks.TaskRunnableArg1; import org.jackhuang.hellominecraft.tasks.TaskWindow; import org.jackhuang.hellominecraft.tasks.communication.DefaultPreviousResult; -import org.jackhuang.hellominecraft.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.tasks.download.HTTPGetTask; import org.jackhuang.hellominecraft.utils.system.IOUtils; import org.jackhuang.hellominecraft.utils.system.MessageBox; @@ -75,8 +69,6 @@ import org.jackhuang.hellominecraft.version.MinecraftVersionRequest; import org.jackhuang.hellominecraft.utils.system.OS; import org.jackhuang.hellominecraft.utils.StrUtils; import org.jackhuang.hellominecraft.utils.SwingUtils; -import org.jackhuang.hellominecraft.utils.Utils; -import org.jackhuang.hellominecraft.utils.system.FileUtils; import org.jackhuang.hellominecraft.utils.system.Java; import org.jackhuang.hellominecraft.version.MinecraftRemoteVersion; import org.jackhuang.hellominecraft.version.MinecraftRemoteVersions; @@ -117,11 +109,7 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL } JMenuItem itm; itm = new JMenuItem(C.i18n("folder.game")); - itm.addActionListener((e) -> { - Profile v = getProfile(); - if (v != null) - v.getMinecraftProvider().openSelf(mcVersion); - }); + itm.addActionListener(new ImplementedActionListener(null)); ppmExplore.add(itm); itm = new JMenuItem(C.i18n("folder.mod")); itm.addActionListener(new ImplementedActionListener("mods")); @@ -183,6 +171,7 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL } lstExternalMods.getSelectionModel().addListSelectionListener(e -> { int row = lstExternalMods.getSelectedRow(); + List mods = profile.getMinecraftProvider().getModService().getMods(); if (mods != null && 0 <= row && row < mods.size()) { ModInfo m = mods.get(row); boolean hasLink = m.url != null; @@ -196,15 +185,9 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL ((DefaultTableModel) lstExternalMods.getModel()).addTableModelListener(e -> { if (e.getType() == TableModelEvent.UPDATE && e.getColumn() == 0) { int row = lstExternalMods.getSelectedRow(); - if (mods != null && mods.size() > row && row >= 0) { - File f = mods.get(row).location, newf; - if (f.getName().endsWith(".disabled")) - newf = new File(f.getParentFile(), f.getName().substring(0, f.getName().length() - ".disabled".length())); - else - newf = new File(f.getParentFile(), f.getName() + ".disabled"); - if (f.renameTo(newf)) - mods.get(row).location = newf; - } + List mods = profile.getMinecraftProvider().getModService().getMods(); + if (mods != null && mods.size() > row && row >= 0) + mods.get(row).reverseModState(); } }); tabVersionEdit.addChangeListener(new ChangeListener() { @@ -222,26 +205,15 @@ public class GameSettingsPanel extends javax.swing.JPanel implements DropTargetL } }); tabInstallers.addChangeListener(new ChangeListener() { - boolean a = false, b = false, c = false; + boolean refreshed[] = new boolean[] {false, false, false}; + InstallerHelper helpers[] = new InstallerHelper[] {forge, optifine, liteloader}; @Override public void stateChanged(ChangeEvent e) { - switch (tabInstallers.getSelectedIndex()) { - case 0: - if (!a) - forge.refreshVersions(); - a = true; - break; - case 1: - if (!b) - optifine.refreshVersions(); - b = true; - break; - case 2: - if (!c) - liteloader.refreshVersions(); - c = true; - break; + int idx = tabInstallers.getSelectedIndex(); + if (0 <= idx && idx < 3 && !refreshed[idx]) { + helpers[idx].refreshVersions(); + refreshed[idx] = true; } } }); @@ -1133,7 +1105,8 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { if (isLoading) return; profile = getProfile(); - if (profile == null) return; + if (profile == null) + return; if (profile.getMinecraftProvider().getVersionCount() <= 0) versionChanged(profile, null); prepare(profile); @@ -1161,14 +1134,13 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { }//GEN-LAST:event_btnRemoveProfileActionPerformed private void cboVersionsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboVersionsItemStateChanged - if (isLoading || evt.getStateChange() != ItemEvent.SELECTED || cboVersions.getSelectedIndex() < 0 || StrUtils.isBlank((String) cboVersions.getSelectedItem()) || getProfile() == null) return; - loadMinecraftVersion((String) cboVersions.getSelectedItem()); - versionChanged(getProfile(), (String) cboVersions.getSelectedItem()); - - getProfile().setSelectedMinecraftVersion(cboVersions.getSelectedItem().toString()); - cboVersions.setToolTipText(cboVersions.getSelectedItem().toString()); + String mcv = (String) cboVersions.getSelectedItem(); + loadMinecraftVersion(mcv); + versionChanged(getProfile(), mcv); + getProfile().setSelectedMinecraftVersion(mcv); + cboVersions.setToolTipText(mcv); Settings.save(); }//GEN-LAST:event_cboVersionsItemStateChanged @@ -1186,17 +1158,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { MessageBox.Show(C.i18n("install.not_refreshed")); return; } - InstallerVersion v = forge.getVersion(idx); - String url; - File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "forge-installer.jar"); - if (v.installer != null) { - url = Settings.getInstance().getDownloadSource().getProvider().getParsedLibraryDownloadURL(v.installer); - TaskWindow.getInstance() - .addTask(new FileDownloadTask(url, filepath).setTag("forge")) - .addTask(new ForgeInstaller(profile.getMinecraftProvider(), filepath, v)) - .start(); - refreshVersions(); - } + profile.getInstallerService().downloadForge(forge.getVersion(idx)).after(new TaskRunnable(this::refreshVersions)).run(); }//GEN-LAST:event_btnDownloadForgeActionPerformed private void btnRefreshOptifineActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshOptifineActionPerformed @@ -1209,17 +1171,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { MessageBox.Show(C.i18n("install.not_refreshed")); return; } - InstallerVersion v = optifine.getVersion(idx); - File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "optifine-installer.jar"); - if (v.installer != null) - SwingUtilities.invokeLater(() -> { - OptiFineDownloadFormatter task = new OptiFineDownloadFormatter(v.installer); - TaskWindow.getInstance().addTask(task) - .addTask(new FileDownloadTask(filepath).registerPreviousResult(task).setTag("optifine")) - .addTask(new OptiFineInstaller(profile, v.selfVersion, filepath)) - .start(); - refreshVersions(); - }); + profile.getInstallerService().downloadOptifine(optifine.getVersion(idx)).after(new TaskRunnable(this::refreshVersions)).run(); }//GEN-LAST:event_btnDownloadOptifineActionPerformed private void btnInstallLiteLoaderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnInstallLiteLoaderActionPerformed @@ -1228,15 +1180,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { MessageBox.Show(C.i18n("install.not_refreshed")); return; } - InstallerVersion v = liteloader.getVersion(idx); - String url; - File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "liteloader-universal.jar"); - url = v.universal; - FileDownloadTask task = (FileDownloadTask) new FileDownloadTask(url, filepath).setTag("LiteLoader"); - TaskWindow.getInstance() - .addTask(task).addTask(new LiteLoaderInstaller(profile, (LiteLoaderInstallerVersion) v).registerPreviousResult(task)) - .start(); - refreshVersions(); + profile.getInstallerService().downloadLiteLoader(liteloader.getVersion(idx)).after(new TaskRunnable(this::refreshVersions)).run(); }//GEN-LAST:event_btnInstallLiteLoaderActionPerformed private void btnRefreshLiteLoaderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshLiteLoaderActionPerformed @@ -1320,7 +1264,8 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { }//GEN-LAST:event_cboLauncherVisibilityFocusLost private void btnDownloadAllAssetsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadAllAssetsActionPerformed - downloadAssets(IAssetsHandler.ASSETS_HANDLER); + if (mcVersion != null && profile != null) + profile.getMinecraftService().downloadAssets(mcVersion).run(); }//GEN-LAST:event_btnDownloadAllAssetsActionPerformed private void txtMaxMemoryFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtMaxMemoryFocusLost @@ -1394,45 +1339,15 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { return; boolean flag = false; for (File f : fc.getSelectedFiles()) - if (!addMod(f)) - flag |= true; + flag |= !profile.getMinecraftProvider().getModService().addMod(f); + reloadMods(); if (flag) MessageBox.Show(C.I18N.getString("mods.failed")); }//GEN-LAST:event_btnAddModActionPerformed - boolean addMod(File f) { - try { - if (!ModInfo.isFileMod(f) || mods == null) - return false; - File newf = profile.getFolder("mods"); - if (newf == null) - return false; - newf.mkdirs(); - newf = new File(newf, f.getName()); - FileUtils.copyFile(f, newf); - ModInfo i = ModInfo.readModInfo(f); - mods.add(i); - ((DefaultTableModel) lstExternalMods.getModel()).addRow(new Object[] {i.isActive(), i.location.getName(), i.version}); - return true; - } catch (IOException ex) { - HMCLog.warn("Failed to copy mod", ex); - return false; - } - } - private void btnRemoveModActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveModActionPerformed - DefaultTableModel model = (DefaultTableModel) lstExternalMods.getModel(); - int[] rows = lstExternalMods.getSelectedRows(); - Arrays.sort(rows); - int removed = 0; - for (int idx : rows) { - ModInfo mi = mods.get(idx - removed); - File f = mi.location; - mods.remove(idx - removed); - model.removeRow(idx - removed); - removed++; - f.delete(); - } + profile.getMinecraftProvider().getModService().removeMod(lstExternalMods.getSelectedRows()); + reloadMods(); }//GEN-LAST:event_btnRemoveModActionPerformed private void lstExternalModsKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_lstExternalModsKeyPressed @@ -1442,11 +1357,8 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { private void lblModInfoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblModInfoMouseClicked int idx = lstExternalMods.getSelectedRow(); - if (idx > 0 && idx < mods.size()) { - ModInfo m = mods.get(idx); - if (m.url != null) - Utils.openLink(m.url); - } + if (idx > 0 && idx < profile.getMinecraftProvider().getModService().getMods().size()) + profile.getMinecraftProvider().getModService().getMods().get(idx).showURL(); }//GEN-LAST:event_lblModInfoMouseClicked private void btnChoosingGameDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChoosingGameDirActionPerformed @@ -1468,7 +1380,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { }//GEN-LAST:event_btnChoosingGameDirActionPerformed private void btnMakeLaunchScriptActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMakeLaunchScriptActionPerformed - MainFrame.instance.mainPanel.btnMakeLaunchCodeActionPerformed(); + MainFrame.INSTANCE.mainPanel.btnMakeLaunchCodeActionPerformed(); }//GEN-LAST:event_btnMakeLaunchScriptActionPerformed private void btnShowLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnShowLogActionPerformed @@ -1476,15 +1388,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { }//GEN-LAST:event_btnShowLogActionPerformed private void btnCleanGameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCleanGameActionPerformed - File f = getProfile().getMinecraftProvider().getRunDirectory(mcVersion); - String[] dir = {"logs", "asm", "NVIDIA", "crash-reports", "server-resource-packs", "natives", "native"}; - for (String s : dir) - FileUtils.deleteDirectoryQuietly(new File(f, s)); - String[] files = {"output-client.log", "usercache.json", "usernamecache.json", "hmclmc.log"}; - for (String s : files) - new File(f, s).delete(); - for (MinecraftVersion s : getProfile().getMinecraftProvider().getVersions()) - FileUtils.deleteDirectoryQuietly(new File(getProfile().getGameDirFile(), "versions" + File.separator + s.id + File.separator + s.id + "-natives")); + profile.getMinecraftProvider().cleanFolder(); }//GEN-LAST:event_btnCleanGameActionPerformed // @@ -1601,15 +1505,6 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { // public int assetsType; - private void downloadAssets(final IAssetsHandler type) { - if (mcVersion == null || profile == null) - return; - type.getList(profile.getMinecraftProvider().getVersionById(mcVersion), profile.getMinecraftProvider(), (value) -> { - if (value != null) - SwingUtilities.invokeLater(() -> TaskWindow.getInstance().addTask(type.getDownloadTask(Settings.getInstance().getDownloadSource().getProvider())).start()); - }); - } - // // public void refreshDownloads(final DownloadType provider) { @@ -1617,10 +1512,10 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { HTTPGetTask tsk = new HTTPGetTask(provider.getProvider().getVersionsListDownloadURL()); @Override - public boolean executeTask() { + public void executeTask() { final MinecraftRemoteVersions v = C.gson.fromJson(tsk.getResult(), MinecraftRemoteVersions.class); if (v == null || v.versions == null) - return true; + return; SwingUtilities.invokeLater(() -> { DefaultTableModel model = (DefaultTableModel) lstDownloads.getModel(); while (model.getRowCount() > 0) @@ -1630,7 +1525,6 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { StrUtils.equalsOne(ver.type, "old_beta", "old_alpha", "release", "snapshot") ? C.i18n("versions." + ver.type) : ver.type}); lstDownloads.updateUI(); }); - return true; } @Override @@ -1672,7 +1566,7 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { Transferable tr = dtde.getTransferable(); List files = (List) tr.getTransferData(DataFlavor.javaFileListFlavor); for (File file : files) - addMod(file); + profile.getMinecraftProvider().getModService().addMod(file); } catch (Exception ex) { HMCLog.warn("Failed to drop file.", ex); } @@ -1757,19 +1651,18 @@ btnRefreshLiteLoader.addActionListener(new java.awt.event.ActionListener() { String mcVersion; // - // - List mods; + // private final Object lockMod = new Object(); private void reloadMods() { new Thread(() -> { synchronized (lockMod) { - mods = profile.getMinecraftProvider().listMods(); + profile.getMinecraftProvider().getModService().recacheMods(); SwingUtilities.invokeLater(() -> { synchronized (lockMod) { SwingUtils.clearDefaultTable(lstExternalMods); DefaultTableModel model = (DefaultTableModel) lstExternalMods.getModel(); - for (ModInfo info : mods) + for (ModInfo info : profile.getMinecraftProvider().getModService().getMods()) model.addRow(new Object[] {info.isActive(), info.getFileName(), info.version}); } }); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/LauncherSettingsPanel.java index 423bf5c89..54e52923d 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/LauncherSettingsPanel.java @@ -274,7 +274,7 @@ public class LauncherSettingsPanel extends javax.swing.JPanel { path = IOUtils.removeLastSeparator(path); txtBackgroundPath.setText(path); Settings.getInstance().setBgpath(path); - MainFrame.instance.loadBackground(); + MainFrame.INSTANCE.loadBackground(); } catch (IOException e) { HMCLog.warn("Failed to set background path.", e); MessageBox.Show(C.i18n("ui.label.failed_set") + e.getMessage()); @@ -283,7 +283,7 @@ public class LauncherSettingsPanel extends javax.swing.JPanel { private void txtBackgroundPathFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtBackgroundPathFocusLost Settings.getInstance().setBgpath(txtBackgroundPath.getText()); - MainFrame.instance.loadBackground(); + MainFrame.INSTANCE.loadBackground(); }//GEN-LAST:event_txtBackgroundPathFocusLost private void btnCheckUpdateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCheckUpdateActionPerformed @@ -296,8 +296,7 @@ public class LauncherSettingsPanel extends javax.swing.JPanel { private void cboThemeItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboThemeItemStateChanged Settings.getInstance().setTheme(cboTheme.getSelectedIndex()); - if (MainFrame.instance != null) - MainFrame.instance.reloadColor(); + MainFrame.INSTANCE.reloadColor(); }//GEN-LAST:event_cboThemeItemStateChanged private void txtProxyHostFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtProxyHostFocusLost diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java index 053fb7711..a41e0c8ec 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainFrame.java @@ -52,7 +52,7 @@ import org.jackhuang.hellominecraft.views.BasicColors; */ public final class MainFrame extends DraggableFrame { - public static final MainFrame instance = new MainFrame(); + public static final MainFrame INSTANCE = new MainFrame(); HeaderTab mainTab, gameTab, launcherTab; TintablePanel centralPanel; @@ -321,8 +321,8 @@ public final class MainFrame extends DraggableFrame { } public static void showMainFrame(boolean firstLoad) { - instance.mainPanel.onShow(firstLoad); - instance.show(); + INSTANCE.mainPanel.onShow(firstLoad); + INSTANCE.show(); } Color borderColor = BasicColors.COLOR_BLUE; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java index 0681caf6b..47bc6ce38 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/views/MainPagePanel.java @@ -71,9 +71,9 @@ public class MainPagePanel extends javax.swing.JPanel { this.add(pnlButtons); pnlButtons.setBounds(0, 0, w, h); - this.setSize(new Dimension(deWidth, deHeight)); - this.pnlButtons.setLocation(deWidth - pnlButtons.getWidth() - 25, deHeight - pnlButtons.getHeight() - 25); - pnlMore.setBounds(0, 0, pnlMore.getWidth(), deHeight); + this.setSize(new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT)); + this.pnlButtons.setLocation(DEFAULT_WIDTH - pnlButtons.getWidth() - 25, DEFAULT_HEIGHT - pnlButtons.getHeight() - 25); + pnlMore.setBounds(0, 0, pnlMore.getWidth(), DEFAULT_HEIGHT); pnlMore.setBackground(GraphicsUtils.getWebColorWithAlpha("FFFFFF7F")); pnlMore.setOpaque(true); @@ -267,7 +267,7 @@ public class MainPagePanel extends javax.swing.JPanel { }// //GEN-END:initComponents private void txtPlayerNameFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPlayerNameFocusGained - MainFrame.instance.closeMessage(); + MainFrame.INSTANCE.closeMessage(); }//GEN-LAST:event_txtPlayerNameFocusGained private void txtPlayerNameFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPlayerNameFocusLost @@ -318,7 +318,7 @@ public class MainPagePanel extends javax.swing.JPanel { }//GEN-LAST:event_cboVersionsItemStateChanged private void txtPasswordFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_txtPasswordFocusGained - MainFrame.instance.closeMessage(); + MainFrame.INSTANCE.closeMessage(); }//GEN-LAST:event_txtPasswordFocusGained private void txtPasswordActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtPasswordActionPerformed @@ -393,7 +393,7 @@ public class MainPagePanel extends javax.swing.JPanel { gl.failEvent.register((sender, s) -> { if (s != null) MessageBox.Show(s); - MainFrame.instance.closeMessage(); + MainFrame.INSTANCE.closeMessage(); isLaunching = false; return true; }); @@ -448,8 +448,8 @@ public class MainPagePanel extends javax.swing.JPanel { if (!showedNoVersion) SwingUtilities.invokeLater(() -> { if (MessageBox.Show(C.i18n("mainwindow.no_version"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { - MainFrame.instance.selectTab("game"); - MainFrame.instance.gamePanel.showGameDownloads(); + MainFrame.INSTANCE.selectTab("game"); + MainFrame.INSTANCE.gamePanel.showGameDownloads(); } showedNoVersion = true; }); @@ -490,7 +490,7 @@ public class MainPagePanel extends javax.swing.JPanel { private boolean isLoading = false; private final javax.swing.JPanel pnlButtons; private final ConstomButton btnRun; - private static final int deWidth = 800, deHeight = 480; + private static final int DEFAULT_WIDTH = 800, DEFAULT_HEIGHT = 480; // class PrepareAuthDoneListener implements Event> { @@ -503,7 +503,7 @@ public class MainPagePanel extends javax.swing.JPanel { } private void btnRunActionPerformed() { - MainFrame.instance.showMessage(C.i18n("ui.message.launching")); + MainFrame.INSTANCE.showMessage(C.i18n("ui.message.launching")); genLaunchCode(value -> { value.successEvent.register(new LaunchFinisher()); value.successEvent.register(new PrepareAuthDoneListener()); @@ -511,7 +511,7 @@ public class MainPagePanel extends javax.swing.JPanel { } public void btnMakeLaunchCodeActionPerformed() { - MainFrame.instance.showMessage(C.i18n("ui.message.launching")); + MainFrame.INSTANCE.showMessage(C.i18n("ui.message.launching")); genLaunchCode(value -> { value.successEvent.register(new LaunchScriptFinisher()); value.successEvent.register(new PrepareAuthDoneListener()); @@ -520,11 +520,11 @@ public class MainPagePanel extends javax.swing.JPanel { public void onShow(boolean showLeft) { if (showLeft) - SwingUtilities.invokeLater(() -> MainFrame.instance.showMessage(C.i18n("ui.message.first_load"))); + SwingUtilities.invokeLater(() -> MainFrame.INSTANCE.showMessage(C.i18n("ui.message.first_load"))); if (cboLoginMode.getSelectedIndex() >= 0 && cboLoginMode.getSelectedIndex() < cboLoginMode.getItemCount()) { IAuthenticator l = IAuthenticator.LOGINS.get(cboLoginMode.getSelectedIndex()); if (!l.isHidePasswordBox() && !l.isLoggedIn()) - SwingUtilities.invokeLater(() -> MainFrame.instance.showMessage(C.i18n("ui.message.enter_password"))); + SwingUtilities.invokeLater(() -> MainFrame.INSTANCE.showMessage(C.i18n("ui.message.enter_password"))); } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/DoubleTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/DoubleTask.java new file mode 100644 index 000000000..d353295aa --- /dev/null +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/DoubleTask.java @@ -0,0 +1,31 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.jackhuang.hellominecraft.tasks; + +/** + * + * @author huangyuhui + */ +public class DoubleTask extends Task { + + Task a, b; + + public DoubleTask(Task a, Task b) { + this.a = a; + this.b = b; + } + + @Override + public void executeTask() throws Throwable { + a.executeTask(); b.executeTask(); + } + + @Override + public String getInfo() { + return "Double Task"; + } + +} diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/ParallelTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/ParallelTask.java index 47720b7a9..0e525c0ec 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/ParallelTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/ParallelTask.java @@ -28,8 +28,7 @@ public class ParallelTask extends Task { Collection dependsTask = new HashSet<>(); @Override - public boolean executeTask() { - return true; + public void executeTask() { } @Override diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/Task.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/Task.java index c5eb19c8a..7702d3d22 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/Task.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/Task.java @@ -18,6 +18,7 @@ package org.jackhuang.hellominecraft.tasks; import java.util.ArrayList; import java.util.Collection; +import org.jackhuang.hellominecraft.HMCLog; /** * @@ -27,10 +28,8 @@ public abstract class Task { /** * Run in a new thread(packed in TaskList). - * - * @return is task finished sucessfully. */ - public abstract boolean executeTask(); + public abstract void executeTask() throws Throwable; /** * if this func returns false, TaskList will force abort the thread. run in @@ -101,4 +100,20 @@ public abstract class Task { ppl = p; return this; } + + public Task after(Task t) { + return new DoubleTask(this, t); + } + + public Task before(Task t) { + return new DoubleTask(t, this); + } + + public void run() { + try { + executeTask(); + } catch(Throwable t) { + HMCLog.err("Failed to execute task", t); + } + } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java index be2e735c4..497235954 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskList.java @@ -117,13 +117,14 @@ public class TaskList extends Thread { for (DoingDoneListener d : t.getTaskListeners()) d.onDoing(t); - boolean returns = false; + boolean flag = true; try { - returns = t.executeTask(); + t.executeTask(); } catch (Throwable e) { t.setFailReason(e); + flag = false; } - if (returns) { + if (flag) { HMCLog.log((t.isAborted() ? "Task aborted: " : "Task finished: ") + t.getInfo()); for (DoingDoneListener d : taskListener) d.onDone(t); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskRunnable.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskRunnable.java index e76918edd..1c038eb24 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskRunnable.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskRunnable.java @@ -29,15 +29,13 @@ public class TaskRunnable extends TaskInfo { this.r = r; } + public TaskRunnable(Runnable r) { + this("TaskRunnable", r); + } + @Override - public boolean executeTask() { - try { - r.run(); - return true; - } catch (Throwable t) { - setFailReason(t); - return false; - } + public void executeTask() { + r.run(); } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskRunnableArg1.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskRunnableArg1.java index fee19b915..91d7d90b7 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskRunnableArg1.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/TaskRunnableArg1.java @@ -36,16 +36,10 @@ public class TaskRunnableArg1 extends TaskInfo implements PreviousResultRegis } @Override - public boolean executeTask() { + public void executeTask() throws Exception { if (al.size() != 1) throw new IllegalStateException("the count of args is not one."); - try { - r.accept(al.get(0).getResult()); - return true; - } catch (Throwable t) { - setFailReason(t); - return false; - } + r.accept(al.get(0).getResult()); } ArrayList> al = new ArrayList(); diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/ContentGetAndShowTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/ContentGetAndShowTask.java index 7a7b4dc9d..1f657ca01 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/ContentGetAndShowTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/ContentGetAndShowTask.java @@ -31,9 +31,9 @@ public class ContentGetAndShowTask extends HTTPGetTask implements Event } @Override - public boolean executeTask() { + public void executeTask() throws Exception { tdtsl.register(this); - return super.executeTask(); + super.executeTask(); } String info; diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/FileDownloadTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/FileDownloadTask.java index 5c761d5cb..4eb0dbb6e 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/FileDownloadTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/FileDownloadTask.java @@ -92,7 +92,7 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev // Download file. @Override - public boolean executeTask() { + public void executeTask() throws Throwable { for (PreviousResult p : al) this.url = IOUtils.parseURL(p.getResult()); @@ -113,15 +113,13 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev // Make sure response code is in the 200 range. if (connection.getResponseCode() / 100 != 2) { - setFailReason(new NetException(C.i18n("download.not_200") + " " + connection.getResponseCode())); - return false; + throw new NetException(C.i18n("download.not_200") + " " + connection.getResponseCode()); } // Check for valid content length. int contentLength = connection.getContentLength(); if (contentLength < 1) { - setFailReason(new NetException("The content length is invalid.")); - return false; + throw new NetException("The content length is invalid."); } filePath.getParentFile().mkdirs(); @@ -173,17 +171,17 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev } if (ppl != null) ppl.onProgressProviderDone(this); - return true; + return; } catch (Exception e) { setFailReason(new NetException(C.i18n("download.failed") + " " + url, e)); } finally { closeFiles(); } } - return false; + if (failReason != null) throw failReason; } - public static void download(String url, String file, DownloadListener dl) { + public static void download(String url, String file, DownloadListener dl) throws Throwable { ((Task) new FileDownloadTask(url, new File(file)).setProgressProviderListener(dl)).executeTask(); } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/HTTPGetTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/HTTPGetTask.java index a465a5cf5..29934c946 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/HTTPGetTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/tasks/download/HTTPGetTask.java @@ -50,7 +50,8 @@ public class HTTPGetTask extends TaskInfo implements PreviousResult { } @Override - public boolean executeTask() { + public void executeTask() throws Exception { + Exception t = null; for (int repeat = 0; repeat < 6; repeat++) { if (repeat > 0) HMCLog.warn("Failed to download, repeat: " + repeat); @@ -65,16 +66,16 @@ public class HTTPGetTask extends TaskInfo implements PreviousResult { if (ppl != null) ppl.setProgress(this, ++read, size); if (!shouldContinue) - return true; + return; } result = baos.toString(); tdtsl.execute(result); - return true; + return; } catch (Exception ex) { - setFailReason(new NetException("Failed to get " + url, ex)); + t = new NetException("Failed to get " + url, ex); } } - return false; + if (t != null) throw t; } @Override diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/functions/BiConsumer.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/functions/BiConsumer.java index 588fe30ea..aa7a5c620 100644 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/functions/BiConsumer.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/utils/functions/BiConsumer.java @@ -21,5 +21,5 @@ package org.jackhuang.hellominecraft.utils.functions; */ public interface BiConsumer { - void onDone(V value, V2 value2); + void call(V value, V2 value2); } diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/views/MainWindow.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/views/MainWindow.java index 08480912e..6f2b48cac 100644 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/views/MainWindow.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/views/MainWindow.java @@ -3160,7 +3160,7 @@ implements MonitorThread.MonitorThreadListener, Event { } @Override - public boolean executeTask() { + public void executeTask() { javax.swing.JTable table = MainWindow.this.lstDownloads; DefaultTableModel model = (DefaultTableModel) table.getModel(); @@ -3173,7 +3173,6 @@ implements MonitorThread.MonitorThreadListener, Event { line[3] = ver.type; model.addRow(line); } - return true; } @Override