package sk.tomsik68.mclauncher.impl.versions.mcassets; import net.minidev.json.JSONObject; import net.minidev.json.JSONValue; import javax.swing.*; import java.awt.*; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Map.Entry; @Deprecated final class Relauncher { public static void main(String[] args) { try { HashMap<String, String> arguments = new HashMap<String, String>(); // setup default values for parameters arguments.put("-dm", "false"); arguments.put("-ap", "false"); arguments.put("-m", "false"); arguments.put("-w", "800"); arguments.put("-h", "600"); arguments.put("-dlt", "deprecated"); arguments.put("-lv", "deprecated"); // parse arguments for (int i = 0; i < args.length; ++i) { if ((args[i].equalsIgnoreCase("--user-name") || args[i].equalsIgnoreCase("-un")) && (i + 1) < args.length) { arguments.put("-un", args[i + 1]); } else if (args[i].equalsIgnoreCase("-sid") && (i + 1) < args.length) { arguments.put("-sid", args[i + 1]); } else if (args[i].equalsIgnoreCase("-dm")) { arguments.put("-dm", "true"); } else if (args[i].equalsIgnoreCase("-ap")) { arguments.put("-ap", "true"); } else if (args[i].equalsIgnoreCase("-dir") && (i + 1) < args.length) { arguments.put("-dir", args[i + 1]); } else if (args[i].equalsIgnoreCase("-jar") && (i + 1) < args.length) { arguments.put("-jar", args[i + 1]); } else if (args[i].equalsIgnoreCase("-lib") && (i + 1) < args.length) { arguments.put("-lib", args[i + 1]); } else if (args[i].equalsIgnoreCase("-mp") && (i + 1) < args.length) { arguments.put("-mp", args[i + 1]); } else if (args[i].equalsIgnoreCase("-w") && (i + 1) < args.length) { arguments.put("-w", args[i + 1]); } else if (args[i].equalsIgnoreCase("-h") && (i + 1) < args.length) { arguments.put("-h", args[i + 1]); } else if (args[i].equalsIgnoreCase("-m")) { arguments.put("-m", "true"); } else if (args[i].equalsIgnoreCase("-lwjgl") && (i + 1) < args.length) { arguments.put("-lwjgl", args[i + 1]); } else if (args[i].equalsIgnoreCase("-jlibpath") && (i + 1) < args.length) { arguments.put("-jlibpath", args[i + 1]); } else if (args[i].equalsIgnoreCase("-args") && (i + 1) < args.length) { arguments.put("-args", args[i + 1]); } } System.out.println("ArgumentMap built!"); for (Entry<String, String> argument : arguments.entrySet()) { System.out.println(argument.getKey() + ": '" + argument.getValue() + "'"); } // load parameter values to variables String userName = arguments.get("-un"); String sessionID = arguments.get("-sid"); String lastVer = arguments.get("-lv"); String dlTicket = arguments.get("-dlt"); File gameDir = new File(arguments.get("-dir")); File gameFile = new File(arguments.get("-jar")); String[] sLibraries = arguments.get("-lib").split(";"); File[] libraries = new File[sLibraries.length]; for (int j = 0; j < sLibraries.length; j++) { libraries[j] = new File(sLibraries[j]); } int w = Integer.parseInt(arguments.get("-w")); int h = Integer.parseInt(arguments.get("-h")); boolean maximize = Boolean.parseBoolean(arguments.get("-m")); boolean changeOptions = Boolean.parseBoolean(arguments.get("-ap")); // create custom class loader and add all desired URLs CustomClassLoader loader = new CustomClassLoader(); loader.addJAR(gameFile.toURI().toURL()); for (File lib : libraries) { loader.addJAR(lib.toURI().toURL()); } // setup LWJGL native library path System.setProperty("org.lwjgl.librarypath", new File(arguments.get("-lwjgl")).getAbsolutePath()); System.setProperty("net.java.games.input.librarypath", new File(arguments.get("-jlibpath")).getAbsolutePath()); // initialize launcher component to be used LauncherComponent launcher = new LauncherComponent(loader); launcher.setParameter("username", userName); launcher.setParameter("sessionid", sessionID); launcher.setParameter("downloadticket", dlTicket); launcher.setParameter("latestversion", lastVer); launcher.setParameter("stand-alone", "true"); launcher.setParameter("demo", arguments.get("-dm")); // if there are any information about multiplayer server, if (arguments.containsKey("-mp")) { // parse IP and port final String ipPort = arguments.get("-mp"); final String ip = ipPort.split(":")[0]; String port = "25565"; if (ipPort.contains(":")) port = ipPort.split(":")[1]; System.out.println("MP: " + ipPort); // and pass them to launcher component launcher.setParameter("server", ip); launcher.setParameter("port", port); } // if game directory is supposed to be changed, if (arguments.containsKey("-dir")) { // change it using reflection in net.minecraft.client.Minecraft Class<?> mcClass = loader.findClass("net.minecraft.client.Minecraft"); Field[] fields = mcClass.getDeclaredFields(); for (Field field : fields) { // the directory is stored in field whose name is obfuscated, so very little we know about it. // however, we know it's static and its class is File, so it should be sufficient if (field.getType() == File.class && Modifier.isStatic(field.getModifiers())) { field.setAccessible(true); field.set(null, gameDir); break; } } } // pass all custom parameters specified in '-args' to launcher component JSONObject params = null; if (arguments.containsKey("-args")) { params = (JSONObject) JSONValue.parse(arguments.get("-args")); launcher.setAll(params); } // create a Frame for launcher JFrame frame = new JFrame(); frame.setSize(w, h); // TODO change title feature frame.setTitle(gameFile.getName() + " running via MCLauncherAPI"); launcher.setSize(w, h); if (maximize) frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setLayout(new BorderLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(launcher); frame.setVisible(true); // start the frame. if users wants to modify applet options, table will be displayed before starting minecraft // in the other case, we can directly run minecraft if (changeOptions) { launcher.start(); } else launcher.startMinecraft(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } }