Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.Point;
- import java.awt.Polygon;
- import java.awt.Rectangle;
- import java.lang.reflect.Method;
- import java.text.DecimalFormat;
- import java.util.ArrayList;
- import java.util.EnumSet;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Random;
- import javax.swing.JOptionPane;
- import org.rsbot.event.events.MessageEvent;
- import org.rsbot.event.listeners.MessageListener;
- import org.rsbot.event.listeners.PaintListener;
- import org.rsbot.script.Script;
- import org.rsbot.script.ScriptManifest;
- import org.rsbot.script.methods.Calculations;
- import org.rsbot.script.methods.Equipment;
- import org.rsbot.script.methods.Game;
- import org.rsbot.script.methods.GrandExchange;
- import org.rsbot.script.methods.GrandExchange.GEItem;
- import org.rsbot.script.methods.Magic;
- import org.rsbot.script.methods.Players;
- import org.rsbot.script.methods.Skills;
- import org.rsbot.script.methods.Walking;
- import org.rsbot.script.wrappers.RSComponent;
- import org.rsbot.script.wrappers.RSInterface;
- import org.rsbot.script.wrappers.RSItem;
- import org.rsbot.script.wrappers.RSNPC;
- import org.rsbot.script.wrappers.RSObject;
- import org.rsbot.script.wrappers.RSPath.TraversalOption;
- import org.rsbot.script.wrappers.RSTile;
- import org.rsbot.script.wrappers.RSTilePath;
- @ScriptManifest(authors = "Equinox_", keywords = "Runecrafting", name = "Equinox_ ZMI Crafter", version = 0.7, description = "Beta Version")
- /**
- * @author Equinox_
- */
- public class EquinoxZMICrafter extends Script implements MessageListener,
- PaintListener {
- // Variables
- final String baseURL = "http://equinox-scripts.web44.net/scripts/natcrafter";
- final double VERSION = getClass().getAnnotation(ScriptManifest.class)
- .version();
- final String author = PaintFormatter.formatList(getClass().getAnnotation(
- ScriptManifest.class).authors());
- final String name = getClass().getAnnotation(ScriptManifest.class).name();
- public final static int COSMIC_RUNE_ID = 564;
- public final static int ASTRAL_RUNE_ID = 9075;
- public static final int AIR_STAFF_ID = 1405;
- public final static int PURE_ESS_ID = 7936;
- public final static int ZMI_ALTAR_ID = 26847;
- public final static int AIR_RUNE_ID = 556;
- public final static int NPC_CONTACT_ANIM = 4413;
- public final static int BANKER_ID = 6362;
- public final static int CRAFT_RUNE_ANIM = 791;
- public final static int FIRE_RUNE_ID = 554;
- public final static int CRACK_IN = 26844;
- public final static int CRACK_OUT = 26845;
- public final static RSTile alterDet = new RSTile(3314, 4813, 0);
- public final static int PAY_BANK_INTERFACE = 619;
- public final static int LAW_RUNE = 563;
- public final static int ASTRAL_RUNE = 9075;
- public final static int EARTH_RUNE = 557;
- public final static String[] PAY_BANKER_ORDER = { "fire", "air", "mind",
- "body", "water", "earth", "cosmic", "chaos", "astral", "law",
- "death", "blood", "nature", "soul" };
- public final static RSTile[][] SAFE_MESH = { { new RSTile(3273, 4856, 0) },
- { new RSTile(3280, 4848, 0) }, { new RSTile(3279, 4839, 0) },
- { new RSTile(3286, 4832, 0) }, { new RSTile(3297, 4834, 0) },
- { new RSTile(3309, 4836, 0) }, { new RSTile(3320, 4833, 0) },
- { new RSTile(3310, 4828, 0) }, { new RSTile(3301, 4828, 0) },
- { new RSTile(3289, 4829, 0) }, { new RSTile(3280, 4822, 0) },
- { new RSTile(3290, 4820, 0) }, { new RSTile(3301, 4820, 0) },
- { new RSTile(3308, 4820, 0) } };
- public final static RSTile[][] DANGER_MESH = {
- { new RSTile(3272, 4851, 0), new RSTile(3269, 4854, 0) },
- { new RSTile(3272, 4844, 0), new RSTile(3268, 4846, 0) },
- { new RSTile(3271, 4837, 0), new RSTile(3268, 4838, 0) },
- { new RSTile(3272, 4828, 0), new RSTile(3267, 4832, 0) },
- { new RSTile(3273, 4821, 0), new RSTile(3268, 4825, 0) },
- { new RSTile(3270, 4814, 0), new RSTile(3268, 4819, 0) },
- { new RSTile(3275, 4808, 0), new RSTile(3276, 4814, 0) },
- { new RSTile(3283, 4806, 0), new RSTile(3279, 4810, 0) },
- { new RSTile(3288, 4812, 0), new RSTile(3287, 4807, 0) },
- { new RSTile(3295, 4813, 0), new RSTile(3293, 4814, 0) },
- { new RSTile(3300, 4807, 0), new RSTile(3298, 4813, 0) },
- { new RSTile(3309, 4812, 0), new RSTile(3305, 4807, 0) } };
- public final RSTile[] OURANIA_PATH = { new RSTile(2469, 3245),
- new RSTile(2459, 3249), new RSTile(2455, 3239),
- new RSTile(2453, 3232) };
- public final static int POUCH_TRIES = 20;
- public final static int[] food = { 333, 329, 379, 373, 7946, 361, 1901,
- 1899, 1897, 1895, 1893, 1891, 2142 };
- public static final int LADDER_ID = 26849;
- // Pouch IDs
- public static class Pouch {
- public final static int SMALL = 5509;
- public final static int MEDIUM = 5510;
- public final static int MEDIUM_DEGRADED = 5511;
- public final static int LARGE = 5512;
- public final static int LARGE_DEGRADED = 5513;
- public final static int GIANT = 5514;
- public final static int GIANT_DEGRADED = 5515;
- public final static int[] ALL = { SMALL, MEDIUM, MEDIUM_DEGRADED,
- LARGE, LARGE_DEGRADED, GIANT, GIANT_DEGRADED };
- public final static int[] ALL_REPAIRED = { SMALL, MEDIUM, LARGE, GIANT };
- public final static int[] ALL_DEGRADED = { MEDIUM_DEGRADED,
- LARGE_DEGRADED, GIANT_DEGRADED };
- public final static int[] ALL_DEGRADEABLE = { MEDIUM, MEDIUM_DEGRADED,
- LARGE, LARGE_DEGRADED, GIANT, GIANT_DEGRADED };
- }
- public static String serverMsg = "";
- public HashMap<PouchType, PouchState> pouches = new HashMap<PouchType, PouchState>();
- State currentState = State.LOST;
- public MeshPath alterMeshPath;
- public MeshPath bankMeshPath;
- public NPCContact npcContact = new NPCContact();
- public OptionsClass.Path pathTypeCurrent;
- public OptionsClass Options = new OptionsClass();
- // Options
- public static class OptionsClass {
- public pouchRepairOption pouchRepair = pouchRepairOption.ONE;
- public boolean hasAirStaff = true;
- public boolean hasEarthStaff = true;
- public PouchCheckSystem pouchCheckSystem = PouchCheckSystem.SERVER_MSG;
- public Range walkingDistance = new Range(4, 6);
- public Path pathType = Path.Danger;
- public boolean chargeEnergy = true;
- public boolean tryOuraniaTeleport = true;
- public boolean onLunars = false;
- enum Path {
- Danger, Safe
- }
- /**
- * When to repair pouches
- *
- * @author Equinox_
- *
- */
- public enum pouchRepairOption {
- ONE, TWO, ALL, NEVER
- }
- /**
- * How to determine a pouch's state
- *
- * @author Equinox_
- *
- */
- public enum PouchCheckSystem {
- SERVER_MSG, INVENTORY_STATUS
- }
- }
- /**
- * A range class for randomized items
- *
- * @author Equinox_
- *
- */
- public static class Range {
- public int MAX;
- public int MIN;
- public Range() {
- MAX = 1;
- MIN = -1;
- }
- /**
- *
- * @param min
- * The inclusive lower bound
- * @param max
- * The inclusive upper bound
- */
- public Range(int min, int max) {
- MAX = Math.max(min, max) + 1;
- MIN = Math.min(min, max);
- }
- /**
- * Returns a linearly distributed pseudorandom integer.
- *
- * @return Random integer min <= n < max.
- */
- public int randomLinearDistribution() {
- return MIN + (MAX == MIN ? 0 : new Random().nextInt(MAX - MIN));
- }
- /**
- * Returns a normally distributed pseudorandom integer about a mean
- * centered between min and max with a calculated standard deviation.
- *
- * @return Random integer min <= n < max from the normal distribution
- * described by the parameters.
- */
- public int randomNormalDistribution() {
- int mean = MIN + (MAX - MIN) / 2;
- int rand;
- int sd = (MAX - MIN) / 3;
- do {
- rand = (int) (new Random().nextGaussian() * sd + mean);
- } while (rand < MIN || rand >= MAX);
- return rand;
- }
- /**
- * Returns a normally distributed pseudorandom integer about a mean
- * centered between min and max with a provided standard deviation.
- *
- * @param sd
- * The standard deviation. A higher value will increase the
- * probability of numbers further from the mean being
- * returned.
- * @return Random integer min <= n < max from the normal distribution
- * described by the parameters.
- */
- public int randomNormalDistribution(int sd) {
- int mean = MIN + (MAX - MIN) / 2;
- int rand;
- do {
- rand = (int) (new Random().nextGaussian() * sd + mean);
- } while (rand < MIN || rand >= MAX);
- return rand;
- }
- public String toString() {
- return MIN + "-" + MAX;
- }
- }
- public static int[] mergeArrays(int[] a1, int... a2) {
- int[] newArr = new int[a1.length + a2.length];
- for (int i = 0; i < a1.length; i++)
- newArr[i] = a1[i];
- for (int i = 0; i < a2.length; i++)
- newArr[a1.length + i] = a2[i];
- return newArr;
- }
- /**
- * Possible states in the process of nature runecrafting
- *
- * @author Equinox_
- *
- */
- public enum State {
- NEAR_BANK, NPC_CONTACT, BANK_WITHDRAW, BANK_DEPOSIT, FILL_POUCHES, TRAVERSE_ALTER, CRAFT_RUNES, EMPTY_POUCHES, TRAVERSE_BANK, LOST, EAT_FOOD, CHARGE_ENERGY, OURANIA_TELEPORT, LADDER_DOWN, TRAVERSE_OURANIA
- }
- /**
- * Possible states of pouches, Empty or Full
- *
- * @author Equinox_
- *
- */
- public enum PouchState {
- Empty, Full
- }
- /**
- * Different pouches and their possible IDs
- *
- * @author Equinox_
- *
- */
- public enum PouchType {
- Small(Pouch.SMALL), Medium(Pouch.MEDIUM, Pouch.MEDIUM_DEGRADED), Large(
- Pouch.LARGE, Pouch.LARGE_DEGRADED), Giant(Pouch.GIANT,
- Pouch.GIANT_DEGRADED);
- public int[] ids;
- private PouchType(int... ids) {
- this.ids = ids;
- }
- }
- /**
- * Gets the current state
- *
- * @return State the current state
- * @throws Exception
- * so we can pipe errors back to the recorder
- */
- public State getState() throws Exception {
- if (objects.getNearest(LADDER_ID) != null
- && objects.getNearest(LADDER_ID).isOnScreen())
- return State.LADDER_DOWN;
- if (objects.getNearest(ZMI_ALTAR_ID) != null
- && objects.getNearest(ZMI_ALTAR_ID).getLocation() != null)
- if (calc.tileOnMap(objects.getNearest(ZMI_ALTAR_ID).getLocation())
- && (Options.pathType.equals(OptionsClass.Path.Danger) || calc
- .pathLengthTo(alterDet, true) <= 15)) {
- if ((inventory.isFull() || !pouches
- .containsValue(PouchState.Full))
- && inventory.contains(PURE_ESS_ID))
- return State.CRAFT_RUNES;
- else if (pouches.containsValue(PouchState.Full))
- return State.EMPTY_POUCHES;
- // Check path type change
- if (!pathTypeCurrent.equals(Options.pathType)) {
- pathTypeCurrent = Options.pathType;
- // Set up path:
- if (Options.pathType.equals(OptionsClass.Path.Danger))
- alterMeshPath = new MeshPath(walking, calc, players,
- DANGER_MESH);
- else
- alterMeshPath = new MeshPath(walking, calc, players,
- SAFE_MESH);
- bankMeshPath = alterMeshPath.reverse();
- }
- }
- // Banking
- if (npcs.getNearest(BANKER_ID) != null) {
- if (npcs.getNearest(BANKER_ID).isOnScreen() || bank.isOpen()) {
- // Check path type change
- if (!pathTypeCurrent.equals(Options.pathType)) {
- pathTypeCurrent = Options.pathType;
- // Set up path:
- if (Options.pathType.equals(OptionsClass.Path.Danger))
- alterMeshPath = new MeshPath(walking, calc, players,
- DANGER_MESH);
- else
- alterMeshPath = new MeshPath(walking, calc, players,
- SAFE_MESH);
- bankMeshPath = alterMeshPath.reverse();
- }
- if (!bank.isOpen() && walking.getEnergy() < 10
- && Options.chargeEnergy)
- return State.CHARGE_ENERGY;
- // Pouch Repair
- if (shouldRepairPouches())
- return State.NPC_CONTACT;
- if ((combat.getLifePoints() + 200 < skills
- .getCurrentLevel(Skills.CONSTITUTION) * 10)
- || combat.getHealth() < 50)
- return State.EAT_FOOD;
- if (inventory.getCount(Pouch.ALL)
- + inventory.getCount(PURE_ESS_ID)
- + inventory.getCount(FIRE_RUNE_ID) != inventory
- .getCount())
- return State.BANK_DEPOSIT;
- if (inventory.contains(PURE_ESS_ID)
- && pouches.containsValue(PouchState.Empty))
- return State.FILL_POUCHES;
- if (!inventory.isFull())
- return State.BANK_WITHDRAW;
- } else if (!inventory.contains(PURE_ESS_ID))
- return State.NEAR_BANK;
- }
- if (inventory.contains(PURE_ESS_ID) && !shouldRepairPouches())
- return State.TRAVERSE_ALTER;
- else {
- if (objects.getNearest(LADDER_ID) != null)
- return State.TRAVERSE_OURANIA;
- if (Options.tryOuraniaTeleport
- && skills.getCurrentLevel(Skills.MAGIC) >= 71
- && inventory.contains(LAW_RUNE)
- && inventory.getCount(true, ASTRAL_RUNE) >= 2
- && (inventory.getCount(true, EARTH_RUNE) >= 6 || Options.hasEarthStaff))
- return State.OURANIA_TELEPORT;
- return State.TRAVERSE_BANK;
- }
- // return State.LOST;
- }
- /**
- * Internal use only. When the client receives a message this method is
- * invoked, saving the message for later use.
- */
- public void messageReceived(MessageEvent msg) {
- if (msg.getID() == MessageEvent.MESSAGE_ACTION
- || msg.getID() == MessageEvent.MESSAGE_SERVER) {
- serverMsg = msg.getMessage().toLowerCase();
- }
- }
- /**
- * Determines if pouches need repairing by using the method defined in the
- * Options class
- *
- * @return boolean should repair pouches
- */
- public boolean shouldRepairPouches() {
- int degradeable = inventory.getCount(Pouch.ALL_DEGRADEABLE);
- int degraded = inventory.getCount(Pouch.ALL_DEGRADED);
- switch (Options.pouchRepair) {
- case ONE:
- return degraded > 0;
- case TWO:
- return degraded > 1 || degradeable < 2;
- case ALL:
- return degradeable == degraded;
- case NEVER:
- return false;
- default:
- return degraded > 1 || degradeable < 2;
- }
- }
- /**
- * Tries to open the bank
- *
- * @return boolean did bank open
- */
- public boolean openBank() {
- if (!alterMeshPath.hasPath())
- alterMeshPath.findPath();
- if (bankMeshPath.hasPath())
- bankMeshPath.clearPath();
- for (byte b = 0; b < 10; b++) {
- if (interfaces.get(PAY_BANK_INTERFACE) != null
- && interfaces.get(PAY_BANK_INTERFACE).isValid())
- payBankCharge();
- if (npcs.getNearest(BANKER_ID) != null) {
- if (bank.isOpen())
- return true;
- npcs.getNearest(BANKER_ID).doAction("Bank");
- sleep(100, 250);
- }
- sleep(1000);
- }
- return false;
- }
- public void payBankCharge() {
- RSInterface pay = interfaces.get(PAY_BANK_INTERFACE);
- if (pay != null && pay.isValid())
- for (String rune : PAY_BANKER_ORDER)
- for (RSComponent c : pay.getComponents())
- if (c != null
- && c.isValid()
- && c.getTooltip() != null
- && c.getTooltip().toLowerCase()
- .contains(rune.toLowerCase()))
- if (inventoryCount(rune) >= 20)
- if (c.doClick()) {
- sleep(1500);
- return;
- }
- log.severe("Unable to pay banker!");
- }
- public int inventoryCount(String name) {
- for (RSItem i : inventory.getCachedItems())
- if (i != null
- && i.getName().toLowerCase().contains(name.toLowerCase()))
- return i.getStackSize();
- return 0;
- }
- /**
- * Deposit all non necessary items.
- */
- public void deposit() {
- if (!openBank())
- return;
- int invBefore = inventory.getCount();
- int pouchesBefore = inventory.getCount(Pouch.ALL);
- bank.depositAll();
- for (byte b = 0; b < 15 && invBefore >= inventory.getCount(); b++)
- sleep(100, 125);
- for (byte b = 0; b < 5 && !inventory.contains(FIRE_RUNE_ID); b++) {
- bank.withdraw(FIRE_RUNE_ID, 0);
- sleep(250, 300);
- }
- int[] pouchIds = {};
- for (PouchType p : pouches.keySet())
- pouchIds = mergeArrays(pouchIds, p.ids);
- for (byte b = 0; b < 5 && inventory.getCount(Pouch.ALL) < pouchesBefore; b++) {
- for (RSItem item : bank.getItems())
- if (item != null)
- for (int id : pouchIds)
- if (item.getID() == id)
- if (bank.withdraw(item.getID(), 1))
- sleep(250, 300);
- }
- // Paint.runsMade++; TODO
- }
- /**
- * Tries to open the bank if the bank is not open, then tries to withdraw
- * the item
- *
- * @param id
- * the item to withdraw
- * @param amount
- * the amount to withdraw, 0 for all
- * @return boolean successfully withdraw
- */
- public boolean withdrawItem(int id, int amount) {
- if (!openBank())
- return false;
- boolean returns = bank.withdraw(id, amount);
- sleep(250, 500);
- return returns;
- }
- /**
- * Withdraws pure essence
- *
- * @return boolean did withdraw item
- */
- public boolean withdrawEss() {
- return withdrawItem(PURE_ESS_ID, 0);
- }
- /**
- * Gets the count of items by the provided id(s) in both the bank and
- * inventory. Includes stack sizes
- *
- * @param id
- * item ids to search
- * @return int number of items in bank and inventory
- */
- public int getCountBankInv(int... id) {
- int count = 0;
- if (bank.isOpen())
- count += bank.getCount(id);
- count += inventory.getCount(true, id);
- return count;
- }
- /**
- * Emptys pouches using the method set in the Options class
- */
- public void emptyPouches() {
- if (game.getCurrentTab() == Game.TAB_INVENTORY)
- updatePouches();
- for (PouchType pType : pouches.keySet()) {
- if (inventory.isFull())
- break;
- if (inventory.containsOneOf(pType.ids)) {
- if (pouches.get(pType).equals(PouchState.Full)) {
- RSItem item = inventory.getItem(pType.ids);
- if (item != null) {
- int invCount = inventory.getCount();
- if (item.doAction("Empty"))
- switch (Options.pouchCheckSystem) {
- case SERVER_MSG:
- for (int i = 0; i < POUCH_TRIES; i++) {
- if (serverMsg != null)
- if (serverMsg
- .contains("pouch has no ess")
- || serverMsg
- .contains("are no essences in your pouch")) {
- pouches.put(pType, PouchState.Empty);
- serverMsg = "";
- break;
- }
- sleep(80, 120);
- }
- break;
- case INVENTORY_STATUS:
- for (int i = 1; i <= POUCH_TRIES; i++)
- if (inventory.getCount() == invCount
- && i != POUCH_TRIES)
- sleep(100, 150);
- else {
- if (!inventory.isFull())
- pouches.put(pType, PouchState.Empty);
- break;
- }
- break;
- }
- }
- }
- }
- }
- }
- /**
- * Fills pouches using the method set in the Options class
- */
- public void fillPouches() {
- if (game.getCurrentTab() == Game.TAB_INVENTORY)
- updatePouches();
- for (PouchType pType : pouches.keySet()) {
- if (!inventory.contains(PURE_ESS_ID))
- break;
- if (inventory.containsOneOf(pType.ids)) {
- if (pouches.get(pType).equals(PouchState.Empty)) {
- RSItem item = inventory.getItem(pType.ids);
- if (item != null) {
- int invCount = inventory.getCount();
- if (item.doAction("Fill"))
- switch (Options.pouchCheckSystem) {
- case SERVER_MSG:
- for (int i = 0; i < POUCH_TRIES; i++) {
- if (serverMsg != null)
- if (serverMsg.contains("pouch is ful")) {
- pouches.put(pType, PouchState.Full);
- serverMsg = "";
- break;
- }
- sleep(80, 120);
- }
- break;
- case INVENTORY_STATUS:
- for (int i = 1; i <= POUCH_TRIES; i++)
- if (inventory.getCount() == invCount
- && i != POUCH_TRIES)
- sleep(100, 150);
- else {
- if (inventory.contains(PURE_ESS_ID))
- pouches.put(pType, PouchState.Full);
- break;
- }
- break;
- }
- }
- }
- }
- }
- }
- /**
- * Rechecks pouches with the inventory's current contents. If a pouch in the
- * list no longer exists it removes it, if there's a pouch in the inventory
- * not in the list it adds it as an empty pouch
- */
- public void updatePouches() {
- for (PouchType pouch : PouchType.values())
- if (inventory.containsOneOf(pouch.ids)) {
- if (!pouches.containsKey(pouch))
- pouches.put(pouch, PouchState.Empty);
- } else if (pouches.containsKey(pouch))
- pouches.remove(pouch);
- }
- public int getRuneCount(boolean cache) {
- int count = 0;
- for (RSItem i : cache ? inventory.getCachedItems() : inventory
- .getItems())
- if (i.getName() != null
- && i.getName().toLowerCase().contains("rune"))
- count += i.getStackSize();
- return count;
- }
- /**
- * Crafts essence at the alter
- */
- public void craftEssence() {
- if (alterMeshPath.hasPath())
- alterMeshPath.clearPath();
- if (!bankMeshPath.hasPath())
- bankMeshPath.findPath();
- RSObject alter = objects.getNearest(ZMI_ALTAR_ID);
- if (!alter.isOnScreen()
- && (!getMyPlayer().isMoving()
- || walking.getDestination() == null || calc
- .distanceBetween(
- alter.getArea().getNearestTile(
- getMyPlayer().getLocation()),
- walking.getDestination()) > 2))
- walking.walkTileMM(alter.getArea().getNearestTile(
- getMyPlayer().getLocation()));
- // int invBefore = inventory.getCount(PURE_ESS_ID);
- // int runesBefore = getRuneCount(false);
- alter.doAction("Craft-rune");
- sleep(1000);
- for (byte b = 0; b < 50
- && (getMyPlayer().getAnimation() == CRAFT_RUNE_ANIM
- || getMyPlayer().isMoving() || walking.getDestination() != null); b++)
- sleep(100, 125);
- // Paint.essUsed += invBefore - inventory.getCount(PURE_ESS_ID); TODO
- // Paint.runesMade += getRuneCount(false) - runesBefore;
- }
- public boolean onStart() {
- if (game.getCurrentTab() != Game.TAB_MAGIC)
- game.openTab(Game.TAB_MAGIC);
- Options.onLunars = magic.getInterface() != null
- && magic.getInterface().getIndex() == Magic.Book.LUNAR
- .getInterfaceID();
- Options.tryOuraniaTeleport = (skills.getCurrentLevel(Skills.MAGIC) >= 71 && Options.onLunars);
- pathTypeCurrent = Options.pathType;
- // Set up path:
- if (Options.pathType.equals(OptionsClass.Path.Danger))
- alterMeshPath = new MeshPath(walking, calc, players, DANGER_MESH);
- else
- alterMeshPath = new MeshPath(walking, calc, players, SAFE_MESH);
- bankMeshPath = alterMeshPath.reverse();
- // Set up the pouches:
- updatePouches();
- RSItem wep = equipment.getItem(Equipment.WEAPON);
- if (wep != null) {
- Options.hasAirStaff = (wep.getName().toLowerCase()
- .contains("staff") && wep.getName().toLowerCase()
- .contains("air"));
- Options.hasEarthStaff = (wep.getName().toLowerCase()
- .contains("staff") && (wep.getName().toLowerCase()
- .contains("earth")
- || wep.getName().toLowerCase().contains("mud") || wep
- .getName().toLowerCase().contains("lava")));
- }
- new DataLoader(this);
- // optimal alt
- camera.setPitch(random(0, 10));
- log.info("Script initiation successful!");
- log.info("--Setup--");
- log.info("Air staff: " + (Options.hasAirStaff ? "yes" : "no"));
- log.info("Earth staff: " + (Options.hasEarthStaff ? "yes" : "no"));
- log.info("Walking range: " + Options.walkingDistance.toString());
- log.info("Pouch method: "
- + PaintFormatter.properCaseAll(Options.pouchCheckSystem.name()
- .replaceAll("_", " ")));
- log.info("Pouch repair system: "
- + PaintFormatter.properCaseAll(Options.pouchRepair.name()
- .replaceAll("_", " ")));
- log.info("Walking style: "
- + PaintFormatter.properCaseAll(Options.pathType.name()));
- log.info("Recharge Energy: "
- + (Options.chargeEnergy ? "True" : "False"));
- log.info("Try Ourania Teleport: "
- + (Options.tryOuraniaTeleport ? "True" : "False"));
- return true;
- }
- public boolean isResting() {
- int anim = getMyPlayer().getAnimation();
- return (anim == 12108 || anim == 2033 || anim == 2716 || anim == 11786 || anim == 5713);
- }
- public void rest() {
- for (int d = 0; d < 5; d++) {
- interfaces.getComponent(walking.INTERFACE_RUN_ORB, 1).doAction(
- "Rest");
- mouse.moveSlightly();
- sleep(random(400, 600));
- int anim = players.getMyPlayer().getAnimation();
- if (anim == 12108 || anim == 2033 || anim == 2716 || anim == 11786
- || anim == 5713) {
- break;
- }
- }
- }
- public int loop() {
- mouse.setSpeed(random(4, 6));
- if (!walking.isRunEnabled() && walking.getEnergy() > 50 && !isResting())
- walking.setRun(true);
- try {
- currentState = getState();
- switch (currentState) {
- case LADDER_DOWN:
- if (objects.getNearest(LADDER_ID).isOnScreen())
- if (objects.getNearest(LADDER_ID).doAction("Climb"))
- sleep(500, 750);
- break;
- case OURANIA_TELEPORT:
- if (magic.castSpell(Magic.SPELL_OURANIA_TELEPORT))
- for (byte b = 0; b < 30 && !calc.tileOnMap(OURANIA_PATH[0]); b++)
- sleep(100, 125);
- sleep(500, 750);
- break;
- case TRAVERSE_OURANIA:
- RSTilePath tPath = walking.newTilePath(OURANIA_PATH).randomize(
- 2, 2);
- for (byte b = 0; b < 300 && tPath.isValid()
- && (objects.getNearest(LADDER_ID) != null) ? !objects
- .getNearest(LADDER_ID).isOnScreen() : true; b++) {
- tPath.traverse();
- sleep(95, 105);
- }
- break;
- case CHARGE_ENERGY:
- if (!isResting())
- rest();
- if (isResting())
- while (walking.getEnergy() < 100 && isResting()
- && isActive())
- sleep(200);
- break;
- case NEAR_BANK:
- RSNPC banker = npcs.getNearest(BANKER_ID);
- if (banker != null)
- if (!banker.isOnScreen()) {
- RSTile loc = banker.getLocation();
- if (calc.tileOnMap(loc)) {
- walking.walkTileMM(loc);
- for (byte b = 0; b < 22 && !banker.isOnScreen(); b++)
- sleep(100, 115);
- }
- }
- break;
- case BANK_DEPOSIT:
- deposit();
- break;
- case BANK_WITHDRAW:
- withdrawEss();
- break;
- case CRAFT_RUNES:
- craftEssence();
- break;
- case EMPTY_POUCHES:
- emptyPouches();
- break;
- case EAT_FOOD:
- if (!inventory.containsOneOf(food)) {
- openBank();
- for (int id : food)
- if (bank.getCount(id) > 0)
- if (bank.withdraw(id, 1))
- break;
- }
- if (bank.isOpen())
- bank.close();
- if (inventory.containsOneOf(food)) {
- RSItem foodI = inventory.getItem(food);
- if (foodI != null)
- foodI.doAction("Eat");
- }
- break;
- case FILL_POUCHES:
- fillPouches();
- break;
- case NPC_CONTACT:
- npcContact.main();
- break;
- case TRAVERSE_BANK:
- if (!bankMeshPath.hasPath())
- bankMeshPath.findPath(MeshPath.MeshPathType.FULL);
- if (Options.pathType.equals(OptionsClass.Path.Safe)
- && (bankMeshPath.getNearestByPath() == null || !bankMeshPath
- .getNearestByPath().equals(
- bankMeshPath.getEnd())))
- if (objects.getNearest(CRACK_OUT) != null
- && objects.getNearest(CRACK_OUT).isOnScreen()
- && objects.getNearest(CRACK_OUT).doAction(
- "Squeeze-through")) {
- sleep(500);
- for (byte b = 0; b < 20
- && getMyPlayer().getAnimation() != -1; b++)
- sleep(100, 110);
- break;
- }
- bankMeshPath.traverse();
- break;
- case TRAVERSE_ALTER:
- if (!alterMeshPath.hasPath())
- alterMeshPath.findPath(MeshPath.MeshPathType.ALL_CENTER);
- if ((calc.pathLengthTo(alterDet, true) > 25 || calc
- .pathLengthTo(alterDet, true) < 0)
- && Options.pathType.equals(OptionsClass.Path.Safe))
- if (objects.getNearest(CRACK_IN) != null)
- if (objects.getNearest(CRACK_IN).isOnScreen()
- && objects.getNearest(CRACK_IN).doAction(
- "Squeeze-through")) {
- sleep(500);
- for (byte b = 0; b < 20
- && getMyPlayer().getAnimation() != -1; b++)
- sleep(100, 110);
- break;
- }
- alterMeshPath.traverse();
- break;
- }
- } catch (Exception e) {
- logError(e);
- }
- return random(50, 100);
- }
- public void onFinish() {
- FailSafe();
- // Paint.paintMenu.saveProggie();
- }
- /**
- * Logs an exception to the Logger and to the error cache
- *
- * @param e
- * as the Exception to log
- */
- public void logError(Exception e) {
- String s = e.getMessage();
- log.severe(s);
- for (StackTraceElement ele : e.getStackTrace()) {
- s += "\n" + ele.toString();
- log.severe(ele.toString());
- }
- }
- /**
- * {@inheritDoc}
- */
- public void onRepaint(Graphics g1) {
- Graphics2D g = (Graphics2D) g1;
- try {
- // MeshPaths
- alterMeshPath.paintAll(g);
- if (bankMeshPath.hasPath()) {
- bankMeshPath.paintBlockPath(g);
- bankMeshPath.paintSmoothPath(g);
- }
- } catch (NullPointerException e) {
- logError(e);
- }
- }
- /**
- * The different states the NPC contact process can be in
- *
- * @author Equinox_
- *
- */
- enum npcContactState {
- CAST, SCROLL, SELECT, WAIT, CONTINUE, MENU, WITHDRAW_ASTRAL, WITHDRAW_COSMIC, WITHDRAW_AIR, OUT_OF_RUNES
- }
- /**
- * A class to contact people using NPC contact
- *
- * @author Equinox_
- *
- */
- class NPCContact {
- public npcContactState currentState = npcContactState.WAIT;
- private final int MAIN_FRAME = 88;
- private final int SCROLL_BAR = 20;
- private final int SCROLL_BAR_DOWN = 0;
- private final int VISIBLE_NPCS_CONTAINER = 21;
- private final int NPCS_CONTAINER = 22;
- private final int NPC_CONTACT_ANIM = 4413;
- private final int NPC_TO_SELECT = 14;
- private final String[] MENU_ITEM = { "repair", "pouch" };
- /**
- * Gets the current npcContactState
- *
- * @return the current npcContactState
- */
- private npcContactState getState() {
- if (interfaces.get(MAIN_FRAME).isValid()) {
- if (interfaces.get(MAIN_FRAME).getComponent(NPCS_CONTAINER)
- .isValid()) {
- Point npcPoint = interfaces.get(MAIN_FRAME)
- .getComponent(NPCS_CONTAINER)
- .getComponent(NPC_TO_SELECT).getCenter();
- Rectangle visible = interfaces.get(MAIN_FRAME)
- .getComponent(VISIBLE_NPCS_CONTAINER).getArea();
- if (!visible.contains(npcPoint))
- return npcContactState.SCROLL;
- else
- return npcContactState.SELECT;
- }
- }
- if (interfaces.canContinue())
- return npcContactState.CONTINUE;
- if (getComponent(MENU_ITEM) != null)
- return npcContactState.MENU;
- if (!interfaces.canContinue()
- && getMyPlayer().getAnimation() != NPC_CONTACT_ANIM
- && getComponent(MENU_ITEM) == null
- && getComponent("lease wai") == null) {
- if (!inventory.contains(ASTRAL_RUNE_ID))
- return npcContactState.WITHDRAW_ASTRAL;
- if (!inventory.contains(COSMIC_RUNE_ID))
- return npcContactState.WITHDRAW_COSMIC;
- if (inventory.getCount(true, AIR_RUNE_ID) < 2
- && !Options.hasAirStaff)
- return npcContactState.WITHDRAW_AIR;
- return npcContactState.CAST;
- }
- return npcContactState.WAIT;
- }
- /**
- * Finds a RSComponent with the specified string
- *
- * @param s
- * The String to search
- * @return RSComponent with string, otherwise null
- */
- private RSComponent getComponent(String... s) {
- RSInterface[] valid = interfaces.getAll();
- for (RSInterface iface : valid) {
- if (iface.getIndex() != 137) {
- int len = iface.getChildCount();
- for (int i = 0; i < len; i++) {
- RSComponent child = iface.getComponent(i);
- boolean b = (child.isValid()
- && child.getAbsoluteX() > 10 && child
- .getAbsoluteY() > 300);
- for (String sub : s)
- if (!child.getText().toLowerCase()
- .contains(sub.toLowerCase()))
- b = false;
- if (b)
- return child;
- }
- }
- }
- return null;
- }
- /**
- * Checks if the inventory or bank contains the specified item
- *
- * @param id
- * the item id
- * @return <tt>true</tt> if the bank or inventory contains the item,
- * otherwise, <tt>false</tt>
- */
- boolean invBank(int id) {
- return bank.getCount(id) > 0 || inventory.containsOneOf(id);
- }
- /**
- * Gets the count of a specified item in the inventory and bank
- *
- * @param int itemId
- * @return the item count
- */
- int invBankCount(int id) {
- return bank.getCount(id) + inventory.getCount(true, id);
- }
- /**
- * The main loop. Call this to do the next action for the contact
- * process.
- */
- public void main() {
- switch (currentState = getState()) {
- case WITHDRAW_ASTRAL:
- withdrawItem(ASTRAL_RUNE_ID, 1);
- if (!invBank(ASTRAL_RUNE_ID))
- removePouches();
- break;
- case WITHDRAW_COSMIC:
- withdrawItem(COSMIC_RUNE_ID, 1);
- if (!invBank(COSMIC_RUNE_ID))
- removePouches();
- break;
- case WITHDRAW_AIR:
- if (!inventory.contains(AIR_RUNE_ID)) {
- if (inventory.isFull())
- bank.deposit(PURE_ESS_ID, 1);
- withdrawItem(AIR_RUNE_ID, 1);
- }
- withdrawItem(AIR_RUNE_ID, 1);
- if (invBankCount(AIR_RUNE_ID) < 2)
- removePouches();
- break;
- case CAST:
- for (byte b = 0; b < 5; b++)
- if (bank.isOpen()) {
- bank.close();
- for (byte b2 = 0; b2 < 25; b2++)
- if (bank.isOpen())
- break;
- else
- sleep(95, 115);
- }
- if (game.getCurrentTab() != Game.TAB_MAGIC)
- game.openTab(Game.TAB_MAGIC);
- sleep(500, 1250);
- magic.castSpell(Magic.SPELL_NPC_CONTACT);
- sleep(750, 1250);
- break;
- case SCROLL:
- // Scroll
- RSComponent bar = interfaces.get(MAIN_FRAME)
- .getComponent(SCROLL_BAR).getComponent(SCROLL_BAR_DOWN);
- Point p = bar.getCenter();
- p.y = bar.getAbsoluteY() + bar.getHeight() - 5;
- mouse.click(p, true);
- break;
- case SELECT:
- interfaces.get(MAIN_FRAME).getComponent(NPCS_CONTAINER)
- .getComponent(NPC_TO_SELECT).doClick();
- break;
- case WAIT:
- break;
- case CONTINUE:
- if (interfaces.canContinue())
- interfaces.clickContinue();
- break;
- case MENU:
- if (getComponent(MENU_ITEM) != null)
- getComponent(MENU_ITEM).doClick();
- break;
- }
- sleep(900, 1200);
- }
- public void removePouches() {
- if (!openBank())
- return;
- // not enough runes, bank pouches:
- for (int id : Pouch.ALL_DEGRADED)
- if (inventory.contains(id)) {
- if (bank.deposit(id, 1))
- sleep(500, 600);
- }
- updatePouches();
- }
- }
- /**
- * Loads script data as the actual script runs. Useful for images that are
- * non-essential.
- *
- * @author Equinox_
- *
- */
- public static class DataLoader extends Thread {
- EquinoxZMICrafter crafter;
- public DataLoader(EquinoxZMICrafter crafter) {
- super("Data Loader");
- this.crafter = crafter;
- this.start();
- }
- // Item Info
- public void checkGE() {
- long before = System.currentTimeMillis();
- GEItem item = crafter.getGE().lookup(PURE_ESS_ID);
- if (item != null) {
- // crafter.Paint.essPrice = getItemPrice(item);
- crafter.log("Price of " + item.getName() + ": "
- + getItemPrice(item));
- crafter.log("Loaded essence information in "
- + PaintFormatter.getFormattedTime(System
- .currentTimeMillis() - before));
- }
- }
- public void run() {
- checkGE();
- try {
- if (JOptionPane.NO_OPTION == JOptionPane.showConfirmDialog(
- null, "Would you like to load some images?",
- "Equinox_ Data Loader", JOptionPane.YES_NO_OPTION))
- throw new Exception();
- /*
- * long before = System.currentTimeMillis();
- * crafter.Paint.putImage( "homeicon", ImageIO.read(new
- * URL(crafter.baseURL + "/images/houseIcon.png")));
- * crafter.log("Loaded home image in " +
- * PaintFormatter.getFormattedTime(System .currentTimeMillis() -
- * before));
- *
- * before = System.currentTimeMillis(); crafter.Paint .putImage(
- * "rcicon", ImageIO.read(new URL(
- * "http://www.runescape.com/img/hiscores/skill_icon_Runecrafting1.gif"
- * ))); crafter.log("Loaded runecrafting image in " +
- * PaintFormatter.getFormattedTime(System .currentTimeMillis() -
- * before));
- *
- * before = System.currentTimeMillis(); crafter.Paint.putImage(
- * "toolsicon", ImageIO.read(new URL(crafter.baseURL +
- * "/images/tools.png"))); crafter.log("Loaded tools icon in " +
- * PaintFormatter.getFormattedTime(System .currentTimeMillis() -
- * before));
- */
- } catch (Exception e) {
- crafter.log("Failed to load images");
- }
- }
- }
- /**
- * Gets the grandExchange singleton for reference by other classes msg
- *
- * @return GrandExchange reference
- */
- public GrandExchange getGE() {
- return grandExchange;
- }
- /**
- * gets the item price based on class. Works with all versions of
- * grandExchange.class
- *
- * @param item
- * the GEItem to get the price from
- * @return int the price
- *
- * @author Equinox_
- */
- public static int getItemPrice(GEItem item) {
- for (Method m : item.getClass().getMethods())
- if (m.getName().equals("getGuidePrice")
- || m.getName().equals("getMinPrice"))
- try {
- return (Integer) (m.invoke(item));
- } catch (Exception e) {
- }
- return 0;
- }
- public void FailSafe() {
- log.info("FailSafe Activated!");
- // Set up path:
- if (pathTypeCurrent.equals(OptionsClass.Path.Danger))
- alterMeshPath = new MeshPath(walking, calc, players, DANGER_MESH);
- else
- alterMeshPath = new MeshPath(walking, calc, players, SAFE_MESH);
- bankMeshPath = alterMeshPath.reverse();
- if (!bankMeshPath.hasPath())
- bankMeshPath.findPath(MeshPath.MeshPathType.WEIGHT_CENTER);
- while (bankMeshPath.isValid()
- && calc.distanceTo(bankMeshPath.getEnd()) >= 2) {
- if (Options.pathType.equals(OptionsClass.Path.Safe)
- && (bankMeshPath.getNearestByPath() == null || !bankMeshPath
- .getNearestByPath().equals(bankMeshPath.getEnd())))
- if (objects.getNearest(CRACK_OUT) != null
- && objects.getNearest(CRACK_OUT).isOnScreen()
- && objects.getNearest(CRACK_OUT).doAction(
- "Squeeze-through")) {
- sleep(500);
- for (byte b = 0; b < 20
- && getMyPlayer().getAnimation() != -1; b++)
- sleep(100);
- continue;
- }
- bankMeshPath.traverse();
- }
- log.info("Failsafe Complete");
- }
- /**
- * A class that will take a specified mesh, generate a path through it, then
- * round the path off with Bezier curves.
- *
- * @author Equinox_
- *
- */
- static class MeshPath {
- public static final Color BLOCK_PATH_COLOR = new Color(0f, 1f, 0f, 1f);
- public static final Color MESH_BORDER = new Color(0.75f, 0.75f, 0.75f,
- 0.75f);
- public static final Color MESH_FILL = new Color(0.5f, 0.5f, 0.5f, 0.75f);
- public static final Color SMOOTH_PATH_COLOR = new Color(0f, 0f, 1f, 1f);
- private List<RSTile> blockPath = new ArrayList<RSTile>();
- private final Calculations calc;
- private boolean end;
- private List<RSTile[]> mesh = new ArrayList<RSTile[]>();
- private final Players players;
- private List<RSTile> smoothPath = new ArrayList<RSTile>();
- private final Walking walking;
- private final Range walkingDistance;
- /**
- * Creates a mesh path with the provided walking methods, calculation
- * methods, player methods, and walking range.
- *
- * @param walking
- * @param calc
- * @param players
- */
- public MeshPath(Walking walking, Calculations calc, Players players) {
- this(walking, calc, players, new Range(7, 9));
- }
- /**
- * Creates a mesh path with the provided walking methods, calculation
- * methods, player methods, and walking range.
- *
- * @param walking
- * @param calc
- * @param players
- * @param walkingDistance
- */
- public MeshPath(Walking walking, Calculations calc, Players players,
- Range walkingDistance) {
- this.walking = walking;
- this.calc = calc;
- this.players = players;
- this.walkingDistance = walkingDistance;
- }
- /**
- * Creates a mesh path with the provided walking methods, calculation
- * methods, player methods, and mesh.
- *
- * @param walking
- * @param calc
- * @param players
- * @param mesh
- */
- public MeshPath(Walking walking, Calculations calc, Players players,
- RSTile[][] mesh) {
- this(walking, calc, players);
- setMesh(mesh);
- }
- /**
- * Creates a mesh path with the provided walking methods, calculation
- * methods, player methods, walking range, and mesh.
- *
- * @param walking
- * @param calc
- * @param players
- * @param walkingDistance
- * @param mesh
- */
- public MeshPath(Walking walking, Calculations calc, Players players,
- RSTile[][] mesh, Range walkingDistance) {
- this(walking, calc, players, walkingDistance);
- setMesh(mesh);
- }
- /**
- * Adds a line to the mesh with the given tiles
- *
- * @param tiles
- * the RSTiles making up the line
- */
- public void addLine(RSTile... tiles) {
- if (mesh.size() == 0) {
- mesh.add(tiles);
- return;
- }
- RSTile first = tiles[0];
- RSTile last = tiles[tiles.length - 1];
- RSTile[] oLine = mesh.get(mesh.size() - 1);
- RSTile oFirst = oLine[0];
- RSTile oLast = oLine[oLine.length - 1];
- double straight = calc.distanceBetween(first, oFirst)
- + calc.distanceBetween(last, oLast);
- double crossed = calc.distanceBetween(first, oLast)
- + calc.distanceBetween(last, oFirst);
- if (straight > crossed) {
- mesh.add(tiles);
- return;
- } else {
- RSTile[] reversed = new RSTile[tiles.length];
- for (int i = 0; i < tiles.length; i++)
- reversed[i] = tiles[tiles.length - 1 - i];
- mesh.add(reversed);
- return;
- }
- }
- /**
- * Adds all the lines of a specified mesh to the current mesh.
- *
- * @param mesh
- * as RSTile[][]
- */
- public void addMesh(RSTile[][] mesh) {
- for (RSTile[] line : mesh)
- addLine(line);
- }
- /**
- * Clears the current path and all refined versions of it.
- */
- public void clearPath() {
- blockPath.clear();
- smoothPath.clear();
- }
- /**
- * Finds a path between the beginning and end of the mesh using the
- * WEIGHT_CENTER placement type, then sets the current path to the found
- * path
- */
- public void findPath() {
- findPath(MeshPathType.WEIGHT_CENTER);
- }
- /**
- * Finds a path between the beginning and end of the mesh using the
- * provided placement type, then sets the current path to the found path
- *
- * @param placement
- * as MeshPathType
- */
- public void findPath(MeshPathType placement) {
- findPath(placement, 0, mesh.size() - 1);
- }
- /**
- * Finds a path between the start index and the end index using the
- * provided placement type, then sets the current path to the found path
- *
- * @param placement
- * as MeshPathType
- * @param start
- * index
- * @param end
- * index
- */
- public void findPath(MeshPathType placement, int start, int end) {
- blockPath.clear();
- for (int i = start; i <= end; i++)
- blockPath.add(getTileOnLine(placement, mesh.get(i)));
- smoothPath = smoothPath(blockPath);
- }
- /**
- * Gets the end tile of this path.
- *
- * @return The end <code>RSTile</code>.
- */
- public RSTile getEnd() {
- if (smoothPath.size() > 0)
- return smoothPath.get(smoothPath.size() - 1);
- else
- return null;
- }
- /**
- * Gets the next immediately available vertex in this path.
- *
- * @return The next walkable <code>RSTile</code>.
- */
- public RSTile getNext() {
- if (smoothPath.size() > 0)
- for (int i = smoothPath.size() - 1; i >= 0; i--)
- if (calc.tileOnMap(smoothPath.get(i)))
- return smoothPath.get(i);
- return null;
- }
- /**
- * Gets the start tile of this path.
- *
- * @return The start <code>RSTile</code>.
- */
- public RSTile getStart() {
- if (smoothPath.size() > 0)
- return smoothPath.get(0);
- else
- return null;
- }
- /**
- * Gets the nearest tile in the mesh to the provided RSTile
- *
- * @param tile
- * the RSTile to use
- * @return RSTile tile in mesh
- */
- public RSTile getTileInMesh(RSTile tile) {
- if (inMesh(tile))
- return tile;
- double bestDist = Double.MAX_VALUE;
- RSTile nearest = null;
- if (mesh.size() > 1) {
- for (int i = 1; i < mesh.size(); i++) {
- RSTile[] lineA = mesh.get(i - 1);
- RSTile[] lineB = mesh.get(i);
- if (lineA != null)
- for (RSTile t : lineA) {
- double dist = calc.distanceBetween(t, tile);
- if (dist < bestDist) {
- nearest = new RSTile(t.getX(), t.getY());
- bestDist = Double.valueOf(dist);
- }
- }
- if (lineB != null)
- for (RSTile t : lineB) {
- double dist = calc.distanceBetween(t, tile);
- if (dist < bestDist) {
- nearest = new RSTile(t.getX(), t.getY());
- bestDist = Double.valueOf(dist);
- }
- }
- }
- }
- return nearest;
- }
- /**
- * Gets a tile on the provided line using the provided method
- *
- * @param placement
- * as MeshPathType
- * @param line
- * as RSTile...
- * @return RSTile tile on line
- */
- public RSTile getTileOnLine(MeshPathType placement, RSTile... line) {
- List<RSTile> tiles = getTilesOnLines(line);
- int index = 0;
- switch (placement) {
- case ALL_CENTER:
- index = new Range((int) (tiles.size() * .25d),
- (int) (tiles.size() * 0.75d))
- .randomLinearDistribution();
- break;
- case FULL:
- index = new Range(0, tiles.size()).randomLinearDistribution();
- break;
- case WEIGHT_CENTER:
- index = new Range(0, tiles.size()).randomNormalDistribution();
- break;
- }
- if (index < 0)
- index = 0;
- if (index >= tiles.size())
- index = tiles.size() - 1;
- if (tiles.size() > 0)
- return tiles.get(index);
- else
- return null;
- }
- /**
- * Gets a tile on the provided line using the ALL_CENTER method
- *
- * @param line
- * as RSTile...
- * @return RSTile tile on line
- */
- public RSTile getTileOnLine(RSTile... line) {
- return getTileOnLine(MeshPathType.WEIGHT_CENTER, line);
- }
- /**
- * Returns an array containing all of the vertices in this path.
- *
- * @return an array containing all of the vertices in this path.
- */
- public RSTile[] getTilePath() {
- RSTile[] tiles = new RSTile[smoothPath.size()];
- for (int i = 0; i < tiles.length; i++)
- tiles[i] = new RSTile(smoothPath.get(i).getX(), smoothPath.get(
- i).getY());
- return tiles;
- }
- public List<RSTile> getTilesOnLine(RSTile a, RSTile b) {
- List<RSTile> sublineTiles = new ArrayList<RSTile>();
- int deltaX = b.getX() - a.getX();
- int deltaY = b.getY() - a.getY();
- double dist = calc.distanceBetween(a, b);
- if (dist == 0)
- dist = 1;
- double eX = deltaX / dist, eY = deltaY / dist;
- for (int i = 0; i <= dist; i++)
- sublineTiles.add(new RSTile(a.getX() + (int) (eX * i), a.getY()
- + (int) (eY * i)));
- return sublineTiles;
- }
- /**
- * Gets all the tiles on the provided line
- *
- * @param line
- * as RSTile...
- * @return List<RSTile> tiles on line
- */
- public List<RSTile> getTilesOnLines(RSTile... line) {
- List<RSTile> sublineTiles = new ArrayList<RSTile>();
- if (line.length == 1)
- sublineTiles.add(line[0]);
- else
- for (int i = 1; i < line.length; i++) {
- RSTile a = line[i - 1];
- RSTile b = line[i];
- sublineTiles.addAll(getTilesOnLine(a, b));
- }
- return sublineTiles;
- }
- /**
- * Checks if we have a path
- *
- * @return boolean has path
- */
- public boolean hasPath() {
- return smoothPath.size() > 0;
- }
- /**
- * Checks to see if the provided RSTile is inside the mesh
- *
- * @param tile
- * the RSTile to check
- * @return boolean is in mesh
- */
- public boolean inMesh(RSTile tile) {
- if (mesh.size() > 1) {
- for (int i = 1; i < mesh.size(); i++) {
- RSTile[] lineA = mesh.get(i - 1);
- RSTile[] lineB = mesh.get(i);
- Polygon poly = new Polygon();
- if (lineA != null)
- for (RSTile t : lineA)
- poly.addPoint(t.getX(), t.getY());
- if (lineB != null)
- for (RSTile t : lineB)
- poly.addPoint(t.getX(), t.getY());
- if (poly.npoints >= 2)
- if (poly.contains(new Point(tile.getX(), tile.getY())))
- return true;
- }
- }
- return false;
- }
- /**
- * Checks whether or not this path can be traversed by the player. This
- * will be the case provided that the player near to one of its
- * vertices, but not already standing on the end vertex.
- *
- * @return <tt>true</tt> if the player can walk along this path;
- * otherwise <tt>false</tt>.
- */
- public boolean isValid() {
- return smoothPath.size() > 0 && getNext() != null
- && !players.getMyPlayer().getLocation().equals(getEnd());
- }
- /**
- * Gets the number of lines in the mesh
- *
- * @return int size
- */
- public int meshSize() {
- return mesh.size();
- }
- /**
- * Paints the mesh, and all versions of the current path to the minimap
- * using the provided graphics object
- *
- * @param g
- * as Graphics2D
- */
- public void paintAll(Graphics2D g) {
- paintMesh(g);
- paintBlockPath(g);
- paintSmoothPath(g);
- }
- /**
- * Paints the current un-smoothed path to the minimap using the provided
- * graphics object
- *
- * @param g
- * as Graphics2D
- */
- public void paintBlockPath(Graphics2D g) {
- if (blockPath.size() > 1) {
- g.setColor(BLOCK_PATH_COLOR);
- Point a = null;
- for (RSTile t : blockPath) {
- Point b = calc.tileToMinimap(t);
- if (b.x > 0 && b.y > 0)
- g.fillOval(b.x - 2, b.y - 2, 5, 5);
- if (a != null && a.x > 0 && a.y > 0 && b.x > 0 && b.y > 0)
- g.drawLine(a.x, a.y, b.x, b.y);
- a = b;
- }
- }
- }
- /**
- * Paints the mesh to the provided graphics context in the minimap
- *
- * @param g
- * as Graphics2D
- */
- public void paintMesh(Graphics2D g) {
- if (mesh.size() > 1) {
- Point[] oldLine = null;
- for (int i = 0; i < mesh.size(); i++) {
- RSTile[] lineB = mesh.get(i);
- Point[] thisLine = new Point[lineB.length];
- Polygon poly = new Polygon();
- boolean onMap = true;
- for (int tile = 0; tile < thisLine.length; tile++) {
- Point p = calc.tileToMinimap(lineB[tile]);
- thisLine[tile] = p;
- poly.addPoint(p.x, p.y);
- if (p.x == -1 || p.y == -1)
- onMap = false;
- }
- if (oldLine != null) {
- for (Point p : oldLine) {
- poly.addPoint(p.x, p.y);
- if (p.x == -1 || p.y == -1)
- onMap = false;
- }
- if (poly.npoints >= 2 && onMap) {
- g.setColor(MESH_BORDER);
- g.draw(poly);
- g.setColor(MESH_FILL);
- g.fill(poly);
- }
- }
- oldLine = thisLine;
- }
- }
- }
- /**
- * Paints the smoothed version of the current path to the minimap using
- * the provided graphics object
- *
- * @param g
- * as Graphics2D
- */
- public void paintSmoothPath(Graphics2D g) {
- if (smoothPath.size() > 1) {
- g.setColor(SMOOTH_PATH_COLOR);
- Point a = null;
- for (RSTile t : smoothPath) {
- Point b = calc.tileToMinimap(t);
- if (b.x > 0 && b.y > 0)
- g.fillOval(b.x - 2, b.y - 2, 5, 5);
- if (a != null && a.x > 0 && a.y > 0 && b.x > 0 && b.y > 0)
- g.drawLine(a.x, a.y, b.x, b.y);
- a = b;
- }
- }
- }
- /**
- * Reverses this path.
- *
- * @return This path.
- */
- public MeshPath reverse() {
- MeshPath m = new MeshPath(walking, calc, players);
- for (int i = mesh.size() - 1; i >= 0; i--) {
- m.addLine(blockPath.get(i));
- }
- return m;
- }
- /**
- * Sets the current mesh to the provided mesh
- *
- * @param mesh
- * as RSTile[][]
- */
- public void setMesh(RSTile[][] mesh) {
- this.mesh.clear();
- addMesh(mesh);
- }
- /**
- * Smoothes the provided List of RSTiles using Bezier curves. Will
- * return a path with 4 times as many vertices
- *
- * @param path
- * as List
- * @return List<RSTile> smoothed path
- */
- public List<RSTile> smoothPath(List<RSTile> path) {
- List<RSTile> smoothed = new ArrayList<RSTile>();
- if (path.size() >= 3) {
- for (int i = 0; i < path.size(); i++) {
- if (i + 2 < path.size()) {
- RSTile tile1 = path.get(i);
- RSTile tile2 = path.get(i + 1);
- RSTile tile3 = path.get(i + 2);
- if (i == 0)
- smoothed.add(tile1);
- double x2, y2;
- double t = 0.5d;
- // use Berstein polynomials
- x2 = (tile1.getX() + t
- * (-tile1.getX() * 3 + t
- * (3 * tile1.getX() - tile1.getX() * t)))
- + t
- * (3 * tile2.getX() + t
- * (-6 * tile2.getX() + tile2.getX() * 3
- * t))
- + t
- * t
- * (tile2.getX() * 3 - tile2.getX() * 3 * t)
- + tile3.getX() * t * t * t;
- y2 = (tile1.getY() + t
- * (-tile1.getY() * 3 + t
- * (3 * tile1.getY() - tile1.getY() * t)))
- + t
- * (3 * tile2.getY() + t
- * (-6 * tile2.getY() + tile2.getY() * 3
- * t))
- + t
- * t
- * (tile2.getY() * 3 - tile2.getY() * 3 * t)
- + tile3.getY() * t * t * t;
- smoothed.add(getTileInMesh(new RSTile((int) x2,
- (int) y2)));
- } else {
- // Just add the vert.
- smoothed.add(path.get(i));
- }
- }
- }
- return smoothed;
- }
- /**
- * Returns a string representation of this Mesh Path.
- *
- * @return String
- */
- public String toString() {
- return "{ Line count: " + mesh.size() + ", Path size: "
- + (hasPath() ? smoothPath.size() : "No path") + " }";
- }
- /**
- * Takes a step along this path if appropriate. Specifies only
- * TraversalOption.SPACE_ACTIONS.
- *
- * @return <tt>true</tt> if this path is currently valid for the player;
- * otherwise <tt>false</tt>.
- * @see #traverse(EnumSet)
- */
- public boolean traverse() {
- return this.traverse(EnumSet.of(TraversalOption.HANDLE_RUN,
- TraversalOption.SPACE_ACTIONS));
- }
- /**
- * Takes a step along this path if appropriate. If the path cannot be
- * traversed due to the player being too far from its vertices or
- * already at the end vertex, <tt>false</tt> will be returned. In all
- * other cases, <tt>true</tt> will be returned, but an action will not
- * necessarily be performed (based on the given options).
- *
- * @param options
- * Walking style options.
- * @return <tt>true</tt> if this path is currently valid for the player;
- * otherwise <tt>false</tt>.
- */
- public boolean traverse(EnumSet<TraversalOption> options) {
- RSTile next = getNext();
- if (next == null) {
- return false;
- }
- if (next.equals(getEnd())) {
- if (calc.distanceTo(next) <= 1
- || (end && players.getMyPlayer().isMoving())
- || next.equals(walking.getDestination())) {
- return false;
- }
- end = true;
- } else {
- end = false;
- }
- if (options.contains(TraversalOption.HANDLE_RUN)
- && !walking.isRunEnabled() && walking.getEnergy() > 50) {
- walking.setRun(true);
- }
- if (options.contains(TraversalOption.SPACE_ACTIONS)) {
- RSTile dest = walking.getDestination();
- if (dest != null
- && players.getMyPlayer().isMoving()
- && calc.distanceTo(dest) > 5
- && calc.distanceBetween(next, dest) < walkingDistance
- .randomLinearDistribution()) {
- return true;
- }
- }
- return walking.walkTileMM(next, 0, 0);
- }
- /**
- * Gets the nearest tile on the path by distance alone
- *
- * @return RSTile
- */
- public RSTile getNearest() {
- int len = Integer.MAX_VALUE;
- RSTile best = null;
- if (hasPath())
- for (RSTile t : smoothPath)
- if (calc.distanceTo(t) < len) {
- best = t;
- len = calc.distanceTo(t);
- }
- return best;
- }
- /**
- * Gets the nearest tile on the path by the length of a path to it.
- *
- * @return RSTile
- */
- public RSTile getNearestByPath() {
- int len = Integer.MAX_VALUE;
- RSTile best = null;
- if (hasPath())
- for (RSTile t : smoothPath) {
- int pLen = calc.pathLengthTo(t, false);
- if (pLen < len && pLen >= 0) {
- best = t;
- len = pLen;
- }
- }
- return best;
- }
- /**
- * Gets the nearest index on the path to the given tile
- *
- * @param t
- * RSTile
- * @return int
- */
- public int getNearestIndexTo(RSTile t) {
- int len = Integer.MAX_VALUE;
- int bestIndex = -1;
- if (hasPath())
- for (int i = 0; i < smoothPath.size(); i++)
- if (calc.distanceBetween(t, smoothPath.get(i)) < len) {
- bestIndex = i;
- len = calc.distanceTo(t);
- }
- return bestIndex;
- }
- /**
- * Use this enum to define the type of path <br />
- * ALL_Center: All points are near the middle of the lines <br />
- * Full: Points can be anywhere on the line<br />
- * WEIGHT_CENTER: Weighted to center, possibility of being on sides, but
- * lower
- *
- * @author Equinox_
- *
- */
- public enum MeshPathType {
- ALL_CENTER, FULL, WEIGHT_CENTER
- }
- }
- /**
- * Used to format data into more conventional formats
- *
- * @author Equinox_
- *
- */
- static class PaintFormatter {
- /**
- * Converts an array of strings into one string, using commas and 'and' <br>
- * <br>
- * Examples: <br>
- * {"option1"} returns "option1"<br>
- * {"option1","option2"} returns "option1 and option2"<br>
- * {"op1","op2","op3"} returns "op1, op2, and op3"<br>
- * <br>
- *
- * @param list
- * The array of strings making up the list.
- * @return The properly formatted string
- */
- public static String formatList(String[] list) {
- String s = "";
- if (list != null)
- if (list.length == 2) {
- s = list[0] + " and " + list[1];
- } else if (list.length > 2) {
- for (int i = 0; i < list.length - 1; i++)
- s += list[i] + ", ";
- s += "and " + list[list.length - 1];
- } else if (list.length == 1)
- s = list[0];
- return s;
- }
- /**
- * Formats a specified amount into thousands, millions or billions, then
- * adds the proper suffix
- *
- * @param money
- * the amount of money
- * @return the formatted string
- */
- public static String getFormattedMoney(long money) {
- /*
- * String suffix = ""; int t = 1; if (money >= 10000) { t *= 1000;
- * suffix = "K"; } if (money / t > 10000) { t *= 1000; suffix = "M";
- * } if (money / t > 10000) { t *= 1000; suffix = "B"; } return
- * String.valueOf((money / t)) + suffix;
- */
- return new DecimalFormat("###,###,###,###,###,###").format(money);
- }
- /**
- * Converts the milliseconds to DD:HH:MM:SS with the days optional.
- *
- * @param timeMillis
- * the number of milliseconds
- * @return the properly formatted time as a String
- */
- public static String getFormattedTime(final long timeMillis) {
- return getFormattedTime(timeMillis, ":", false);
- }
- /**
- * Formats time to DD:HH:MM:SS:MSMS with days and millis optional
- *
- * @param timeMillis
- * long milliseconds of time
- * @param sep
- * String seperation character
- * @param millisInc
- * boolean include milliseconds
- * @return
- */
- public static String getFormattedTime(final long timeMillis,
- String sep, boolean millisInc) {
- long millis = timeMillis;
- final long days = millis / (24 * 1000 * 60 * 60);
- millis -= days * (24 * 1000 * 60 * 60);
- final long hours = millis / (1000 * 60 * 60);
- millis -= hours * 1000 * 60 * 60;
- final long minutes = millis / (1000 * 60);
- millis -= minutes * 1000 * 60;
- final long _seconds = millis / 1000;
- millis -= _seconds * 1000;
- String dayString = String.valueOf(days);
- String hoursString = String.valueOf(hours);
- String minutesString = String.valueOf(minutes);
- String secondsString = String.valueOf(_seconds);
- if (hours < 10) {
- hoursString = 0 + hoursString;
- }
- if (minutes < 10) {
- minutesString = 0 + minutesString;
- }
- if (_seconds < 10) {
- secondsString = 0 + secondsString;
- }
- String s = "";
- if (days > 0)
- s = dayString + sep;
- s += hoursString + sep + minutesString + sep + secondsString;
- if (millisInc)
- s += sep + String.valueOf(millis);
- return s;
- }
- /**
- * Converts the first letter of every word to uppercase, and the rest
- * lowercase.
- *
- * @param s
- * The input String
- * @return the properly formatted string
- */
- public static String properCaseAll(String s) {
- String[] words = s.split(" ");
- String result = "";
- for (int i = 0; i < words.length; i++) {
- String f = words[i].substring(0, 1).toUpperCase();
- words[i] = f + words[i].substring(1).toLowerCase();
- result += " " + words[i];
- }
- return result.substring(1);
- }
- /**
- * Capitalizes the first letter of every sentence, with every other
- * letter lowercase.
- *
- * @param s
- * The input string
- * @return The properly formatted String
- */
- public static String properCaseFirst(String s) {
- String[] sentences = new String[] { s };
- if (s.contains("."))
- sentences = s.split(".");
- String result = "";
- for (int i = 0; i < sentences.length; i++) {
- String f = sentences[i].substring(0, 1).toUpperCase();
- sentences[i] = f + sentences[i].substring(1).toLowerCase();
- result += " " + sentences[i];
- }
- return result.substring(1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment