From 0e4c38d99ec031ea233ecfbc0557dda56dc632ed Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Sat, 6 Feb 2016 12:56:16 +0800 Subject: [PATCH] Supported 16w05a version json --- .../core/asset/AssetsMojangLoader.java | 9 ++- .../core/asset/MinecraftAssetService.java | 21 +++--- .../download/MinecraftDownloadService.java | 73 ++++++++++++++----- .../install/MinecraftInstallerService.java | 22 +++--- .../core/launch/DefaultGameLauncher.java | 6 +- .../launcher/core/launch/LaunchOptions.java | 12 ++- .../launcher/core/launch/MinecraftLoader.java | 14 ++-- .../core/service/IMinecraftAssetService.java | 3 +- .../core/version/AssetIndexDownloadInfo.java | 44 +++++++++++ .../core/version/GameDownloadInfo.java | 29 ++++++++ .../core/version/MinecraftVersion.java | 17 +++-- .../core/version/MinecraftVersionManager.java | 2 +- .../launcher/setting/VersionSetting.java | 1 + .../launcher/ui/InstallerPanel.java | 4 +- .../launcher/ui/MainPagePanel.java | 2 +- .../util/upgrade/AppDataUpgrader.java | 4 +- .../util/upgrade/NewFileUpgrader.java | 2 +- .../jackhuang/hellominecraft/util/Utils.java | 7 ++ .../util/tasks/DoingDoneListener.java | 6 +- .../hellominecraft/util/tasks/Task.java | 4 +- .../hellominecraft/util/tasks/TaskList.java | 20 +++-- .../hellominecraft/util/tasks/TaskWindow.java | 15 ++-- .../util/tasks/download/FileDownloadTask.java | 24 +++++- .../install/cauldron/ForgeInstaller.java | 16 ++-- .../hellominecraft/svrmgr/ui/MainWindow.java | 10 +-- .../svrmgr/ui/PluginInfoDialog.java | 6 +- 26 files changed, 270 insertions(+), 103 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/AssetIndexDownloadInfo.java create mode 100644 HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/GameDownloadInfo.java diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java index 9ca17e542..484ce9236 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/AssetsMojangLoader.java @@ -19,6 +19,7 @@ package org.jackhuang.hellominecraft.launcher.core.asset; import java.io.File; import java.util.ArrayList; +import java.util.HashSet; import java.util.Map; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; @@ -49,11 +50,11 @@ public class AssetsMojangLoader extends IAssetsHandler { protected void work() throws Exception { if (mv == null) throw new IllegalArgumentException("AssetsMojangLoader: null argument: MinecraftVersion"); - String assetsId = mv.assets == null ? "legacy" : mv.assets; + String assetsId = mv.getAssetsIndex().getId(); File assets = mp.getAssets(); HMCLog.log("Gathering asset index: " + assetsId); File f = IOUtils.tryGetCanonicalFile(new File(assets, "indexes/" + assetsId + ".json")); - if (!f.exists() && !mp.downloadMinecraftAssetsIndex(assetsId)) + if (!f.exists() && !mp.downloadMinecraftAssetsIndex(mv.getAssetsIndex())) throw new IllegalStateException("Failed to get index json"); String result = FileUtils.readFileToString(f); @@ -64,8 +65,12 @@ public class AssetsMojangLoader extends IAssetsHandler { assetsLocalNames = new ArrayList<>(); ArrayList al = new ArrayList<>(); contents = new ArrayList<>(); + HashSet loadedHashes = new HashSet<>(); if (o != null && o.getFileMap() != null) for (Map.Entry e : o.getFileMap().entrySet()) { + if (loadedHashes.contains(e.getValue().getHash())) + continue; + loadedHashes.add(e.getValue().getHash()); Contents c = new Contents(); c.eTag = e.getValue().getHash(); c.key = c.eTag.substring(0, 2) + "/" + e.getValue().getHash(); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java index ccba6be65..bbc08bcc7 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/asset/MinecraftAssetService.java @@ -23,6 +23,7 @@ import java.io.IOException; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftAssetService; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; +import org.jackhuang.hellominecraft.launcher.core.version.AssetIndexDownloadInfo; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.tasks.Task; @@ -49,7 +50,7 @@ public class MinecraftAssetService extends IMinecraftAssetService { public void executeTask() throws Throwable { IAssetsHandler type = IAssetsHandler.ASSETS_HANDLER; type.getList(service.version().getVersionById(mcVersion), service.asset()) - .reg((t) -> TaskWindow.getInstance().addTask(type.getDownloadTask(service.getDownloadType().getProvider())).start()).execute(); + .reg((t) -> TaskWindow.factory().append(type.getDownloadTask(service.getDownloadType().getProvider())).create()).execute(); } @Override @@ -64,26 +65,28 @@ public class MinecraftAssetService extends IMinecraftAssetService { MinecraftVersion mv = service.version().getVersionById(id); if (mv == null) return false; - return downloadMinecraftAssetsIndex(mv.assets); + return downloadMinecraftAssetsIndex(mv.getAssetsIndex()); } @Override - public boolean downloadMinecraftAssetsIndex(String assetsId) { - String aurl = service.getDownloadType().getProvider().getIndexesDownloadURL(); + public boolean downloadMinecraftAssetsIndex(AssetIndexDownloadInfo assets) { + String aurl = service.getDownloadType().getProvider().getIndexesDownloadURL() + assets.getId() + ".json"; + if (assets.url != null && service.getDownloadType().getProvider().isAllowedToUseSelfURL()) + aurl = assets.url; File assetsLocation = getAssets(); if (!assetsLocation.exists() && !assetsLocation.mkdirs()) HMCLog.warn("Failed to make directories: " + assetsLocation); - File assetsIndex = new File(assetsLocation, "indexes/" + assetsId + ".json"); + File assetsIndex = new File(assetsLocation, "indexes/" + assets.getId() + ".json"); File renamed = null; if (assetsIndex.exists()) { - renamed = new File(assetsLocation, "indexes/" + assetsId + "-renamed.json"); + renamed = new File(assetsLocation, "indexes/" + assets.getId() + "-renamed.json"); if (assetsIndex.renameTo(renamed)) HMCLog.warn("Failed to rename " + assetsIndex + " to " + renamed); } - if (TaskWindow.getInstance() - .addTask(new FileDownloadTask(aurl + assetsId + ".json", IOUtils.tryGetCanonicalFile(assetsIndex)).setTag(assetsId + ".json")) - .start()) { + if (TaskWindow.factory() + .append(new FileDownloadTask(aurl, IOUtils.tryGetCanonicalFile(assetsIndex), assets.sha1).setTag(assets.getId() + ".json")) + .create()) { if (renamed != null && !renamed.delete()) HMCLog.warn("Failed to delete " + renamed + ", maybe you should do it."); return true; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java index 161df5d54..523511578 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java @@ -21,11 +21,14 @@ import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftDownloadServ import com.google.gson.JsonSyntaxException; import java.io.File; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.core.GameException; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftService; +import org.jackhuang.hellominecraft.launcher.core.version.GameDownloadInfo; import org.jackhuang.hellominecraft.launcher.core.version.IMinecraftLibrary; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.util.tasks.TaskWindow; @@ -33,7 +36,7 @@ import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.OverridableSwingWorker; import org.jackhuang.hellominecraft.util.system.FileUtils; -import org.jackhuang.hellominecraft.util.system.IOUtils; +import org.jackhuang.hellominecraft.util.tasks.DoingDoneListener; import org.jackhuang.hellominecraft.util.tasks.Task; import org.jackhuang.hellominecraft.util.version.MinecraftRemoteVersion; import org.jackhuang.hellominecraft.util.version.MinecraftRemoteVersions; @@ -83,18 +86,50 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { if (mvj.exists() && !mvj.delete()) HMCLog.warn("Failed to delete " + mvj); - if (TaskWindow.getInstance() - .addTask(new FileDownloadTask(vurl + id + ".json", IOUtils.tryGetCanonicalFile(mvt)).setTag(id + ".json")) - .addTask(new FileDownloadTask(vurl + id + ".jar", IOUtils.tryGetCanonicalFile(mvj)).setTag(id + ".jar")) - .start()) - try { - return C.GSON.fromJson(FileUtils.readFileToStringQuietly(mvt), MinecraftVersion.class); - } catch (JsonSyntaxException ex) { - HMCLog.err("Failed to parse minecraft version json.", ex); + Task t = new FileDownloadTask(vurl + id + ".json", mvt).setTag(id + ".json"); + t.addTaskListener(new DoingDoneListener() { + @Override + public void onDone(Task k, Collection taskCollection) { + MinecraftVersion mv; + try { + mv = C.GSON.fromJson(FileUtils.readFileToStringQuietly(mvt), MinecraftVersion.class); + } catch (JsonSyntaxException ex) { + HMCLog.err("Failed to parse minecraft version json.", ex); + onFailed(k); + return; + } + String jarURL = vurl + id + ".jar", hash = null; + if (service.getDownloadType().getProvider().isAllowedToUseSelfURL() && mv.downloads != null) { + GameDownloadInfo gdi = mv.downloads.get("client"); + if (gdi != null) { + if (gdi.url != null) + jarURL = gdi.url; + if (gdi.sha1 != null) + hash = gdi.sha1; + } + } + + taskCollection.add(new FileDownloadTask(jarURL, mvj, hash).setTag(id + ".jar")); } - else - FileUtils.deleteDirectoryQuietly(vpath); - return null; + + @Override + public void onDoing(Task k, Collection taskCollection) { + } + + @Override + public void onFailed(Task k) { + FileUtils.deleteDirectoryQuietly(vpath); + } + }); + + if (!TaskWindow.factory().append(t).create()) + return null; + try { + return C.GSON.fromJson(FileUtils.readFileToStringQuietly(mvt), MinecraftVersion.class); + } catch (JsonSyntaxException ex) { + HMCLog.err("Failed to parse minecraft version json.", ex); + return null; + } } @Override @@ -110,9 +145,9 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { File mvt = new File(vpath, id + ".jar"); if (!vpath.exists() && !vpath.mkdirs()) HMCLog.warn("Failed to make version folder " + vpath); - if (TaskWindow.getInstance() - .addTask(new FileDownloadTask(vurl + id + ".jar", IOUtils.tryGetCanonicalFile(mvt)).setTag(id + ".jar")) - .start()) { + if (TaskWindow.factory() + .append(new FileDownloadTask(vurl + id + ".jar", mvt).setTag(id + ".jar")) + .create()) { if (moved != null && moved.exists() && !moved.delete()) HMCLog.warn("Failed to delete " + moved); return true; @@ -128,7 +163,7 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { @Override public Task downloadMinecraftJarTo(String id, File mvt) { String vurl = service.getDownloadType().getProvider().getVersionsDownloadURL() + id + "/"; - return new FileDownloadTask(vurl + id + ".jar", IOUtils.tryGetCanonicalFile(mvt)).setTag(id + ".jar"); + return new FileDownloadTask(vurl + id + ".jar", mvt).setTag(id + ".jar"); } @Override @@ -144,9 +179,9 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { File mvt = new File(vpath, id + ".json"); if (!vpath.exists() && !vpath.mkdirs()) HMCLog.warn("Failed to make version folder " + vpath); - if (TaskWindow.getInstance() - .addTask(new FileDownloadTask(vurl + id + ".json", IOUtils.tryGetCanonicalFile(mvt)).setTag(id + ".json")) - .start()) { + if (TaskWindow.factory() + .append(new FileDownloadTask(vurl + id + ".json", mvt).setTag(id + ".json")) + .create()) { if (moved != null && moved.exists() && !moved.delete()) HMCLog.warn("Failed to delete " + moved); return true; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java index 83efffb1d..c2ad29add 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/install/MinecraftInstallerService.java @@ -63,10 +63,10 @@ public final class MinecraftInstallerService extends IMinecraftInstallerService public void executeTask() { File filepath = IOUtils.tryGetCanonicalFile(IOUtils.currentDirWithSeparator() + "forge-installer.jar"); if (v.installer != null) - TaskWindow.getInstance() - .addTask(new FileDownloadTask(service.getDownloadType().getProvider().getParsedLibraryDownloadURL(v.installer), filepath).setTag("forge")) - .addTask(new ForgeInstaller(service, filepath)) - .start(); + TaskWindow.factory() + .append(new FileDownloadTask(service.getDownloadType().getProvider().getParsedLibraryDownloadURL(v.installer), filepath).setTag("forge")) + .append(new ForgeInstaller(service, filepath)) + .create(); } }; } @@ -79,10 +79,10 @@ public final class MinecraftInstallerService extends IMinecraftInstallerService 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(service, installId, v, filepath)) - .start(); + TaskWindow.factory().append(task) + .append(new FileDownloadTask(filepath).registerPreviousResult(task).setTag("optifine")) + .append(new OptiFineInstaller(service, installId, v, filepath)) + .create(); } } }; @@ -95,9 +95,9 @@ public final class MinecraftInstallerService extends IMinecraftInstallerService 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(service, installId, (LiteLoaderVersionList.LiteLoaderInstallerVersion) v).registerPreviousResult(task)) - .start(); + TaskWindow.factory() + .append(task).append(new LiteLoaderInstaller(service, installId, (LiteLoaderVersionList.LiteLoaderInstallerVersion) v).registerPreviousResult(task)) + .create(); } }; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/DefaultGameLauncher.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/DefaultGameLauncher.java index b27834797..ab9cdc4a2 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/DefaultGameLauncher.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/DefaultGameLauncher.java @@ -39,14 +39,14 @@ public class DefaultGameLauncher extends GameLauncher { private void register() { downloadLibrariesEvent.register((sender, t) -> { - final TaskWindow.TaskWindowFactory dw = TaskWindow.getInstance(); + final TaskWindow.TaskWindowFactory dw = TaskWindow.factory(); ParallelTask parallelTask = new ParallelTask(); for (DownloadLibraryJob s : t) parallelTask.addDependsTask(new LibraryDownloadTask(s)); - dw.addTask(parallelTask); + dw.append(parallelTask); boolean flag = true; if (t.size() > 0) - flag = dw.start(); + flag = dw.create(); if (!flag && MessageBox.Show(C.i18n("launch.not_finished_downloading_libraries"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) flag = true; return flag; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/LaunchOptions.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/LaunchOptions.java index 11bcf309e..e95c5a885 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/LaunchOptions.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/LaunchOptions.java @@ -29,7 +29,7 @@ import org.jackhuang.hellominecraft.util.system.JdkVersion; public class LaunchOptions { private String name, versionName, javaArgs, minecraftArgs, maxMemory, permSize, width, height, serverIp; - private String proxyHost, proxyPort, proxyUser, proxyPass, javaDir, launchVersion; + private String proxyHost, proxyPort, proxyUser, proxyPass, javaDir, launchVersion, type, precalledCommand; private boolean fullscreen, debug, noJVMArgs, canceledWrapper; private JdkVersion java; private File gameDir; @@ -207,8 +207,6 @@ public class LaunchOptions { this.proxyPass = proxyPass; } - private String precalledCommand; - public String getPrecalledCommand() { return precalledCommand; } @@ -224,4 +222,12 @@ public class LaunchOptions { public void setLaunchVersion(String launchVersion) { this.launchVersion = launchVersion; } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/MinecraftLoader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/MinecraftLoader.java index e194b54d6..8cc41a6fb 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/MinecraftLoader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/launch/MinecraftLoader.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; -import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.core.GameException; import org.jackhuang.hellominecraft.launcher.core.auth.UserProfileProvider; import org.jackhuang.hellominecraft.util.system.IOUtils; @@ -72,7 +71,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { if (!checkAssetsExist()) if (MessageBox.Show(C.i18n("assets.no_assets"), MessageBox.YES_NO_OPTION) == MessageBox.YES_OPTION) { IAssetsHandler.ASSETS_HANDLER.getList(version, service.asset()).run(); - TaskWindow.getInstance().addTask(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(service.getDownloadType().getProvider())).start(); + TaskWindow.factory().append(IAssetsHandler.ASSETS_HANDLER.getDownloadTask(service.getDownloadType().getProvider())).create(); } String game_assets = reconstructAssets().getAbsolutePath(); @@ -81,14 +80,15 @@ public class MinecraftLoader extends AbstractMinecraftLoader { t = t.replace("${auth_player_name}", lr.getUserName()); t = t.replace("${auth_session}", lr.getSession()); t = t.replace("${auth_uuid}", lr.getUserId()); - t = t.replace("${version_name}", Main.makeTitle()); + t = t.replace("${version_name}", options.getVersionName()); t = t.replace("${profile_name}", options.getName()); + t = t.replace("${version_type}", options.getType()); t = t.replace("${game_directory}", service.version().getRunDirectory(version.id).getAbsolutePath()); t = t.replace("${game_assets}", game_assets); t = t.replace("${assets_root}", service.asset().getAssets().getAbsolutePath()); t = t.replace("${auth_access_token}", lr.getAccessToken()); t = t.replace("${user_type}", lr.getUserType()); - t = t.replace("${assets_index_name}", version.getAssets()); + t = t.replace("${assets_index_name}", version.getAssetsIndex().getId()); t = t.replace("${user_properties}", lr.getUserProperties()); res.add(t); } @@ -105,7 +105,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { try { if (OS.os() == OS.OSX) { - list.add("-Xdock:icon=" + service.asset().getAssetObject(version.assets, "icons/minecraft.icns").getAbsolutePath()); + list.add("-Xdock:icon=" + service.asset().getAssetObject(version.getAssetsIndex().getId(), "icons/minecraft.icns").getAbsolutePath()); list.add("-Xdock:name=Minecraft"); } } catch (IOException e) { @@ -117,7 +117,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { File assetsDir = new File(service.baseDirectory(), "assets"); File indexDir = new File(assetsDir, "indexes"); File objectDir = new File(assetsDir, "objects"); - File indexFile = new File(indexDir, version.getAssets() + ".json"); + File indexFile = new File(indexDir, version.getAssetsIndex().getId() + ".json"); if (!assetsDir.exists() && !indexFile.isFile()) return false; @@ -140,7 +140,7 @@ public class MinecraftLoader extends AbstractMinecraftLoader { File assetsDir = new File(service.baseDirectory(), "assets"); File indexDir = new File(assetsDir, "indexes"); File objectDir = new File(assetsDir, "objects"); - String assetVersion = version.getAssets(); + String assetVersion = version.getAssetsIndex().getId(); File indexFile = new File(indexDir, assetVersion + ".json"); File virtualRoot = new File(new File(assetsDir, "virtual"), assetVersion); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftAssetService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftAssetService.java index a475f033c..5a7326f6b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftAssetService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftAssetService.java @@ -19,6 +19,7 @@ package org.jackhuang.hellominecraft.launcher.core.service; import java.io.File; import java.io.IOException; +import org.jackhuang.hellominecraft.launcher.core.version.AssetIndexDownloadInfo; import org.jackhuang.hellominecraft.util.tasks.Task; /** @@ -44,7 +45,7 @@ public abstract class IMinecraftAssetService extends IMinecraftBasicService { */ public abstract boolean refreshAssetsIndex(String a); - public abstract boolean downloadMinecraftAssetsIndex(String assetsId); + public abstract boolean downloadMinecraftAssetsIndex(AssetIndexDownloadInfo assetsId); public abstract File getAssetObject(String assetVersion, String name) throws IOException; } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/AssetIndexDownloadInfo.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/AssetIndexDownloadInfo.java new file mode 100644 index 000000000..1a4cbf88a --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/AssetIndexDownloadInfo.java @@ -0,0 +1,44 @@ +/* + * 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.hellominecraft.launcher.core.version; + +/** + * + * @author huangyuhui + */ +public class AssetIndexDownloadInfo extends GameDownloadInfo { + + String id; + int totalSize; + + public AssetIndexDownloadInfo() { + } + + public AssetIndexDownloadInfo(String id) { + this.id = id; + url = null; + } + + public String getId() { + return id; + } + + public int getTotalSize() { + return totalSize; + } +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/GameDownloadInfo.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/GameDownloadInfo.java new file mode 100644 index 000000000..62581e598 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/GameDownloadInfo.java @@ -0,0 +1,29 @@ +/* + * 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.hellominecraft.launcher.core.version; + +/** + * + * @author huangyuhui + */ +public class GameDownloadInfo { + + public String sha1, url; + public int size; + +} diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersion.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersion.java index d9202b59c..fd7ae889b 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersion.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersion.java @@ -21,12 +21,14 @@ import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.launcher.core.GameException; import org.jackhuang.hellominecraft.launcher.core.service.IMinecraftProvider; import org.jackhuang.hellominecraft.launcher.core.asset.AssetsIndex; import org.jackhuang.hellominecraft.util.ArrayUtils; +import org.jackhuang.hellominecraft.util.Utils; /** * @@ -35,9 +37,12 @@ import org.jackhuang.hellominecraft.util.ArrayUtils; public class MinecraftVersion implements Cloneable, Comparable { public String minecraftArguments, mainClass, time, id, type, processArguments, - releaseTime, assets, jar, inheritsFrom, runDir; + releaseTime, jar, inheritsFrom, runDir; + protected String assets; public int minimumLauncherVersion; public boolean hidden; + public AssetIndexDownloadInfo assetIndex; + public Map downloads; public ArrayList libraries; @@ -127,12 +132,14 @@ public class MinecraftVersion implements Cloneable, Comparable return true; } - public String getAssets() { - return assets == null ? AssetsIndex.DEFAULT_ASSET_NAME : assets; - } - @Override public int compareTo(MinecraftVersion o) { return id.compareTo(o.id); } + + public AssetIndexDownloadInfo getAssetsIndex() { + if (assetIndex == null) + assetIndex = new AssetIndexDownloadInfo((String) Utils.firstNonNull(assets, AssetsIndex.DEFAULT_ASSET_NAME)); + return assetIndex; + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java index 266402291..54a351a45 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/version/MinecraftVersionManager.java @@ -291,6 +291,6 @@ public class MinecraftVersionManager extends IMinecraftProvider { public void downloadModpack(String url) throws IOException { File tmp = File.createTempFile("hmcl", ".zip"); - TaskWindow.getInstance().addTask(new FileDownloadTask(url, tmp)).addTask(new DecompressTask(tmp, service.baseDirectory())).start(); + TaskWindow.factory().append(new FileDownloadTask(IOUtils.parseURL(url), tmp)).append(new DecompressTask(tmp, service.baseDirectory())).create(); } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/VersionSetting.java index 55c9e2d6e..28c8038db 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/VersionSetting.java @@ -287,6 +287,7 @@ public class VersionSetting { x.setMaxMemory(getMaxMemory()); x.setMinecraftArgs(getMinecraftArgs()); x.setName(Main.makeTitle()); + x.setType(Main.makeTitle()); x.setNoJVMArgs(isNoJVMArgs()); x.setPermSize(getPermSize()); x.setPrecalledCommand(getPrecalledCommand()); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java index 81a9c2090..bcb61a787 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java @@ -123,9 +123,9 @@ public class InstallerPanel extends AnimatedPanel { InstallerType id; void refreshVersions() { - if (TaskWindow.getInstance().addTask(new TaskRunnableArg1<>(C.i18n("install." + id.id + ".get_list"), list) + if (TaskWindow.factory().append(new TaskRunnableArg1<>(C.i18n("install." + id.id + ".get_list"), list) .registerPreviousResult(new DefaultPreviousResult<>(new String[] { gsp.getMinecraftVersionFormatted() }))) - .start()) + .create()) loadVersions(); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java index 577bbb53b..dae7c7eb3 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java @@ -373,7 +373,7 @@ public class MainPagePanel extends AnimatedPanel { if (fc.getSelectedFile() == null) return; String suggestedModpackId = JOptionPane.showInputDialog("Please enter your favourite game name", FileUtils.getBaseName(fc.getSelectedFile().getName())); - TaskWindow.getInstance().addTask(ModpackManager.install(fc.getSelectedFile(), getProfile().service(), suggestedModpackId)).start(); + TaskWindow.factory().append(ModpackManager.install(fc.getSelectedFile(), getProfile().service(), suggestedModpackId)).create(); loadMinecraftVersions(); }//GEN-LAST:event_btnImportModpackActionPerformed diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java index 96704998f..66e9eab3d 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/AppDataUpgrader.java @@ -98,7 +98,7 @@ public class AppDataUpgrader extends IUpgrader { ((UpdateChecker) sender).requestDownloadLink().reg(map -> { if (map != null && map.containsKey("pack")) try { - if (TaskWindow.getInstance().addTask(new AppDataUpgraderTask(map.get("pack"), number.version)).start()) { + if (TaskWindow.factory().append(new AppDataUpgraderTask(map.get("pack"), number.version)).create()) { new ProcessBuilder(new String[] { IOUtils.getJavaDir(), "-jar", AppDataUpgraderTask.getSelf(number.version).getAbsolutePath() }).directory(new File(".")).start(); System.exit(0); } @@ -147,7 +147,7 @@ public class AppDataUpgrader extends IUpgrader { } @Override - public Collection getDependTasks() { + public Collection getDependTasks() { return Arrays.asList(new FileDownloadTask(downloadLink, tempFile)); } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/NewFileUpgrader.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/NewFileUpgrader.java index dc0bebee4..5c07d76de 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/NewFileUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/util/upgrade/NewFileUpgrader.java @@ -48,7 +48,7 @@ public class NewFileUpgrader extends IUpgrader { public boolean call(Object sender, VersionNumber number) { String str = requestDownloadLink(); File newf = new File(FileUtils.getName(str)); - if (TaskWindow.getInstance().addTask(new FileDownloadTask(str, newf)).start()) { + if (TaskWindow.factory().append(new FileDownloadTask(str, newf)).create()) { try { new ProcessBuilder(new String[] { IOUtils.tryGetCanonicalFilePath(newf), "--removeOldLauncher", IOUtils.getRealPath() }).directory(new File(".")).start(); } catch (IOException ex) { diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/Utils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/Utils.java index 068af9707..e7cc4e546 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/Utils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/Utils.java @@ -151,4 +151,11 @@ public final class Utils { if (o == null) throw new NullPointerException("Oh dear, there is a problem..."); } + + public static Object firstNonNull(Object... o) { + for (Object s : o) + if (s != null) + return s; + return null; + } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoingDoneListener.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoingDoneListener.java index 016b8ae95..213855d0d 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoingDoneListener.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/DoingDoneListener.java @@ -17,6 +17,8 @@ */ package org.jackhuang.hellominecraft.util.tasks; +import java.util.Collection; + /** * * @author huangyuhui @@ -28,14 +30,14 @@ public interface DoingDoneListener { * * @param k */ - void onDone(K k); + void onDone(K k, Collection tasks); /** * Before task executing. * * @param k */ - void onDoing(K k); + void onDoing(K k, Collection tasks); /** * Task failed. diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/Task.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/Task.java index f9dfbe98c..d98c1ef69 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/Task.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/Task.java @@ -87,11 +87,11 @@ public abstract class Task { public abstract String getInfo(); - public Collection getDependTasks() { + public Collection getDependTasks() { return null; } - public Collection getAfterTasks() { + public Collection getAfterTasks() { return null; } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java index 7c586357d..c6c3a4565 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskList.java @@ -88,7 +88,7 @@ public class TaskList extends Thread { static final Set TASK_POOL = Collections.synchronizedSet(new HashSet()); private void processTasks(Collection c) { - if (c == null) + if (c == null || c.isEmpty()) return; this.totTask += c.size(); Set runningThread = Collections.synchronizedSet(new HashSet()); @@ -112,13 +112,16 @@ public class TaskList extends Thread { private void executeTask(Task t) { if (!shouldContinue || t == null) return; - processTasks(t.getDependTasks()); + Collection c = t.getDependTasks(); + if (c == null) + c = new HashSet<>(); HMCLog.log("Executing task: " + t.getInfo()); for (DoingDoneListener d : taskListener) - d.onDoing(t); + d.onDoing(t, c); for (DoingDoneListener d : t.getTaskListeners()) - d.onDoing(t); + d.onDoing(t, c); + processTasks(c); boolean flag = true; try { @@ -129,11 +132,14 @@ public class TaskList extends Thread { } if (flag) { HMCLog.log((t.isAborted() ? "Task aborted: " : "Task finished: ") + t.getInfo()); + Collection at = t.getAfterTasks(); + if (at == null) + at = new HashSet<>(); for (DoingDoneListener d : taskListener) - d.onDone(t); + d.onDone(t, at); for (DoingDoneListener d : t.getTaskListeners()) - d.onDone(t); - processTasks(t.getAfterTasks()); + d.onDone(t, at); + processTasks(at); } else { HMCLog.err("Task failed: " + t.getInfo(), t.getFailReason()); for (DoingDoneListener d : taskListener) diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java index 97e86ce95..27c22b1a8 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/TaskWindow.java @@ -18,6 +18,7 @@ package org.jackhuang.hellominecraft.util.tasks; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedList; import javax.swing.SwingUtilities; import org.jackhuang.hellominecraft.util.C; @@ -35,12 +36,12 @@ public class TaskWindow extends javax.swing.JDialog private static final TaskWindow INSTANCE = new TaskWindow(); - private static TaskWindow inst() { + private static TaskWindow instance() { INSTANCE.clean(); return INSTANCE; } - public static TaskWindowFactory getInstance() { + public static TaskWindowFactory factory() { return new TaskWindowFactory(); } @@ -225,7 +226,7 @@ public class TaskWindow extends javax.swing.JDialog } @Override - public void onDoing(Task task) { + public void onDoing(Task task, Collection taskCollection) { if (task == null) return; task.setProgressProviderListener(this); @@ -245,7 +246,7 @@ public class TaskWindow extends javax.swing.JDialog } @Override - public void onDone(Task task) { + public void onDone(Task task, Collection taskCollection) { SwingUtilities.invokeLater(() -> { if (taskList == null || task == null) return; @@ -299,18 +300,18 @@ public class TaskWindow extends javax.swing.JDialog LinkedList ll = new LinkedList<>(); boolean flag; - public TaskWindowFactory addTask(Task t) { + public TaskWindowFactory append(Task t) { ll.add(t); return this; } - public boolean start() { + public boolean create() { String stacktrace = StrUtils.getStackTrace(new Throwable()); return SwingUtils.invokeAndWait(() -> { synchronized (INSTANCE) { if (INSTANCE.isVisible()) return false; - TaskWindow tw = inst(); + TaskWindow tw = instance(); for (Task t : ll) tw.addTask(t); tw.lastStackTrace = tw.stackTrace; diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java index 9ab889ee9..6b42f96fd 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java @@ -21,10 +21,13 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; +import java.math.BigInteger; import java.net.HttpURLConnection; import java.net.URL; +import java.security.MessageDigest; import java.util.ArrayList; import org.jackhuang.hellominecraft.util.C; +import org.jackhuang.hellominecraft.util.code.DigestUtils; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.tasks.Task; import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResult; @@ -44,6 +47,7 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev protected URL url; // download URL protected int downloaded = 0; // number of bytes downloaded protected File filePath; + protected String expectedHash; public FileDownloadTask() { } @@ -56,10 +60,18 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev this(IOUtils.parseURL(url), filePath); } - // Constructor for Download. public FileDownloadTask(URL url, File filePath) { + this(url, filePath, null); + } + + public FileDownloadTask(String url, File filePath, String hash) { + this(IOUtils.parseURL(url), filePath, hash); + } + + public FileDownloadTask(URL url, File file, String hash) { this.url = url; - this.filePath = filePath; + this.filePath = file; + this.expectedHash = hash; } // Get this download's URL. @@ -130,6 +142,8 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev // Open file and seek to the end of it. file = new RandomAccessFile(tempFile, "rw"); + MessageDigest digest = DigestUtils.getSha1Digest(); + stream = connection.getInputStream(); int lastDownloaded = 0; downloaded = 0; @@ -149,6 +163,8 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev if (read == -1) break; + digest.update(buffer, 0, read); + // Write buffer to file. file.write(buffer, 0, read); downloaded += read; @@ -169,6 +185,10 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev filePath.delete(); tempFile.renameTo(filePath); } + String hashCode = String.format("%1$040x", new Object[] { new BigInteger(1, digest.digest()) }); + if (expectedHash != null && !expectedHash.equals(hashCode)) + throw new IllegalStateException("Unexpected hash code: " + hashCode + ", expected: " + expectedHash); + if (ppl != null) ppl.onProgressProviderDone(this); return; diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java index 5ceded14c..3c01366cb 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java @@ -87,22 +87,22 @@ public class ForgeInstaller { File minecraftserver = new File(gameDir, "minecraft_server." + profile.install.minecraft + ".jar"); if (minecraftserver.exists() && JOptionPane.showConfirmDialog(null, "已发现官方服务端文件,是否要重新下载?") == JOptionPane.YES_OPTION) - if (!TaskWindow.getInstance().addTask(new FileDownloadTask("https://s3.amazonaws.com/Minecraft.Download/versions/{MCVER}/minecraft_server.{MCVER}.jar".replace("{MCVER}", profile.install.minecraft), - minecraftserver).setTag("minecraft_server")).start()) + if (!TaskWindow.factory().append(new FileDownloadTask("https://s3.amazonaws.com/Minecraft.Download/versions/{MCVER}/minecraft_server.{MCVER}.jar".replace("{MCVER}", profile.install.minecraft), + minecraftserver).setTag("minecraft_server")).create()) MessageBox.Show("Minecraft官方服务端下载失败!"); - TaskWindow.TaskWindowFactory tw = TaskWindow.getInstance(); + TaskWindow.TaskWindowFactory tw = TaskWindow.factory(); for (MinecraftLibrary library : profile.versionInfo.libraries) { library.init(); File lib = new File(gameDir, "libraries" + File.separator + library.formatted + ".pack.xz"); String libURL = "https://libraries.minecraft.net/"; if (StrUtils.isNotBlank(library.url)) libURL = library.url; - tw.addTask(new FileDownloadTask(libURL + library.formatted.replace("\\", "/"), lib).setTag(library.name)); + tw.append(new FileDownloadTask(libURL + library.formatted.replace("\\", "/"), lib).setTag(library.name)); } - if (!tw.start()) + if (!tw.create()) MessageBox.Show("压缩库下载失败!"); - tw = TaskWindow.getInstance(); + tw = TaskWindow.factory(); for (MinecraftLibrary library : profile.versionInfo.libraries) { File packxz = new File(gameDir, "libraries" + File.separator + library.formatted + ".pack.xz"); if (packxz.exists()) @@ -112,9 +112,9 @@ public class ForgeInstaller { String libURL = "https://libraries.minecraft.net/"; if (StrUtils.isNotBlank(library.url)) libURL = library.url; - tw.addTask(new FileDownloadTask(libURL + library.formatted.replace("\\", "/"), lib).setTag(library.name)); + tw.append(new FileDownloadTask(libURL + library.formatted.replace("\\", "/"), lib).setTag(library.name)); } - if (!tw.start()) + if (!tw.create()) MessageBox.Show("库下载失败!"); ArrayList badLibs = new ArrayList<>(); diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java index 1b4d03394..d5a492840 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java @@ -2994,7 +2994,7 @@ public final class MainWindow extends javax.swing.JFrame void refreshDownloads() { clearListDownloads(); - TaskWindow.getInstance().addTask(new RefreshDownloadsDone()).start(); + TaskWindow.factory().append(new RefreshDownloadsDone()).create(); } void refreshInfos() { @@ -3716,7 +3716,7 @@ public final class MainWindow extends javax.swing.JFrame serverjar.delete(); String downloadURL = url + "minecraft_server." + id + ".jar"; - TaskWindow.getInstance().addTask(new FileDownloadTask(downloadURL, serverjar).setTag(id)).start(); + TaskWindow.factory().append(new FileDownloadTask(downloadURL, serverjar).setTag(id)).create(); }//GEN-LAST:event_btnMinecraftServerDownloadActionPerformed private void btnRefreshInfosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshInfosActionPerformed @@ -3850,8 +3850,8 @@ public final class MainWindow extends javax.swing.JFrame } BukkitVersion v = cb.get(idx); File file = new File(IOUtils.currentDir(), "craftbukkit-" + ext + "-" + v.version + ".jar"); - TaskWindow.getInstance().addTask(new FileDownloadTask(v.downloadLink, IOUtils.tryGetCanonicalFile(file)).setTag("bukkit-" + ext + "-" + v.version)) - .start(); + TaskWindow.factory().append(new FileDownloadTask(v.downloadLink, IOUtils.tryGetCanonicalFile(file)).setTag("bukkit-" + ext + "-" + v.version)) + .create(); }//GEN-LAST:event_btnDownloadCraftbukkitActionPerformed private void btnDownloadMCPCActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDownloadMCPCActionPerformed @@ -3862,7 +3862,7 @@ public final class MainWindow extends javax.swing.JFrame String url; File filepath = new File(IOUtils.currentDir(), "forge-installer.jar"); url = v.installer[1]; - if (!TaskWindow.getInstance().addTask(new FileDownloadTask(url, filepath).setTag("cauldron-" + v.ver)).start()) + if (!TaskWindow.factory().append(new FileDownloadTask(url, filepath).setTag("cauldron-" + v.ver)).create()) MessageBox.Show(C.i18n("install.failed_download_forge")); else installMCPC(filepath); diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/PluginInfoDialog.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/PluginInfoDialog.java index 9dea85f3f..02f69435c 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/PluginInfoDialog.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/PluginInfoDialog.java @@ -231,10 +231,10 @@ public class PluginInfoDialog extends javax.swing.JDialog { if (index == -1) return; String url = pi.versions.get(index).download; - TaskWindow.getInstance() - .addTask(new FileDownloadTask(url, new File(Utilities.getGameDir() + "plugins" + TaskWindow.factory() + .append(new FileDownloadTask(url, new File(Utilities.getGameDir() + "plugins" + File.separator + pi.versions.get(index).filename))) - .start(); + .create(); }//GEN-LAST:event_jButton1ActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables