package com.kbot2.bot; import com.kbot2.accessors.Client; import com.kbot2.accessors.GameCanvas; import com.kbot2.handlers.EventHandler; import com.kbot2.handlers.ScriptHandler; import com.kbot2.handlers.eventSystem.eventListeners.PaintListener; import com.kbot2.handlers.eventSystem.eventListeners.ServerMessageListener; import com.kbot2.handlers.eventSystem.eventListeners.TextPaintListener; import com.kbot2.handlers.settings.BotConstants; import com.kbot2.loader.Loader; import com.kbot2.loader.StubGenerator; import com.kbot2.out.Console; import com.kbot2.scriptable.methods.Calculations; import com.kbot2.scriptable.methods.Methods; import static com.kbot2.scriptable.methods.Calculations.random; import com.kbot2.bot.injector.Injector; import java.applet.Applet; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.RasterFormatException; import java.lang.reflect.Field; import java.net.URL; import java.io.File; /** * Created by IntelliJ IDEA. * User: Jan Ove / Kosaki * Date: 12.mar.2009 * Time: 18:36:38 */ public class Bot extends Canvas implements Runnable, BotCallback { public final ThreadGroup botTG; public BotEnvironment botEnv; private Loader loader; private Thread loaderThread; private Thread paintThread; private StubGenerator stub; public final String botName; private final BufferedImage gameImage; public BufferedImage botImage; public final BufferedImage paintImage; private Client client; // The game's main class. private Applet clientApplet; // The game's applet which is the same as (Applet) client private ScriptHandler scriptHandler; private final EventHandler eventHandler; private InputListeners inputListeners; private boolean running = true; public String worldID; private Font helvetica = new Font("Helvetica", Font.BOLD, 13); private FontMetrics helveticaFontMetrics = getFontMetrics(helvetica); public boolean loading = true; public String loadingState = "Starting up bot"; public int loadingPercentage = 5; private final String loadingStringTop = "KBot is loading - please wait..."; public Bot(String botName) { final Bot self = this; worldID = getRandomWorld(); setFocusable(true); // TODO clean this up... botTG = new ThreadGroup("Bot[" + botName + "]"); this.botName = botName; gameImage = new BufferedImage(765, 503, BufferedImage.TYPE_INT_RGB); botImage = new BufferedImage(765, 503, BufferedImage.TYPE_INT_RGB); paintImage = new BufferedImage(765, 503, BufferedImage.TYPE_INT_RGB); updateLoadingScreen(); new Thread(new Runnable() { public void run() { Injector injector = new Injector(self); File runescapeJar = injector.run(); System.gc(); if(runescapeJar == null) return; loadingState = "Starting loader"; updateLoadingScreen(); loader = new Loader(runescapeJar); stub = new StubGenerator(loader, worldID); loader.setStub(stub); loader.setCallBack(new Runnable() { public void run() { clientApplet = loader.getApplet(); client = (Client) clientApplet; inputListeners = new InputListeners(true, client); addMouseListener(inputListeners); addMouseMotionListener(inputListeners); addMouseWheelListener(inputListeners); addKeyListener(inputListeners); addFocusListener(inputListeners); if (!hasFocus()) requestFocus(); } }); loaderThread = new Thread(botTG, loader, "loader"); loaderThread.start(); loadingState = "Started game engine!"; loadingPercentage = 100; updateLoadingScreen(); try { Thread.sleep(1000); } catch (InterruptedException e) { } loading = false; } }).start(); paintThread = new Thread(botTG, this, "paint"); paintThread.start(); eventHandler = new EventHandler(this); botEnv = new BotEnvironment(this); botEnv.setCPUSaving(false); botEnv.setCPUWait(BotConstants.saveCPUwait); scriptHandler = new ScriptHandler(this); Console.writeLine(this, "Bot[" + botName + "] started."); } private String getRandomWorld() { String world = BotConstants.worlds.get(random(0, BotConstants.worlds.size() - 1)); Console.writeLine(this, "Document base is world "+world); return world; } public void updateLoadingScreen() { Graphics g = botImage.getGraphics(); try { //g.drawImage(Toolkit.getDefaultToolkit().getImage(new URL("http://i29.tinypic.com/14c4sns.jpg")), 0, 0, Color.black, this); g.drawImage(Toolkit.getDefaultToolkit().getImage("images/YOURNAME.png"), 0, 0, Color.black, this); } catch (Exception e) { } g.setColor(Color.green); g.drawRect(230, 234, 302, 31); g.fillRect(232, 236, (int) (((double) loadingPercentage / 100D) * 299), 28); g.setFont(helvetica); g.setColor(Color.white); g.drawString(loadingStringTop, 382 - helveticaFontMetrics.stringWidth(loadingStringTop) / 2, 225); g.drawString(loadingState, (304 - helveticaFontMetrics.stringWidth(loadingState)) / 2 + 230, 255); } private boolean paintThreadRunning = true; public void run() { while (paintThreadRunning) { if (this.isShowing()) { try { repaint(); Thread.sleep(1000 / BotConstants.paintFPS); } catch (InterruptedException ignored) { } } else { try { Thread.sleep(300); } catch (InterruptedException ignored) { } } } } public Calculations getCalculations() { return botEnv.calculations; } @Override public void paint(Graphics g) { //this.setEnabled(false); try { if (!this.isVisible()) return; Rectangle r = g.getClipBounds(); if (loading) { g.drawImage(botImage, r.x, r.y, r.x + r.width, r.y + r.height, r.x, r.y, r.x + r.width, r.y + r.height, null); return; } if (botImage != null) { paintImage.flush(); Graphics paintGraphics = paintImage.getGraphics(); paintGraphics.drawImage(botImage, r.x, r.y, r.x + r.width, r.y + r.height, r.x, r.y, r.x + r.width, r.y + r.height, null); final PaintListener paintListeners = eventHandler.getPaintListeners(); if (paintListeners != null) paintListeners.onRepaint(paintGraphics); final TextPaintListener textPaintListeners = eventHandler.getTextPaintListeners(); if (textPaintListeners != null) { int y = 40; paintGraphics.setColor(Color.cyan); String[] lines = textPaintListeners.onTextRepaint(); if (lines != null) { for (String line : lines) { if (line == null) continue; paintGraphics.drawString(line, 20, y); y += 20; } } } if (client != null) { paintGraphics.setColor(Color.white); int x = client.getMouseX(); int y = client.getMouseY(); paintGraphics.drawLine(x - 5, y - 5, x + 5, y + 5); paintGraphics.drawLine(x - 5, y + 5, x + 5, y - 5); x = client.getMousePressedX(); y = client.getMousePressedY(); paintGraphics.setColor(Color.red); paintGraphics.drawLine(x - 5, y - 5, x + 5, y + 5); paintGraphics.drawLine(x - 5, y + 5, x + 5, y - 5); } else { paintGraphics.drawString("Client is null", 30, 40); } g.drawImage(paintImage, r.x, r.y, r.x + r.width, r.y + r.height, r.x, r.y, r.x + r.width, r.y + r.height, null); paintGraphics.dispose(); } } catch (RasterFormatException ignored) { } //this.setEnabled(true); } public void close() { running = false; paintThreadRunning = false; scriptHandler.stopAllScripts(); scriptHandler.stop(); botEnv.notifyOnClose(); loader.destroyLoader(); Class c = client.getClass(); for (Field f : c.getFields()) { f.setAccessible(true); if (!f.getType().isPrimitive()) { try { f.set(client, null); } catch (IllegalAccessException ignored) { } } } client = null; clientApplet = null; inputListeners.client = null; inputListeners = null; stub.close(); stub = null; scriptHandler = null; botEnv = null; paintThread = null; loaderThread = null; System.gc(); } @Override public void repaint(int x, int y, int width, int height) { super.repaint(0, 0, 765, 503); } @Override public void repaint(long tm, int x, int y, int width, int height) { super.repaint(tm, 0, 0, 765, 503); } @Override public void paintAll(Graphics g) { paint(g); } @Override public void update(Graphics g) { paint(g); } public BotCallback getBotCallback(GameCanvas gameCanvas) { if (!running) return null; final Applet applet = loader.getApplet(); final Canvas canvas = ((Client) applet).getCanvas(); if (canvas == null) return null; if (gameCanvas == canvas) { // Found our graphics return this; } return null; } public Loader getLoader() { return loader; } public boolean isInputEnabled() { return inputListeners == null || inputListeners.isInputEnabled(); } public void setInputEnabled(boolean inputEnabled) { inputListeners.setInputeEnabled(inputEnabled); } public ScriptHandler getScriptHandler() { return scriptHandler; } public Client getClient() { return client; } public EventHandler getEventHandler() { return eventHandler; } public Graphics gamePaint() { if (!loading) { botImage.flush(); botImage = gameImage.getSubimage(0, 0, 765, 503); } gameImage.flush(); return gameImage.getGraphics(); } public boolean useCPUWait() { return botEnv.isCPUSavingOn(); } public int getCPUWait() { return botEnv.getCPUWait(); } public void onServerMessage(String message) { final ServerMessageListener listeners = eventHandler.getServerMessageListeners(); if (listeners != null) { listeners.onServerMessage(message); } } public Methods getMethods() { return botEnv.methods; } public boolean getInputEnabled() { if (inputListeners == null) return true; return inputListeners.isInputEnabled(); } }