package org.rsbot.bot; import org.rsbot.Application; import org.rsbot.Configuration; import org.rsbot.client.Loader; import org.rsbot.loader.ClientLoader; import org.rsbot.loader.script.ParseException; import java.applet.Applet; import java.awt.*; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; /** * @author Qauters */ public class RSLoader extends Applet implements Runnable, Loader { private final Logger log = Logger.getLogger(RSLoader.class.getName()); private static final long serialVersionUID = 6288499508495040201L; /** * The applet of the client */ private Applet client; private Runnable loadedCallback; private String targetName; private Dimension size = Application.getPanelSize(); /** * The game class loader */ private RSClassLoader classLoader; @Override public final synchronized void destroy() { if (client != null) { client.destroy(); } } @Override public boolean isShowing() { return true; } @Override public final synchronized void init() { if (client != null) { client.init(); } } @Override public final void paint(final Graphics graphics) { if (client != null) { client.paint(graphics); } else { final Font font = new Font("Helvetica", 1, 13); final FontMetrics fontMetrics = getFontMetrics(font); graphics.setColor(Color.black); graphics.fillRect(0, 0, 768, 503); graphics.setColor(new Color(150, 0, 0)); graphics.drawRect(230, 233, 304, 34); final String s = "Loading..."; graphics.setFont(font); graphics.setColor(Color.WHITE); graphics.drawString(s, (768 - fontMetrics.stringWidth(s)) / 2, 255); } } /** * The run void of the loader */ public void run() { try { final Class<?> c = classLoader.loadClass("client"); client = (Applet) c.newInstance(); loadedCallback.run(); c.getMethod("provideLoaderApplet", new Class[]{java.applet.Applet.class}).invoke(null, this); client.init(); client.start(); } catch (final Throwable e) { log.severe("Unable to load client, please check your firewall and internet connection."); final File versionFile = new File(Configuration.Paths.getVersionCache()); if (versionFile.exists() && !versionFile.delete()) { log.warning("Unable to clear cache."); } log.log(Level.SEVERE, "Error reason:", e); } } public Applet getClient() { return client; } public void load() { final File ms = Configuration.Paths.getCachableResources().get(Configuration.Paths.URLs.CLIENTPATCH); try { final ClientLoader cl = new ClientLoader(); cl.init(new URL(Configuration.Paths.URLs.CLIENTPATCH), ms); final File client = new File(Configuration.Paths.getCacheDirectory(), "client.dat"); cl.load(client, new File(Configuration.Paths.getVersionCache())); targetName = cl.getTargetName(); classLoader = new RSClassLoader(cl.getClasses(), new URL("http://" + targetName + ".com/")); } catch (final IOException ex) { log.severe("Unable to load client: " + ex.getMessage()); } catch (final ParseException ex) { log.info("Unable to load client: " + ex.toString()); if (ms.exists()) { ms.delete(); } log.severe("Cached objects deleted, please try restarting the application"); } } public void setCallback(final Runnable r) { loadedCallback = r; } public String getTargetName() { return targetName; } /** * Overridden void start() */ @Override public final synchronized void start() { if (client != null) { client.start(); } } /** * Overridden void deactivate() */ @Override public final synchronized void stop() { if (client != null) { client.stop(); } } /** * Overridden void update(Graphics) */ @Override public final void update(final Graphics graphics) { if (client != null) { client.update(graphics); } else { paint(graphics); } } @Override public final void setSize(final int width, final int height) { super.setSize(width, height); size = new Dimension(width, height); } @Override public final Dimension getSize() { return size; } public RSClassLoader getClassLoader() { return classLoader; } }