/* Copied from MCUpdater under the terms of the Apache License, version 2.0. * The source code has been modified by asiekierka. */ package net.minecraft; import java.applet.Applet; import java.applet.AppletStub; import java.awt.BorderLayout; import java.awt.Dimension; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.HashMap; import java.util.Map; public class Launcher extends Applet implements AppletStub { /** * */ private static final long serialVersionUID = 6604634479463399020L; private final Map<String, String> params; private Applet mcApplet; private boolean active; private URLClassLoader classLoader; public Launcher(File instance, File lwjgl, String username, String sessionid, String host, String port, boolean doConnect) { params = new HashMap<String, String>(); params.put("username", username); params.put("sessionid", sessionid); params.put("stand-alone", "true"); if (doConnect) { params.put("server", host); params.put("port", port); } params.put("fullscreen","false"); //Required param for vanilla. Forge handles the absence gracefully. URL[] urls = new URL[4]; urls[0] = pathToUrl(new File(new File(instance,"bin"), "minecraft.jar")); urls[1] = pathToUrl(new File(lwjgl, "lwjgl.jar")); urls[2] = pathToUrl(new File(lwjgl, "lwjgl_util.jar")); urls[3] = pathToUrl(new File(lwjgl, "jinput.jar")); classLoader = new URLClassLoader(urls, Launcher.class.getClassLoader()); try { Class<?> minecraft = classLoader.loadClass("net.minecraft.client.Minecraft"); Field pathField = findPathField(minecraft); if (pathField == null) { System.err.println("Unable to find a matching field. Aborting launch."); System.exit(-1); } pathField.setAccessible(true); pathField.set(null, instance); mcApplet = (Applet)classLoader.loadClass("net.minecraft.client.MinecraftApplet").newInstance(); this.add(mcApplet, "Center"); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public void replace(Applet applet) { this.mcApplet = applet; applet.setStub(this); applet.setSize(getWidth(), getHeight()); this.setLayout(new BorderLayout()); this.add(applet, "Center"); applet.init(); active = true; applet.start(); validate(); } private Field findPathField(Class<?> minecraft) { Field[] fields = minecraft.getDeclaredFields(); for (int i=0; i<fields.length; i++) { Field current = fields[i]; if (current.getType() != File.class || (current.getModifiers() != (Modifier.PRIVATE + Modifier.STATIC))) {continue;} return current; } return null; } private URL pathToUrl(File path) { try { return path.toURI().toURL(); } catch (MalformedURLException e) { e.printStackTrace(); } return null; } @Override public void appletResize(int width, int height) { mcApplet.resize(width, height); } @Override public void resize(int width, int height) { mcApplet.resize(width, height); } @Override public void resize(Dimension dim) { mcApplet.resize(dim); } @Override public String getParameter(String name) { String value = params.get(name); if (value != null) { return value; } try { return super.getParameter(name); } catch (Exception e) {} return null; } @Override public boolean isActive() { return this.active; } @Override public void init() { if (mcApplet != null) { mcApplet.setStub(this); mcApplet.setSize(getWidth(),getHeight()); this.setLayout(new BorderLayout()); this.add(mcApplet, "Center"); mcApplet.init(); } } @Override public void start() { mcApplet.start(); active = true; } @Override public void stop() { mcApplet.stop(); active = false; } @Override public URL getCodeBase() { return mcApplet.getCodeBase(); } @Override public URL getDocumentBase() { try { return new URL("http://www.minecraft.net/game"); } catch (MalformedURLException e) { e.printStackTrace(); } return null; } @Override public void setVisible(boolean flag) { super.setVisible(flag); mcApplet.setVisible(flag); } }