import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.awt.*; import java.net.MalformedURLException; import java.net.URL; import javax.imageio.ImageIO; import org.rsbot.event.listeners.PaintListener; import org.rsbot.script.Script; import org.rsbot.script.ScriptManifest; import org.rsbot.script.methods.Skills; import org.rsbot.script.util.Timer; import org.rsbot.script.wrappers.RSItem; @ScriptManifest(authors = "Albi, xPure2", name = "AIO Herbie.", version = 1.3, description = "Let's make some pots!") public class AlbisAIOHerblore extends Script implements PaintListener, MouseListener { ScriptManifest SM = getClass().getAnnotation(ScriptManifest.class); private State currentState; private boolean showPaint = true; private Timer antiBanTimer; private long startTime; BufferedImage normal = null, clicked = null; Rectangle button = new Rectangle(211, 296, 86, 22); int tab = 1; Point p; private String whichPot = "", debugMsg = ""; private int startXP = 0, failsafe = 0, fstIngred, sndIngred, product, XPgained, XPToNextLvl, levelsGained, startLevel, currLevel; private long runTime = 0, seconds = 0; private enum State { DEPOSITING, WITHDRAWING, MAKE, WITHDREW_TOO_MUCH, UNK } private State getState() { if (!bank.isOpen() && inventory.containsOneOf(fstIngred, sndIngred)) { return State.MAKE; } else if (bank.isOpen() && inventory.isFull() && (inventory.contains(fstIngred) && !inventory.contains(sndIngred)) || (!inventory.contains(fstIngred) && inventory.contains(sndIngred))) { return State.WITHDREW_TOO_MUCH; } else if (bank.isOpen() && inventory.getCount() > 0) { return State.DEPOSITING; } else if (bank.isOpen() && inventory.getCount() == 0) { return State.WITHDRAWING; } else { return State.UNK; } } public boolean inventoryCheck(int fst, int snd) { return (inventory.getCount(fst) == 0 || inventory.getCount(snd) == 0); } public void mixIngredients(int fst, int snd) { try { if (!interfaces.get(905).getComponent(14).isValid()) { inventory.useItem(inventory.getItem(fst), inventory.getItem(snd)); sleep(2000, 3000); } if (interfaces.get(905).getComponent(14).doClick()) { mouse.moveOffScreen(); while (!inventoryCheck(fst, snd) && failsafe < 4) { sleep(2000, 5000); failsafe++; mouse.moveSlightly(); } if (failsafe < 4) { if (!interfaces.get(905).getComponent(14).isValid()) { inventory.useItem(inventory.getItem(fst), inventory.getItem(snd)); sleep(2000, 3000); } failsafe = 0; } whichPot = inventory.getItem(product).getName(); } } catch (NullPointerException e) { debugMsg = "Line: " + Thread.currentThread().getStackTrace()[2].getLineNumber() + ", NPE in mixIngredients()"; log.warning(debugMsg); } } public void withdrawIngreds() { if (bank.getItem(fstIngred) == null || bank.getItem(sndIngred) == null) { log("No ingreds to carry on.."); game.logout(false); stopScript(true); } else { while (!inventory.contains(fstIngred) && !inventory.contains(sndIngred)) { bank.withdraw(fstIngred, 14); sleep(800, 1200); bank.withdraw(sndIngred, 14); } bank.close(); } } @Override public boolean onStart() { try { final URL cursorURL = new URL("http://i48.tinypic.com/313623n.png"); final URL cursor80URL = new URL("http://i46.tinypic.com/9prjnt.png"); normal = ImageIO.read(cursorURL); clicked = ImageIO.read(cursor80URL); } catch (MalformedURLException e) { log("Unable to buffer cursor."); } catch (IOException e) { log("Unable to open cursor image."); } mouse.setSpeed(random(6, 8)); if (inventory.getCount() == 0) { log("No primary mixes in inventory, quitting.."); stopScript(true); return false; } else { fstIngred = inventory.getItemAt(0).getID(); sndIngred = inventory.getItemAt(1).getID(); sleep(800, 1200); mixIngredients(fstIngred, sndIngred); for (RSItem item : inventory.getItems()) { if (item != null) { if (item.getID() != fstIngred && item.getID() != sndIngred) { product = item.getID(); break; } } } antiBanTimer = new Timer(random(150000, 300000)); startTime = System.currentTimeMillis(); startLevel = skills.getCurrentLevel(Skills.HERBLORE); startXP = skills.getCurrentExp(Skills.HERBLORE); XPgained = skills.getCurrentExp(Skills.HERBLORE) - startXP; XPToNextLvl = skills.getExpToNextLevel(Skills.HERBLORE); currLevel = skills.getCurrentLevel(Skills.HERBLORE); return true; } } @Override public void onFinish() { env.saveScreenshot(true); log("Thankyou for using " + SM.name() + " v" + SM.version()); } @Override public int loop() { currentState = getState(); debugMsg = currentState.name(); if (!antiBanTimer.isRunning()) { camera.moveRandomly(random(1, 360)); antiBanTimer = null; antiBanTimer = new Timer(random(1500000, 3500000)); antiBanTimer.reset(); } switch (currentState) { case WITHDREW_TOO_MUCH: bank.depositAll(); failsafe = 0; return random(750, 1250); case DEPOSITING: bank.depositAll(); failsafe = 0; return random(1000, 1500); case WITHDRAWING: withdrawIngreds(); failsafe = 0; return random(1000, 1500); case MAKE: mixIngredients(fstIngred, sndIngred); bank.open(); return random(1000, 1500); case UNK: if (!bank.isOpen()) { bank.open(); bank.depositAll(); } failsafe = 0; return random(1000, 1500); } return random(1000, 1500); } public void mouseClicked(MouseEvent e){ p = e.getPoint(); if (button.contains(p) && tab == 2) { tab = 1; } if (button.contains(p) && tab == 1) { tab = 2; } } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } private Image getImage(String url) { try { return ImageIO.read(new URL(url)); } catch(IOException e) { return null; } } private final Color color1 = new Color(0, 255, 0); private final Color color2 = new Color(0, 0, 0); private final Color color3 = new Color(0, 204, 0); private final Color color4 = new Color(51, 51, 51); private final BasicStroke stroke1 = new BasicStroke(1); private final Font font1 = new Font("Arial", 1, 14); private final Font font2 = new Font("Arial", 1, 12); private final Font font3 = new Font("Arial", 0, 12); private final Image img1 = getImage("http://images1.wikia.nocookie.net/__cb20110305043047/runescape/images/f/f1/Herblore-icon.png"); private final Image img2 = getImage("http://images.wikia.com/runescape/images/b/ba/Herblore-hood-inv.png"); private final Image img3 = getImage("http://images2.wikia.nocookie.net/__cb20091112192213/runescape/images/9/96/Herblore-cape-%28t%29-inv.png"); public void onRepaint(Graphics g1) { Graphics2D g = (Graphics2D)g1; if (showPaint) { runTime = System.currentTimeMillis() - startTime; XPgained = skills.getCurrentExp(Skills.HERBLORE) - startXP; XPToNextLvl = skills.getExpToNextLevel(Skills.HERBLORE); currLevel = skills.getCurrentLevel(Skills.HERBLORE); levelsGained = startLevel -= currLevel; int XPHour = (int) ((XPgained) * 3600000.0 / runTime); seconds = runTime / 1000; String displayRunTime = String.format("%02d:%02d:%02d", seconds / 3600, (seconds % 3600) / 60, (seconds % 60)); g.setColor(color1); g.fillRect(10, 350, 480, 120); g.setColor(color2); g.setStroke(stroke1); g.drawRect(10, 350, 480, 120); g.setFont(font1); g.drawString("AlbisAIOHerblore", 20, 370); g.setFont(font2); g.drawString("v" + SM.version(), 180, 370); g.setFont(font3); g.drawString("Herblore Level: " + skills.getCurrentLevel(skills.HERBLORE) + "(" + levelsGained + ")", 200, 390); g.drawString("Runtime (h:m:s): " + displayRunTime, 20, 390); g.drawString("Making: " + whichPot, 20, 410); g.drawString("XP/Hr: " + XPHour, 200, 430); g.drawString("XP untill Level up: " + XPToNextLvl, 200, 450); g.drawImage(img1, 440, 360, null); g.drawImage(img2, 440, 390, null); g.drawImage(img3, 444, 431, null); g.drawString("Debug: " + debugMsg, 20, 430); g.setColor(color3); g.fillRect(439, 319, 75, 17); g.setColor(color4); g.drawString("Hide Paint", 444, 332); } else { g.setColor(color3); g.fillRect(439, 319, 75, 17); g.setColor(color4); g.drawString("Hide Paint", 444, 332); } final Point p = mouse.getLocation(); final Point c = mouse.getPressLocation(); final long mpt = System.currentTimeMillis()- mouse.getPressTime(); if (mouse.getPressTime() == -1 || mpt >= 1000) { g.drawImage(normal, p.x - 8, p.y - 8, null); // this } if (mpt < 1000) { g.drawImage(clicked, c.x - 8, c.y - 8, null); } } }