Package org.rsbot.script.methods

Source Code of org.rsbot.script.methods.Game

package org.rsbot.script.methods;

import org.rsbot.script.Random;
import org.rsbot.script.randoms.*;
import org.rsbot.script.wrappers.RSComponent;
import org.rsbot.script.wrappers.RSInterface;
import org.rsbot.script.wrappers.RSTile;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
* Game state and GUI operations.
*/
public class Game extends MethodProvider {
  /**
   * Different Types of Chat Modes
   */
  public enum ChatMode {
    VIEW, ON, FRIENDS, OFF, HIDE, ALL, FILTER
  }

  /**
   * The chat filter buttons
   *
   * @author kiko
   */
  public enum ChatButton {
    ALL(2, -1, 31),
    GAME(3, 30, 28, ChatMode.ALL, ChatMode.FILTER),
    PUBLIC(4, 27, 25, ChatMode.ON, ChatMode.FRIENDS, ChatMode.OFF, ChatMode.HIDE),
    PRIVATE(5, 24, 22, ChatMode.ON, ChatMode.FRIENDS, ChatMode.OFF),
    FRIENDS(7, 35, 33, ChatMode.ON, ChatMode.FRIENDS, ChatMode.OFF),
    CLAN(6, 21, 19, ChatMode.ON, ChatMode.FRIENDS, ChatMode.OFF),
    TRADE(8, 18, 16, ChatMode.ON, ChatMode.FRIENDS, ChatMode.OFF),
    ASSIST(9, 15, 13, ChatMode.ON, ChatMode.FRIENDS, ChatMode.OFF);

    private final int component;
    private final int textComponent;
    private final int selectComponent;
    private final ChatMode[] options;

    ChatButton(final int component, final int textComponent, final int selectComponent, final ChatMode... options) {
      this.component = component;
      this.textComponent = textComponent;
      this.selectComponent = selectComponent;
      this.options = options;
    }

    public boolean hasMode(final ChatMode mode) {
      if (mode == ChatMode.VIEW) {
        return true;
      }
      for (ChatMode option : options) {
        if (mode == option) {
          return true;
        }
      }
      return false;
    }

    public int idx() {
      return component;
    }

    public int selectIdx() {
      return selectComponent;
    }

    public int textIdx() {
      return textComponent;
    }
  }

  /**
   * The game tabs
   *
   * @author kiko
   */
  public enum Tab {
    NONE(-1, "None", 0, -1),
    ATTACK(0, "Combat Styles", KeyEvent.VK_F5, 884),
    TASK(1, "Task System", 0, 1056),
    STATS(2, "Stats", 0, Skills.INTERFACE_TAB_STATS),
    QUESTS(3, "Quest Journals", 0, Quests.QUESTS),
    INVENTORY(4, "Inventory", KeyEvent.VK_F1, Inventory.INTERFACE_INVENTORY),
    EQUIPMENT(5, "Worn Equipment", KeyEvent.VK_F2, Equipment.INTERFACE_EQUIPMENT),
    PRAYER(6, "Prayer List", KeyEvent.VK_F3, Prayer.INTERFACE_PRAYER),
    MAGIC(7, "Magic Spellbook", KeyEvent.VK_F4, 192),
    FRIENDS(9, "Friends List", 0, 550),
    FRIENDS_CHAT(10, "Friends Chat", 0, FriendChat.INTERFACE_FRIEND_CHAT),
    CLAN_CHAT(11, "Clan Chat", 0, ClanChat.INTERFACE_CLAN_CHAT),
    OPTIONS(12, "Options", 0, 261),
    EMOTES(13, "Emotes", 0, 464),
    MUSIC(14, "Music Player", 0, 187),
    NOTES(15, "Notes", 0, 34),
    LOGOUT(16, "Exit", 0, Game.INTERFACE_LOGOUT);

    final String description;
    final int functionKey;
    final int index;
    final int inter;

    Tab(final int index, final String description, final int functionKey, final int inter) {
      this.description = description;
      this.functionKey = functionKey;
      this.index = index;
      this.inter = inter;
    }

