import java.util.EnumSet; import java.util.Iterator; /** * Identifies herbs. *

* Requirements: * Start at a bank or Shantay Pass with a sleeping bag in inventory. * The script will try to identify all herbs if no herb parameter is provided. *

* Optional Parameter: * *

* Herbs: * guam * marrentill * tarromin * harralander * ranarr_weed * irit_leaf * avantoe * kwuarm * cadantine * dwarf_weed * torstol *

* * @Author Chomp */ public class AA_HerbIdentifier extends AA_Script { private static final Coordinate COORDINATE_SHANTAY_BANK_CHEST = new Coordinate(58, 731); private static final long IDENTIFY_DELAY = 1210L; // +- based on latency private static final int MAXIMUM_FATIGUE = 99; private Herb herb; private Iterator iterator; private long startTime; private double initialHerblawXp; private long openTimeout; private long depositTimeout; private long withdrawTimeout; private long identifyTimeout; private int herbsIdentified; private int herbsRemaining; private boolean shantayBanking; private boolean idle; public AA_HerbIdentifier(final Extension extension) { super(extension); } @Override public void init(final String parameters) { if (!parameters.isEmpty()) herb = Herb.valueOf(parameters.toUpperCase()); if (!hasInventoryItem(ITEM_ID_SLEEPING_BAG)) { throw new IllegalStateException("Sleeping bag missing from inventory."); } if (herb == null) { iterator = EnumSet.allOf(Herb.class).iterator(); herb = iterator.next(); } if (getLevel(Skill.HERBLAW.getIndex()) < herb.level) { throw new IllegalStateException(String.format("Lvl %d Herblaw required to identify %s", herb.level, getItemNameId(herb.id))); } shantayBanking = distanceTo(COORDINATE_SHANTAY_BANK_CHEST.getX(), COORDINATE_SHANTAY_BANK_CHEST.getY()) < 10; initialHerblawXp = getAccurateXpForLevel(Skill.HERBLAW.getIndex()); startTime = System.currentTimeMillis(); } @Override public int main() { if (idle) { return idle(); } if (getFatigue() >= MAXIMUM_FATIGUE) { return sleep(); } if (System.currentTimeMillis() <= identifyTimeout) { return 0; } if (getInventoryCount() == 1 || getInventoryId(1) != herb.id) { return bank(); } bot.displayMessage("@gre@Identifying ..."); useItem(1); identifyTimeout = System.currentTimeMillis() + TIMEOUT_TWO_SECONDS; return 0; } @Override public void onServerMessage(final String message) { if (message.startsWith("herb", 5)) { herbsIdentified++; if (herbsRemaining > 0) { herbsRemaining--; } identifyTimeout = System.currentTimeMillis() + IDENTIFY_DELAY; } else if (message.endsWith("men.") || message.endsWith("you.")) { openTimeout = System.currentTimeMillis() + TIMEOUT_FIVE_SECONDS; } else if (message.endsWith("area")) { if (!shantayBanking) { return; } idle = true; } else { super.onServerMessage(message); } } private int idle() { if (getX() == COORDINATE_SHANTAY_BANK_CHEST.getX() + 2 && getY() == COORDINATE_SHANTAY_BANK_CHEST.getY()) { idle = false; return 0; } walkTo(COORDINATE_SHANTAY_BANK_CHEST.getX() + 2, COORDINATE_SHANTAY_BANK_CHEST.getY()); return SLEEP_ONE_TICK; } private int bank() { if (!isBanking()) { if (shantayBanking) { if (System.currentTimeMillis() <= openTimeout) { return 0; } atObject(COORDINATE_SHANTAY_BANK_CHEST.getX(), COORDINATE_SHANTAY_BANK_CHEST.getY()); openTimeout = System.currentTimeMillis() + TIMEOUT_TWO_SECONDS; return 0; } return openBank(); } if (getInventoryCount() == 1) { if (System.currentTimeMillis() <= withdrawTimeout) { return 0; } if (!hasBankItem(herb.id)) { if (iterator == null || !iterator.hasNext()) { return exit(String.format("Out of %s.", getItemNameId(herb.id))); } herb = iterator.next(); herbsIdentified = 0; initialHerblawXp = getAccurateXpForLevel(Skill.HERBLAW.getIndex()); startTime = System.currentTimeMillis(); if (getLevel(Skill.HERBLAW.getIndex()) < herb.level) { return exit(String.format("Lvl %d Herblaw required to identify %s.", herb.level, getItemNameId(herb.id))); } return 0; } herbsRemaining = bankCount(herb.id); withdraw(herb.id, MAX_INV_SIZE - 1); withdrawTimeout = System.currentTimeMillis() + TIMEOUT_THREE_SECONDS; return 0; } if (System.currentTimeMillis() <= depositTimeout) { return 0; } final int itemId = getInventoryId(1); deposit(itemId, MAX_INV_SIZE); depositTimeout = System.currentTimeMillis() + TIMEOUT_THREE_SECONDS; return 0; } @Override public void paint() { int y = PAINT_OFFSET_Y; drawString("@yel@Herb Identifier", PAINT_OFFSET_X, y, 1, 0); drawString(String.format("@yel@Runtime: @whi@%s", toDuration(startTime)), PAINT_OFFSET_X, y += PAINT_OFFSET_Y_INCREMENT, 1, 0); final double xpGained = getAccurateXpForLevel(Skill.HERBLAW.getIndex()) - initialHerblawXp; drawString(String.format("@yel@Xp: @whi@%s @cya@(@whi@%s xp@cya@/@whi@hr@cya@)", DECIMAL_FORMAT.format(xpGained), toUnitsPerHour((int) xpGained, startTime)), PAINT_OFFSET_X, y += PAINT_OFFSET_Y_INCREMENT * 2, 1, 0); drawString(String.format("@yel@%s: @whi@%d @cya@(@whi@%s per@cya@/@whi@hr@cya@)", herb, herbsIdentified, toUnitsPerHour(herbsIdentified, startTime)), PAINT_OFFSET_X, y += PAINT_OFFSET_Y_INCREMENT, 1, 0); drawString(String.format("@yel@Remaining: @whi@%d", herbsRemaining), PAINT_OFFSET_X, y += PAINT_OFFSET_Y_INCREMENT * 2, 1, 0); drawString(String.format("@yel@Time remaining: @whi@%s", toTimeToCompletion(herbsIdentified, herbsRemaining, startTime)), PAINT_OFFSET_X, y + PAINT_OFFSET_Y_INCREMENT, 1, 0); } private enum Herb { GUAM(165, 3, "Guam"), MARRENTILL(435, 5, "Marrentill"), TARROMIN(436, 12, "Tarromin"), HARRALANDER(437, 22, "Harralander"), RANARR_WEED(438, 30, "Ranarr"), IRIT_LEAF(439, 45, "Irit"), AVANTOE(440, 50, "Avantoe"), KWUARM(441, 55, "Kwuarm"), CADANTINE(442, 66, "Cadantine"), DWARF_WEED(443, 72, "Dwarfweed"), TORSTOL(933, 78, "Torstol"); private final int id; private final int level; private final String name; Herb(final int id, final int level, final String name) { this.id = id; this.level = level; this.name = name; } @Override public String toString() { return name; } } }