Flamezzz Posted November 12, 2015 Posted November 12, 2015 (edited) Small API for the new attack option stuff they introduced in the update today.Usage: AttackOptions.setNPC(this, AttackOptions.Option.HIDDEN); AttackOptions.setPlayer(this, AttackOptions.Option.HIDDEN); AttackOptions.getNPC(this) AttackOptions.getPlayer(this) import org.osbot.rs07.api.ui.RS2Widget; import org.osbot.rs07.api.ui.Tab; import org.osbot.rs07.script.MethodProvider; import org.osbot.rs07.utility.ConditionalSleep; import java.util.List; /** * Created by Flamezzz on 12/11/2015. */ public class AttackOptions { public enum Option { DEPENDS_ON_COMBAT("Depends on combat levels"), ALWAYS_RIGHT_CLICK("Always right-click"), LEFT_CLICK_WHERE_AVAILABLE("Left-click where available"), HIDDEN("Hidden"); String str; Option(String str) { this.str = str; } } private static boolean DEBUG = true; private static int[] CONFIGS = {1107, 1306}; private static final int CONTROLS_ROOT = 261; private static void debug(MethodProvider api, String str) { if (DEBUG) api.log(str); } private static boolean openControls(MethodProvider api) { RS2Widget controls = api.widgets.singleFilter( CONTROLS_ROOT, w -> w.getInteractActions() != null && w.getInteractActions().length > 0 && "Controls".equals(w.getInteractActions()[0])); if (controls == null || !controls.isVisible()) return false; return controls.getSpriteIndex1() == 762 || controls.interact("Controls"); } public static Option getNPC(MethodProvider api) { return Option.values()[api.configs.get(CONFIGS[1])]; } public static Option getPlayer(MethodProvider api) { return Option.values()[api.configs.get(CONFIGS[0])]; } public static boolean setNPC(MethodProvider api, Option o) { return getNPC(api).equals(o) ? true : set(api, o, "NPC 'Attack' options:", 1); } public static boolean setPlayer(MethodProvider api, Option o) { return getPlayer(api).equals(o) ? true : set(api, o, "Player 'Attack' options:", 0); } private static List<RS2Widget> getOptions(MethodProvider api) { return api.widgets.filter( CONTROLS_ROOT, w -> w.isVisible() && w.getInteractActions() != null && w.getInteractActions().length > 0 && "Select".equals(w.getInteractActions()[0])); } private static boolean set(MethodProvider api, Option o, String searchStr, int idx) { if (api.tabs.open(Tab.SETTINGS) && openControls(api)) { debug(api, "Opened controls"); RS2Widget child = api.widgets.singleFilter(CONTROLS_ROOT, w -> w.getMessage().equalsIgnoreCase(searchStr)); if (child == null || !child.isVisible()) return false; debug(api, "Found child [" + child.getRootId() + "," + child.getSecondLevelId() + "," + child.getThirdLevelId() + "]"); RS2Widget openOptions = api.widgets.get(child.getRootId(), child.getSecondLevelId(), 1); if(openOptions == null || !openOptions.isVisible()) { debug(api, "openoptions can not be found"); return false; } List<RS2Widget> options = getOptions(api); debug(api, "Found " + options.size() + " options"); if(options.size() != Option.values().length) { openOptions.interact(); debug(api, "Opening option list"); if (!new ConditionalSleep(5000) { public boolean condition() throws InterruptedException { return getOptions(api).size() == Option.values().length; } }.sleep()) { return false; } } debug(api, "Clicking option"); RS2Widget selectOption = options.get(o.ordinal()); return selectOption.interact() && new ConditionalSleep(5000) { public boolean condition() throws InterruptedException { return api.configs.get(CONFIGS[idx]) == o.ordinal(); } }.sleep(); } return false; } } Edited November 12, 2015 by Flamezzz 2