    public String description() {
      return description;
    }

    public int functionKey() {
      return functionKey;
    }

    public boolean hasFunctionKey() {
      return functionKey != 0;
    }

    public int index() {
      return index;
    }

    public int interfaceID() {
      return inter;
    }
  }

  public static final int[] INDEX_LOGGED_IN = {11, 12};
  public static final int INDEX_LOGIN_SCREEN = 3;
  public static final int INDEX_LOBBY_SCREEN = 7;
        public static final int INDEX_LOGGING_IN = 5;
  public static final int INDEX_FIXED = 746;

  @Deprecated
  public static final int[] TAB_FUNCTION_KEYS = {
      KeyEvent.VK_F5, // Attack
      0, // Achievements
      0, // Stats
      0, // Quests
      KeyEvent.VK_F1, // Inventory
      KeyEvent.VK_F2, // Equipment
      KeyEvent.VK_F3, // Prayer
      KeyEvent.VK_F4, // Magic
      0, // Summoning
      0, // Friends
      0, // Ignore
      0, // Clan
      0, // Options
      0, // Controls
      0, // Music
      0, // Notes
      0, // Logout
  };

  public static final int TAB_ATTACK = 0;
  public static final int TAB_TASK = 1;
  public static final int TAB_STATS = 2;
  public static final int TAB_QUESTS = 3;
  public static final int TAB_INVENTORY = 4;
  public static final int TAB_EQUIPMENT = 5;
  public static final int TAB_PRAYER = 6;
  public static final int TAB_MAGIC = 7;
  public static final int TAB_SUMMONING = 8; // Untested
  public static final int TAB_FRIENDS = 9;
  public static final int TAB_FRIENDS_CHAT = 10;
  public static final int TAB_CLAN = 11;
  public static final int TAB_CLAN_CHAT = 11;
  public static final int TAB_OPTIONS = 12;
  public static final int TAB_CONTROLS = 13;
  public static final int TAB_MUSIC = 14;
  public static final int TAB_NOTES = 15;
  public static final int TAB_LOGOUT = 16;

  public static final int CHAT_OPTION = 751;
  public static final int CHAT_OPTION_ALL = 2;
  public static final int CHAT_OPTION_GAME = 3;
  public static final int CHAT_OPTION_PUBLIC = 4;
  public static final int CHAT_OPTION_PRIVATE = 5;
  public static final int CHAT_OPTION_FRIENDS = 7;
  public static final int CHAT_OPTION_CLAN = 6;
  public static final int CHAT_OPTION_TRADE = 8;
  public static final int CHAT_OPTION_ASSIST = 9;

  public static final int INTERFACE_CHAT_BOX = 137;
  public static final int INTERFACE_GAME_SCREEN = 548;
  public static final int INTERFACE_LEVEL_UP = 740;
  public static final int INTERFACE_LOGOUT = 182;
  public static final int INTERFACE_LOGOUT_LOBBY = 1;
  public static final int INTERFACE_LOGOUT_COMPLETE = 6;
  public static final int INTERFACE_LOGOUT_BUTTON_FIXED = 181;
  public static final int INTERFACE_LOGOUT_BUTTON_RESIZED = 172;
  public static final int INTERFACE_WELCOME_SCREEN = 907;
  public static final int INTERFACE_WELCOME_SCREEN_CHILD = 150;
  public static final int INTERFACE_WELCOME_SCREEN_PLAY = 18;

  public static final int INTERFACE_HP_ORB = 748;
  public static final int INTERFACE_PRAYER_ORB = 749;

  public static final int[] INTERFACE_TALKS = {211, 241, 251, 101, 242,
      102, 161, 249, 243, 64, 65, 244, 255, 249, 230, 372, 421};
  public static final int[] INTERFACE_OPTIONS = {230, 228};

