package org.rsbot.script.randoms; import org.rsbot.script.Random; import org.rsbot.script.ScriptManifest; import org.rsbot.script.methods.Bank; import org.rsbot.script.wrappers.*; import java.awt.*; import java.util.ArrayList; import java.util.Iterator; /** * <p> * This short-sighted gravedigger has managed to put five coffins in the wrong * graves. <br /> * If he'd looked more closely at the headstones, he might have known where each * one was supposed to go! <br /> * Help him by matching the contents of each coffin with the headstones in the * graveyard. Easy, huh? * </p> * <p/> * Last Update: 1.6 09/05/10 Jacmob. * * @author Qauters */ @ScriptManifest(authors = {"Qauters"}, name = "GraveDigger", version = 1.6) public class GraveDigger extends Random { class Group { // IDs used later int coffinID = -1; int graveID = -1; // General group data final int graveStoneModelID; final int[] coffinModelIDs; public Group(final int graveStoneModelID, final int[] coffinModelIDs) { this.graveStoneModelID = graveStoneModelID; this.coffinModelIDs = coffinModelIDs; } public boolean isGroup(final int graveStoneModelID) { return this.graveStoneModelID == graveStoneModelID; } public boolean isGroup(final int[] coffinModelIDs) { for (final int modelID : this.coffinModelIDs) { boolean found = false; for (final int coffinModelID : coffinModelIDs) { if (modelID == coffinModelID) { found = true; } } if (!found) { return false; } } return true; } } private static final int[] coffinIDs = {7587, 7588, 7589, 7590, 7591}; private static final int[] graveStoneIDs = {12716, 12717, 12718, 12719, 12720}; private static final int[] filledGraveIDs = {12721, 12722, 12723, 12724, 12725}; private static final int[] emptyGraveIDs = {12726, 12727, 12728, 12729, 12730}; private static final int INTERFACE_READ_GRAVESTONE = 143; private static final int INTERFACE_READ_GRAVESTONE_MODEL = 2; private static final int INTERFACE_READ_GRAVESTONE_CLOSE = 3; private static final int INTERFACE_CHECK_COFFIN = 141; private static final int INTERFACE_CHECK_COFFIN_CLOSE = 12; private static final int[] INTERFACE_CHECK_COFFIN_ITEMS = {3, 4, 5, 6, 7, 8, 9, 10, 11}; @SuppressWarnings("unused") private static final int[] NOT_TO_DEPOSIT = {1351, 1349, 1353, 1361, 1355, 1357, 1359, 4031, 6739, 13470, 14108, 1265, 1267, 1269, 1296, 1273, 1271, 1275, 15259, 303, 305, 307, 309, 311, 10129, 301, 13431, 313, 314, 2347, 995, 10006, 10031, 10008, 10012, 11260, 10150, 10010, 556, 558, 555, 557, 554, 559, 562, 560, 565, 8013, 4251, 8011, 8010, 8009, 8008, 8007}; private final ArrayList<Group> groups = new ArrayList<Group>(); private int tmpID = -1, tmpStatus = -1; // used to store some data across // loops @Override public void onFinish() { tmpID = -1; tmpStatus = -1; } public GraveDigger() { groups.add(new Group(7614, new int[]{7603, 7605, 7612})); groups.add(new Group(7615, new int[]{7600, 7601, 7604})); groups.add(new Group(7616, new int[]{7597, 7606, 7607})); groups.add(new Group(7617, new int[]{7602, 7609, 7610})); groups.add(new Group(7618, new int[]{7599, 7608, 7613})); } @Override public boolean activateCondition() { return settings.getSetting(696) != 0 && objects.getNearest(12731) != null; } @Override public int loop() { if (npcs.getNearest("Leo") == null) { return -1; } if (inventory.getCountExcept(GraveDigger.coffinIDs) > 23) { if (interfaces.canContinue()) { interfaces.clickContinue(); sleep(random(1500, 2000)); } final RSObject depo = objects.getNearest(12731); if (depo != null) { if (!calc.tileOnScreen(depo.getLocation())) { walking.getPath(depo.getLocation()).traverse(); camera.turnTo(depo); } else { depo.interact("Deposit"); } } if (interfaces.get(Bank.INTERFACE_DEPOSIT_BOX).isValid()) { sleep(random(700, 1200)); interfaces.get(11).getComponent(17).getComponent(27).interact("Dep"); sleep(random(700, 1200)); interfaces.get(11).getComponent(17).getComponent(26).interact("Dep"); sleep(random(700, 1200)); interfaces.get(11).getComponent(17).getComponent(25).interact("Dep"); sleep(random(700, 1200)); interfaces.get(11).getComponent(17).getComponent(24).interact("Dep"); sleep(random(700, 1200)); interfaces.get(11).getComponent(17).getComponent(23).interact("Dep"); sleep(random(700, 1200)); interfaces.getComponent(11, 15).doClick(); return random(500, 700); } return random(2000, 3000); } if (getMyPlayer().isMoving()) { } else if (getMyPlayer().getAnimation() == 827) { } else if (interfaces.get(242).isValid()) { // Check if we finished before if (interfaces.get(242).containsText("ready to leave")) { tmpStatus++; } interfaces.getComponent(242, 6).doClick(); } else if (interfaces.get(64).isValid()) { interfaces.getComponent(64, 5).doClick(); } else if (interfaces.get(241).isValid()) { interfaces.getComponent(241, 5).doClick(); } else if (interfaces.get(243).isValid()) { interfaces.getComponent(243, 7).doClick(); } else if (interfaces.get(220).isValid()) { interfaces.getComponent(220, 16).doClick(); } else if (interfaces.get(236).isValid()) { if (interfaces.get(236).containsText("ready to leave")) { interfaces.getComponent(236, 1).doClick(); } else { interfaces.getComponent(236, 2).doClick(); } } else if (interfaces.get(GraveDigger.INTERFACE_CHECK_COFFIN).isValid()) { if (tmpID >= 0) { final int[] items = new int[GraveDigger.INTERFACE_CHECK_COFFIN_ITEMS.length]; final RSInterface inters = interfaces.get(GraveDigger.INTERFACE_CHECK_COFFIN); for (int i = 0; i < GraveDigger.INTERFACE_CHECK_COFFIN_ITEMS.length; i++) { items[i] = inters.getComponent(GraveDigger.INTERFACE_CHECK_COFFIN_ITEMS[i]).getComponentID(); } for (final Iterator<Group> it = groups.iterator(); it.hasNext() && tmpID >= 0;) { final Group g = it.next(); if (g.isGroup(items)) { g.coffinID = tmpID; tmpID = -1; } } } atCloseInterface(GraveDigger.INTERFACE_CHECK_COFFIN, GraveDigger.INTERFACE_CHECK_COFFIN_CLOSE); } else if (interfaces.get(GraveDigger.INTERFACE_READ_GRAVESTONE).isValid()) { final int modelID = interfaces.get(GraveDigger.INTERFACE_READ_GRAVESTONE).getComponent(GraveDigger.INTERFACE_READ_GRAVESTONE_MODEL).getComponentID(); for (final Group g : groups) { if (g.isGroup(modelID)) { g.graveID = tmpID; } } atCloseInterface(GraveDigger.INTERFACE_READ_GRAVESTONE, GraveDigger.INTERFACE_READ_GRAVESTONE_CLOSE); } else if (tmpStatus == 0 && tmpID != -1) { for (final Group g : groups) { if (g.graveID == tmpID) { final RSObject obj = objects.getNearest(g.graveID); if (obj == null || !setObjectInScreen(obj)) { log.info("Couldn't find grave, shutting down."); game.logout(false); return -1; } // if (isItemSelected() > 0) { // inventory.atItem(GraveDigger.coffinIDs[g.coffinID], // "Cancel"); // } inventory.useItem(inventory.getItem(GraveDigger.coffinIDs[g.coffinID]), obj); // Wait for about 10s to finish final long cTime = System.currentTimeMillis(); while (System.currentTimeMillis() - cTime < 10000) { if (inventory.getItem(GraveDigger.coffinIDs[g.coffinID]) == null) { break; } sleep(random(400, 700)); } break; } } tmpID = -1; } else if (tmpStatus == -1 && objects.getNearest(GraveDigger.filledGraveIDs) != null) { final RSObject obj = objects.getNearest(GraveDigger.filledGraveIDs); if (obj == null || !setObjectInScreen(obj)) { log.severe("Couldn't find grave, shutting down."); game.logout(false); return -1; } obj.interact("Take-coffin"); } else if (tmpStatus == 0 && objects.getNearest(GraveDigger.emptyGraveIDs) != null) { final RSObject obj = objects.getNearest(GraveDigger.emptyGraveIDs); final int id = obj.getID(); for (int i = 0; i < GraveDigger.emptyGraveIDs.length; i++) { if (GraveDigger.emptyGraveIDs[i] == id) { final RSObject objGS = objects.getNearest(GraveDigger.graveStoneIDs[i]); if (objGS == null || !setObjectInScreen(objGS)) { log.severe("Couldn't find grave stone, shutting down."); game.logout(false); return -1; } tmpID = obj.getID(); // if (Bot.getClient().isItemSelected() == 1) { // objects.atObject(objGS, "Use"); // } objGS.interact("Read"); } } } else if (tmpStatus == -1) { final ArrayList<Integer> agc = new ArrayList<Integer>(); for (int i = 0; i < GraveDigger.coffinIDs.length; i++) { agc.add(i); } for (final Group g : groups) { if (g.coffinID != -1) { agc.remove(new Integer(g.coffinID)); } } if (tmpStatus == -1 && agc.size() == 0) { tmpStatus++; } while (tmpStatus == -1) { final int i = random(0, agc.size()); if (inventory.getCount(GraveDigger.coffinIDs[agc.get(i)]) > 0) { tmpID = agc.get(i); inventory.getItem(GraveDigger.coffinIDs[agc.get(i)]).interact("Check"); return random(1800, 2400); // We are looking at the model } } } else if (tmpStatus == 0) { // Done final RSNPC leo = npcs.getNearest("Leo"); if (leo == null || !setCharacterInScreen(leo)) { log.severe("Couldn't find Leo, shutting down."); game.logout(false); return -1; } //Teleport Ani - 8939 if (getMyPlayer().getAnimation() == -1) { leo.interact("Talk-to"); } } return random(1400, 1800); } public boolean atCloseInterface(final int parent, final int child) { final RSComponent i = interfaces.getComponent(parent, child); if (!i.isValid()) { return false; } final Rectangle pos = i.getArea(); if (pos.x == -1 || pos.y == -1 || pos.width == -1 || pos.height == -1) { return false; } final int dx = (int) (pos.getWidth() - 4) / 2; final int dy = (int) (pos.getHeight() - 4) / 2; final int midx = (int) (pos.getMinX() + pos.getWidth() / 2); final int midy = (int) (pos.getMinY() + pos.getHeight() / 2); mouse.click(midx + random(-dx, dx) - 5, midy + random(-dy, dy), true); return true; } public boolean setCharacterInScreen(final RSCharacter ch) { // Check if it's on screen, if not make it on screen. for (int i = 0; i < 3; i++) { final Point screenLocation = ch.getScreenLocation(); if (!calc.pointOnScreen(screenLocation)) { switch (i) { case 0: camera.turnTo(ch); sleep(random(200, 500)); break; case 1: walking.walkTileMM(walking.getClosestTileOnMap(ch.getLocation().randomize(2, 2))); sleep(random(1800, 2000)); while (getMyPlayer().isMoving()) { sleep(random(200, 500)); } break; default: return false; } } } return true; } public boolean setObjectInScreen(final RSObject obj) { // Check if it's on screen, if not make it on screen. for (int i = 0; i < 3; i++) { final Point screenLocation = calc.tileToScreen(obj.getLocation()); if (!calc.pointOnScreen(screenLocation)) { switch (i) { case 0: camera.turnTo(obj); sleep(random(200, 500)); break; case 1: walking.walkTileMM(walking.getClosestTileOnMap(obj.getLocation().randomize(2, 2))); sleep(random(1800, 2000)); while (getMyPlayer().isMoving()) { sleep(random(200, 500)); } break; default: return false; } } } return true; } }