From b200105a8564147743adfb9f89f3e4a375a5a723 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Tue, 6 Mar 2018 10:13:48 +0800 Subject: [PATCH] Fix Liteloader installing of BMCLAPI --- .../hmcl/setting/DownloadProviders.java | 2 +- .../resources/assets/lang/I18N.properties | 6 +- .../assets/lang/I18N_zh_CN.properties | 6 +- .../jackhuang/hmcl/auth/AccountBuilder.java | 61 +++++++++ .../download/BMCLAPIDownloadProvider.java | 25 ++-- .../download/CurseCDNDownloadProvider.java | 4 - .../hmcl/download/MojangDownloadProvider.java | 16 --- .../liteloader/LiteLoaderBMCLVersionList.java | 121 ++++++++++++++++++ .../optifine/OptiFineBMCLVersionList.java | 4 +- README.md | 14 +- 10 files changed, 215 insertions(+), 44 deletions(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountBuilder.java create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java index 8b38c133f..b345c4ace 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/DownloadProviders.java @@ -28,7 +28,7 @@ import java.util.List; public final class DownloadProviders { private DownloadProviders() {} - public static final List DOWNLOAD_PROVIDERS = Lang.immutableListOf(new MojangDownloadProvider(Settings.INSTANCE.getLocale() == Locales.ZH_CN), BMCLAPIDownloadProvider.INSTANCE, CurseCDNDownloadProvider.INSTANCE); + public static final List DOWNLOAD_PROVIDERS = Lang.immutableListOf(new MojangDownloadProvider(), BMCLAPIDownloadProvider.INSTANCE, CurseCDNDownloadProvider.INSTANCE); public static DownloadProvider getDownloadProvider(int index) { return Lang.get(DOWNLOAD_PROVIDERS, index).orElse(DOWNLOAD_PROVIDERS.get(0)); diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 54a07b9e1..2a522755f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -20,7 +20,7 @@ about.copyright.statement=Copyright (c) 2018 huangyuhui. about.author=Author about.author.statement=huanghongxun (MCF: klkl6523) about.thanks_to=Thanks to -about.thanks_to.statement=bangbang93 (BMCLAPI, http://bmclapi.bangbang93.com/)\ngamerteam (Default background image)\nAll contributors. +about.thanks_to.statement=bangbang93 (BMCLAPI, http://bmclapi2.bangbang93.com/)\ngamerteam (Default background image)\nAll contributors. about.dependency=Dependency about.dependency.statement=Gson (Google, Apache License 2.0)\nCommons Compress (Apache, Apache License 2.0) about.claim=Statement @@ -57,7 +57,7 @@ archive.author=Authors archive.game_version=Game archive.version=Version -assets.download=Download Assets +assets.download=Check for the completion of assets assets.download_all=Download Assets Files assets.failed=Failed to get the list, try again. assets.failed_download=Failed to download assets, may cause no sounds and language files. @@ -112,7 +112,7 @@ crash.minecraft=Minecraft has crashed! crash.user_fault=Your OS or Java environment may not be properly installed resulting in crashing of this software, please check your Java Environment or your computer! download=Download -download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) +download.BMCL=BMCLAPI (bangbang93, http://bmclapi2.bangbang93.com/) download.failed=Failed to download download.failed.refresh=Unable to load version list. Click here to retry. download.mojang=Mojang diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 0f0ab104e..d6e00a13f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -20,7 +20,7 @@ about.copyright.statement=Copyright (c) 2018 huangyuhui. about.author=作者 about.author.statement=huanghongxun (百度贴吧:huanghongxun20) about.thanks_to=鸣谢 -about.thanks_to.statement=bangbang93 (BMCLAPI, http://bmclapi.bangbang93.com/)\ngamerteam (默认背景图)\n所有参与本项目,issue,pull requests的贡献者 +about.thanks_to.statement=bangbang93 (BMCLAPI, http://bmclapi2.bangbang93.com/)\ngamerteam (默认背景图)\n所有参与本项目,issue,pull requests的贡献者 about.dependency=依赖 about.dependency.statement=Gson (Google, Apache License 2.0)\nCommons Compress (Apache, Apache License 2.0) about.claim=免责声明 @@ -57,7 +57,7 @@ archive.author=作者 archive.game_version=游戏版本 archive.version=版本 -assets.download=下载资源 +assets.download=检查资源文件完整性 assets.download_all=下载资源文件 assets.failed=获取列表失败,请刷新重试。 assets.failed_download=下载资源文件失败,可能导致没有中文和声音。 @@ -112,7 +112,7 @@ crash.minecraft=Minecraft崩溃了!请认真阅读建议。 crash.user_fault=您的系统或Java环境可能安装不当导致本软件崩溃,请检查您的Java环境或您的电脑!可以尝试重新安装Java。 download=下载 -download.BMCL=BMCLAPI (bangbang93, http://bmclapi.bangbang93.com/) +download.BMCL=BMCLAPI (bangbang93, http://bmclapi2.bangbang93.com/) download.failed=下载失败 download.failed.refresh=加载版本列表失败,点击此处重试。 download.mojang=官方 diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountBuilder.java new file mode 100644 index 000000000..c9dbf3450 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/AccountBuilder.java @@ -0,0 +1,61 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2017 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.auth; + +import java.net.Proxy; +import java.util.Objects; + +public final class AccountBuilder { + private CharacterSelector selector = CharacterSelector.DEFAULT; + private String username; + private String password = null; + private Object additionalData = null; + private Proxy proxy = Proxy.NO_PROXY; + + public AccountBuilder() { + } + + public AccountBuilder setSelector(CharacterSelector selector) { + this.selector = Objects.requireNonNull(selector); + return this; + } + + public AccountBuilder setUsername(String username) { + this.username = Objects.requireNonNull(username); + return this; + } + + public AccountBuilder setPassword(String password) { + this.password = password; + return this; + } + + public AccountBuilder setAdditionalData(Object additionalData) { + this.additionalData = additionalData; + return this; + } + + public AccountBuilder setProxy(Proxy proxy) { + this.proxy = Objects.requireNonNull(proxy); + return this; + } + + public T create(AccountFactory factory) throws AuthenticationException { + return factory.create(selector, Objects.requireNonNull(username), password, additionalData, proxy); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java index 36ae08186..baaa0f15f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java @@ -19,6 +19,7 @@ package org.jackhuang.hmcl.download; import org.jackhuang.hmcl.download.forge.ForgeVersionList; import org.jackhuang.hmcl.download.game.GameVersionList; +import org.jackhuang.hmcl.download.liteloader.LiteLoaderBMCLVersionList; import org.jackhuang.hmcl.download.liteloader.LiteLoaderVersionList; import org.jackhuang.hmcl.download.optifine.OptiFineBMCLVersionList; @@ -35,27 +36,27 @@ public class BMCLAPIDownloadProvider implements DownloadProvider { @Override public String getLibraryBaseURL() { - return "https://bmclapi2.bangbang93.com/libraries/"; + return "http://bmclapi2.bangbang93.com/libraries/"; } @Override public String getVersionListURL() { - return "https://bmclapi2.bangbang93.com/mc/game/version_manifest.json"; + return "http://bmclapi2.bangbang93.com/mc/game/version_manifest.json"; } @Override public String getVersionBaseURL() { - return "https://bmclapi2.bangbang93.com/versions/"; + return "http://bmclapi2.bangbang93.com/versions/"; } @Override public String getAssetIndexBaseURL() { - return "https://bmclapi2.bangbang93.com/indexes/"; + return "http://bmclapi2.bangbang93.com/indexes/"; } @Override public String getAssetBaseURL() { - return "https://bmclapi2.bangbang93.com/assets/"; + return "http://bmclapi2.bangbang93.com/assets/"; } @Override @@ -66,7 +67,7 @@ public class BMCLAPIDownloadProvider implements DownloadProvider { case "forge": return ForgeVersionList.INSTANCE; case "liteloader": - return LiteLoaderVersionList.INSTANCE; + return LiteLoaderBMCLVersionList.INSTANCE; case "optifine": return OptiFineBMCLVersionList.INSTANCE; default: @@ -77,12 +78,12 @@ public class BMCLAPIDownloadProvider implements DownloadProvider { @Override public String injectURL(String baseURL) { return baseURL - .replace("https://launchermeta.mojang.com", "https://bmclapi2.bangbang93.com") - .replace("https://launcher.mojang.com", "https://bmclapi2.bangbang93.com") - .replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries") - .replaceFirst("https?://files\\.minecraftforge\\.net/maven", "https://bmclapi2.bangbang93.com/maven") - .replace("http://dl.liteloader.com/versions/versions.json", "https://bmclapi2.bangbang93.com/maven/com/mumfrey/liteloader/versions.json") - .replace("http://dl.liteloader.com/versions", "https://bmclapi2.bangbang93.com/maven"); + .replace("https://launchermeta.mojang.com", "http://bmclapi2.bangbang93.com") + .replace("https://launcher.mojang.com", "http://bmclapi2.bangbang93.com") + .replace("https://libraries.minecraft.net", "http://bmclapi2.bangbang93.com/libraries") + .replaceFirst("https?://files\\.minecraftforge\\.net/maven", "http://bmclapi2.bangbang93.com/maven") + .replace("http://dl.liteloader.com/versions/versions.json", "http://bmclapi2.bangbang93.com/maven/com/mumfrey/liteloader/versions.json") + .replace("http://dl.liteloader.com/versions", "http://bmclapi2.bangbang93.com/maven"); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/CurseCDNDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/CurseCDNDownloadProvider.java index ece53bf94..f40c839d2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/CurseCDNDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/CurseCDNDownloadProvider.java @@ -20,10 +20,6 @@ package org.jackhuang.hmcl.download; public class CurseCDNDownloadProvider extends MojangDownloadProvider { public static final CurseCDNDownloadProvider INSTANCE = new CurseCDNDownloadProvider(); - protected CurseCDNDownloadProvider() { - super(false); - } - @Override public String injectURL(String baseURL) { return baseURL == null ? null : baseURL.replaceFirst("https?://files\\.minecraftforge\\.net/maven", "https://ftb.cursecdn.com/FTB2/maven"); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java index e725f3fab..db67d0e30 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java @@ -28,12 +28,6 @@ import org.jackhuang.hmcl.download.optifine.OptiFineVersionList; */ public class MojangDownloadProvider implements DownloadProvider { - private final boolean isChina; - - public MojangDownloadProvider(boolean isChina) { - this.isChina = isChina; - } - @Override public String getLibraryBaseURL() { return "https://libraries.minecraft.net/"; @@ -77,16 +71,6 @@ public class MojangDownloadProvider implements DownloadProvider { @Override public String injectURL(String baseURL) { - if (baseURL == null) - return null; - //else if (baseURL.contains("scala-swing") || baseURL.contains("scala-xml") || baseURL.contains("scala-parser-combinators")) - // return baseURL.replaceFirst("https?://files\\.minecraftforge\\.net/maven", "https://bmclapi2.bangbang93.com/maven"); - /*else if (baseURL.contains("typesafe") || baseURL.contains("scala")) - if (isChina) - return baseURL.replaceFirst("https?://files\\.minecraftforge\\.net/maven", "http://maven.aliyun.com/nexus/content/groups/public"); - else - return baseURL.replaceFirst("https?://files\\.minecraftforge\\.net/maven", "https://repo1.maven.org/maven2"); - */else return baseURL; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java new file mode 100644 index 000000000..d60674e25 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java @@ -0,0 +1,121 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.download.liteloader; + +import org.jackhuang.hmcl.download.DownloadProvider; +import org.jackhuang.hmcl.download.VersionList; +import org.jackhuang.hmcl.task.GetTask; +import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.util.Constants; +import org.jackhuang.hmcl.util.NetworkUtils; +import org.jackhuang.hmcl.util.VersionNumber; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +/** + * + * @author huangyuhui + */ +public final class LiteLoaderBMCLVersionList extends VersionList { + + public static final LiteLoaderBMCLVersionList INSTANCE = new LiteLoaderBMCLVersionList(); + + private LiteLoaderBMCLVersionList() { + } + + @Override + public Task refreshAsync(DownloadProvider downloadProvider) { + GetTask task = new GetTask(NetworkUtils.toURL(downloadProvider.injectURL(LITELOADER_LIST))); + return new Task() { + @Override + public Collection getDependents() { + return Collections.singleton(task); + } + + @Override + public void execute() { + lock.writeLock().lock(); + + try { + LiteLoaderVersionsRoot root = Constants.GSON.fromJson(task.getResult(), LiteLoaderVersionsRoot.class); + versions.clear(); + + for (Map.Entry entry : root.getVersions().entrySet()) { + String gameVersion = entry.getKey(); + LiteLoaderGameVersions liteLoader = entry.getValue(); + Optional gg = VersionNumber.parseVersion(gameVersion); + if (!gg.isPresent()) + continue; + doBranch(gg.get(), gameVersion, liteLoader.getRepoitory(), liteLoader.getArtifacts(), false); + doBranch(gg.get(), gameVersion, liteLoader.getRepoitory(), liteLoader.getSnapshots(), true); + } + } finally { + lock.writeLock().unlock(); + } + } + + private void doBranch(String key, String gameVersion, LiteLoaderRepository repository, LiteLoaderBranch branch, boolean snapshot) { + if (branch == null || repository == null) + return; + + for (Map.Entry entry : branch.getLiteLoader().entrySet()) { + String branchName = entry.getKey(); + LiteLoaderVersion v = entry.getValue(); + if ("latest".equals(branchName)) + continue; + + String version = v.getVersion(); + String url = "http://bmclapi2.bangbang93.com/liteloader/download?version=" + version; + if (snapshot) { + try { + version = version.replace("SNAPSHOT", getLatestSnapshotVersion(repository.getUrl() + "com/mumfrey/liteloader/" + v.getVersion() + "/")); + url = repository.getUrl() + "com/mumfrey/liteloader/" + v.getVersion() + "/liteloader-" + version + "-release.jar"; + } catch (Exception ignore) { + } + } + + versions.put(key, new LiteLoaderRemoteVersion(gameVersion, + version, downloadProvider.injectURL(url), + v.getTweakClass(), v.getLibraries() + )); + } + } + }; + } + + public static final String LITELOADER_LIST = "http://dl.liteloader.com/versions/versions.json"; + + private static String getLatestSnapshotVersion(String repo) throws Exception { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse(repo + "maven-metadata.xml"); + Element r = doc.getDocumentElement(); + Element snapshot = (Element) r.getElementsByTagName("snapshot").item(0); + Node timestamp = snapshot.getElementsByTagName("timestamp").item(0); + Node buildNumber = snapshot.getElementsByTagName("buildNumber").item(0); + return timestamp.getTextContent() + "-" + buildNumber.getTextContent(); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java index 102089940..54df5b90d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java @@ -42,7 +42,7 @@ public final class OptiFineBMCLVersionList extends VersionList { @Override public Task refreshAsync(DownloadProvider downloadProvider) { - GetTask task = new GetTask(NetworkUtils.toURL("https://bmclapi.bangbang93.com/optifine/versionlist")); + GetTask task = new GetTask(NetworkUtils.toURL("http://bmclapi2.bangbang93.com/optifine/versionlist")); return new Task() { @Override public Collection getDependents() { @@ -59,7 +59,7 @@ public final class OptiFineBMCLVersionList extends VersionList { String version = element.getType(); if (version == null) continue; - String mirror = "https://bmclapi2.bangbang93.com/optifine/" + element.getGameVersion() + "/" + element.getType() + "/" + element.getPatch(); + String mirror = "http://bmclapi2.bangbang93.com/optifine/" + element.getGameVersion() + "/" + element.getType() + "/" + element.getPatch(); if (!duplicates.add(mirror)) continue; diff --git a/README.md b/README.md index c3860724f..53b56a23f 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,16 @@ Now you can launch game by constructing a `DefaultLauncher`. DefaultLauncher launcher = new DefaultLauncher( repository, // GameRepository "test", // Your minecraft version name - OfflineAccountFactory.INSTANCE.fromUsername("player007").logIn(MultiCharacterSelector.DEFAULT), // account - // or YggdrasilAccountFactory.INSTANCE.fromUsername(username, password).logIn + new AccountBuilder.Builder() + .setUsername("playerId") + .setProxy(Proxy.NO_PROXY) // Optional + .create(OfflineAccountFactory.INSTANCE) + .logIn(), // account + // or new AccountBuilder.Builder() + // .setUsername("someone@xxx.com") + // .setPassword("123") + // .create(YggdrasilAccountFactory.INSTANCE) + // .logIn() new LaunchOptions.Builder() .setGameDir(repository.getBaseDirectory()) .setMaxMemory(...) @@ -51,7 +59,7 @@ DefaultLauncher launcher = new DefaultLauncher( System.out.println("Process exited then exit code " + exitCode); } }, - false // true if launcher process exits, listening thread exit too. + false // true if launcher process exits, listening threads exit too. ); ``` Now you can simply call `launcher.launch()` to launch the game.