  public static final int[] WORLDS_GERMAN = {122, 139, 140, 146, 147};
  public static final int[] WORLDS_FRENCH = {128, 150};
  public static final int[] WORLDS_PORTUGUESE = {94, 101, 125, 126, 127, 133};
  public static final int[] WORLDS_MEMBER = {2, 6, 9, 12, 15, 18, 21, 22, 23, 24, 26, 27, 28, 31, 32, 36, 39,
      40, 42, 44, 45, 46, 48, 51, 52, 53, 54, 56, 58, 59, 60, 64, 65, 66, 67, 68, 69, 70, 71, 72, 76, 77, 78,
      79, 82, 83, 84, 85, 86, 88, 89, 91, 92, 96, 97, 98, 99, 100, 103, 104, 112, 114, 115, 116, 119, 121, 124,
      127, 129, 130, 131, 132, 133, 137, 138, 140, 142, 143, 144, 145, 147, 148, 150, 151, 156, 157, 158, 159, 160, 164, 166, 172};
  public static final int[] WORLDS_FREE = {1, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 25, 29, 30, 33, 34,
      35, 37, 38, 41, 43, 47, 49, 50, 55, 57, 61, 62, 73, 74, 75, 80, 81, 87, 90, 93, 94, 101, 102, 105, 106, 108,
      113, 118, 120, 122, 123, 125, 126, 134, 135, 136, 139, 141, 146, 149, 152, 153, 154, 155, 161, 165, 167, 169};

  public enum Language {
    ENGLISH, GERMAN, FRENCH, PORTUGUESE
  }

  ;

  @Deprecated
  public static final String[] TAB_NAMES = new String[]{"Combat Styles", "Task System", "Stats",
      "Quest Journals", "Inventory", "Worn Equipment", "Prayer List", "Magic Spellbook", "",
      "Friends List", "Friends Chat", "Clan Chat", "Options", "Emotes", "Music Player",
      "Notes", "Exit"};

  Game(final MethodContext ctx) {
    super(ctx);
  }

  /**
   * Closes the currently open tab if in re-sizable mode.
   */
  public void closeTab() {
    final Tab tab = getTab();
    if (isFixed() || tab == Tab.LOGOUT) {
      return;
    }
    final org.rsbot.client.RSInterface iTab = methods.gui.getTab(tab);
    if (iTab != null) {
      methods.interfaces.getComponent(iTab.getID()).doClick();
    }
  }

  /**
   * Turns accept aid off if it isn't already.
   *
   * @return <tt>true</tt> if the setting was clicked; otherwise <tt>false</tt>.
   */
  public boolean disableAid() {
    if (methods.settings.getSetting(427) == 1 && openTab(Tab.OPTIONS)) {
      final RSComponent toggle = methods.interfaces.getComponent(Tab.OPTIONS.interfaceID(), 7);
      return toggle != null && toggle.doClick();
    }
    return false;
  }

  /**
   * Gets the x coordinate of the loaded map area (far west).
   *
   * @return The region base x.
   */
  public int getBaseX() {
    return methods.client.getBaseX();
  }

  /**
   * Gets the y coordinate of the loaded map area (far south).
   *
   * @return The region base y.
   */
  public int getBaseY() {
    return methods.client.getBaseY();
  }

  /**
   * Gets the game state.
   *
   * @return The game state.
   */
  public int getClientState() {
    return methods.client.getLoginIndex();
  }

  /**
   * Gets a color corresponding to x and y coordinates from the current game screen.
   *
   * @param x The x coordinate at which to get the color.
   * @param y The y coordinate at which to get the color.
   * @return Color
   * @see java.awt.color
   */
  public Color getColorAtPoint(final int x, final int y) {
    final BufferedImage image = methods.env.takeScreenshot(false);
    return new Color(image.getRGB(x, y));
  }

  /**
   * Gets the currently open tab.
   *
   * @return The currently open tab or the logout tab by default.
   */
  @Deprecated
  public int getCurrentTab() {
    return getTab().index();
  }

