13
13
import java .util .zip .ZipEntry ;
14
14
import java .util .zip .ZipInputStream ;
15
15
16
+ import org .json .JSONArray ;
16
17
import org .mcphackers .mcp .MCP ;
17
18
import org .mcphackers .mcp .MCPPaths ;
18
19
import org .mcphackers .mcp .tasks .mode .TaskParameter ;
19
20
import org .mcphackers .mcp .tools .Util ;
21
+ import org .mcphackers .mcp .tools .versions .json .Rule ;
20
22
import org .mcphackers .mcp .tools .versions .json .Version ;
23
+ import org .mcphackers .mcp .tools .versions .json .Version .Argument ;
21
24
import org .mcphackers .mcp .tools .versions .json .Version .Arguments ;
22
25
23
26
public class TaskRun extends TaskStaged {
@@ -43,6 +46,7 @@ protected Stage[] setStages() {
43
46
mcp .log ("Start class not found" );
44
47
return ;
45
48
}
49
+ mcp .log ("Using main class: " + main );
46
50
47
51
boolean runBuild = mcp .getOptions ().getBooleanParameter (TaskParameter .RUN_BUILD );
48
52
boolean fullBuild = mcp .getOptions ().getBooleanParameter (TaskParameter .FULL_BUILD );
@@ -55,16 +59,24 @@ protected Stage[] setStages() {
55
59
Path natives = MCPPaths .get (mcp , NATIVES ).toAbsolutePath ();
56
60
57
61
List <String > args = new ArrayList <>();
62
+ List <String > gameArgs = new ArrayList <>();
58
63
args .add (Util .getJava ());
64
+ String cpString = String .join (File .pathSeparator , classPath );
65
+ for (String s : getJvmArgs (mcp , mcpSide )) {
66
+ args .add (s .replace ("${classpath}" , cpString )
67
+ .replace ("${natives_directory}" , natives .toAbsolutePath ().toString ())
68
+ .replace ("${launcher_name}" , "RetroMCP" )
69
+ .replace ("${launcher_version}" , MCP .VERSION ));
70
+ }
59
71
Collections .addAll (args , runArgs );
60
- args .add ("-Djava.library.path=" + natives );
61
- args .add ("-cp" );
62
- args .add (String .join (File .pathSeparator , classPath ));
63
72
args .add (main );
64
73
if (side == Side .CLIENT ) {
65
- args .addAll (getLaunchArgs (mcp , mcpSide ));
66
- Collections .addAll (args , mcp .getOptions ().getStringParameter (TaskParameter .GAME_ARGS ).split (" " ));
74
+ gameArgs .addAll (getLaunchArgs (mcp , mcpSide ));
75
+ Collections .addAll (gameArgs , mcp .getOptions ().getStringParameter (TaskParameter .GAME_ARGS ).split (" " ));
76
+ args .addAll (gameArgs );
67
77
}
78
+ mcp .log ("Launch arguments: " + String .join (", " , args ));
79
+ // mcp.log("Classpath:\n" + String.join("\n", classPath));
68
80
69
81
Util .runCommand (args .toArray (new String [0 ]), getMCDir (mcp , mcpSide ), true );
70
82
})
@@ -92,6 +104,43 @@ public static String getMain(MCP mcp, Version version, Side side) throws IOExcep
92
104
return null ;
93
105
}
94
106
107
+ private static List <String > getStringArguments (List <Object > objects ) {
108
+ List <String > argsList = new ArrayList <>();
109
+ for (Object o : objects ) {
110
+ if (o instanceof String ) {
111
+ argsList .add ((String ) o );
112
+ }
113
+ else if (o instanceof Argument ) {
114
+ Argument arg = (Argument )o ;
115
+ if (Rule .apply (arg .rules )) {
116
+ if (arg .value instanceof String ) {
117
+ argsList .add ((String )arg .value );
118
+ }
119
+ else if (arg .value instanceof JSONArray ) {
120
+ JSONArray arr = (JSONArray )arg .value ;
121
+ for (int i = 0 ; i < arr .length (); i ++) {
122
+ argsList .add (arr .getString (i ));
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ return argsList ;
129
+ }
130
+
131
+ public static List <String > getJvmArgs (MCP mcp , Side side ) {
132
+ List <String > argsList = new ArrayList <>();
133
+ Version ver = mcp .getCurrentVersion ();
134
+ if (ver .arguments != null ) {
135
+ argsList .addAll (getStringArguments (ver .arguments .jvm ));
136
+ } else {
137
+ argsList .add ("-Djava.library.path=${natives_directory}" );
138
+ argsList .add ("-cp" );
139
+ argsList .add ("${classpath}" );
140
+ }
141
+ return argsList ;
142
+ }
143
+
95
144
/**
96
145
* @param mcp
97
146
* @return arguments for launching client
@@ -102,11 +151,7 @@ public static List<String> getLaunchArgs(MCP mcp, Side side) {
102
151
String mcArgs = ver .minecraftArguments ;
103
152
List <String > argsList = new ArrayList <>();
104
153
if (args != null ) {
105
- for (Object o : args .game ) {
106
- if (o instanceof String ) {
107
- argsList .add ((String ) o );
108
- }
109
- }
154
+ argsList .addAll (getStringArguments (args .game ));
110
155
} else {
111
156
argsList .addAll (Arrays .asList (mcArgs .split (" " )));
112
157
}
0 commit comments