From 2b7c072a28c257bfea49a34ff42a13c1392469cf Mon Sep 17 00:00:00 2001 From: Lassebq Date: Thu, 12 Sep 2024 01:38:58 +0300 Subject: [PATCH] Improve build. Fix Fabric in dev env. Fix splash screen patch in b1.4 --- build.gradle | 68 +++--- launchwrapper-fabric/build.gradle | 8 +- .../libs/rdi-1.0-SNAPSHOT.jar | Bin 81763 -> 0 bytes .../launchwrapper/inject/LWGameProvider.java | 10 +- .../inject/LWGameTransformer.java | 4 +- .../tweak/injection/fabric/FabricHook.java | 4 +- libs/rdi-1.0-SNAPSHOT.jar | Bin 81763 -> 0 bytes settings.gradle | 2 +- .../org/mcphackers/launchwrapper/Launch.java | 1 - .../launchwrapper/LaunchConfig.java | 28 ++- .../loader/LaunchClassLoader.java | 9 +- .../protocol/LegacyURLStreamHandler.java | 16 +- .../launchwrapper/tweak/BTATweak.java | 21 +- .../launchwrapper/tweak/LegacyTweak.java | 12 +- .../injection/legacy/ClassicCrashScreen.java | 219 ++++++++++++++++++ .../tweak/injection/legacy/FixShutdown.java | 18 +- .../injection/legacy/FixSplashScreen.java | 145 ++++++++++++ .../tweak/injection/legacy/IndevSaving.java | 39 ++-- .../injection/legacy/SplashScreenFix.java | 84 ------- .../injection/legacy/UnlicensedCopyText.java | 49 ++++ .../launchwrapper/util/UnsafeUtils.java | 1 + .../launchwrapper/test/AlphaTest.java | 2 +- .../launchwrapper/test/BetaTest.java | 2 +- 23 files changed, 550 insertions(+), 192 deletions(-) delete mode 100644 launchwrapper-fabric/libs/rdi-1.0-SNAPSHOT.jar delete mode 100644 libs/rdi-1.0-SNAPSHOT.jar create mode 100644 src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/ClassicCrashScreen.java create mode 100644 src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/FixSplashScreen.java delete mode 100644 src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/SplashScreenFix.java create mode 100644 src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/UnlicensedCopyText.java diff --git a/build.gradle b/build.gradle index b30a0fc..ae2609e 100644 --- a/build.gradle +++ b/build.gradle @@ -7,12 +7,14 @@ archivesBaseName = 'launchwrapper' project.ext.asm_version = 9.7 +def ENV = System.getenv() + dependencies { - // implementation 'org.mcphackers.rdi:rdi:1.0' - implementation name: 'rdi-1.0-SNAPSHOT' + implementation "org.mcphackers.rdi:rdi:1.0" implementation "org.ow2.asm:asm:${project.asm_version}" + implementation "org.ow2.asm:asm-util:${project.asm_version}" implementation "org.ow2.asm:asm-tree:${project.asm_version}" - implementation 'org.json:json:20230311' + implementation "org.json:json:20230311" // I'll bring discord RPC support later, when I have an environment to compile natives testRuntimeOnly('org.junit.platform:junit-platform-launcher:1.5.2') @@ -33,12 +35,13 @@ allprojects { apply plugin: 'maven-publish' group = 'org.mcphackers' - version = '1.0-SNAPSHOT' + project.version = '1.0' + if(!ENV.RELEASE.equals('1')) { + project.version += '-SNAPSHOT' + } repositories { - flatDir { - dirs "libs" - } + mavenLocal() maven { url "https://libraries.minecraft.net/" } @@ -61,18 +64,12 @@ allprojects { archives sourcesJar } - tasks.withType(JavaCompile).configureEach { - it.options.encoding = "UTF-8" - - // Not possible due to unsafe usage - // if (JavaVersion.current().isJava9Compatible()) { - // it.options.release.set(8) - // } - } sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 compileJava { + options.encoding = "UTF-8" + // Minecraft is mostly compatible with java 5 up until the version we support, so why not? if (JavaVersion.current().ordinal() <= JavaVersion.VERSION_1_8.ordinal()) { sourceCompatibility = JavaVersion.VERSION_1_5 @@ -85,29 +82,28 @@ allprojects { targetCompatibility = JavaVersion.VERSION_1_8 } - publishing { - publications { - mavenJava(MavenPublication) { - groupId = "${project.group}" - artifactId = "${project.archivesBaseName}" - version = "${project.version}" - - artifact jar - artifact sourcesJar + afterEvaluate { + publishing { + publications { + mavenJava(MavenPublication) { + artifactId = project.archivesBaseName + + artifact jar + artifact sourcesJar + } } - } - repositories { - mavenLocal() - - def ENV = System.getenv() - if (ENV.MAVEN_URL) { - maven { - url ENV.MAVEN_URL - if (ENV.MAVEN_USERNAME) { - credentials { - username ENV.MAVEN_USERNAME - password ENV.MAVEN_PASSWORD + repositories { + mavenLocal() + + if (ENV.MAVEN_URL) { + maven { + url ENV.MAVEN_URL + if (ENV.MAVEN_USERNAME) { + credentials { + username ENV.MAVEN_USERNAME + password ENV.MAVEN_PASSWORD + } } } } diff --git a/launchwrapper-fabric/build.gradle b/launchwrapper-fabric/build.gradle index 94970e5..b1f6c44 100644 --- a/launchwrapper-fabric/build.gradle +++ b/launchwrapper-fabric/build.gradle @@ -4,9 +4,6 @@ repositories { maven { url "https://maven.fabricmc.net/" } - maven { - url "https://maven.glass-launcher.net/babric/" - } } archivesBaseName = 'launchwrapper-fabric' @@ -17,9 +14,8 @@ compileJava { dependencies { implementation rootProject - implementation name: "rdi-1.0-SNAPSHOT" - implementation "babric:fabric-loader:0.14.24-babric.1" - // implementation 'org.mcphackers.rdi:rdi:1.0' + implementation "org.mcphackers.rdi:rdi:1.0" + implementation "net.fabricmc:fabric-loader:0.16.4" implementation "org.ow2.asm:asm:${project.asm_version}" implementation "org.ow2.asm:asm-tree:${project.asm_version}" implementation "org.ow2.asm:asm-util:${project.asm_version}" diff --git a/launchwrapper-fabric/libs/rdi-1.0-SNAPSHOT.jar b/launchwrapper-fabric/libs/rdi-1.0-SNAPSHOT.jar deleted file mode 100644 index 6baf91814d208272f2e3a00c3c2f7a27720364e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81763 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 lwjglJars = new ArrayList<>(); private Path launchwrapperJar; @@ -102,6 +104,8 @@ private Path getLaunchwrapperSource() { @Override public boolean locateGame(FabricLauncher launcher, String[] args) { this.envType = launcher.getEnvironmentType(); + this.arguments = new Arguments(); + arguments.parse(args); String entrypoint = null; try { @@ -144,9 +148,11 @@ public boolean locateGame(FabricLauncher launcher, String[] args) { ObjectShare share = FabricLoaderImpl.INSTANCE.getObjectShare(); share.put("fabric-loader:inputGameJar", gameJar); // deprecated - share.put("fabric-loader:inputGameJars", Collections.singleton(gameJar)); + share.put("fabric-loader:inputGameJars", Collections.singletonList(gameJar)); - versionData = McVersionLookup.getVersion(Collections.singletonList(gameJar), entrypoint, config.version.get()); + String version = arguments.remove(Arguments.GAME_VERSION); + if (version == null) version = System.getProperty(SystemProperties.GAME_VERSION); + versionData = McVersionLookup.getVersion(Collections.singletonList(gameJar), entrypoint, version); return true; } diff --git a/launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/inject/LWGameTransformer.java b/launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/inject/LWGameTransformer.java index cc2288f..4260d26 100644 --- a/launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/inject/LWGameTransformer.java +++ b/launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/inject/LWGameTransformer.java @@ -11,6 +11,7 @@ import java.util.function.Function; import java.util.zip.ZipError; +import org.mcphackers.launchwrapper.loader.SafeClassWriter; import org.mcphackers.launchwrapper.target.MainLaunchTarget; import org.mcphackers.launchwrapper.tweak.Tweak; import org.mcphackers.launchwrapper.util.ClassNodeSource; @@ -96,7 +97,8 @@ public byte[] transform(String className) { } // Fabric's GameTransformer did not compute max stack and local // Tweaks rely on writer computing maxes for it - ClassWriter writer = new ClassWriter(COMPUTE_MAXS); + // Also don't trust existing frames + ClassWriter writer = new SafeClassWriter(this, COMPUTE_MAXS | COMPUTE_FRAMES); node.accept(writer); return writer.toByteArray(); } diff --git a/launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/tweak/injection/fabric/FabricHook.java b/launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/tweak/injection/fabric/FabricHook.java index 0ac7b32..f4eddae 100644 --- a/launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/tweak/injection/fabric/FabricHook.java +++ b/launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/tweak/injection/fabric/FabricHook.java @@ -13,11 +13,11 @@ import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; -import org.objectweb.asm.tree.IntInsnNode; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.TypeInsnNode; +import org.objectweb.asm.tree.VarInsnNode; import net.fabricmc.loader.impl.game.minecraft.Hooks; @@ -46,7 +46,7 @@ public boolean apply(ClassNodeSource source, LaunchConfig config) { if(m.name.equals("")) { InsnList insns = new InsnList(); insns.add(getGameDirectory(config)); - insns.add(new IntInsnNode(ALOAD, 0)); + insns.add(new VarInsnNode(ALOAD, 0)); insns.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Hooks.INTERNAL_NAME, "startClient", "(Ljava/io/File;Ljava/lang/Object;)V", false)); m.instructions.insertBefore(getLastReturn(m.instructions.getLast()), insns); diff --git a/libs/rdi-1.0-SNAPSHOT.jar b/libs/rdi-1.0-SNAPSHOT.jar deleted file mode 100644 index 6baf91814d208272f2e3a00c3c2f7a27720364e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81763 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 parameters = new HashMap>(); @@ -46,11 +47,13 @@ public class LaunchConfig { public LaunchParameterString userType = new LaunchParameterString("userType"); public LaunchParameterString versionType = new LaunchParameterString("versionType"); public LaunchParameterSwitch applet = new LaunchParameterSwitch("applet", false); - public LaunchParameterSwitch haspaid = new LaunchParameterSwitch("haspaid", true); + public LaunchParameterSwitch haspaid = new LaunchParameterSwitch("haspaid", true); + private LaunchParameterSwitch unlicensedCopy = new LaunchParameterSwitchReverse("unlicensedCopy", haspaid); public LaunchParameterString loadmap_user = new LaunchParameterString("loadmap_user"); public LaunchParameterNumber loadmap_id = new LaunchParameterNumber("loadmap_id"); public LaunchParameterString mppass = new LaunchParameterString("mppass", ""); - public LaunchParameterSwitch lwjglFrame = new LaunchParameterSwitch("awtFrame", true, true); + public LaunchParameterSwitch lwjglFrame = new LaunchParameterSwitch("lwjglFrame", true, true); + private LaunchParameterSwitch awtFrame = new LaunchParameterSwitchReverse("awtFrame", lwjglFrame); public LaunchParameterSwitch isom = new LaunchParameterSwitch("isom", false, true); public LaunchParameterSwitch forceVsync = new LaunchParameterSwitch("forceVsync", false, true); public LaunchParameterSwitch forceResizable = new LaunchParameterSwitch("forceResizable", false, true); @@ -133,6 +136,7 @@ public LaunchConfig(String[] args) { } if(uuid.get() == null && username.get() != null) { // Purely cosmetic change. Makes skins in modern versions when only provided with username + // FIXME could hang until connection timeout without running the game uuid.set(SkinRequests.getUUIDfromName(username.get())); } } @@ -303,6 +307,22 @@ public void setString(String argument) { this.value = newValue; } } + public class LaunchParameterSwitchReverse extends LaunchParameterSwitch { + LaunchParameterSwitch parent; + public LaunchParameterSwitchReverse(String name, LaunchParameterSwitch parent) { + super(name, !parent.defaultValue, true); + this.parent = parent; + } + + public void set(Boolean b) { + super.set(b); + parent.value = !value; + } + + public Boolean get() { + return(!parent.value); + } + } public class LaunchParameterSwitch extends LaunchParameter { public LaunchParameterSwitch(String name) { @@ -332,11 +352,11 @@ public void setString(String argument) { } public void setFlag() { - this.value = !defaultValue; + this.set(true); } public void toggle() { - this.value = !value; + this.set(!value); } } diff --git a/src/main/java/org/mcphackers/launchwrapper/loader/LaunchClassLoader.java b/src/main/java/org/mcphackers/launchwrapper/loader/LaunchClassLoader.java index cef55d8..a8a58e1 100644 --- a/src/main/java/org/mcphackers/launchwrapper/loader/LaunchClassLoader.java +++ b/src/main/java/org/mcphackers/launchwrapper/loader/LaunchClassLoader.java @@ -199,7 +199,6 @@ private ProtectionDomain getProtectionDomain(String name) { public void overrideClass(ClassNode node) { if(node == null) return; - saveDebugClass(node); overridenClasses.put(className(node.name), node); classNodeCache.put(node.name, node); } @@ -211,7 +210,7 @@ public void saveDebugClass(ClassNode node) { try { File cls = new File(debugOutput, node.name + ".class"); cls.getParentFile().mkdirs(); - // TraceClassVisitor trace = new TraceClassVisitor(new java.io.PrintWriter(new File(debugOutput, node.name + ".dump"))); + // org.objectweb.asm.util.TraceClassVisitor trace = new org.objectweb.asm.util.TraceClassVisitor(new java.io.PrintWriter(new File(debugOutput, node.name + ".dump"))); // node.accept(trace); ClassWriter writer = new SafeClassWriter(this, COMPUTE_MAXS | COMPUTE_FRAMES); node.accept(writer); @@ -244,7 +243,7 @@ public ClassNode getClass(String name) { } ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(is); - classReader.accept(classNode, 0); + classReader.accept(classNode, ClassReader.SKIP_FRAMES); classNodeCache.put(classNode.name, classNode); return classNode; } catch (IOException e) { @@ -319,9 +318,9 @@ private Class transformedClass(String name) throws ClassNotFoundException { if(tweak != null) { if(tweak.tweakClass(this, classNodeName(name))) { transformed = overridenClasses.get(name); - saveDebugClass(transformed); } } + saveDebugClass(transformed); return redefineClass(transformed); } return redefineClass(name); @@ -349,7 +348,7 @@ private static ClassNode getSystemClass(Class cls) { try { ClassNode classNode = new ClassNode(); ClassReader classReader = new ClassReader(is); - classReader.accept(classNode, 0); + classReader.accept(classNode, ClassReader.SKIP_FRAMES); return classNode; } catch (IOException e) { Util.closeSilently(is); diff --git a/src/main/java/org/mcphackers/launchwrapper/protocol/LegacyURLStreamHandler.java b/src/main/java/org/mcphackers/launchwrapper/protocol/LegacyURLStreamHandler.java index a5d6fe4..4360bdf 100644 --- a/src/main/java/org/mcphackers/launchwrapper/protocol/LegacyURLStreamHandler.java +++ b/src/main/java/org/mcphackers/launchwrapper/protocol/LegacyURLStreamHandler.java @@ -28,16 +28,20 @@ protected URLConnection openConnection(URL url) throws IOException { if(path.equals("/game/joinserver.jsp")) // TODO: update this to use the "sessionserver.mojang.com" API instead? return super.openConnection(new URL("https", "session.minecraft.net", file)); - if(path.equals("/login/session.jsp")) - return new BasicResponseURLConnection(url, "ok"); - if(host.equals("login.minecraft.net") && path.equals("/session")) - return new BasicResponseURLConnection(url, "ok"); + if(path.equals("/login/session.jsp") || host.equals("login.minecraft.net") && path.equals("/session")) { + // UnlicensedCopyText injection does this instead. (It doesn't fire the check thread fro some reason) + if(config.haspaid.get()) { + return new BasicResponseURLConnection(url, "ok"); + } else { + return new BasicResponseURLConnection(url, 400, ""); + } + } if(path.equals("/game/")) return new BasicResponseURLConnection(url, "42069"); if(path.equals("/client")) - return new BasicResponseURLConnection(url, "idk"); + return new BasicResponseURLConnection(url, "idk"); // TODO figure out what this API endpoint is for if(path.equals("/haspaid.jsp")) - return new BasicResponseURLConnection(url, "true"); + return new BasicResponseURLConnection(url, "true"); // TODO Where is this used? if(path.contains("/level/save.html")) return new SaveLevelURLConnection(url, config.gameDir.get()); if(path.contains("/level/load.html")) diff --git a/src/main/java/org/mcphackers/launchwrapper/tweak/BTATweak.java b/src/main/java/org/mcphackers/launchwrapper/tweak/BTATweak.java index 4580e15..9e2a44e 100644 --- a/src/main/java/org/mcphackers/launchwrapper/tweak/BTATweak.java +++ b/src/main/java/org/mcphackers/launchwrapper/tweak/BTATweak.java @@ -8,23 +8,26 @@ import org.mcphackers.launchwrapper.tweak.injection.legacy.FixShutdown; import org.mcphackers.launchwrapper.tweak.injection.legacy.LegacyInit; import org.mcphackers.launchwrapper.tweak.injection.legacy.ReplaceGameDir; -import org.mcphackers.launchwrapper.tweak.injection.legacy.SplashScreenFix; +import org.mcphackers.launchwrapper.tweak.injection.legacy.FixSplashScreen; +/** + * Based on LegacyTweak but less invasive in order to maintain compatibility + * with BTA. BTA provides some fixes so LaunchWrapper doesn't need to apply them + */ public class BTATweak extends LegacyTweak { public BTATweak(LaunchConfig launch) { super(launch); } - @Override + @Override public List getInjections() { return Arrays.asList( - new LegacyInit(context), - new SplashScreenFix(context), - new FixShutdown(context), - // new LWJGLPatch(context), - new ReplaceGameDir(context) - ); + new LegacyInit(context), + new FixSplashScreen(context), + new FixShutdown(context), + // new LWJGLPatch(context), + new ReplaceGameDir(context)); } - + } diff --git a/src/main/java/org/mcphackers/launchwrapper/tweak/LegacyTweak.java b/src/main/java/org/mcphackers/launchwrapper/tweak/LegacyTweak.java index b7e0609..0965f41 100644 --- a/src/main/java/org/mcphackers/launchwrapper/tweak/LegacyTweak.java +++ b/src/main/java/org/mcphackers/launchwrapper/tweak/LegacyTweak.java @@ -7,18 +7,16 @@ import java.lang.reflect.Field; import java.net.URL; import java.util.Arrays; -import java.util.Collections; import java.util.List; import org.mcphackers.launchwrapper.LaunchConfig; import org.mcphackers.launchwrapper.protocol.LegacyURLStreamHandler; -import org.mcphackers.launchwrapper.protocol.SkinRequests; -import org.mcphackers.launchwrapper.protocol.SkinType; import org.mcphackers.launchwrapper.protocol.URLStreamHandlerProxy; import org.mcphackers.launchwrapper.target.LaunchTarget; import org.mcphackers.launchwrapper.target.MainLaunchTarget; import org.mcphackers.launchwrapper.tweak.injection.Injection; import org.mcphackers.launchwrapper.tweak.injection.legacy.AddMain; +import org.mcphackers.launchwrapper.tweak.injection.legacy.ClassicCrashScreen; import org.mcphackers.launchwrapper.tweak.injection.legacy.FixClassicSession; import org.mcphackers.launchwrapper.tweak.injection.legacy.FixGrayScreen; import org.mcphackers.launchwrapper.tweak.injection.legacy.FixShutdown; @@ -28,9 +26,9 @@ import org.mcphackers.launchwrapper.tweak.injection.legacy.LegacyTweakContext; import org.mcphackers.launchwrapper.tweak.injection.legacy.OptionsLoadFix; import org.mcphackers.launchwrapper.tweak.injection.legacy.ReplaceGameDir; -import org.mcphackers.launchwrapper.tweak.injection.legacy.SplashScreenFix; +import org.mcphackers.launchwrapper.tweak.injection.legacy.FixSplashScreen; +import org.mcphackers.launchwrapper.tweak.injection.legacy.UnlicensedCopyText; import org.mcphackers.launchwrapper.tweak.injection.vanilla.ChangeBrand; -import org.mcphackers.launchwrapper.util.ResourceSource; import org.mcphackers.launchwrapper.util.UnsafeUtils; import org.mcphackers.launchwrapper.util.Util; @@ -55,7 +53,9 @@ public LegacyTweak(LaunchConfig config) { public List getInjections() { return Arrays.asList( new LegacyInit(context), - new SplashScreenFix(context), + new ClassicCrashScreen(context), + new UnlicensedCopyText(context), + new FixSplashScreen(context), new FixGrayScreen(context), new FixShutdown(context), new IndevSaving(context), diff --git a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/ClassicCrashScreen.java b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/ClassicCrashScreen.java new file mode 100644 index 0000000..4f01706 --- /dev/null +++ b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/ClassicCrashScreen.java @@ -0,0 +1,219 @@ +package org.mcphackers.launchwrapper.tweak.injection.legacy; + +import static org.mcphackers.rdi.util.InsnHelper.*; +import static org.objectweb.asm.Opcodes.*; + +import org.mcphackers.launchwrapper.LaunchConfig; +import org.mcphackers.launchwrapper.tweak.injection.InjectionWithContext; +import org.mcphackers.launchwrapper.util.ClassNodeSource; +import org.mcphackers.rdi.util.NodeHelper; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.FieldNode; +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.JumpInsnNode; +import org.objectweb.asm.tree.LabelNode; +import org.objectweb.asm.tree.LdcInsnNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.TryCatchBlockNode; +import org.objectweb.asm.tree.TypeInsnNode; +import org.objectweb.asm.tree.VarInsnNode; + +/** + * Brings back an unused error screen which was previously used to catch fatal + * exceptions in Minecraft Classic and Indev + * + * Currently only tested to work between a1.1 and b1.5 + * Known versions where it doesn't work yet: a1.0.1_01 and b1.6.6 + * + * Note that some crashes related to rendering may break Tesselator which will make it stuck in an exception loop + */ +public class ClassicCrashScreen extends InjectionWithContext { + + public ClassicCrashScreen(LegacyTweakContext context) { + super(context); + } + + @Override + public String name() { + return "Classic crash screen"; + } + + @Override + public boolean required() { + return false; + } + + @Override + public boolean apply(ClassNodeSource source, LaunchConfig config) { + if (context.run == null) { + return false; + } + AbstractInsnNode insn1 = context.run.instructions.getFirst(); + String fieldName = null; + String fieldDesc = null; + LabelNode start = null; + AbstractInsnNode end = null; + TryCatchBlockNode afterCatch = null; + while (insn1 != null) { + AbstractInsnNode[] insns1 = fill(insn1, 6); + if (compareInsn(insns1[0], ALOAD, 0) + && compareInsn(insns1[1], GETFIELD, context.minecraft.name, context.running.name, + context.running.desc) + && compareInsn(insns1[2], IFEQ) + && compareInsn(insns1[3], ALOAD, 0) + && compareInsn(insns1[4], GETFIELD, context.minecraft.name, null, + "L" + context.minecraftApplet.name + ";") + && compareInsn(insns1[5], IFNULL)) { + start = new LabelNode(); + context.run.instructions.insertBefore(insn1, start); + JumpInsnNode jmp = (JumpInsnNode) insns1[2]; + end = previousInsn(jmp.label); // GOTO outside of loop + // end = previousInsn(end); // GOTO to the beggining of loop + for (TryCatchBlockNode tryCatch : context.run.tryCatchBlocks) { + if (afterCatch == null && tryCatch.type != null && !tryCatch.type.startsWith("java/lang/")) { + afterCatch = tryCatch; + } + // if ("java/lang/Throwable".equals(tryCatch.type)) { + AbstractInsnNode testInsn = nextInsn(tryCatch.handler); + while (tryCatch.end != testInsn && testInsn != null) { + testInsn = nextInsn(testInsn); + if (compareInsn(testInsn, ACONST_NULL) && compareInsn(nextInsn(testInsn), PUTFIELD)) { + FieldInsnNode putfield = (FieldInsnNode) nextInsn(testInsn); + fieldName = putfield.name; + fieldDesc = putfield.desc; + } + } + // } + } + } + insn1 = nextInsn(insn1); + } + if (start == null || end == null) { + return false; + } + if (fieldDesc == null || fieldName == null) { + return false; + } + MethodNode setWorld = null; + for (MethodNode m : context.minecraft.methods) { + if (m.desc.equals("(" + fieldDesc + ")V")) { + setWorld = m; + break; + } + } + if (setWorld == null) { + return false; + } + ClassNode errScreen = null; + MethodNode openScreen = null; + for (MethodNode m : context.minecraft.methods) { + if (m.desc.equals("()V")) { + AbstractInsnNode insn = m.instructions.getFirst(); + if (insn != null && insn.getOpcode() == -1) { + insn = nextInsn(insn); + } + if (!compareInsn(insn, INVOKESTATIC, "org/lwjgl/opengl/Display", "isActive", "()Z")) { + continue; + } + AbstractInsnNode insn2 = insn; + while (insn2 != null) { + AbstractInsnNode[] insns2 = fill(insn2, 3); + if (compareInsn(insns2[0], ALOAD, 0) + && compareInsn(insns2[1], ACONST_NULL) + && compareInsn(insns2[2], INVOKEVIRTUAL, context.minecraft.name, null, null)) { + MethodInsnNode invoke = (MethodInsnNode) insns2[2]; + openScreen = NodeHelper.getMethod(context.minecraft, invoke.name, invoke.desc); + break; + } + insn2 = nextInsn(insn2); + } + break; + } + } + if (openScreen == null) { + return false; + } + AbstractInsnNode insn = openScreen.instructions.getFirst(); + while (insn != null) { + if (insn.getOpcode() == INSTANCEOF) { + break; + } + insn = nextInsn(insn); + } + if (insn == null) { + return false; + } + errScreen = source.getClass(((TypeInsnNode) insn).desc); + + if (errScreen == null) { + return false; + } + MethodNode init = NodeHelper.getMethod(errScreen, "", "(Ljava/lang/String;Ljava/lang/String;)V"); + if (init == null) { + MethodNode newInit = new MethodNode(ACC_PUBLIC, "", "(Ljava/lang/String;Ljava/lang/String;)V", null, + null); + InsnList insnList = newInit.instructions; + insnList.add(new VarInsnNode(ALOAD, 0)); + insnList.add(new MethodInsnNode(INVOKESPECIAL, errScreen.superName, "", "()V")); + int c = 1; + for (FieldNode f : errScreen.fields) { + if (!f.desc.equals("Ljava/lang/String;")) { + continue; + } + insnList.add(new VarInsnNode(ALOAD, 0)); + insnList.add(new VarInsnNode(ALOAD, c)); + insnList.add(new FieldInsnNode(PUTFIELD, errScreen.name, f.name, f.desc)); + if (c == 2) { + break; + } + c++; + } + insnList.add(new InsnNode(RETURN)); + errScreen.methods.add(newInit); + } + source.overrideClass(errScreen); + + int n = getFreeIndex(context.run.instructions); + InsnList handle = new InsnList(); + handle.add(new VarInsnNode(ASTORE, n)); + handle.add(new VarInsnNode(ALOAD, 0)); + handle.add(new InsnNode(ACONST_NULL)); + handle.add(new FieldInsnNode(PUTFIELD, context.minecraft.name, fieldName, fieldDesc)); + handle.add(new VarInsnNode(ALOAD, 0)); + handle.add(new InsnNode(ACONST_NULL)); + handle.add(new MethodInsnNode(INVOKEVIRTUAL, context.minecraft.name, setWorld.name, setWorld.desc)); + handle.add(new VarInsnNode(ALOAD, n)); + handle.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Throwable", "printStackTrace", "()V")); + handle.add(new VarInsnNode(ALOAD, 0)); + handle.add(new TypeInsnNode(NEW, errScreen.name)); + handle.add(new InsnNode(DUP)); + handle.add(new LdcInsnNode("Client error")); + handle.add(new TypeInsnNode(NEW, "java/lang/StringBuilder")); + handle.add(new InsnNode(DUP)); + handle.add(new MethodInsnNode(INVOKESPECIAL, "java/lang/StringBuilder", "", "()V")); + handle.add(new LdcInsnNode("The game broke! [")); + handle.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", + "(Ljava/lang/String;)Ljava/lang/StringBuilder;")); + handle.add(new VarInsnNode(ALOAD, n)); + handle.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;")); + handle.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", + "(Ljava/lang/String;)Ljava/lang/StringBuilder;")); + handle.add(new LdcInsnNode("]")); + handle.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", + "(Ljava/lang/String;)Ljava/lang/StringBuilder;")); + handle.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;")); + handle.add( + new MethodInsnNode(INVOKESPECIAL, errScreen.name, "", "(Ljava/lang/String;Ljava/lang/String;)V")); + handle.add(new MethodInsnNode(INVOKEVIRTUAL, context.minecraft.name, openScreen.name, openScreen.desc)); + + handle.add(new JumpInsnNode(GOTO, start)); + addTryCatch(context.run, start, end, handle, "java/lang/Exception", afterCatch); + source.overrideClass(context.minecraft); + return true; + } + +} diff --git a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/FixShutdown.java b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/FixShutdown.java index 397b510..e7d8846 100644 --- a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/FixShutdown.java +++ b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/FixShutdown.java @@ -9,11 +9,18 @@ import org.mcphackers.rdi.util.NodeHelper; import org.objectweb.asm.Type; import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.JumpInsnNode; +import org.objectweb.asm.tree.LabelNode; +import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.TryCatchBlockNode; +import org.objectweb.asm.tree.TypeInsnNode; import org.objectweb.asm.tree.VarInsnNode; public class FixShutdown extends InjectionWithContext { @@ -33,12 +40,8 @@ public boolean required() { } @Override - public boolean apply(ClassNodeSource source, LaunchConfig config) { - fixShutdown(source); - return true; - } - - private void fixShutdown(ClassNodeSource source) { + public boolean apply(ClassNodeSource source, LaunchConfig config) { + boolean b = false; MethodNode destroy = null; if(context.run != null) { AbstractInsnNode insn1 = context.run.instructions.getLast(); @@ -90,6 +93,7 @@ && compareInsn(insns2[1], INVOKESTATIC, "java/lang/System", "exit", "(I)V")) { insert.add(new InsnNode(ICONST_0)); insert.add(new MethodInsnNode(INVOKESTATIC, "java/lang/System", "exit", "(I)V")); destroy.instructions.insert(insn1, insert); + b = true; // tweakInfo("Shutdown patch"); } } @@ -121,6 +125,7 @@ && compareInsn(insns2[2], INVOKEVIRTUAL, context.minecraft.name, null, null)) { MethodInsnNode invoke = (MethodInsnNode) insns2[2]; if(Type.getReturnType(invoke.desc).getSort() == Type.VOID) { addTryCatch(destroy, insns2[0], insns2[2], "java/lang/Throwable"); + b = true; // tweakInfo("SoundManager shutdown"); break; } @@ -129,6 +134,7 @@ && compareInsn(insns2[2], INVOKEVIRTUAL, context.minecraft.name, null, null)) { } } } + return b; } } diff --git a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/FixSplashScreen.java b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/FixSplashScreen.java new file mode 100644 index 0000000..d8a4f38 --- /dev/null +++ b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/FixSplashScreen.java @@ -0,0 +1,145 @@ +package org.mcphackers.launchwrapper.tweak.injection.legacy; + +import static org.mcphackers.rdi.util.InsnHelper.*; +import static org.objectweb.asm.Opcodes.*; + +import org.mcphackers.launchwrapper.LaunchConfig; +import org.mcphackers.launchwrapper.tweak.injection.InjectionWithContext; +import org.mcphackers.launchwrapper.util.ClassNodeSource; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.IntInsnNode; +import org.objectweb.asm.tree.LdcInsnNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.VarInsnNode; + +/** + * Fixes mojang splash screen offset when running with custom window size or fullscreen + */ +public class FixSplashScreen extends InjectionWithContext { + + public FixSplashScreen(LegacyTweakContext storage) { + super(storage); + } + + @Override + public String name() { + return "Splash screen fix"; + } + + @Override + public boolean required() { + return false; + } + + @Override + public boolean apply(ClassNodeSource source, LaunchConfig config) { + for(MethodNode m : context.minecraft.methods) { + boolean astore1 = false; + boolean store2 = false; + boolean store3 = false; + String owner = null; + String fieldWidth = null; + String fieldHeight = null; + for(AbstractInsnNode insn : m.instructions) { + if(compareInsn(insn, ASTORE, 1)) { + // stores ScreenSizeCalculator, or whatever is used for scaling of Screen instances + astore1 = true; + } + if(astore1 && fieldWidth == null && fieldHeight == null) { + AbstractInsnNode[] insns2 = fill(insn, 4); + if(compareInsn(insns2[0], ALOAD, 1) + && compareInsn(insns2[1], GETFIELD, null, null, "D") + && compareInsn(insns2[2], ALOAD, 1) + && compareInsn(insns2[3], GETFIELD, null, null, "D")) { + FieldInsnNode width = (FieldInsnNode)insns2[1]; + FieldInsnNode height = (FieldInsnNode)insns2[3]; + owner = width.owner; + fieldWidth = width.name; + fieldHeight = height.name; + } + + } + if(compareInsn(insn, ISTORE, 2)) { + // stores width from ScreenSizeCalculator. (Only in b1.3 or prior) + store2 = true; + } + if(compareInsn(insn, ISTORE, 3)) { + // stores height from ScreenSizeCalculator. (Only in b1.3 or prior) + store3 = true; + } + if(insn.getOpcode() == LDC) { + LdcInsnNode ldc = (LdcInsnNode) insn; + if(ldc.cst.equals("/title/mojang.png")) { + AbstractInsnNode insn3 = ldc.getNext(); + while(insn3 != null) { + AbstractInsnNode[] insns2 = fill(insn3, 15); + if((store2 && store3 || owner != null) + && compareInsn(insns2[0], ALOAD) + && compareInsn(insns2[1], GETFIELD, null, null, "I") + && compareInsn(insns2[2], ICONST_2) + && compareInsn(insns2[3], IDIV) + && compareInsn(insns2[4], ILOAD) + && compareInsn(insns2[5], ISUB) + && compareInsn(insns2[6], ICONST_2) + && compareInsn(insns2[7], IDIV) + && compareInsn(insns2[8], ALOAD) + && compareInsn(insns2[9], GETFIELD, null, null, "I") + && compareInsn(insns2[10], ICONST_2) + && compareInsn(insns2[11], IDIV) + && compareInsn(insns2[12], ILOAD) + && compareInsn(insns2[13], ISUB) + && compareInsn(insns2[14], ICONST_2)) { + if(store2 && store3 || owner != null) { + m.instructions.remove(insns2[2]); + m.instructions.remove(insns2[3]); + m.instructions.remove(insns2[10]); + m.instructions.remove(insns2[11]); + } + if(store2 && store3) { + // b1.3 and prior + m.instructions.remove(insns2[0]); + m.instructions.set(insns2[1], new VarInsnNode(ILOAD, 2)); + m.instructions.remove(insns2[8]); + m.instructions.set(insns2[9], new VarInsnNode(ILOAD, 3)); + source.overrideClass(context.minecraft); + return true; + } else if(owner != null) { + // b1.4 + InsnList list = new InsnList(); + list.add(new IntInsnNode(ALOAD, 1)); + list.add(new FieldInsnNode(GETFIELD, owner, fieldWidth, "D")); + list.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Math", "ceil", "(D)D")); + list.add(new InsnNode(D2I)); + m.instructions.insertBefore(insns2[0], list); + m.instructions.remove(insns2[0]); + m.instructions.remove(insns2[1]); + + list = new InsnList(); + list.add(new IntInsnNode(ALOAD, 1)); + list.add(new FieldInsnNode(GETFIELD, owner, fieldHeight, "D")); + list.add(new MethodInsnNode(INVOKESTATIC, "java/lang/Math", "ceil", "(D)D")); + list.add(new InsnNode(D2I)); + m.instructions.insertBefore(insns2[8], list); + m.instructions.remove(insns2[8]); + m.instructions.remove(insns2[9]); + source.overrideClass(context.minecraft); + return true; + } else { + return false; + } + } + insn3 = nextInsn(insn3); + } + break; + } + } + } + } + return false; + } + +} diff --git a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/IndevSaving.java b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/IndevSaving.java index 07e9592..874d9f9 100644 --- a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/IndevSaving.java +++ b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/IndevSaving.java @@ -81,31 +81,28 @@ && compareInsn(insns2[6], PUTFIELD, null, null, "Z")) { } } for(MethodNode m2 : pauseMenu.methods) { + if(m2.desc.equals("()V")) { + continue; + } AbstractInsnNode insn = m2.instructions.getFirst(); - AbstractInsnNode[] insns2 = fill(insn, 3); - if(compareInsn(insns2[0], ALOAD, 1) - && compareInsn(insns2[1], GETFIELD, null, null, "I") - && compareInsn(insns2[2], IFNE)) { - FieldInsnNode idField = (FieldInsnNode) insns2[1]; - while(insn != null) { - insns2 = fill(insn, 4); - if(compareInsn(insns2[0], ALOAD, 1) - && compareInsn(insns2[1], GETFIELD, idField.owner, idField.name, idField.desc) - && compareInsn(insns2[3], IF_ICMPNE)) { - AbstractInsnNode[] insns3 = fill(nextInsn(insns2[3]), 3); - if(compareInsn(insns3[2], NEW)) { - if(compareInsn(insns2[2], ICONST_2)) { - saveLevelMenu = source.getClass(((TypeInsnNode) insns3[2]).desc); - } else if(compareInsn(insns2[2], ICONST_3)) { - loadLevelMenu = source.getClass(((TypeInsnNode) insns3[2]).desc); - } + while(insn != null) { + AbstractInsnNode[] insns2 = fill(insn, 4); + if(compareInsn(insns2[0], ALOAD, 1) + && compareInsn(insns2[1], GETFIELD, null, null, "I") + && compareInsn(insns2[3], IF_ICMPNE)) { + AbstractInsnNode[] insns3 = fill(nextInsn(insns2[3]), 3); + if(compareInsn(insns3[2], NEW)) { + if(compareInsn(insns2[2], ICONST_2)) { // Button id + saveLevelMenu = source.getClass(((TypeInsnNode) insns3[2]).desc); + } else if(compareInsn(insns2[2], ICONST_3)) { + loadLevelMenu = source.getClass(((TypeInsnNode) insns3[2]).desc); } } - if(saveLevelMenu != null && loadLevelMenu != null) { - break methods; - } - insn = nextInsn(insn); } + if(saveLevelMenu != null && loadLevelMenu != null) { + break methods; + } + insn = nextInsn(insn); } } } diff --git a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/SplashScreenFix.java b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/SplashScreenFix.java deleted file mode 100644 index b119798..0000000 --- a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/SplashScreenFix.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.mcphackers.launchwrapper.tweak.injection.legacy; - -import static org.mcphackers.rdi.util.InsnHelper.*; -import static org.objectweb.asm.Opcodes.*; - -import org.mcphackers.launchwrapper.LaunchConfig; -import org.mcphackers.launchwrapper.tweak.injection.InjectionWithContext; -import org.mcphackers.launchwrapper.util.ClassNodeSource; -import org.objectweb.asm.tree.AbstractInsnNode; -import org.objectweb.asm.tree.LdcInsnNode; -import org.objectweb.asm.tree.MethodNode; -import org.objectweb.asm.tree.VarInsnNode; - -public class SplashScreenFix extends InjectionWithContext { - - public SplashScreenFix(LegacyTweakContext storage) { - super(storage); - } - - @Override - public String name() { - return "Splash screen fix"; - } - - @Override - public boolean required() { - return false; - } - - @Override - public boolean apply(ClassNodeSource source, LaunchConfig config) { - for(MethodNode m : context.minecraft.methods) { - boolean store2 = false; - boolean store3 = false; - for(AbstractInsnNode insn : m.instructions) { - if(compareInsn(insn, ISTORE, 2)) { - store2 = true; - } - if(compareInsn(insn, ISTORE, 3)) { - store3 = true; - } - if(insn.getOpcode() == LDC) { - LdcInsnNode ldc = (LdcInsnNode) insn; - if(ldc.cst.equals("/title/mojang.png")) { - AbstractInsnNode insn3 = ldc.getNext(); - while(insn3 != null) { - AbstractInsnNode[] insns2 = fill(insn3, 15); - if(store2 && store3 - && compareInsn(insns2[0], ALOAD) - && compareInsn(insns2[1], GETFIELD, null, null, "I") - && compareInsn(insns2[2], ICONST_2) - && compareInsn(insns2[3], IDIV) - && compareInsn(insns2[4], ILOAD) - && compareInsn(insns2[5], ISUB) - && compareInsn(insns2[6], ICONST_2) - && compareInsn(insns2[7], IDIV) - && compareInsn(insns2[8], ALOAD) - && compareInsn(insns2[9], GETFIELD, null, null, "I") - && compareInsn(insns2[10], ICONST_2) - && compareInsn(insns2[11], IDIV) - && compareInsn(insns2[12], ILOAD) - && compareInsn(insns2[13], ISUB) - && compareInsn(insns2[14], ICONST_2)) { - m.instructions.remove(insns2[2]); - m.instructions.remove(insns2[3]); - m.instructions.remove(insns2[10]); - m.instructions.remove(insns2[11]); - m.instructions.remove(insns2[0]); - m.instructions.remove(insns2[8]); - m.instructions.set(insns2[1], new VarInsnNode(ILOAD, 2)); - m.instructions.set(insns2[9], new VarInsnNode(ILOAD, 3)); - return true; - } - insn3 = nextInsn(insn3); - } - break; - } - } - } - } - return false; - } - -} diff --git a/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/UnlicensedCopyText.java b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/UnlicensedCopyText.java new file mode 100644 index 0000000..20eec3e --- /dev/null +++ b/src/main/java/org/mcphackers/launchwrapper/tweak/injection/legacy/UnlicensedCopyText.java @@ -0,0 +1,49 @@ +package org.mcphackers.launchwrapper.tweak.injection.legacy; + +import static org.mcphackers.rdi.util.InsnHelper.*; +import static org.objectweb.asm.Opcodes.*; + +import org.mcphackers.launchwrapper.LaunchConfig; +import org.mcphackers.launchwrapper.tweak.injection.InjectionWithContext; +import org.mcphackers.launchwrapper.util.ClassNodeSource; +import org.mcphackers.rdi.util.NodeHelper; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.MethodNode; + +public class UnlicensedCopyText extends InjectionWithContext { + + public UnlicensedCopyText(LegacyTweakContext context) { + super(context); + } + + @Override + public String name() { + return "Unlicensed Copy text"; + } + + @Override + public boolean required() { + return false; + } + + @Override + public boolean apply(ClassNodeSource source, LaunchConfig config) { + if(config.haspaid.get()) { + return false; + } + MethodNode clinit = NodeHelper.getMethod(context.minecraft, "", "()V"); + if(clinit == null) { + return false; + } + for(AbstractInsnNode insn = clinit.instructions.getFirst(); insn != null; insn = nextInsn(insn)) { + if(compareInsn(insn, LCONST_0) && compareInsn(nextInsn(insn), PUTSTATIC, context.minecraft.name, null, "J")) { + clinit.instructions.set(insn, longInsn(1)); + source.overrideClass(context.minecraft); + return true; + } + } + + return false; + } + +} diff --git a/src/main/java/org/mcphackers/launchwrapper/util/UnsafeUtils.java b/src/main/java/org/mcphackers/launchwrapper/util/UnsafeUtils.java index 1024c39..ead4531 100644 --- a/src/main/java/org/mcphackers/launchwrapper/util/UnsafeUtils.java +++ b/src/main/java/org/mcphackers/launchwrapper/util/UnsafeUtils.java @@ -4,6 +4,7 @@ import sun.misc.Unsafe; +@SuppressWarnings("sunapi") public final class UnsafeUtils { private static final Unsafe theUnsafe = getUnsafe(); diff --git a/src/test/java/org/mcphackers/launchwrapper/test/AlphaTest.java b/src/test/java/org/mcphackers/launchwrapper/test/AlphaTest.java index 56d1e42..bbd992b 100644 --- a/src/test/java/org/mcphackers/launchwrapper/test/AlphaTest.java +++ b/src/test/java/org/mcphackers/launchwrapper/test/AlphaTest.java @@ -24,6 +24,6 @@ public Tweak getTweak(LaunchConfig config) { @Override public TestFeatureBuilder getTests() { return new TestFeatureBuilder() - .tweakInfoList("LegacyTweak init", "Fix Shutdown", "LWJGL Patch", "Splash screen fix", "Replace game directory", "Options load fix", "Fix gray screen", "Add main"); + .tweakInfoList("LegacyTweak init", "Classic crash screen", "Fix Shutdown", "LWJGL Patch", "Splash screen fix", "Replace game directory", "Options load fix", "Fix gray screen", "Add main"); } } diff --git a/src/test/java/org/mcphackers/launchwrapper/test/BetaTest.java b/src/test/java/org/mcphackers/launchwrapper/test/BetaTest.java index b2f30d5..f72b29b 100644 --- a/src/test/java/org/mcphackers/launchwrapper/test/BetaTest.java +++ b/src/test/java/org/mcphackers/launchwrapper/test/BetaTest.java @@ -24,6 +24,6 @@ public Tweak getTweak(LaunchConfig config) { @Override public TestFeatureBuilder getTests() { return new TestFeatureBuilder() - .tweakInfoList("LegacyTweak init", "Splash screen fix", "Fix Shutdown", "LWJGL Patch", "Replace game directory", "Options load fix", "Add main"); + .tweakInfoList("LegacyTweak init", "Classic crash screen", "Splash screen fix", "Fix Shutdown", "LWJGL Patch", "Replace game directory", "Options load fix", "Add main"); } }