diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 3fa53c0c1..927a70a32 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -25,6 +25,7 @@ import org.jackhuang.hmcl.auth.AuthInfo; import org.jackhuang.hmcl.auth.AuthenticationException; import org.jackhuang.hmcl.auth.ServerDisconnectException; import org.jackhuang.hmcl.download.DefaultDependencyManager; +import org.jackhuang.hmcl.download.MaintainTask; import org.jackhuang.hmcl.launch.*; import org.jackhuang.hmcl.mod.CurseCompletionTask; import org.jackhuang.hmcl.setting.LauncherVisibility; @@ -73,7 +74,7 @@ public final class LauncherHelper { private void launch0(Profile profile, Account account, String selectedVersion, File scriptFile) { GameRepository repository = profile.getRepository(); DefaultDependencyManager dependencyManager = profile.getDependency(); - Version version = repository.getResolvedVersion(selectedVersion); + Version version = MaintainTask.maintain(repository.getResolvedVersion(selectedVersion)); VersionSetting setting = profile.getVersionSetting(selectedVersion); Optional gameVersion = GameVersion.minecraftVersion(repository.getVersionJar(version)); @@ -219,6 +220,9 @@ public final class LauncherHelper { } public void emitStatus(LoadingState state) { + if (state == LoadingState.DONE) + Controllers.closeDialog(); + launchingStepsPane.setTitle(state.getLocalizedMessage()); launchingStepsPane.setSubtitle((state.ordinal() + 1) + " / " + LoadingState.values().length); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java index c69ded871..0700d84f0 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/MainPage.java @@ -54,6 +54,9 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import static org.jackhuang.hmcl.util.StringUtils.removePrefix; +import static org.jackhuang.hmcl.util.StringUtils.removeSuffix; + public final class MainPage extends StackPane implements DecoratorPage { private final StringProperty title = new SimpleStringProperty(this, "title", Launcher.i18n("main_page")); @@ -94,6 +97,10 @@ public final class MainPage extends StackPane implements DecoratorPage { FXUtils.installTooltip(btnRefresh, Launcher.i18n("button.refresh")); } + private String modifyVersion(String gameVersion, String version) { + return removeSuffix(removePrefix(removeSuffix(removePrefix(version.replace(gameVersion, "").trim(), "-"), "-"), "_"), "_"); + } + private Node buildNode(HMCLGameRepository repository, Version version, String game) { Profile profile = repository.getProfile(); String id = version.getId(); @@ -105,13 +112,13 @@ public final class MainPage extends StackPane implements DecoratorPage { StringBuilder libraries = new StringBuilder(); for (Library library : version.getLibraries()) { if (library.getGroupId().equalsIgnoreCase("net.minecraftforge") && library.getArtifactId().equalsIgnoreCase("forge")) { - libraries.append(Launcher.i18n("install.installer.forge")).append(": ").append(StringUtils.removeSuffix(StringUtils.removePrefix(library.getVersion().replaceAll("(?i)forge", "").replace(game, "").trim(), "-"), "-")).append("\n"); + libraries.append(Launcher.i18n("install.installer.forge")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)forge", ""))).append("\n"); } if (library.getGroupId().equalsIgnoreCase("com.mumfrey") && library.getArtifactId().equalsIgnoreCase("liteloader")) { - libraries.append(Launcher.i18n("install.installer.liteloader")).append(": ").append(StringUtils.removeSuffix(StringUtils.removePrefix(library.getVersion().replaceAll("(?i)liteloader", "").replace(game, "").trim(), "-"), "-")).append("\n"); + libraries.append(Launcher.i18n("install.installer.liteloader")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)liteloader", ""))).append("\n"); } if (library.getGroupId().equalsIgnoreCase("net.optifine") && library.getArtifactId().equalsIgnoreCase("optifine")) { - libraries.append(Launcher.i18n("install.installer.optifine")).append(": ").append(StringUtils.removeSuffix(StringUtils.removePrefix(library.getVersion().replaceAll("(?i)optifine", "").replace(game, "").trim(), "-"), "-")).append("\n"); + libraries.append(Launcher.i18n("install.installer.optifine")).append(": ").append(modifyVersion(game, library.getVersion().replaceAll("(?i)optifine", ""))).append("\n"); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java index 6394fb4a9..28f88e87a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogWizardDisplayer.java @@ -60,20 +60,24 @@ public interface TaskExecutorDialogWizardDisplayer extends AbstractWizardDisplay TaskExecutor executor = task.executor(new TaskListener() { @Override public void onStop(boolean success, TaskExecutor executor) { - if (success) { - if (settings.containsKey("success_message") && settings.get("success_message") instanceof String) - JFXUtilities.runInFX(() -> Controllers.dialog((String) settings.get("success_message"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null))); - else if (!settings.containsKey("forbid_success_message")) - JFXUtilities.runInFX(() -> Controllers.dialog(Launcher.i18n("message.success"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null))); - } else { - if (executor.getLastException() == null) - return; - String appendix = StringUtils.getStackTrace(executor.getLastException()); - if (settings.containsKey("failure_message") && settings.get("failure_message") instanceof String) - JFXUtilities.runInFX(() -> Controllers.dialog(appendix, (String) settings.get("failure_message"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null))); - else if (!settings.containsKey("forbid_failure_message")) - JFXUtilities.runInFX(() -> Controllers.dialog(appendix, Launcher.i18n("wizard.failed"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null))); - } + JFXUtilities.runInFX(() -> { + Controllers.closeDialog(); + if (success) { + if (settings.containsKey("success_message") && settings.get("success_message") instanceof String) + Controllers.dialog((String) settings.get("success_message"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); + else if (!settings.containsKey("forbid_success_message")) + Controllers.dialog(Launcher.i18n("message.success"), null, MessageBox.FINE_MESSAGE, () -> Controllers.navigate(null)); + } else { + if (executor.getLastException() == null) + return; + String appendix = StringUtils.getStackTrace(executor.getLastException()); + if (settings.containsKey("failure_message") && settings.get("failure_message") instanceof String) + Controllers.dialog(appendix, (String) settings.get("failure_message"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null)); + else if (!settings.containsKey("forbid_failure_message")) + Controllers.dialog(appendix, Launcher.i18n("wizard.failed"), MessageBox.ERROR_MESSAGE, () -> Controllers.navigate(null)); + } + + }); } }); pane.setExecutor(executor); diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 2a522755f..6b85f1a36 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -57,8 +57,8 @@ archive.author=Authors archive.game_version=Game archive.version=Version -assets.download=Check for the completion of assets -assets.download_all=Download Assets Files +assets.download=Download assets +assets.download_all=Check for the completion of assets assets.failed=Failed to get the list, try again. assets.failed_download=Failed to download assets, may cause no sounds and language files. 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 d6e00a13f..812869cef 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -57,8 +57,8 @@ archive.author=作者 archive.game_version=游戏版本 archive.version=版本 -assets.download=检查资源文件完整性 -assets.download_all=下载资源文件 +assets.download=下载资源 +assets.download_all=检查资源文件完整性 assets.failed=获取列表失败,请刷新重试。 assets.failed_download=下载资源文件失败,可能导致没有中文和声音。 diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java index bad83a75f..c74d7b515 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java @@ -41,9 +41,12 @@ public class MaintainTask extends TaskResult { @Override public void execute() { - Version newVersion = version; + setResult(maintain(version)); + } + + public static Version maintain(Version version) { Library forge = null, liteLoader = null, optiFine = null; - List args = new ArrayList<>(StringUtils.tokenize(newVersion.getMinecraftArguments().orElse(""))); + List args = new ArrayList<>(StringUtils.tokenize(version.getMinecraftArguments().orElse(""))); for (Library library : version.getLibraries()) { if (library.getGroupId().equalsIgnoreCase("net.minecraftforge") && library.getArtifactId().equalsIgnoreCase("forge")) @@ -84,11 +87,13 @@ public class MaintainTask extends TaskResult { } if ((liteLoader != null || forge != null) && optiFine != null) { - // If forge or LiteLoader installed, OptiFine Tweaker will cause crash. + // If forge or LiteLoader installed, OptiFine Forge Tweaker is needed. removeTweakClass(args, "optifine"); + args.add("--tweakClass"); + args.add("optifine.OptiFineForgeTweaker"); } - setResult(newVersion.setMinecraftArguments(StringUtils.makeCommand(args))); + return version.setMinecraftArguments(StringUtils.makeCommand(args)); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineInstallTask.java index 1a930d1f8..5e7ab8a69 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineInstallTask.java @@ -70,13 +70,13 @@ public final class OptiFineInstallTask extends TaskResult { @Override public void execute() { - String remoteVersion = remote.getSelfVersion(); + String remoteVersion = remote.getGameVersion() + "-" + remote.getSelfVersion(); Library library = new Library( "net.optifine", "optifine", remoteVersion, null, null, new LibrariesDownloadInfo(new LibraryDownloadInfo( "net/optifine/optifine/" + remoteVersion + "/optifine-" + remoteVersion + ".jar", - remote.getUrl())), true + remote.getUrl())) ); List libraries = new LinkedList<>(); @@ -99,6 +99,8 @@ public final class OptiFineInstallTask extends TaskResult { String minecraftArguments = version.getMinecraftArguments().orElse(""); if (!hasFMLTweaker) minecraftArguments = minecraftArguments + " --tweakClass optifine.OptiFineTweaker"; + else + minecraftArguments = minecraftArguments + " --tweakClass optifine.OptiFineForgeTweaker"; if (version.getMainClass() == null || !version.getMainClass().startsWith("net.minecraft.launchwrapper.")) libraries.add(0, new Library("net.minecraft", "launchwrapper", "1.12")); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ClassicVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ClassicVersion.java index 805eb4138..ecc83468f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ClassicVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/ClassicVersion.java @@ -40,7 +40,7 @@ public class ClassicVersion extends Version { public ClassicLibrary(String name) { super("", "", "", null, null, new LibrariesDownloadInfo(new LibraryDownloadInfo("bin/" + name + ".jar"), null), - false, null, null, null, null); + null, null, null, null); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java index ef17af4cb..75e1b72ea 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java @@ -45,7 +45,6 @@ public class Library implements Comparable { private final LibrariesDownloadInfo downloads; private final LibraryDownloadInfo download; private final ExtractRules extract; - private final boolean lateload; private final Map natives; private final List rules; private final List checksums; @@ -55,16 +54,12 @@ public class Library implements Comparable { public Library(String groupId, String artifactId, String version) { this(groupId, artifactId, version, null, null, null); } - + public Library(String groupId, String artifactId, String version, String classifier, String url, LibrariesDownloadInfo downloads) { - this(groupId, artifactId, version, classifier, url, downloads, false); + this(groupId, artifactId, version, classifier, url, downloads, null, null, null, null); } - public Library(String groupId, String artifactId, String version, String classifier, String url, LibrariesDownloadInfo downloads, boolean lateload) { - this(groupId, artifactId, version, classifier, url, downloads, lateload, null, null, null, null); - } - - public Library(String groupId, String artifactId, String version, String classifier, String url, LibrariesDownloadInfo downloads, boolean lateload, List checksums, ExtractRules extract, Map natives, List rules) { + public Library(String groupId, String artifactId, String version, String classifier, String url, LibrariesDownloadInfo downloads, List checksums, ExtractRules extract, Map natives, List rules) { this.groupId = groupId; this.artifactId = artifactId; this.version = version; @@ -78,7 +73,6 @@ public class Library implements Comparable { this.url = url; this.downloads = downloads; this.extract = extract; - this.lateload = lateload; this.natives = natives; this.rules = rules; this.checksums = checksums; @@ -139,10 +133,6 @@ public class Library implements Comparable { return download; } - public boolean isLateload() { - return lateload; - } - public List getChecksums() { return checksums; } @@ -179,7 +169,7 @@ public class Library implements Comparable { } public Library setClassifier(String classifier) { - return new Library(groupId, artifactId, version, classifier, url, downloads, lateload, checksums, extract, natives, rules); + return new Library(groupId, artifactId, version, classifier, url, downloads, checksums, extract, natives, rules); } public static Library fromName(String name) { @@ -191,7 +181,7 @@ public class Library implements Comparable { if (arr.length != 3 && arr.length != 4) throw new IllegalArgumentException("Library name is malformed. Correct example: group:artifact:version(:classifier)."); - return new Library(arr[0].replace("\\", "/"), arr[1], arr[2], arr.length >= 4 ? arr[3] : null, url, downloads, false, checksums, extract, natives, rules); + return new Library(arr[0].replace("\\", "/"), arr[1], arr[2], arr.length >= 4 ? arr[3] : null, url, downloads, checksums, extract, natives, rules); } public static class Serializer implements JsonDeserializer, JsonSerializer { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index 680fce272..5e897528d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -110,29 +110,23 @@ public class DefaultLauncher extends Launcher { res.add("-Dfml.ignorePatchDiscrepancies=true"); } - LinkedList lateload = new LinkedList<>(); - StringBuilder classpath = new StringBuilder(); + LinkedList classpath = new LinkedList<>(); for (Library library : version.getLibraries()) if (library.appliesToCurrentEnvironment() && !library.isNative()) { File f = repository.getLibraryFile(version, library); if (f.exists() && f.isFile()) - if (library.isLateload()) - lateload.add(f); - else - classpath.append(f.getAbsolutePath()).append(OperatingSystem.PATH_SEPARATOR); + classpath.add(f.getAbsolutePath()); } - for (File library : lateload) - classpath.append(library.getAbsolutePath()).append(OperatingSystem.PATH_SEPARATOR); File jar = repository.getVersionJar(version); if (!jar.exists() || !jar.isFile()) throw new IOException("Minecraft jar does not exist"); - classpath.append(jar.getAbsolutePath()); + classpath.add(jar.getAbsolutePath()); // Provided Minecraft arguments File gameAssets = repository.getActualAssetDirectory(version.getId(), version.getAssetIndex().getId()); Map configuration = getConfigurations(); - configuration.put("${classpath}", classpath.toString()); + configuration.put("${classpath}", String.join(OperatingSystem.PATH_SEPARATOR, classpath)); configuration.put("${natives_directory}", nativeFolder.getAbsolutePath()); configuration.put("${game_assets}", gameAssets.getAbsolutePath()); configuration.put("${assets_root}", gameAssets.getAbsolutePath());