Skip to content

Commit 4882090

Browse files
committed
Add parameter to dump modified classes for debugging
1 parent 64854c8 commit 4882090

File tree

3 files changed

+60
-52
lines changed

3 files changed

+60
-52
lines changed

src/main/java/org/mcphackers/launchwrapper/Launch.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ protected Tweak getTweak() {
6969
protected LaunchClassLoader getLoader() {
7070
if (CLASS_LOADER == null) {
7171
CLASS_LOADER = LaunchClassLoader.instantiate();
72+
CLASS_LOADER.setDebugOutput(config.debugClassDump.get());
7273
}
7374
return CLASS_LOADER;
7475
}

src/main/java/org/mcphackers/launchwrapper/LaunchConfig.java

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -28,54 +28,55 @@ public class LaunchConfig {
2828
// clang-format off
2929

3030
// Minecraft options
31-
public final LaunchParameterSwitch demo = new LaunchParameterSwitch("demo");
31+
public final LaunchParameterSwitch demo = new LaunchParameterSwitch("demo");
3232
public final LaunchParameterSwitch fullscreen = new LaunchParameterSwitch("fullscreen");
33-
public final LaunchParameterString server = new LaunchParameterString("server");
34-
public final LaunchParameterNumber port = new LaunchParameterNumber("port", 25565);
35-
public final LaunchParameterFile gameDir = new LaunchParameterFile("gameDir", DEFAULT_GAME_DIR).altName("workDir");
36-
public final LaunchParameterFile assetsDir = new LaunchParameterFile("assetsDir");
37-
public final LaunchParameterFile resourcePackDir = new LaunchParameterFile("resourcePackDir");
38-
public final LaunchParameterString username = new LaunchParameterString("username", "Player");
39-
public final LaunchParameterString session = new LaunchParameterString("session", "-").altName("sessionid");
40-
public final LaunchParameterString password = new LaunchParameterString("password");
41-
public final LaunchParameterString uuid = new LaunchParameterString("uuid");
42-
public final LaunchParameterString accessToken = new LaunchParameterString("accessToken");
43-
public final LaunchParameterString version = new LaunchParameterString("version");
44-
public final LaunchParameterNumber width = new LaunchParameterNumber("width", 854);
45-
public final LaunchParameterNumber height = new LaunchParameterNumber("height", 480);
46-
public final LaunchParameterString userProperties = new LaunchParameterString("userProperties");
47-
public final LaunchParameterString profileProperties = new LaunchParameterString("profileProperties");
48-
public final LaunchParameterString assetIndex = new LaunchParameterString("assetIndex");
49-
public final LaunchParameterString userType = new LaunchParameterString("userType");
50-
public final LaunchParameterString versionType = new LaunchParameterString("versionType");
33+
public final LaunchParameterString server = new LaunchParameterString("server");
34+
public final LaunchParameterNumber port = new LaunchParameterNumber("port", 25565);
35+
public final LaunchParameterFile gameDir = new LaunchParameterFile("gameDir", DEFAULT_GAME_DIR).altName("workDir");
36+
public final LaunchParameterFile assetsDir = new LaunchParameterFile("assetsDir");
37+
public final LaunchParameterFile resourcePackDir = new LaunchParameterFile("resourcePackDir");
38+
public final LaunchParameterString username = new LaunchParameterString("username", "Player");
39+
public final LaunchParameterString session = new LaunchParameterString("session", "-").altName("sessionid");
40+
public final LaunchParameterString password = new LaunchParameterString("password");
41+
public final LaunchParameterString uuid = new LaunchParameterString("uuid");
42+
public final LaunchParameterString accessToken = new LaunchParameterString("accessToken");
43+
public final LaunchParameterString version = new LaunchParameterString("version");
44+
public final LaunchParameterNumber width = new LaunchParameterNumber("width", 854);
45+
public final LaunchParameterNumber height = new LaunchParameterNumber("height", 480);
46+
public final LaunchParameterString userProperties = new LaunchParameterString("userProperties");
47+
public final LaunchParameterString profileProperties = new LaunchParameterString("profileProperties");
48+
public final LaunchParameterString assetIndex = new LaunchParameterString("assetIndex");
49+
public final LaunchParameterString userType = new LaunchParameterString("userType");
50+
public final LaunchParameterString versionType = new LaunchParameterString("versionType");
5151
// Applet arguments
5252
private final LaunchParameterSwitch haspaid = new LaunchParameterSwitch("haspaid", true);
53-
public final LaunchParameterString loadmapUser = new LaunchParameterString("loadmap_user");
54-
public final LaunchParameterNumber loadmapId = new LaunchParameterNumber("loadmap_id");
55-
public final LaunchParameterString mppass = new LaunchParameterString("mppass", "");
53+
public final LaunchParameterString loadmapUser = new LaunchParameterString("loadmap_user");
54+
public final LaunchParameterNumber loadmapId = new LaunchParameterNumber("loadmap_id");
55+
public final LaunchParameterString mppass = new LaunchParameterString("mppass", "");
5656
// Built-in wrapper options
57-
public final LaunchParameterString tweakClass = new LaunchParameterString("tweakClass", null, true);
57+
public final LaunchParameterFile debugClassDump = new LaunchParameterFile("debugClassDump", null, true);
58+
public final LaunchParameterString tweakClass = new LaunchParameterString("tweakClass", null, true);
5859
public final LaunchParameterString brand = new LaunchParameterString("brand", "launchwrapper", true);
59-
public final LaunchParameterString realmsServer = new LaunchParameterString("realmsServer", null, true);
60-
public final LaunchParameterNumber realmsPort = new LaunchParameterNumber("realmsPort", 80, true);
61-
public final LaunchParameterSwitch lwjglFrame = new LaunchParameterSwitch("lwjglFrame", true, true);
62-
private final LaunchParameterSwitch awtFrame = new LaunchParameterSwitchReverse("awtFrame", lwjglFrame);
63-
public final LaunchParameterSwitch modernSkinProxy = new LaunchParameterSwitch("useSkinProxy", false, true);
64-
public final LaunchParameterEnum<SkinType> skinProxy = new LaunchParameterEnum<SkinType>("skinProxy", SkinType.DEFAULT, true);
60+
public final LaunchParameterString realmsServer = new LaunchParameterString("realmsServer", null, true);
61+
public final LaunchParameterNumber realmsPort = new LaunchParameterNumber("realmsPort", 80, true);
62+
public final LaunchParameterSwitch lwjglFrame = new LaunchParameterSwitch("lwjglFrame", true, true);
63+
private final LaunchParameterSwitch awtFrame = new LaunchParameterSwitchReverse("awtFrame", lwjglFrame);
64+
public final LaunchParameterSwitch modernSkinProxy = new LaunchParameterSwitch("useSkinProxy", false, true);
65+
public final LaunchParameterEnum<SkinType> skinProxy = new LaunchParameterEnum<SkinType>("skinProxy", SkinType.DEFAULT, true);
6566
public final LaunchParameterSkinOptions skinOptions = new LaunchParameterSkinOptions("skinOptions");
6667
public final LaunchParameterFile levelsDir = new LaunchParameterFile("levelsDir", null, true);
67-
public final LaunchParameterSwitch isom = new LaunchParameterSwitch("isom", false, true);
68-
public final LaunchParameterFileList icon = new LaunchParameterFileList("icon", null, true);
69-
public final LaunchParameterString title = new LaunchParameterString("title", null, true);
70-
public final LaunchParameterSwitch vsync = new LaunchParameterSwitch("vsync", false, true);
71-
public final LaunchParameterSwitch resizable = new LaunchParameterSwitch("resizable", false, true);
68+
public final LaunchParameterSwitch isom = new LaunchParameterSwitch("isom", false, true);
69+
public final LaunchParameterFileList icon = new LaunchParameterFileList("icon", null, true);
70+
public final LaunchParameterString title = new LaunchParameterString("title", null, true);
71+
public final LaunchParameterSwitch vsync = new LaunchParameterSwitch("vsync", false, true);
72+
public final LaunchParameterSwitch resizable = new LaunchParameterSwitch("resizable", false, true);
7273
public final LaunchParameterSwitch applet = new LaunchParameterSwitch("applet", false);
73-
public final LaunchParameterSwitch oneSixFlag = new LaunchParameterSwitch("oneSixFlag", false, true);
74+
public final LaunchParameterSwitch oneSixFlag = new LaunchParameterSwitch("oneSixFlag", false, true);
7475
public final LaunchParameterSwitch unlicensedCopy = new LaunchParameterSwitchReverse("unlicensedCopy", haspaid);
75-
public final LaunchParameterSwitch creative = new LaunchParameterSwitch("creative", false, true);
76-
public final LaunchParameterSwitch survival = new LaunchParameterSwitch("survival", false, true);
77-
public final LaunchParameterString serverURL = new LaunchParameterString("serverURL", null, true);
78-
public final LaunchParameterString serverSHA1 = new LaunchParameterString("serverSHA1", null, true);
76+
public final LaunchParameterSwitch creative = new LaunchParameterSwitch("creative", false, true);
77+
public final LaunchParameterSwitch survival = new LaunchParameterSwitch("survival", false, true);
78+
public final LaunchParameterString serverURL = new LaunchParameterString("serverURL", null, true);
79+
public final LaunchParameterString serverSHA1 = new LaunchParameterString("serverSHA1", null, true);
7980
// clang-format on
8081

8182
private static File getDefaultGameDir() {

src/main/java/org/mcphackers/launchwrapper/loader/LaunchClassLoader.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.mcphackers.launchwrapper.util.Util;
3434
import org.mcphackers.launchwrapper.util.asm.NodeHelper;
3535
import org.objectweb.asm.ClassReader;
36+
import org.objectweb.asm.ClassVisitor;
3637
import org.objectweb.asm.ClassWriter;
3738
import org.objectweb.asm.tree.ClassNode;
3839

@@ -260,19 +261,23 @@ public void overrideClass(ClassNode node) {
260261
classNodeCache.put(node.name, node);
261262
}
262263

263-
// public void saveDebugDump(ClassNode node) {
264-
// if(debugOutput == null) {
265-
// return;
266-
// }
267-
// try {
268-
// File cls = new File(debugOutput, node.name + ".dump");
269-
// cls.getParentFile().mkdirs();
270-
// org.objectweb.asm.util.TraceClassVisitor trace = new org.objectweb.asm.util.TraceClassVisitor(new java.io.PrintWriter(new File(debugOutput, node.name + ".dump")));
271-
// node.accept(trace);
272-
// } catch (IOException e) {
273-
// e.printStackTrace();
274-
// }
275-
// }
264+
public void saveDebugDump(ClassNode node) {
265+
if (debugOutput == null) {
266+
return;
267+
}
268+
try {
269+
File cls = new File(debugOutput, node.name + ".dump");
270+
Class<?> traceVisitorClass = Class.forName("org.objectweb.asm.util.TraceClassVisitor");
271+
ClassVisitor trace = traceVisitorClass.asSubclass(ClassVisitor.class)
272+
.getConstructor(java.io.PrintWriter.class)
273+
.newInstance(new java.io.PrintWriter(cls));
274+
cls.getParentFile().mkdirs();
275+
node.accept(trace);
276+
} catch (ClassNotFoundException e) {
277+
} catch (Exception e) {
278+
e.printStackTrace();
279+
}
280+
}
276281

277282
public void saveDebugClass(ClassNode node) {
278283
if (debugOutput == null) {
@@ -360,6 +365,7 @@ private Class<?> redefineClass(ClassNode node) {
360365
if (node == null) {
361366
return null;
362367
}
368+
saveDebugDump(node);
363369
saveDebugClass(node);
364370
ClassWriter writer = new SafeClassWriter(this, COMPUTE_MAXS | COMPUTE_FRAMES);
365371
node.accept(writer);

0 commit comments

Comments
 (0)