Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 70 additions & 23 deletions src/main/java/org/mcphackers/launchwrapper/LaunchConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Object> arguments = new ArrayList<Object>();
private final Map<String, LaunchParameter<?>> parameters = new HashMap<String, LaunchParameter<?>>();
// If we won't find any of the parameters from below, they're going into this list
private final List<String> extraParameters = new ArrayList<String>();

// clang-format off

Expand Down Expand Up @@ -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<Object> param = (LaunchParameter<Object>)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<String, LaunchParameter<?>> entry : parameters.entrySet()) {
LaunchParameter<Object> param = (LaunchParameter<Object>)newConfig.parameters.get(entry.getKey());
if (param == null) {
Expand All @@ -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) {
Expand All @@ -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"));
Expand All @@ -166,49 +184,72 @@ public LaunchConfig(String[] args) {
public List<LaunchParameter<?>> getParamsAsList() {
List<LaunchParameter<?>> list = new ArrayList<LaunchParameter<?>>();
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);
}
}
return list;
}

public Map<String, String> getArgsAsMap() {
Map<String, String> map = new HashMap<String, String>();
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<String, String> map = new LinkedHashMap<String, String>();
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;
}

public String[] getArgs() {
List<String> list = new ArrayList<String>();
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);
}

public abstract class LaunchParameter<T> {
public final String name;
public final boolean wrapperOnly;
protected String altName;
protected final T defaultValue;
protected T value;

Expand All @@ -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<T> altName(String altName) {
this.altName = altName;
parameters.put(altName, this);
return this;
}

public String getAltName() {
return this.altName;
}

public boolean isSwitch() {
return false;
}
Expand Down
Loading