  /**
   * Access the last message spoken by a player.
   *
   * @return The last message spoken by a player or "" if none.
   */
  public String getLastMessage() {
    final RSInterface chatBox = methods.interfaces.get(INTERFACE_CHAT_BOX);
    for (int i = 279; i >= 180; i--) {// Valid text is from 180 to 279, was 58-157
      final String text = chatBox.getComponent(i).getText();
      if (!text.isEmpty() && text.contains("<")) {
        return text;
      }
    }
    return "";
  }

  /**
   * Gets the (x, y) coordinate pair of the south-western tile at the base of
   * the loaded map area.
   *
   * @return The region base tile.
   */
  public RSTile getMapBase() {
    return new RSTile(methods.client.getBaseX(), methods.client.getBaseY());
  }

  /**
   * Gets the plane we are currently on. Typically 0 (ground level), but will
   * increase when going up ladders. You cannot be on a negative plane. Most
   * dungeons/basements are on plane 0 elsewhere on the world map.
   *
   * @return The current plane.
   */
  public int getPlane() {
    return methods.client.getPlane();
  }

  /**
   * Gets a random selectable game tab (excludes Logout).
   *
   * @return Returns a random selectable game tab.
   */
  public Tab getRandomTab() {
    final Tab[] tabs = Tab.values();
    return tabs[random(0, tabs.length - 1)];
  }

  /**
   * Gets the currently open tab.
   *
   * @return The currently open tab.
   */
  public Tab getTab() {
    for (Tab t : Tab.values()) {
      final org.rsbot.client.RSInterface tab = methods.gui.getTab(t);
      if (tab != null && tab.getTextureID() != -1) {
        return t;
      }
    }
    final RSInterface logout = methods.interfaces.get(INTERFACE_LOGOUT);
    return logout != null && logout.isValid() ? Tab.LOGOUT : Tab.NONE;
  }
 
  /**
   * Determines if runescape is loading
   *
   * @return <tt>true</tt> if runescape is loading; otherwise <tt>false</tt>.
   */
  public boolean isLoading() {
    return getClientState() == INDEX_LOGGED_IN[1];
  }

  /**
   * Determines if quick chat is open
   *
   * @return true if quickchat is open
   */
  public boolean isQuickChatOpen() {
    return methods.interfaces.getComponent(137, 4).isValid() && !new Color(186, 170, 139).equals(getColorAtPoint(19, 352));
  }

  /**
   * Returns the valid chat component.
   *
   * @return <tt>RSComponent</tt> of the current valid talk interface; otherwise null.
   * @see #INTERFACE_TALKS
   */
  public RSComponent getTalkInterface() {
    for (final int talk : INTERFACE_TALKS) {
      final RSComponent child = methods.interfaces.getComponent(talk, 0);
      if (child.isValid()) {
        return child;
      }
    }
    return null;
  }

  /**
   * Gets the canvas height.
   *
   * @return The canvas' width.
   */
  public int getWidth() {
    return methods.bot.getCanvas().getWidth();
  }

  /**
   * Gets the canvas height.
   *
   * @return The canvas' height.
   */
  public int getHeight() {
    return methods.bot.getCanvas().getHeight();
  }

  /**
   * Excludes Loginbot, BankPin, TeleotherCloser, CloseAllInterface, RewardsBox
   *
   * @return True if player is in a random
   */
  public boolean inRandom() {
    for (final Random random : methods.bot.getScriptHandler().getRandoms()) {
      if (random.getClass().equals(new ImprovedLoginBot()) ||
          random.getClass().equals(new BankPins()) ||
          random.getClass().equals(new TeleotherCloser()) ||
          random.getClass().equals(new CloseAllInterface()) ||
          random.getClass().equals(new RewardsBox())) {
      } else {
        if (random.activateCondition()) {
          return true;
        }
      }
    }
    return false;
  }

  public boolean isButtonSelected(final ChatButton button) {
    return methods.interfaces.getComponent(CHAT_OPTION, button.selectIdx())
        .getTextureID() == 1022;
  }

  /**
   * Determines whether or not the client is currently in the fixed display mode.
   *
   * @return <tt>true</tt> if in fixed mode; otherwise <tt>false</tt>.
   */
  public boolean isFixed() {
    return methods.client.getGUIRSInterfaceIndex() != INDEX_FIXED;
  }

