All pastes #2052679 Raw Edit

AIOFiremaker (Edited by SilverSh

public java v1 · immutable
#2052679 ·published 2011-05-02 00:34 UTC
rendered paste body
import java.awt.BorderLayout;import java.awt.Color;import java.awt.Graphics;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import javax.swing.DefaultComboBoxModel;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.WindowConstants;import org.rsbot.event.listeners.PaintListener;import org.rsbot.script.Script;import org.rsbot.script.ScriptManifest;import org.rsbot.script.methods.Bank;import org.rsbot.script.methods.Game;import org.rsbot.script.methods.Skills;import org.rsbot.script.util.Filter;import org.rsbot.script.wrappers.*;import org.rsbot.script.util.Timer;import org.rsbot.util.GlobalConfiguration;/** * RSBot AIO Firemaker * * @author Jacmob * @version 2.0 */@ScriptManifest(authors = {"Jacmob & SilverShine"}, keywords = "Firemaking", name = "AIO Firemaker (Edited by SilverShine)", version = 2.0, description = "Logs must be at bank's top, first tab.")public class AIOFiremaker extends Script implements PaintListener {        private enum State {                FIREMAKE, OPEN_BANK, BANK        }        class AntiBan implements Runnable {                public void run() {                        int camAlt = camera.getZ();                        char LR = KeyEvent.VK_LEFT;                        char UD;                        if (camAlt > -1600) {                                UD = KeyEvent.VK_UP;                        } else if (cawfgsgsdgsgsgsdgsdfgsdgsdfgsdfgdsfgdsgsdgrandom(50, 400));                        } catch (Exception ignored) {                        }                        keyboard.pressKey(UD);                        try {                                Thread.sleep(random(300, 700));                        } catch (Exception ignored) {                        }                        keyboard.releaseKey(UD);                        try {                                Thread.sleep(random(100, 400));                        } catch (Exception ignored) {                        }                        keyboard.releaseKey(LR);                }        }        public static final int TINDERBOX = 590;        public static final int FIRE_RING = 13659;        public static final int FLAME_GLOVES = 13660;        public static final int[] FireObjects = {2732, 2982, 2983, 2984, 2985, 2986, 1189};        public static final Color BG = new Color(100, 0, 0, 150);        public static final Color DROP = new Color(20, 0, 0, 255);        public static final Color TEXT = new Color(200, 255, 0, 255);        private int logId = 0;        private String logName = "";        private String eqString = "";        private double xpPerFire = 0;        private double xpMultiplier = 1;        private FMLocation location;        private int nextMinRunEnergy = random(20, 50);        private int currentZone = 0;        private int sine = 0;        private int sineM = 1;        private int scriptStartXP = 0;        private long scriptStartTime = 0;        private long lastXPCheckTime = 0;        private RSTile nextTile = null;        private RSTile blackListedTile = null;        private final AStar pathFinder = new AStar();        private final ExecutorService antiBanExecutor = Executors.newSingleThreadExecutor();        private RSTile checkTile(RSTile tile) {                if (calc.distanceTo(tile) < 17) {                        return tile;                }                RSTile loc = getMyPlayer().getLocation();                RSTile walk = new RSTile((loc.getX() + tile.getX()) / 2,                                (loc.getY() + tile.getY()) / 2);                return calc.distanceTo(walk) < 17 ? walk : checkTile(walk);        }        private void checkXP() {                if (System.currentTimeMillis() - lastXPCheckTime < 300000) {                        return;                }                lastXPCheckTime = System.currentTimeMillis();                game.openTab(Game.TAB_STATS);                sleep(random(50, 500));                if (random(0, 5) != 1) {                        if (random(0, 2) == 1) {                                mouse.move(random(575, 695), random(240, 435), 10);                        }                        interfaces.getComponent(320, 85).doHover();                        sleep(random(800, 3400));                }                if (random(0, 2) == 0) {                        game.openTab(Game.TAB_INVENTORY);                }        }        private RSTile getBestFreeTile() {                RSTile nextT = getProceedingTile(getMyPlayer().getLocation());                if (nextT != null) {                        RSTile nextT2 = getProceedingTile(nextT);                        if (nextT2 != null && isFreeTile(nextT) && isFreeTile(nextT2)                                        && !isPlayerAt(nextT) && !isPlayerAt(nextT2)) {                                return nextT;                        }                }                int start = 0, longest = 0, length = 0;                RSTile[] bestRow = location.zones[currentZone].rows[0].tiles;                outer:                for (int i = 0; i < location.zones[currentZone].rows.length; i++) {                        RSTile[] tiles = location.zones[currentZone].rows[i].tiles;                        // log.info("Traversing Row " + i);                        for (int j = 0; j < tiles.length; j++) {                                if (tiles[j] == blackListedTile) {                                        blackListedTile = null;                                        continue outer;                                }                                if (isFireAt(tiles[j])) {                                        if (j - start > length                                                        || (j - start >= inventory.getCount(logId) || j                                                        - start == length)                                                        && calc.distanceTo(tiles[start]) < calc.distanceTo(bestRow[longest])) {                                                length = j - start;                                                longest = start;                                                bestRow = tiles;                                                // log.info("  Set Best - " + i + ", " + start + " (" +                                                // length + "/" + tiles.length + ")");                                        }                                        start = j + 1;                                } else if (j == tiles.length - 1) {                                        if (j - start > length - 1                                                        || (j - start + 1 >= inventory.getCount(logId) || j                                                        - start == length - 1)                                                        && calc.distanceTo(tiles[start]) < calc.distanceTo(bestRow[longest])) {                                                length = j - start + 1;                                                longest = start;                                                bestRow = tiles;                                                // log.info("  Set Best - " + i + ", " + start + " (" +                                                // length + "/" + tiles.length + ")");                                        }                                }                        }                        start = 0;                }                // log("Calculated Best Tile: " + bestRow[longest].getX() + "," +                // bestRow[longest].getY());                if (length == 0 && start != 0) {                        return null;                } else {                        return bestRow[longest];                }        }        private RSTile getClosestTileInRegion(RSTile tile) {                RSTile loc = getMyPlayer().getLocation();                for (int i = 0; i < 1000; ++i) {                        if (tileInRegion(tile)) {                                return tile;                        }                        tile = new RSTile((loc.getX() + tile.getX()) / 2,                                        (loc.getY() + tile.getY()) / 2);                }                return null;        }        private RSTile getProceedingTile(RSTile location) {                if (location == null) {                        return null;                }                FMRow[] rows = this.location.zones[currentZone].rows;                int x = location.getX(), y = location.getY();                for (FMRow row : rows) {                        int start = Math.min(row.start, row.end);                        int end = Math.max(row.start, row.end);                        if (this.location.zones[currentZone].horizontal && y == row.pos                                        && x >= start && x <= end) {                                if (row.start < row.end && x + 1 <= row.end) {                                        return new RSTile(x + 1, y);                                } else if (row.start > row.end && x - 1 >= row.end) {                                        return new RSTile(x - 1, y);                                }                                return null;                        } else if (!this.location.zones[currentZone].horizontal && x == row.pos                                        && y >= start && y <= end) {                                if (row.start < row.end && y + 1 <= row.end) {                                        return new RSTile(x, y + 1);                                } else if (row.start > row.end && y - 1 >= row.end) {                                        return new RSTile(x, y - 1);                                }                                return null;                        }                }                return null;        }        private State getState() {                if (!inventory.contains(logId) || !inventory.contains(TINDERBOX)) {                        if (bank.isOpen()) {                                return State.BANK;                        } else {                                return State.OPEN_BANK;                        }                } else {                        return State.FIREMAKE;                }        }        private void highlightTile(Graphics g, RSTile t, Color outline, Color fill) {                Point pn = calc.tileToScreen(t, 0, 0, 0);                Point px = calc.tileToScreen(t, 1, 0, 0);                Point py = calc.tileToScreen(t, 0, 1, 0);                Point pxy = calc.tileToScreen(t, 1, 1, 0);                if (py.x == -1 || pxy.x == -1 || px.x == -1 || pn.x == -1) {                        return;                }                g.setColor(outline);                g.drawPolygon(new int[]{py.x, pxy.x, px.x, pn.x},                                new int[]{py.y, pxy.y, px.y, pn.y}, 4);                g.setColor(fill);                g.fillPolygon(new int[]{py.x, pxy.x, px.x, pn.x},                                new int[]{py.y, pxy.y, px.y, pn.y}, 4);        }        private boolean isFireAt(RSTile location) {                RSObject obj = objects.getTopAt(location);                if (obj == null) {                        return false;                }                int objID = obj.getID();                for (int i : FireObjects) {                        if (objID == i) {                                return true;                        }                }                return false;        }        private boolean isFreeTile(RSTile location) {                return isInRow(location) && !isFireAt(location);        }        private boolean isInRow(RSTile location) {                FMRow[] rows = this.location.zones[currentZone].rows;                int x = location.getX(), y = location.getY();                for (FMRow row : rows) {                        int start = Math.min(row.start, row.end);                        int end = Math.max(row.start, row.end);                        if (this.location.zones[currentZone].horizontal && y == row.pos                                        && x >= start && x <= end                                        || !this.location.zones[currentZone].horizontal && x == row.pos                                        && y >= start && y <= end) {                                return true;                        }                }                return false;        }        private boolean isPlayerAt(final RSTile tile) {                return players.getAll(new Filter<RSPlayer>() {                        public boolean accept(RSPlayer player) {                                return player.getLocation().equals(tile);                        }                }).length > 0;        }        @Override        public int loop() {                if (scriptStartTime == -1 && skills.getRealLevel(Skills.FIREMAKING) > 1) {                        int fireLevel = skills.getRealLevel(Skills.FIREMAKING);                        scriptStartTime = System.currentTimeMillis();                        scriptStartXP = skills.getCurrentExp(Skills.FIREMAKING);                       // if (equipment.containsAll(FIRE_RING, FLAME_GLOVES)) {                       //         log.info("Your ring and gloves will grant you 5% extra XP per log.");                        //        xpMultiplier = 1.05;                        //        eqString = " (+5%)";                       // } else if (equipment.containsAll(FIRE_RING)) {                       //         log.info("Your Ring of Fire will grant you 2% extra XP per log.");                       //         if (fireLevel >= 79) {                        //                log.info("Flame Gloves with your ring would grant you 5% extra XP per log.");                        //        }                       //         xpMultiplier = 1.02;                       //         eqString = " (+2%)";                       // } else if (equipment.containsAll(FLAME_GLOVES)) {                       //         log.info("A Ring of Fire with your gloves would grant you 5% extra XP per log.");                       //         xpMultiplier = 1.02;                        //        eqString = " (+2%)";                       // } else if (fireLevel >= 79) {                       //         log.info("A Ring of Fire and Flame Gloves would grant you 5% extra XP per log.");                       // } else if (fireLevel >= 62) {                        //        log.info("A Ring of Fire from 'All Fired Up' would grant you 2% extra XP per log.");                        //}                } else {                        mouse.setSpeed(random(10, 12));                }                State state = getState();                switch (state) {                        case FIREMAKE:                                if (!isFreeTile(getMyPlayer().getLocation())) {                                        nextTile = getBestFreeTile();                                        if (calc.distanceTo(nextTile) == 0) {                                                return random(100, 200);                                        }                                        if (nextTile != null) {                                                int iters = 0;                                                while (calc.distanceTo(nextTile) > 0) {                                                        if (isFireAt(nextTile)) {                                                                blackListedTile = nextTile;                                                                return random(100, 300);                                                        }                                                        if (calc.tileOnScreen(nextTile) && !bank.isOpen()) {                                                                if (inventory.isItemSelected()) {                                                                        unUse();                                                                }                                                                Point location = calc.tileToScreen(nextTile);                                                                if (location.x == -1 || location.y == -1) {                                                                        break;                                                                } else {                                                                        mouse.move(location, 5, 5);                                                                }																if (inventory.isItemSelected()) {																	RSItem item = inventory.getItem(TINDERBOX);																	if (item != null) {																		item.doClick(true);																	}																}                                                                tiles.doAction(nextTile, "Walk here");                                                                sleep(random(10, 03));                                                                if (random(0, 3) != 0) {                                                                        RSItem item = inventory.getItem(TINDERBOX);                                                                        if (item != null) {                                                                                item.getComponent().doHover();                                                                        }                                                                }                                                                sleep(random(5, 10));                                                        } else {                                                                if (walking.getEnergy() > nextMinRunEnergy) {                                                                        walking.setRun(true);                                                                        nextMinRunEnergy = random(20, 50);                                                                }                                                                if (calc.distanceTo(nextTile) < 16) {                                                                        walkTo(nextTile);                                                                        sleep(random(30, 50));                                                                } else {                                                                        walkTo(nextTile);                                                                }                                                        }                                                        int tries = 0;                                                        sleep(random(1, 2));                                                        RSTile proceeding = getProceedingTile(nextTile);                                                        if (proceeding != null && calc.distanceTo(proceeding) == 0                                                                        && isFreeTile(proceeding) || iters > 50                                                                        || calc.distanceTo(nextTile) > 100) {                                                                break;                                                        }                                                        iters++;                                                }                                        }					sleep(random(200,300));                                } else if (bank.isOpen()) {                                        bank.close();                                } else if (isTinderboxSelected()) {                                        RSTile currTile = getMyPlayer().getLocation();                                        if (currTile.equals(nextTile)) {                                                nextTile = getProceedingTile(currTile);                                                if (nextTile != null && !isFreeTile(nextTile)) {                                                        nextTile = null;                                                }                                        }                                        RSTile secondTile = nextTile == null ? null : getProceedingTile(nextTile);                                        if (secondTile != null && !isFreeTile(secondTile)) {                                                secondTile = null;                                        }                                        boolean oneLog = inventory.getCount(logId) == 1;                                        RSItem item = inventory.getItem(logId);                                        if (item != null) {                                                item.getComponent().doClick();                                        }                                        if (random(0, 40) == 0) {                                        	antiBanExecutor.submit(new AntiBan());                                        }                                        if (random(0, 100) != 0 && secondTile != null && !oneLog) {                                                item = inventory.getItem(TINDERBOX);                                                if (item != null || inventory.getCount(logId) > 1) {                                                        item.doClick(true);                                                }                                                if (random(0, 100) != 0) {                                                        item = inventory.getItem(logId);                                                        if (item != null) {                                                                mouse.move(item.getComponent().getCenter(), 30, 30);                                                                if (mouse.getLocation().distance(item.getComponent().getCenter()) > 10) {																	if (item != null) {                                                                        mouse.move(inventory.getItem(logId).getComponent().getCenter(), 8, 8);																		while (getMyPlayer().getAnimation() != -1) {																			sleep(random(10, 90));																		}																	}                                                                }                                                        }                                                }                                        } else if (random(0, 5) != 0 && !oneLog) {                                                item = inventory.getItem(TINDERBOX);                                                if (item != null || inventory.getCount(logId) > 1) {                                                        item.getComponent().doHover();														while (getMyPlayer().getAnimation() != -1) {															sleep(random(10, 90));														}                                                }                                        }					if (random(0,100) == 0) {                                        	antiBanExecutor.submit(new AntiBan());                                        }                                      	while (getMyPlayer().getAnimation() != -1) {                                                sleep(random(10, 90));                                        }                                } else {                                        if (random(0, 100) == 0) {                                                checkXP();                                        }                                        if (!inventory.isItemSelected()) {                                                //if (getMyPlayer().isMoving()) {                                                //}                                                RSItem item = inventory.getItem(TINDERBOX);                                                if (item != null || inventory.getCount(logId) > 1) {                                                        item.doClick(true);                                                }                                        }                                }                                break;                        case OPEN_BANK:                                RSTile bankLoc = nearestBank();                                nextTile = bankLoc;                                if (walking.getEnergy() > nextMinRunEnergy) {                                        walking.setRun(true);                                        nextMinRunEnergy = random(20, 50);                                }                                if (inventory.isItemSelected()) {                                        unUse();                                }                                if (bankLoc == null) {                                        walkTo(location.bank);                                } else if (calc.distanceTo(bankLoc) < 7) {                                        if (bank.open()) {                                                sleep(700);                                                if (getMyPlayer().isMoving()) {                                                        sleep(1000);                                                }                                        } else {                                                sleep(random(200, 400));                                                if (!bank.open()) {                                                        rotateCamera();                                                }                                        }                                } else if (location.randomness == -1) {                                        walkTo(bankLoc);                                } else {                                        walkTo(new RSTile(location.bank.getX()                                                        + random(0, location.randomness + 1),                                                        location.bank.getY()                                                                        + random(0, location.randomness + 1)));                                }                                break;                        case BANK:								try {									bank.depositAllExcept(logId, TINDERBOX);								}								catch (Exception e) {																}                                if (!inventory.contains(TINDERBOX)) {                                        withdraw(TINDERBOX, "Tinderbox", false);                                        sleep(1000);                                        if (!inventory.contains(TINDERBOX)) {                                                sleep(1000);                                        }                                } else if (!inventory.contains(logId)) {                                        withdraw(logId, logName, true);                                        sleep(random(500, 800));                                        if (!inventory.contains(logId)) {                                                sleep(random(500, 700));                                        }                                }                                if (inventory.contains(logId) && random(0, 2) == 0) {                                        bank.close();                                }                                currentZone = random(0, location.zones.length);                                break;                        default:                                break;                }                return random(500, 1000);        }        private RSTile nearestBank() {                RSObject booth = objects.getNearest(Bank.BANK_BOOTHS);                RSNPC BankerNPC = npcs.getNearest(Bank.BANKERS);                RSObject BankChest = objects.getNearest(Bank.BANK_CHESTS);                int minDist = 30;                if (BankChest != null) {                        minDist = calc.distanceTo(BankChest);                }                if (BankerNPC != null && calc.distanceTo(BankerNPC) < minDist) {                        minDist = calc.distanceTo(BankerNPC);                        BankChest = null;                }                if (booth != null && calc.distanceTo(booth) < minDist) {                        BankerNPC = null;                }                if (BankerNPC != null) {                        return BankerNPC.getLocation();                }                if (BankChest != null) {                        return BankChest.getLocation();                }                if (booth != null) {                        return booth.getLocation();                }                return null;        }        @Override        public void onFinish() {                log.info("AIO Firemaker Stopped. You gained "                                + (skills.getCurrentExp(Skills.FIREMAKING) - scriptStartXP)                                + " XP in "                                + Timer.format(System.currentTimeMillis() - scriptStartTime) + ".");        }        public void onRepaint(Graphics g) {                if (game.isLoggedIn()) {                        if (bank.isOpen()) {                                RSItem logIF = bank.getItem(logId);                                RSItem tbIF = bank.getItem(TINDERBOX);                                g.setColor(Color.green);                                if (logIF != null && logIF.getComponent().getAbsoluteY() < 270) {                                        g.drawRect(logIF.getComponent().getAbsoluteX() - 1,                                                        logIF.getComponent().getAbsoluteY() - 1,                                                        logIF.getComponent().getWidth() + 2,                                                        logIF.getComponent().getHeight() + 2);                                }                                g.setColor(Color.blue);                                if (tbIF != null && tbIF.getComponent().getAbsoluteY() < 270) {                                        g.drawRect(tbIF.getComponent().getAbsoluteX() - 1,                                                        tbIF.getComponent().getAbsoluteY() - 1,                                                        tbIF.getComponent().getWidth() + 2,                                                        tbIF.getComponent().getHeight() + 2);                                }                        } else if (nextTile != null) {                                highlightTile(g, nextTile, new Color(255, 0, 0, 20), new Color(255, 255, 0, 20));                        }                        if (scriptStartTime == -1) {                                return;                        }                        String title = "AIOFiremaker "                                        + getClass().getAnnotation(ScriptManifest.class).version()                                        + " by Jacmob";                        int x = 13;                        int y = 26;                        if (sine >= 84) {                                sine = 84;                                sineM *= -1;                        } else if (sine <= 1) {                                sine = 1;                                sineM *= -1;                        }                        sine += sineM;                        g.setColor(BG);                        g.fill3DRect(x - 6, y, 211, 25, true);                        g.setColor(DROP);                        g.drawString(title, x + 1, y += 18);                        g.setColor(TEXT);                        g.drawString(title, x, y -= 1);                        if (xpPerFire == 0) {                                return;                        }                        int fireLevel = skills.getRealLevel(Skills.FIREMAKING);                        int levelsGained = fireLevel - Skills.getLevelAt(scriptStartXP);                        int XPGained = skills.getCurrentExp(Skills.FIREMAKING) - scriptStartXP;                        int lvlPerc = skills.getPercentToNextLevel(Skills.FIREMAKING);                        int XPToLevel = skills.getExpToNextLevel(Skills.FIREMAKING);                        long runMillis = System.currentTimeMillis() - scriptStartTime;                        int LogsBurned = (int) Math.round(XPGained                                        / (xpPerFire * xpMultiplier));                        String lvlStr = levelsGained + " lvls";                        if (levelsGained == 1) {                                lvlStr = "1 lvl";                        }                        g.setColor(BG);                        g.fill3DRect(x - 6, y += 11, 211, 112, true);                        g.setColor(TEXT);                        if (scriptStartTime == 0) {                                g.drawString("Waiting For > Lvl 1...", x, y += 17);                        } else {                                g.drawString("Runtime: " + Timer.format(runMillis), x, y += 17);                        }                        g.drawString("Gained: " + XPGained + " XP (" + lvlStr + ")", x, y += 17);                        g.drawString("Burned: " + LogsBurned + " Logs" + eqString, x, y += 17);                        g.drawString("Next Level: " + (fireLevel + 1) + " ("                                        + (int) Math.ceil(XPToLevel / (xpPerFire * xpMultiplier))                                        + " Fires)", x, y += 17);                        g.drawString("Next Level: " + XPToLevel + " XP", x, y += 17);                        g.setColor(new Color(0, 0, 0, 150));                        g.fill3DRect(x, y += 8, 199, 12, true);                        g.setColor(new Color(255 - 2 * lvlPerc,                                        (int) (1.7 * lvlPerc + sine), 0, 150));                        g.fillRect(x + 1, y += 1, (int) (1.97 * lvlPerc), 10);                        g.setColor(new Color(255, 255, 255, 50));                        g.fillRect(x + 1, y, (int) (1.97 * lvlPerc), 5);                        g.setColor(BG);                        if (XPGained >= 1000) {                                int XPPerSecond = (int) (XPGained * 1000 / runMillis);                                int SecsToLevel = XPToLevel / XPPerSecond;                                g.fill3DRect(x - 6, y += 21, 211, 59, true);                                g.setColor(TEXT);                                g.drawString("Next Level: "                                                + Timer.format(SecsToLevel * 1000), x, y += 17);                                g.drawString("Averaging: " + XPPerSecond * 3600 + " XP/hr", x,                                                y += 17);                                g.drawString("Averaging: "                                                + (int) Math.ceil(LogsBurned * 360000D / runMillis)                                                + "0 Logs/hr", x, y += 17);                        } else {                                g.fill3DRect(x - 6, y += 21, 211, 25, true);                                g.setColor(TEXT);                                g.drawString("Calculating...", x, y += 17);                        }                }        }        @Override        public boolean onStart() {                log.info("Waiting for options to be set...");                FMFrame gui = new FMFrame("AIO Firemaker");                while (gui.isVisible()) {                        sleep(500);                }                location = gui.getSelectedLocation();                if (location == null) {                        return false;                }                logId = (int) gui.getSelectedLogInfo()[0];                xpPerFire = gui.getSelectedLogInfo()[1];                logName = gui.getSelectedLogName();                scriptStartTime = -1;                log.info("Options Loaded - Burning " + logName + "...");                return true;        }        private void rotateCamera() {                int angle = camera.getAngle() + random(-40, 40);                if (angle < 0) {                        angle += 359;                }                if (angle > 359) {                        angle -= 359;                }                camera.setAngle(angle);        }        private boolean tileInRegion(RSTile tile) {                int tileX = tile.getX() - game.getBaseX(), tileY = tile.getY() - game.getBaseY();                return !(tileX < 0 || tileY < 0 || tileX > 103 || tileY > 103);        }        private void unUse() {                int rand = random(0, 2);                if (game.getCurrentTab() != Game.TAB_INVENTORY) {                        game.openTab(Game.TAB_INVENTORY);                } else if (rand == 0) {                        //game.openTab(Game.TAB_FRIENDS);                        sleep(random(20, 50));                        if (random(0, 3) != 0) {                                mouse.move(random(575, 695), random(238, 418));                        }                        //game.openTab(Game.TAB_INVENTORY);                } else {                        checkXP();                }        }        private boolean isTinderboxSelected() {                RSItem item = inventory.getSelectedItem();                return item != null && item.getID() == TINDERBOX;        }        public void walkTo(RSTile tile) {                if (inventory.isItemSelected()) {                    RSItem item = inventory.getItem(TINDERBOX);                    if (item != null) {                        item.doClick(true);                    }                }                RSTile dest = getMyPlayer().getLocation();                RSTile[] path = null;                if (calc.distanceBetween(tile, dest) > 1) {                        dest = getClosestTileInRegion(tile);                        if (dest != null) {                                path = pathFinder.findPath(getMyPlayer().getLocation(), dest);                        }                }                if (path == null) {                        walking.walkTileMM(checkTile(tile));                        return;                }                for (int i = path.length - 1; i >= 0; i--) {                        if (calc.distanceTo(path[i]) < 17) {                                RSTile currDest = walking.getDestination();                                if (currDest != null) {                                        if (calc.distanceBetween(currDest, path[i]) <= 3) {                                                break;                                        }                                }                                walking.walkTileMM(checkTile(path[i]));                                sleep(random(200, 400));                                RSTile cdest = walking.getDestination();                                if (cdest != null && calc.distanceTo(cdest) > 6) {                                        sleep(random(300, 500));                                }                                break;                        }                }        }        private void withdraw(int ID, String name, boolean all) {                if (!bank.isOpen()) {                        return;                }                RSComponent[] scrollbox = interfaces.getComponent(                                Bank.INTERFACE_BANK, Bank.INTERFACE_BANK_SCROLLBAR)                                .getComponents();                if (scrollbox.length > 1) {                        int scrollTop = scrollbox[0].getAbsoluteY();                        if (scrollbox[1].getAbsoluteY() > scrollTop + 1) {                                mouse.click(scrollbox[0].getAbsoluteX() + random(2, 4),                                                scrollTop + random(2, 4), true);                        }                }                RSItem bankItem = bank.getItem(ID);                if (bankItem == null) {                        sleep(2000);                        if (bank.getItem(ID) == null) {                                log.severe("Unable to withraw " + name                                                + ". You will be logged out in ten seconds.");                                sleep(random(9000, 11000));                                bank.close();                                stopScript();                        }                } else if (bankItem.getComponent().getAbsoluteY() > 270                                && interfaces.getComponent(Bank.INTERFACE_BANK,                                Bank.INTERFACE_BANK_BUTTON_SEARCH).doAction("Search")) {                        sleep(random(1200, 1500));                        int rand = random(0, Math.min(4, name.length() - 2));                        keyboard.sendText(name.toLowerCase().substring(0, name.length() - rand),                                        false);                        sleep(random(900, 1200));                        bankItem = bank.getItem(ID);                        if (bankItem == null                                        || bankItem.getComponent().getAbsoluteY() > 270                                        || !bank.getItem(ID).doAction(all ? "Withdraw-All " + name                                        : "Withdraw-1 " + name)                                        && !bank.getItem(ID).doAction(all ? "Withdraw-All " + name                                        : "Withdraw-1 " + name)) {                                log.severe("Unable to withraw " + name                                                + ". You will be logged out in ten seconds.");                                sleep(random(9000, 11000));                                if (bank.isOpen()) {                                        bank.close();                                }                                stopScript();                        } else {                                interfaces.getComponent(Bank.INTERFACE_BANK, 50).doClick();                        }                } else {                        bank.getItem(ID).doAction(all ? "Withdraw-All " + name : "Withdraw-1 " + name);                }        }        class AStar {                private class Node {                        public int x, y;                        public Node parent;                        public double g, f;                        public Node(int x, int y) {                                this.x = x;                                this.y = y;                                g = f = 0;                        }                        public boolean isAt(Node another) {                                return x == another.x && y == another.y;                        }                        public RSTile toRSTile(int baseX, int baseY) {                                return new RSTile(x + baseX, y + baseY);                        }                }                private int[][] blocks;                public AStar() {                }                private Node cheapestNode(ArrayList<Node> open) {                        Node c = null;                        for (Node t : open) {                                if (c == null || t.f < c.f) {                                        c = t;                                }                        }                        return c;                }                private double diagonalHeuristic(Node current, Node end) {                        double dx = Math.abs(current.x - end.x);                        double dy = Math.abs(current.y - end.y);                        double diag = Math.min(dx, dy);                        double straight = dx + dy;                        return Math.sqrt(2.0) * diag + straight - 2 * diag;                }                public RSTile[] findPath(RSTile cur, RSTile dest) {                        int baseX = game.getBaseX(), baseY = game.getBaseY();                        int currX = cur.getX() - baseX, currY = cur.getY() - baseY;                        int destX = dest.getX() - baseX, destY = dest.getY() - baseY;                        if (currX < 0 || currY < 0 || currX > 103 || currY > 103 || destX < 0                                        || destY < 0 || destX > 103 || destY > 103) {                                return null;                        }                        ArrayList<Node> closed = new ArrayList<Node>(), open = new ArrayList<Node>();                        blocks = walking.getCollisionFlags(game.getPlane());                        Node current = new Node(currX, currY);                        Node destination = new Node(destX, destY);                        open.add(current);                        while (open.size() > 0) {                                current = cheapestNode(open);                                closed.add(current);                                open.remove(open.indexOf(current));                                for (Node n : getSurroundingWalkableNodes(current)) {                                        if (!isIn(closed, n)) {                                                if (!isIn(open, n)) {                                                        n.parent = current;                                                        n.g = current.g + getAdditionalCost(n, current);                                                        n.f = n.g + diagonalHeuristic(n, destination);                                                        open.add(n);                                                } else {                                                        Node old = getNode(open, n);                                                        if (current.g + getAdditionalCost(old, current) < old.g) {                                                                old.parent = current;                                                                old.g = current.g + getAdditionalCost(old, current);                                                                old.f = old.g + diagonalHeuristic(old, destination);                                                        }                                                }                                        }                                }                                if (isIn(closed, destination)) {                                        return getPath(closed.get(closed.size() - 1), baseX, baseY);                                }                        }                        return null;                }                private double getAdditionalCost(Node start, Node end) {                        double cost = 1.0;                        if (!(start.x == end.y) || start.x == end.y) {                                cost = Math.sqrt(2.0);                        }                        return cost;                }                private Node getNode(ArrayList<Node> nodes, Node key) {                        for (Node n : nodes) {                                if (n.isAt(key)) {                                        return n;                                }                        }                        return null;                }                private RSTile[] getPath(Node endNode, int baseX,                                                                 int baseY) {                        ArrayList<RSTile> reversePath = new ArrayList<RSTile>();                        Node p = endNode;                        while (p.parent != null) {                                reversePath.add(p.toRSTile(baseX, baseY));                                int next = (int) (Math.random() * 4 + 5);                                for (int i = 0; i < next && p.parent != null; i++) {                                        p = p.parent;                                }                        }                        RSTile[] fixedPath = new RSTile[reversePath.size()];                        for (int i = 0; i < fixedPath.length; i++) {                                fixedPath[i] = reversePath.get(fixedPath.length - 1 - i);                        }                        return fixedPath;                }                private ArrayList<Node> getSurroundingWalkableNodes(Node t) {                        ArrayList<Node> tiles = new ArrayList<Node>();                        int curX = t.x, curY = t.y;                        if (curX > 0 && curY < 103                                        && (blocks[curX - 1][curY + 1] & 0x1280138) == 0                                        && (blocks[curX - 1][curY] & 0x1280108) == 0                                        && (blocks[curX][curY + 1] & 0x1280120) == 0) {                                tiles.add(new Node(curX - 1, curY + 1));                        }                        if (curY < 103 && (blocks[curX][curY + 1] & 0x1280120) == 0) {                                tiles.add(new Node(curX, curY + 1));                        }                        if (curX > 0 && curY < 103                                        && (blocks[curX - 1][curY + 1] & 0x1280138) == 0                                        && (blocks[curX - 1][curY] & 0x1280108) == 0                                        && (blocks[curX][curY + 1] & 0x1280120) == 0) {                                tiles.add(new Node(curX + 1, curY + 1));                        }                        if (curX > 0 && (blocks[curX - 1][curY] & 0x1280108) == 0) {                                tiles.add(new Node(curX - 1, curY));                        }                        if (curX < 103 && (blocks[curX + 1][curY] & 0x1280180) == 0) {                                tiles.add(new Node(curX + 1, curY));                        }                        if (curX > 0 && curY > 0                                        && (blocks[curX - 1][curY - 1] & 0x128010e) == 0                                        && (blocks[curX - 1][curY] & 0x1280108) == 0                                        && (blocks[curX][curY - 1] & 0x1280102) == 0) {                                tiles.add(new Node(curX - 1, curY - 1));                        }                        if (curY > 0 && (blocks[curX][curY - 1] & 0x1280102) == 0) {                                tiles.add(new Node(curX, curY - 1));                        }                        if (curX < 103 && curY > 0                                        && (blocks[curX + 1][curY - 1] & 0x1280183) == 0                                        && (blocks[curX + 1][curY] & 0x1280180) == 0                                        && (blocks[curX][curY - 1] & 0x1280102) == 0) {                                tiles.add(new Node(curX + 1, curY - 1));                        }                        return tiles;                }                private boolean isIn(ArrayList<Node> nodes, Node key) {                        return getNode(nodes, key) != null;                }        }}class FMFrame extends JFrame {        /**         * AIO Firemaker Swing GUI Class         */        private static long serialVersionUID = -6177554547983230084L;        private int currentLogs;        private String currentLogName;        private JComboBox logsBox;        private JComboBox locationsBox;        private FMLocation currentLocation;        private HashMap<Integer, Double> XPMap;        private HashMap<String, Integer> logMap;        private HashMap<String, FMLocation> locationMap;        public FMLocation[] LOCATIONS;        public File SETTINGS_FILE = new File(new File(                        GlobalConfiguration.Paths.getSettingsDirectory()), "AIOFM.txt");        public FMFrame(String title) {                super(title);                /*                 * LOCATIONS ARRAY                 *                 * FMLocation("Name", FMZone[], (RSTile)bankLocation, (int)randomness)                 * FMZone(FMRow[], (boolean)horizontal) FMRow((int)startpos,                 * (int)endpos, (int)otheraxispos)                 *                 * If a zone is horizontal, starpos and endpos for all rows will refer                 * to the x axis and otheraxispos will refer to the y position. As far                 * as I have seen all firemaking runs from east to west, so horizontal =                 * true && endpos < startpos The randomness for each location determins                 * how it will walk to the bank tile. If -1 is specified, it will walk                 * directly to the found bank if possible, otherwise the script will                 * always walk to bankLocation, with the randomness specified. 0 = no                 * randomness, 1 = one tile randomness etc.                 */                LOCATIONS = new FMLocation[]{                                new FMLocation("Grand Exchange", new FMZone[]{                                                new FMZone(new FMRow[]{new FMRow(3172, 3157, 3484),                                                                new FMRow(3178, 3151, 3483),                                                                new FMRow(3178, 3151, 3482),                                                                new FMRow(3169, 3161, 3481)}, true),                                                new FMZone(new FMRow[]{new FMRow(3173, 3156, 3494),                                                                new FMRow(3172, 3157, 3495),                                                                new FMRow(3178, 3151, 3496),                                                                new FMRow(3178, 3151, 3497),                                                                new FMRow(3168, 3161, 3498)}, true)},                                                new RSTile(3162, 3490), 1),                                new FMLocation("Draynor Village", new FMZone[]{new FMZone(                                                new FMRow[]{new FMRow(3097, 3077, 3249),                                                                new FMRow(3098, 3072, 3248),                                                                new FMRow(3095, 3081, 3247)}, true)},                                                new RSTile(3093, 3244), 0),                                new FMLocation("Fist of Guthix", new FMZone[]{new FMZone(                                                new FMRow[]{new FMRow(1717, 1676, 5601),                                                                new FMRow(1718, 1676, 5600),                                                                new FMRow(1718, 1676, 5599),                                                                new FMRow(1718, 1676, 5598),                                                                new FMRow(1718, 1676, 5597)}, true)},                                                new RSTile(1703, 5599), -1),                                new FMLocation("Varrock West", new FMZone[]{new FMZone(                                                new FMRow[]{new FMRow(3199, 3175, 3431),                                                                new FMRow(3199, 3168, 3430),                                                                new FMRow(3199, 3168, 3429),                                                                new FMRow(3199, 3168, 3428)}, true)},                                                new RSTile(3183, 3435), 0),                                new FMLocation("Varrock East", new FMZone[]{new FMZone(                                                new FMRow[]{new FMRow(3265, 3241, 3429),                                                                new FMRow(3265, 3241, 3428),                                                                new FMRow(3257, 3255, 3427),                                                                new FMRow(3252, 3250, 3427)}, true)},                                                new RSTile(3253, 3421), 0),                                new FMLocation("Falador East", new FMZone[]{new FMZone(                                                new FMRow[]{new FMRow(3032, 3005, 3359),                                                                new FMRow(3032, 3005, 3360),                                                                new FMRow(3032, 3001, 3361),                                                                new FMRow(3032, 3001, 3362),                                                                new FMRow(3032, 3001, 3363)}, true)},                                                new RSTile(3012, 3356), 0),                                new FMLocation("Yanille", new FMZone[]{new FMZone(                                                new FMRow[]{new FMRow(2606, 2577, 3099),                                                                new FMRow(2606, 2577, 3098),                                                                new FMRow(2606, 2578, 3097)}, true)},                                                new RSTile(2612, 3092), 0)                };                currentLocation = null;                logsBox = new JComboBox();                locationsBox = new JComboBox();                XPMap = new HashMap<Integer, Double>();                logMap = new HashMap<String, Integer>();                locationMap = new HashMap<String, FMLocation>();                setupFrame();                setVisible(true);        }        public FMLocation getSelectedLocation() {                return currentLocation;        }        public double[] getSelectedLogInfo() {                return new double[]{currentLogs, XPMap.get(currentLogs)};        }        public String getSelectedLogName() {                return currentLogName;        }        private void setupFrame() {                // FRAME                setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);                setResizable(false);                setAlwaysOnTop(true);                setLocationRelativeTo(null);                setSize(200, 120);                // START BUTTON                JButton startButton = new JButton("Start");                add(startButton, BorderLayout.SOUTH);                startButton.addActionListener(new ActionListener() {                        public void actionPerformed(ActionEvent evt) {                                currentLocation = locationMap.get(locationsBox                                                .getSelectedItem().toString());                                currentLogs = logMap.get(logsBox.getSelectedItem().toString());                                currentLogName = logsBox.getSelectedItem().toString();                                // WRITE TO SETTINGS FILE                                try {                                        BufferedWriter out = new BufferedWriter(                                                        new FileWriter(SETTINGS_FILE));                                        out.write(currentLogName + ":"                                                        + locationsBox.getSelectedItem().toString());                                        out.close();                                } catch (Exception ignored) {                                }                                // DISPOSE                                setVisible(false);                                dispose();                        }                });                // COMBO BOXES                String[] locations = new String[LOCATIONS.length];                /*                 * LOG ARRAYS                 *                 * The following three arrays must be the same length, with                 * <code>logs</code> referring to the log name, <code>logIDs</code>                 * referring to the log ID, and <code>logXPs</code> referring to the                 * firemaking XP gained each time a log of that kind is burned.                 *                 * Each string in (String[] logs) must be the correct name of the item                 * specified in logIDs or the script will be unable to withdraw the logs                 * from the bank.                 */                String[] logs = {"Logs", "Oak logs", "Willow logs",                                "Maple logs", "Yew logs", "Magic logs"};                int[] logIDs = {1511, 1521, 1519, 1517, 1515, 1513};                double[] logXPs = {40.0, 60.0, 90.0, 135.0, 202.5, 303.8};                for (int i = 0; i < logs.length; i++) {                        logMap.put(logs[i], logIDs[i]);                        XPMap.put(logIDs[i], logXPs[i]);                }                for (int i = 0; i < locations.length; i++) {                        locations[i] = LOCATIONS[i].name;                        locationMap.put(locations[i], LOCATIONS[i]);                }                locationsBox.setModel(new DefaultComboBoxModel(locations));                add(locationsBox, BorderLayout.CENTER);                logsBox.setModel(new DefaultComboBoxModel(logs));                add(logsBox, BorderLayout.NORTH);                // LOAD SAVED SELECTIONS FROM SETTINGS FILE                try {                        BufferedReader in = new BufferedReader(new FileReader(                                        SETTINGS_FILE));                        String line;                        String[] opts = {};                        while ((line = in.readLine()) != null) {                                if (line.contains(":")) {                                        opts = line.split(":");                                }                        }                        in.close();                        if (opts.length == 2) {                                logsBox.setSelectedItem(opts[0]);                                locationsBox.setSelectedItem(opts[1]);                        }                } catch (IOException ignored) {                }        }}class FMLocation {        public String name;        public FMZone[] zones;        public RSTile bank;        public int randomness;        public FMLocation(String name, FMZone[] zones,                                          RSTile bank, int randomness) {                this.name = name;                this.zones = zones;                this.bank = bank;                this.randomness = randomness;        }}class FMRow {        public RSTile[] tiles;        public int start, end, pos;        public FMRow(int start, int end, int pos) {                this.start = start;                this.end = end;                this.pos = pos;        }        public void generateTiles(boolean horizontal) {                int length = Math.abs(end - start) + 1;                tiles = new RSTile[length];                if (end > start) {                        if (horizontal) {                                for (int i = 0; i < length; i++) {                                        tiles[i] = new RSTile(start + i, pos);                                }                        } else {                                for (int i = 0; i < length; i++) {                                        tiles[i] = new RSTile(pos, start + i);                                }                        }                } else {                        if (horizontal) {                                for (int i = 0; i < length; i++) {                                        tiles[i] = new RSTile(start - i, pos);                                }                        } else {                                for (int i = 0; i < length; i++) {                                        tiles[i] = new RSTile(pos, start - i);                                }                        }                }        }}class FMZone {        public FMRow[] rows;        public boolean horizontal;        public FMZone(FMRow[] fmRows, boolean horizontal) {                rows = fmRows;                this.horizontal = horizontal;                for (FMRow r : rows) {                        r.generateTiles(horizontal);                }        }}