diff --git a/src/main/java/org/mcphackers/launchwrapper/LaunchConfig.java b/src/main/java/org/mcphackers/launchwrapper/LaunchConfig.java index 659e24f..b95346d 100644 --- a/src/main/java/org/mcphackers/launchwrapper/LaunchConfig.java +++ b/src/main/java/org/mcphackers/launchwrapper/LaunchConfig.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -18,9 +19,10 @@ @SuppressWarnings("unused") public class LaunchConfig { private static final File DEFAULT_GAME_DIR = getDefaultGameDir(); + // Store all arguments into this list, in order of whatever has been passed by a launcher or the user + // NOTE: this is supposed to hold String and LaunchParameter objects primarily + private final List arguments = new ArrayList(); private final Map> parameters = new HashMap>(); - // If we won't find any of the parameters from below, they're going into this list - private final List extraParameters = new ArrayList(); // clang-format off @@ -115,7 +117,21 @@ private static File getDefaultGameDir() { @Override public LaunchConfig clone() { LaunchConfig newConfig = new LaunchConfig(); - newConfig.extraParameters.addAll(extraParameters); + for (Object argument : arguments) { + if (argument == null) { + continue; + } + if (argument instanceof LaunchParameter) { + LaunchParameter param = (LaunchParameter)newConfig.parameters.get(((LaunchParameter)argument).name); + if (param == null) { + continue; + } + // This should add the new config's parameters to its arguments list + newConfig.arguments.add(param); + } else { + newConfig.arguments.add(argument); + } + } for (Map.Entry> entry : parameters.entrySet()) { LaunchParameter param = (LaunchParameter)newConfig.parameters.get(entry.getKey()); if (param == null) { @@ -133,17 +149,18 @@ public LaunchConfig() { public LaunchConfig(String[] args) { for (int i = 0; i < args.length; i++) { if (!args[i].startsWith("--")) { - extraParameters.add(args[i]); + arguments.add(args[i]); continue; } String paramName = args[i].substring(2); LaunchParameter param = parameters.get(paramName); if (param == null) { - extraParameters.add(args[i]); + arguments.add(args[i]); continue; } if (param.isSwitch()) { ((LaunchParameterSwitch)param).setFlag(); + arguments.add(param); continue; } if (i + 1 < args.length) { @@ -153,6 +170,7 @@ public LaunchConfig(String[] args) { } catch (IllegalArgumentException ignored) { } } + arguments.add(param); } if (levelsDir.get() == null) { levelsDir.set(new File(gameDir.get(), "levels")); @@ -166,7 +184,7 @@ public LaunchConfig(String[] args) { public List> getParamsAsList() { List> list = new ArrayList>(); for (LaunchParameter param : parameters.values()) { - if (!param.wrapperOnly && param.get() != null && param.get() != Boolean.FALSE) { + if (!param.wrapperOnly && param.get() != null && !param.get().equals(Boolean.FALSE)) { list.add(param); } } @@ -174,11 +192,22 @@ public List> getParamsAsList() { } public Map getArgsAsMap() { - Map map = new HashMap(); - for (String key : parameters.keySet()) { - LaunchParameter param = parameters.get(key); - if (!param.wrapperOnly && param.get() != null && param.get() != Boolean.FALSE) { - map.put(key, param.getString()); + // LinkedHashMap as arguments should be returned in a consistent order + Map map = new LinkedHashMap(); + for (Object argument : arguments) { + if (argument == null) { + continue; + } + if (argument instanceof LaunchParameter) { + LaunchParameter param = (LaunchParameter)argument; + if (!param.wrapperOnly && param.get() != null && !param.get().equals(Boolean.FALSE)) { + map.put(param.name, param.getString()); + if (param.getAltName() != null && param.getAltName().length() > 0) { + map.put(param.getAltName(), param.getString()); + } + } + } else { + map.put(argument.toString(), null); } } return map; @@ -186,22 +215,33 @@ public Map getArgsAsMap() { public String[] getArgs() { List list = new ArrayList(); - for (String key : parameters.keySet()) { - LaunchParameter param = parameters.get(key); - if (!param.wrapperOnly && param.get() != null) { - if (param.isSwitch()) { - if (param.get().equals(true)) { - list.add("--" + key); + for (Object argument : arguments) { + if (argument == null) { + continue; + } + if (argument instanceof LaunchParameter) { + LaunchParameter param = (LaunchParameter)argument; + if (!param.wrapperOnly && param.get() != null) { + if (param.isSwitch()) { + if (param.get().equals(Boolean.TRUE)) { + list.add("--" + param.name); + if (param.getAltName() != null && param.getAltName().length() > 0) { + list.add("--" + param.getAltName()); + } + } + } else { + list.add("--" + param.name); + list.add(param.getString()); + if (param.getAltName() != null && param.getAltName().length() > 0) { + list.add("--" + param.getAltName()); + list.add(param.getString()); + } } - } else { - list.add("--" + key); - list.add(param.getString()); } + } else { + list.add(argument.toString()); } } - for (String param : extraParameters) { - list.add(param); - } String[] arr = new String[list.size()]; return list.toArray(arr); } @@ -209,6 +249,7 @@ public String[] getArgs() { public abstract class LaunchParameter { public final String name; public final boolean wrapperOnly; + protected String altName; protected final T defaultValue; protected T value; @@ -225,15 +266,21 @@ protected LaunchParameter(String name, T defaultValue, boolean wrapper) { this.value = defaultValue; this.name = name; this.wrapperOnly = wrapper; + this.altName = null; // Parameters names are case sensitive parameters.put(name, this); } public LaunchParameter altName(String altName) { + this.altName = altName; parameters.put(altName, this); return this; } + public String getAltName() { + return this.altName; + } + public boolean isSwitch() { return false; }