  /**
   * Determines whether or not the client is currently logged in to an account.
   *
   * @return <tt>true</tt> if logged in; otherwise <tt>false</tt>.
   */
  public boolean isLoggedIn() {
    final org.rsbot.client.Client client = methods.client;
    if (client == null) {
      return true;
    }
    final int index = client.getLoginIndex();
    return index == 11 || index == 12;
  }

  /**
   * Determines whether or not the client is showing the login screen.
   *
   * @return <tt>true</tt> if the client is showing the login screen;
   *         otherwise <tt>false</tt>.
   */
  public boolean isLoginScreen() {
    return methods.client.getLoginIndex() == INDEX_LOGIN_SCREEN;
  }

  /**
   * Checks whether or not the logout tab is selected.
   *
   * @return <tt>true</tt> if on the logout tab.
   */
  @Deprecated
  public boolean isOnLogoutTab() {
    return getTab() == Tab.LOGOUT;
  }

  /**
   * Determines whether or not the welcome screen is open.
   *
   * @return <tt>true</tt> if the client is showing the welcome screen;
   *         otherwise <tt>false</tt>.
   */
  public boolean isWelcomeScreen() {
    return methods.interfaces.getComponent(INTERFACE_WELCOME_SCREEN,
        INTERFACE_WELCOME_SCREEN_CHILD).getAbsoluteY() > 2;
  }

  /**
   * Runs the ImprovedLoginBot random.
   *
   * @return <tt>true</tt> if random was run; otherwise <tt>false</tt>.
   */
  public boolean login() {
    org.rsbot.script.randoms.ImprovedLoginBot loginBot = new org.rsbot.script.randoms.ImprovedLoginBot();
    loginBot.init(methods);
    if (loginBot.activateCondition()) {
      sleep(loginBot.loop());
      return true;
    }
    return false;
  }

  /**
   * Closes the bank if it is open and logs out.
   *
   * @param lobby <tt>true</tt> if player should be logged out to the lobby
   * @return <tt>true</tt> if the player was logged out.
   */
  public boolean logout(final boolean lobby) {
    if (methods.bank.isOpen()) {
      if (methods.bank.close()) {
        sleep(random(200, 400));
      }
    }
    if (methods.bank.isOpen()) {
      return false;
    }
    if (methods.client.isSpellSelected() || methods.inventory.isItemSelected()) {
      final Tab currentTab = methods.game.getTab();
      int randomTab = random(1, 6);
      while (randomTab == currentTab.index()) {
        randomTab = random(1, 6);
      }
      if (methods.game.openTab(Game.Tab.values()[randomTab])) {
        sleep(random(400, 800));
      }
    }
    if (methods.client.isSpellSelected() || methods.inventory.isItemSelected()) {
      return false;
    }
    if (getTab() != Tab.LOGOUT) {
      final int idx = methods.client.getGUIRSInterfaceIndex();
      RSComponent exitComponent = methods.interfaces.getComponent(idx, isFixed() ? 182 : 176);
      if (exitComponent == null || !exitComponent.doClick()) {
        return false;
      }
      long time = System.currentTimeMillis();
      while (getTab() != Tab.LOGOUT) {
        if (System.currentTimeMillis() - time > 2000) {
          break;
        }
        sleep(random(50, 100));
      }
    }
    RSComponent exitToComponent = methods.interfaces.getComponent(INTERFACE_LOGOUT, lobby ? 2 : 13);
    if (exitToComponent != null && exitToComponent.doClick()) {
      sleep(random(1500, 2000));
    }
    return !isLoggedIn();
  }

  /**
   * Click chat button.
   *
   * @param button Which button? One of CHAT_OPTION
   * @param left   Left or right button? Left = true. Right = false.
   * @return <tt>true</tt> if it was clicked.
   */
  @Deprecated
  public boolean mouseChatButton(final int button, final boolean left) {
    return mouseChatButton(getButton(button), left);
  }

