package co.forsaken.projectindigo.mclaunch;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import co.forsaken.projectindigo.data.Server;
import co.forsaken.projectindigo.data.log.Logger;
import co.forsaken.projectindigo.log.LogManager;
import co.forsaken.projectindigo.session.Identity;
import co.forsaken.projectindigo.utils.DirectoryLocations;
import co.forsaken.projectindigo.utils.Settings;
import co.forsaken.projectindigo.utils.Utils;
import co.forsaken.projectindigo.utils.Utils.OS;
public class MinecraftLauncher {
private static String parseFileName(File file) {
String path = file.getAbsolutePath();
if (!path.endsWith(File.separator)) path += File.separator;
return path;
}
public static Process launchMinecraft(Server server, Identity identity, Settings settings, boolean autoLogin) throws IOException {
List<String> addedCP = new ArrayList<String>();
StringBuilder cpb = new StringBuilder("");
File jarMods = server.getJarModsDir();
for (File f : jarMods.listFiles()) {
cpb.append(File.pathSeparator);
cpb.append(parseFileName(f));
}
File libMods = server.getLibraryDir();
File[] jarModFiles = libMods.listFiles();
if (jarMods.exists() && jarModFiles != null) {
ArrayList<String> jarmods = new ArrayList<String>();
if (server.getJarOrder() != null && !server.getJarOrder().isEmpty()) {
jarmods = new ArrayList<String>(Arrays.asList(server.getJarOrder().split(",")));
for (String mod : jarmods) {
File thisFile = new File(jarMods, mod);
String parsedName = thisFile.getName();
if (parsedName.contains("-")) {
parsedName = thisFile.getName().substring(0, thisFile.getName().lastIndexOf("-"));
}
if (thisFile.isDirectory() || addedCP.contains(parsedName)) {
continue;
}
if (thisFile.exists()) {
cpb.append(File.pathSeparator);
cpb.append(parseFileName(thisFile));
addedCP.add(parsedName);
}
}
}
for (File file : jarModFiles) {
if (jarmods.contains(file.getName())) {
continue;
}
String parsedName = file.getName();
if (parsedName.contains("-")) {
parsedName = file.getName().substring(0, file.getName().lastIndexOf("-"));
}
if (file.isDirectory() || addedCP.contains(parsedName)) continue;
cpb.append(File.pathSeparator);
cpb.append(parseFileName(file));
addedCP.add(parsedName);
}
}
if (server.getLibraryDir().isDirectory()) {
for (File file : server.getLibraryDir().listFiles()) {
String parsedName = file.getName();
if (parsedName.contains("-")) {
parsedName = file.getName().substring(0, file.getName().lastIndexOf("-"));
}
if (file.isDirectory() || addedCP.contains(parsedName)) continue;
cpb.append(Utils.getJavaDelimiter());
cpb.append(parseFileName(file));
addedCP.add(parsedName);
}
}
String title = server.getToken().friendlyName + " v" + server.getToken().version;
List<String> arguments = new ArrayList<String>();
String separator = System.getProperty("file.separator");
String path = System.getProperty("java.home") + separator + "bin" + separator + "java" + (Utils.getCurrentOS() == Utils.OS.WINDOWS ? "w" : "");
arguments.add(path);
// String imagePath = DirectoryLocations.IMAGE_DIR_LOCATION +
// server.getToken().modpackRefName + ".png";
// if (Utils.getCurrentOS() == OS.MACOSX) {
// arguments.add("-Xdock:icon=" + imagePath);
// arguments.add("-Xdock:name=" + title);
// }
setMemory(arguments, Settings.getToken().maxRam);
arguments.add("-XX:+UseConcMarkSweepGC");
arguments.add("-XX:+CMSIncrementalMode");
arguments.add("-XX:+AggressiveOpts");
arguments.add("-XX:+CMSClassUnloadingEnabled");
if (!Settings.getToken().javaParams.isEmpty() && Settings.getToken().javaParams.split(" ").length > 0) {
for (String s : Settings.getToken().javaParams.split(" ")) {
if (!s.isEmpty()) {
arguments.add(s);
}
}
}
arguments.add("-Djava.library.path=" + parseFileName(server.getNativesDir()));
arguments.add("-Duser.home=" + parseFileName(server.getMinecraftDir()));
if (Utils.getCurrentOS() == OS.WINDOWS) {
arguments.add("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump");
}
arguments.add("-cp");
arguments.add(cpb.toString());
arguments.add("net.minecraft.launchwrapper.Launch");
for (String s : server.getLaunchArgs().split(" ")) {
if (s.equalsIgnoreCase("${auth_player_name}")) {
s = identity.getName();
} else if (s.equalsIgnoreCase("${game_directory}")) {
s = parseFileName(server.getMinecraftDir());
} else if (s.equalsIgnoreCase("${assets_root}")) {
s = DirectoryLocations.BACKEND_ASSET_DIR.get();
} else if (s.equalsIgnoreCase("${assets_index_name}")) {
s = "1.7.10";
} else if (s.equalsIgnoreCase("${auth_uuid}")) {
s = identity.getId();
} else if (s.equalsIgnoreCase("${version_name}")) {
s = "1.7.10";
} else if (s.equalsIgnoreCase("${auth_access_token}")) {
s = identity.getAccessToken();
} else if (s.equalsIgnoreCase("${user_properties}")) {
s = "{}";
} else if (s.equalsIgnoreCase("${user_type}")) {
s = "mojang";
}
arguments.add(s);
}
String argsString = arguments.toString();
if (!LogManager.showDebug) {
argsString = argsString.replace(identity.getAccessToken(), "REDACTED");
argsString = argsString.replace(identity.getId(), "REDACTED");
argsString = argsString.replace(identity.getClientToken(), "REDACTED");
argsString = argsString.replace(identity.getName(), "REDACTED");
}
arguments.add("--tweakClass=cpw.mods.fml.common.launcher.FMLTweaker");
if (autoLogin) {
arguments.add("--server=" + server.getToken().friendlyIp);
}
ProcessBuilder processBuilder = new ProcessBuilder(arguments);
LogManager.info("Setting working dir to " + server.getMinecraftDir().getAbsolutePath());
LogManager.info("Launch Arguments: " + argsString);
System.out.println("Launch Arguments: " + argsString);
processBuilder.directory(new File(server.getMinecraftDir().getAbsolutePath()));
processBuilder.redirectErrorStream(true);
processBuilder.environment().remove("_JAVA_OPTIONS");
return processBuilder.start();
}
private static void setMemory(List<String> arguments, String rmax) {
boolean memorySet = false;
try {
int min = 256;
if (rmax != null && Integer.parseInt(rmax) > 0) {
arguments.add("-Xms" + min + "M");
Logger.logInfo("Setting MinMemory to " + min);
arguments.add("-Xmx" + rmax + "M");
Logger.logInfo("Setting MaxMemory to " + rmax);
memorySet = true;
}
} catch (Exception e) {
Logger.logError("Error parsing memory settings", e);
}
if (!memorySet) {
arguments.add("-Xms" + 256 + "M");
Logger.logInfo("Defaulting MinMemory to " + 256);
arguments.add("-Xmx" + 1024 + "M");
Logger.logInfo("Defaulting MaxMemory to " + 1024);
}
}
}