From 69ddc939b341d2444d86b6429bd9f506af14219f Mon Sep 17 00:00:00 2001 From: ZekerZhayard Date: Mon, 14 Feb 2022 20:39:16 +0800 Subject: [PATCH] Fix #645, #1381 --- .../hmcl/download/LibraryAnalyzer.java | 11 ++++++ .../jackhuang/hmcl/download/MaintainTask.java | 34 +++++++++++------- .../hmcl/game/VersionLibraryBuilder.java | 36 ++++++++++++++++--- 3 files changed, 64 insertions(+), 17 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java index cc4968f4a..010cf8cdc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java @@ -237,4 +237,15 @@ public final class LibraryAnalyzer implements Iterable { VersionLibraryBuilder builder = new VersionLibraryBuilder(version); String mainClass = null; - if (!libraryAnalyzer.has(FORGE)) { - builder.removeTweakClass("forge"); - } - // Installing Forge will override the Minecraft arguments in json, so LiteLoader and OptiFine Tweaker are being re-added. - if (libraryAnalyzer.has(LITELOADER) && !libraryAnalyzer.hasModLauncher()) { - builder.replaceTweakClass("liteloader", "com.mumfrey.liteloader.launch.LiteLoaderTweaker", !reorderTweakClass); + builder.replaceTweakClass(LibraryAnalyzer.LITELOADER_TWEAKER, LibraryAnalyzer.LITELOADER_TWEAKER, !reorderTweakClass, reorderTweakClass); } else { - builder.removeTweakClass("liteloader"); + builder.removeTweakClass(LibraryAnalyzer.LITELOADER_TWEAKER); } if (libraryAnalyzer.has(OPTIFINE)) { - if (!libraryAnalyzer.has(LITELOADER) && !libraryAnalyzer.has(FORGE)) { - builder.replaceTweakClass("optifine", "optifine.OptiFineTweaker", !reorderTweakClass); + if (!libraryAnalyzer.has(LITELOADER) && !libraryAnalyzer.has(FORGE) && builder.hasTweakClass(LibraryAnalyzer.OPTIFINE_TWEAKERS[1])) { + builder.replaceTweakClass(LibraryAnalyzer.OPTIFINE_TWEAKERS[1], LibraryAnalyzer.OPTIFINE_TWEAKERS[0], !reorderTweakClass, reorderTweakClass); } else { if (libraryAnalyzer.hasModLauncher()) { // If ModLauncher installed, we use ModLauncher in place of LaunchWrapper. - mainClass = "cpw.mods.modlauncher.Launcher"; - builder.replaceTweakClass("optifine", "optifine.OptiFineForgeTweaker", !reorderTweakClass); + mainClass = LibraryAnalyzer.MOD_LAUNCHER_MAIN; + for (String optiFineTweaker : LibraryAnalyzer.OPTIFINE_TWEAKERS) { + builder.removeTweakClass(optiFineTweaker); + } } else { // If forge or LiteLoader installed, OptiFine Forge Tweaker is needed. - builder.replaceTweakClass("optifine", "optifine.OptiFineForgeTweaker", !reorderTweakClass); + builder.replaceTweakClass(LibraryAnalyzer.OPTIFINE_TWEAKERS[0], LibraryAnalyzer.OPTIFINE_TWEAKERS[1], !reorderTweakClass, reorderTweakClass); } } } else { - builder.removeTweakClass("optifine"); + for (String optiFineTweaker : LibraryAnalyzer.OPTIFINE_TWEAKERS) { + builder.removeTweakClass(optiFineTweaker); + } + } + + boolean hasForge = libraryAnalyzer.has(FORGE), hasModLauncher = libraryAnalyzer.hasModLauncher(); + for (String forgeTweaker : LibraryAnalyzer.FORGE_TWEAKERS) { + if (!hasForge) { + builder.removeTweakClass(forgeTweaker); + } else if (!hasModLauncher && builder.hasTweakClass(forgeTweaker)) { + builder.replaceTweakClass(forgeTweaker, forgeTweaker, !reorderTweakClass, reorderTweakClass); + } } Version ret = builder.build(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/VersionLibraryBuilder.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/VersionLibraryBuilder.java index 481f76abe..144a8b1b3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/VersionLibraryBuilder.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/VersionLibraryBuilder.java @@ -58,6 +58,10 @@ public final class VersionLibraryBuilder { .setLibraries(libraries); } + public boolean hasTweakClass(String tweakClass) { + return useMcArgs && mcArgs.contains(tweakClass) || game.stream().anyMatch(arg -> arg.toString().equals(tweakClass)); + } + public void removeTweakClass(String target) { replaceTweakClass(target, null, false); } @@ -94,6 +98,20 @@ public final class VersionLibraryBuilder { * @param inPlace if true, replace the tweak class in place, otherwise add the tweak class to the end of the argument list without replacement. */ public void replaceTweakClass(String target, String replacement, boolean inPlace) { + replaceTweakClass(target, replacement, inPlace, false); + } + + /** + * Replace existing tweak class. + * If the tweak class does not exist, the new tweak class will be added to argument list. + * If the tweak class appears more than one time, the tweak classes will be removed excluding the first one. + * + * @param target the tweak class to replace + * @param replacement the new tweak class to be replaced with, if null, remove the tweak class only + * @param inPlace if true, replace the tweak class in place, otherwise add the tweak class to the end of the argument list without replacement. + * @param reserve if true, add the tweak class to the start of the argument list. + */ + public void replaceTweakClass(String target, String replacement, boolean inPlace, boolean reserve) { if (replacement == null && inPlace) throw new IllegalArgumentException("Replacement cannot be null in replace mode"); @@ -102,7 +120,7 @@ public final class VersionLibraryBuilder { for (int i = 0; i + 1 < mcArgs.size(); ++i) { String arg0Str = mcArgs.get(i); String arg1Str = mcArgs.get(i + 1); - if (arg0Str.equals("--tweakClass") && arg1Str.toLowerCase().contains(target)) { + if (arg0Str.equals("--tweakClass") && arg1Str.equals(target)) { if (!replaced && inPlace) { // for the first one, we replace the tweak class only. mcArgs.set(i + 1, replacement); @@ -124,7 +142,7 @@ public final class VersionLibraryBuilder { // We need to preserve the tokens String arg0Str = arg0.toString(); String arg1Str = arg1.toString(); - if (arg0Str.equals("--tweakClass") && arg1Str.toLowerCase().contains(target)) { + if (arg0Str.equals("--tweakClass") && arg1Str.equals(target)) { if (!replaced && inPlace) { // for the first one, we replace the tweak class only. game.set(i + 1, new StringArgument(replacement)); @@ -141,8 +159,18 @@ public final class VersionLibraryBuilder { // if the tweak class does not exist, add a new one to the end. if (!replaced && replacement != null) { - game.add(new StringArgument("--tweakClass")); - game.add(new StringArgument(replacement)); + if (reserve) { + if (useMcArgs) { + mcArgs.add(0, replacement); + mcArgs.add(0, "--tweakClass"); + } else { + game.add(0, new StringArgument(replacement)); + game.add(0, new StringArgument("--tweakClass")); + } + } else { + game.add(new StringArgument("--tweakClass")); + game.add(new StringArgument(replacement)); + } } }