  /**
   * Click the specified chat button.
   *
   * @param button One of ChatButton
   * @param left   true to left click, false for right click.
   * @return <tt>true</tt> if the button was successfully clicked.
   */
  public boolean mouseChatButton(final ChatButton button, final boolean left) {
    if (button == null || (left && isButtonSelected(button))) {
      return false;
    }
    final RSComponent chatButton = methods.interfaces.getComponent(CHAT_OPTION, button.idx());
    return chatButton.isValid() && chatButton.doClick(left);
  }

  /**
   * Opens the specified tab at the specified index.
   *
   * @param tab         The tab to open, functionKey if wanting to use function keys to switch.
   * @param functionKey Use a function key (if available) for fast switching.
   * @return <tt>true</tt> if tab successfully selected; otherwise <tt>false</tt>.
   * @see #openTab(Tab tab, boolean functionKey)
   */
  @Deprecated
  public boolean open(final int tab, final boolean functionKey) {
    return openTab(getTab(tab), functionKey);
  }

  /**
   * Opens the specified tab at the specified index.
   *
   * @param tab The tab to open.
   * @return <tt>true</tt> if tab successfully selected; otherwise <tt>false</tt>.
   * @see #openTab(Tab tab, boolean functionKey)
   */
  @Deprecated
  public boolean openTab(final int tab) {
    return openTab(getTab(tab));
  }

  /**
   * Opens the specified game tab.
   *
   * @param tab The tab to open.
   * @return <tt>true</tt> if tab successfully selected; otherwise <tt>false</tt>.
   * @see #openTab(Tab tab, boolean functionKey)
   */
  public boolean openTab(final Tab tab) {
    return openTab(tab, false);
  }

  /**
   * Opens the specified tab at the specified index.
   *
   * @param tab         The tab to open, functionKey if wanting to use function keys to switch.
   * @param functionKey Use function keys to open the tab or not.
   * @return <tt>true</tt> if tab successfully selected; otherwise <tt>false</tt>.
   * @see #openTab(Tab tab, boolean functionKey)
   */
  @Deprecated
  public boolean openTab(final int tab, final boolean functionKey) {
    return openTab(getTab(tab), functionKey);
  }

  /**
   * Opens the specified game tab.
   *
   * @param tab         The tab to open, functionKey if wanting to use function keys to switch.
   * @param functionKey Use function keys to open the tab or not.
   * @return <tt>true</tt> if tab successfully selected; otherwise <tt>false</tt>.
   */
  public boolean openTab(final Tab tab, final boolean functionKey) {
    if (tab == Tab.NONE) {
      return false;
    }

    if (getTab() == tab) {
      return true;
    }

    if (functionKey && tab.hasFunctionKey()) {
      methods.keyboard.pressKey((char) tab.functionKey());
      sleep(random(60, 200));
      methods.keyboard.releaseKey((char) tab.functionKey());
    } else {
      final org.rsbot.client.RSInterface iTab = methods.gui.getTab(tab);
      if (iTab == null || !methods.interfaces.getComponent(iTab.getID()).doClick()) {
        return false;
      }
    }

    boolean opened = false;
    for (int i = 0; i < 4; i++) {
      if (!opened) {
        if (getTab() == tab) {
          opened = true;
          i--;
          continue;
        }
      } else if (methods.interfaces.get(tab.interfaceID()).isValid()) {
        return true;
      }
      sleep(random(100, 200));
    }
    return getTab() == tab;
  }

  /**
   * Sets the specified chat mode
   *
   * @param button one of ChatButton
   * @param mode   one of ChatMode
   * @return <tt>true</tt> if item was clicked correctly; otherwise <tt>false</tt>.
   */
  @Deprecated
  public boolean setChatOption(final int button, final ChatMode mode) {
    return setChatOption(getButton(button), mode);
  }

  /**
   * Sets the specified chat mode
   *
   * @param option one of ChatButton
   * @param mode   one of ChatMode
   * @return <tt>true</tt> if item was clicked correctly; otherwise <tt>false</tt>.
   */
  public boolean setChatOption(final ChatButton option, final ChatMode mode) {
    if (option == null || !option.hasMode(mode)) {
      return false;
    }
    if (mode == ChatMode.VIEW) {
      return mouseChatButton(option, true);
    }
    final RSComponent chat = methods.interfaces.getComponent(CHAT_OPTION, option.textIdx());
    if (chat != null) {
      String setting = chat.getText();
      setting = setting.substring(setting.indexOf(">") + 1);
      if (setting.toUpperCase().equals(mode.toString())) {
        return false;
      }
    }
    mouseChatButton(option, false);
    return methods.menu.click(mode.toString());
  }

  /**
   * Switches to a given world.
   *
   * @param world the world to switch to, must be valid.
   * @return If worlds were switched.
   */
  public boolean switchWorld(final int world) {
    methods.env.disableRandom("Improved Login");
    if (methods.game.isLoggedIn()) {
      methods.game.logout(true);
      for (int i = 0; i < 50; i++) {
        sleep(100);
        if (methods.interfaces.get(906).isValid() && getClientState() == INDEX_LOBBY_SCREEN) {
          break;
        }
      }
    }

    if (!methods.interfaces.get(906).isValid()) {
      methods.env.enableRandom("Improved Login");
      return false;
    }
    if (methods.lobby.switchWorlds(world)) {
      sleep(random(1000, 2000));
      methods.env.enableRandom("Improved Login");
      return true;
    }
    return false;
  }

  /**
   * Gets Current World
   *
   * @return current or selected world
   */
  public int getCurrentWorld() {
    int world = 0;
    if (methods.game.isLoggedIn()) {
      if (methods.game.getTab() != Game.Tab.FRIENDS) {
        methods.game.openTab(Game.Tab.FRIENDS);
      }
      world = Integer.parseInt(methods.interfaces.getComponent(550, 19).getText().replaceAll("Friends List<br>RuneScape ", ""));
    } else if (methods.game.getClientState() == Game.INDEX_LOBBY_SCREEN) {
      world = methods.lobby.getSelectedWorld();
    }
    return world;
  }

  /**
   * Fetch the chat button at the provided index for deprecated methods.
   * For internal use only.
   *
   * @param idx The chat buttons' index.
   * @return Returns the current chat button.
   */
  private ChatButton getButton(final int idx) {
    for (ChatButton b : ChatButton.values()) {
      if (b.idx() == idx) {
        return b;
      }
    }
    return null;
  }

  /**
   * Fetch the game tab at the provided index. For internal use only.
   *
   * @param idx The game tab at the provided index.
   * @return The tab at the index issued.
   */
  private Tab getTab(final int idx) {
    for (Tab t : Tab.values()) {
      if (t.index() == idx) {
        return t;
      }
    }
    return Tab.NONE;
  }

  /**
   * Get the current world language.
   *
   * @return The language of the current world, currently only English, German, French or Portuguese.
   */
  public Language getWorldLanguage() {
    final Map<Language, int[]> map = new HashMap<Language, int[]>(3);
    map.put(Language.GERMAN, WORLDS_GERMAN);
    map.put(Language.FRENCH, WORLDS_FRENCH);
    map.put(Language.PORTUGUESE, WORLDS_PORTUGUESE);
    final int w = getCurrentWorld();
    for (final Entry<Language, int[]> entry : map.entrySet()) {
      for (int i = 0; i < entry.getValue().length; i++) {
        if (w == entry.getValue()[i]) {
          return entry.getKey();
        }
      }
    }
    return Language.ENGLISH;
  }

  /**
   * Determines whether the current world is members or free to play.
   *
   * @return true if the current world is a members world, false otherwise.
   */
  public boolean isWorldMembers() {
    final int w = getCurrentWorld();
    for (final int n : WORLDS_MEMBER) {
      if (w == n) {
        return true;
      }
    }
    return false;
  }
}
TOP

Related Classes of org.rsbot.script.methods.Game

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.