Package org.rsbot.script.methods

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

package org.rsbot.script.methods;

import org.rsbot.script.util.SkillData;

/**
* This class is for all the skill calculations.
* <p/>
* Example usage: skills.getRealLevel(Skills.ATTACK);
*/
public class Skills extends MethodProvider {
  public static final String[] SKILL_NAMES = {"attack", "defence", "strength", "constitution", "range", "prayer",
      "magic", "cooking", "woodcutting", "fletching", "fishing", "firemaking", "crafting", "smithing", "mining",
      "herblore", "agility", "thieving", "slayer", "farming", "runecrafting", "hunter", "construction",
      "summoning", "dungeoneering", "-unused-"};

  /**
   * A table containing the experiences that begin each level.
   */
  public static final int[] XP_TABLE = {0, 0, 83, 174, 276, 388, 512, 650, 801, 969, 1154, 1358, 1584, 1833, 2107,
      2411, 2746, 3115, 3523, 3973, 4470, 5018, 5624, 6291, 7028, 7842, 8740, 9730, 10824, 12031, 13363, 14833,
      16456, 18247, 20224, 22406, 24815, 27473, 30408, 33648, 37224, 41171, 45529, 50339, 55649, 61512, 67983,
      75127, 83014, 91721, 101333, 111945, 123660, 136594, 150872, 166636, 184040, 203254, 224466, 247886, 273742,
      302288, 333804, 368599, 407015, 449428, 496254, 547953, 605032, 668051, 737627, 814445, 899257, 992895,
      1096278, 1210421, 1336443, 1475581, 1629200, 1798808, 1986068, 2192818, 2421087, 2673114, 2951373, 3258594,
      3597792, 3972294, 4385776, 4842295, 5346332, 5902831, 6517253, 7195629, 7944614, 8771558, 9684577, 10692629,
      11805606, 13034431, 14391160, 15889109, 17542976, 19368992, 21385073, 23611006, 26068632, 28782069,
      31777943, 35085654, 38737661, 42769801, 47221641, 52136869, 57563718, 63555443, 70170840, 77474828,
      85539082, 94442737, 104273167};

  public static final int ATTACK = 0;
  public static final int DEFENSE = 1;
  public static final int STRENGTH = 2;
  public static final int CONSTITUTION = 3;
  public static final int RANGE = 4;
  public static final int PRAYER = 5;
  public static final int MAGIC = 6;
  public static final int COOKING = 7;
  public static final int WOODCUTTING = 8;
  public static final int FLETCHING = 9;
  public static final int FISHING = 10;
  public static final int FIREMAKING = 11;
  public static final int CRAFTING = 12;
  public static final int SMITHING = 13;
  public static final int MINING = 14;
  public static final int HERBLORE = 15;
  public static final int AGILITY = 16;
  public static final int THIEVING = 17;
  public static final int SLAYER = 18;
  public static final int FARMING = 19;
  public static final int RUNECRAFTING = 20;
  public static final int HUNTER = 21;
  public static final int CONSTRUCTION = 22;
  public static final int SUMMONING = 23;
  public static final int DUNGEONEERING = 24;

  public static final int INTERFACE_TAB_STATS = 320;
  public static final int INTERFACE_ATTACK = 1;
  public static final int INTERFACE_DEFENSE = 22;
  public static final int INTERFACE_STRENGTH = 4;
  public static final int INTERFACE_CONSTITUTION = 2;
  public static final int INTERFACE_RANGE = 46;
  public static final int INTERFACE_PRAYER = 70;
  public static final int INTERFACE_MAGIC = 87;
  public static final int INTERFACE_COOKING = 62;
  public static final int INTERFACE_WOODCUTTING = 102;
  public static final int INTERFACE_FLETCHING = 95;
  public static final int INTERFACE_FISHING = 38;
  public static final int INTERFACE_FIREMAKING = 85;
  public static final int INTERFACE_CRAFTING = 78;
  public static final int INTERFACE_SMITHING = 20;
  public static final int INTERFACE_MINING = 3;
  public static final int INTERFACE_HERBLORE = 30;
  public static final int INTERFACE_AGILITY = 12;
  public static final int INTERFACE_THIEVING = 54;
  public static final int INTERFACE_SLAYER = 112;
  public static final int INTERFACE_FARMING = 120;
  public static final int INTERFACE_RUNECRAFTING = 104;
  public static final int INTERFACE_HUNTER = 136;
  public static final int INTERFACE_CONSTRUCTION = 128;
  public static final int INTERFACE_SUMMONING = 144;
  public static final int INTERFACE_DUNGEONEERING = 152;

  /**
   * Gets the index of the skill with a given name. This is not case
   * sensitive.
   *
   * @param statName The skill's name.
   * @return The index of the specified skill; otherwise -1.
   */
  public static int getIndex(final String statName) {
    for (int i = 0; i < Skills.SKILL_NAMES.length; i++) {
      if (Skills.SKILL_NAMES[i].equalsIgnoreCase(statName)) {
        return i;
      }
    }
    return -1;
  }

  /**
   * Gets the level at the given experience.
   *
   * @param exp The experience.
   * @return The level based on the experience given.
   * @see #XP_TABLE
   */
  public static int getLevelAt(final int exp) {
    for (int i = Skills.XP_TABLE.length - 1; i > 0; i--) {
      if (exp > Skills.XP_TABLE[i]) {
        return i;
      }
    }
    return 1;
  }

  /**
   * Gets the experience at the given level.
   *
   * @param lvl The level.
   * @return The level based on the experience given.
   */
  public static int getExpAt(final int lvl) {
    if (lvl > 120) {
      return 1;
    }
    return Skills.XP_TABLE[lvl - 1];
  }

  /**
   * Gets the experience required for the given level.
   *
   * @param lvl The level.
   * @return The level based on the experience given.
   */
  public static int getExpRequired(final int lvl) {
    if (lvl > 120) {
      return 1;
    }
    return Skills.XP_TABLE[lvl];
  }

  /**
   * Gets the skill name of an index.
   *
   * @param index The index.
   * @return The name of the skill for that index.
   */
  public static String getSkillName(final int index) {
    if (index > Skills.SKILL_NAMES.length - 1) {
      return null;
    }
    return Skills.SKILL_NAMES[index];
  }

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

  /**
   * Gets the current experience for the given skill.
   *
   * @param index The index of the skill.
   * @return -1 if the skill is unavailable
   */
  public int getCurrentExp(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    final int[] skills = methods.client.getSkillExperiences();

    if (index > skills.length - 1) {
      return -1;
    }

    return methods.client.getSkillExperiences()[index];
  }

  /**
   * Gets the effective level of the given skill (accounting for temporary
   * boosts and reductions).
   *
   * @param index The index of the skill.
   * @return The current level of the given Skill.
   */
  public int getCurrentLevel(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    return methods.client.getSkillLevels()[index];
  }

  /**
   * Gets the player's current level in a skill based on their experience in
   * that skill.
   *
   * @param index The index of the skill.
   * @return The real level of the skill.
   * @see #getRealLevel(int)
   */
  public int getRealLevel(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    return Skills.getLevelAt(getCurrentExp(index));
  }

  /**
   * Gets the percentage to the next level in a given skill.
   *
   * @param index The index of the skill.
   * @return The percent to the next level of the provided skill or 0 if level
   *         of skill is 99.
   */
  public int getPercentToNextLevel(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    final int lvl = getRealLevel(index);
    return getPercentToLevel(index, lvl + 1);
  }

  /**
   * Gets the percentage to the a level in a given skill.
   *
   * @param index  The index of the skill.
   * @param endLvl The level for the percent.
   * @return The percent to the level provided of the provided skill or 0 if level
   *         of skill is 99.
   */
  public int getPercentToLevel(final int index, final int endLvl) {
    if (!isSkill(index)) {
      return -1;
    }
    final int lvl = getRealLevel(index);
    if (index == Skills.DUNGEONEERING && (lvl == 120 || endLvl > 120)) {
      return 0;
    } else if (lvl == 99 || endLvl > 99) {
      return 0;
    }
    final int xpTotal = Skills.XP_TABLE[endLvl] - Skills.XP_TABLE[lvl];
    if (xpTotal == 0) {
      return 0;
    }
    final int xpDone = getCurrentExp(index) - Skills.XP_TABLE[lvl];
    return 100 * xpDone / xpTotal;
  }

  /**
   * Gets the maximum level of a given skill.
   *
   * @param index The index of the skill.
   * @return The max level of the skill.
   */
  public int getMaxLevel(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    return methods.client.getSkillLevelMaxes()[index];
  }

  /**
   * Gets the maximum experience of a given skill.
   *
   * @param index The index of the skill.
   * @return The max experience of the skill.
   */
  public int getMaxExp(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    return methods.client.getSkillExperiencesMax()[index];
  }

  /**
   * Gets the experience remaining until reaching the next level in a given
   * skill.
   *
   * @param index The index of the skill.
   * @return The experience to the next level of the skill.
   */
  public int getExpToNextLevel(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    final int lvl = getRealLevel(index);
    return getExpToLevel(index, lvl + 1);
  }

  /**
   * Gets the experience remaining until reaching the a level in a given
   * skill.
   *
   * @param index  The index of the skill.
   * @param endLvl The level for the experience remaining.
   * @return The experience to the level provided of the skill.
   */
  public int getExpToLevel(final int index, final int endLvl) {
    if (!isSkill(index)) {
      return -1;
    }
    final int lvl = getRealLevel(index);
    if (index == Skills.DUNGEONEERING && (lvl == 120 || endLvl > 120)) {
      return 0;
    } else if (lvl == 99 || endLvl > 99) {
      return 0;
    }
    return Skills.XP_TABLE[endLvl] - getCurrentExp(index);
  }

  /**
   * Gets the time remaining until the next level.
   *
   * @param index The index of the skill.
   * @param exp   The start Exp.
   * @param time  The time the script has been running.
   * @return The time till the next level of the skill.
   */
  public long getTimeTillNextLevel(final int index, final int exp, final long time) {
    if (!isSkill(index)) {
      return -1;
    }
    final int level = getRealLevel(index);
    return getTimeTillLevel(index, exp, level + 1, time);
  }

  /**
   * Gets the time remaining until the level provided.
   *
   * @param index  The index of the skill.
   * @param exp    The start Exp.
   * @param endLvl The level to get the time till for.
   * @param time   The time the script has been running.
   * @return The time till the level provided of the skill.
   */
  public long getTimeTillLevel(final int index, final int exp, final int endLvl, final long time) {
    if (!isSkill(index)) {
      return -1;
    }
    final int level = getRealLevel(index);
    final int currentExp = getCurrentExp(index);
    if (index == Skills.DUNGEONEERING && level == 120) {
      return 0;
    } else if (level == 99) {
      return 0;
    }
    try {
      return time * getExpToLevel(index, endLvl) / (currentExp - exp);
    } catch (final Exception e) {
      return -1;
    }
  }

  /**
   * Gets the number of actions needed until the next level.
   *
   * @param index The index.
   * @param exp   The exp each action gives.
   * @return How many you need to do until the next level.
   */
  public int ammountTillNextLevel(final int index, final double exp) {
    if (!isSkill(index)) {
      return -1;
    }
    final int level = getRealLevel(index);
    return ammountTillLevel(index, exp, level + 1);
  }

  /**
   * Gets the number of actions needed until the level provided.
   *
   * @param index The index.
   * @param exp   The exp each action gives.
   * @param lvl   The level to get the ammount till for.
   * @return How many you need to do until leveling to the level provided.
   */
  public int ammountTillLevel(final int index, final double exp, final int lvl) {
    if (!isSkill(index)) {
      return -1;
    }
    return getExpToLevel(index, lvl) != -1 ? (int) (getExpToLevel(index, lvl) / exp) : 0;
  }

  /**
   * Gets the total/overall level.
   *
   * @return The total/overall level.
   */
  public int getTotalLevel() {
    int total = 0;
    for (int i = 0; i < Skills.SKILL_NAMES.length - 1; i++) {
      total += getRealLevel(i);
    }
    return total;
  }

  /**
   * Gets the percent to max level in the specified skill index
   *
   * @param index Skill index.
   * @return Percent to level max level.
   */
  public int getPercentToMaxLevel(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    int lvl = 99;
    if (index == Skills.DUNGEONEERING) {
      lvl = 120;
    }
    return getPercentToLevel(index, lvl);
  }

  /**
   * Gets the experience needed to the max level in the specified skill index
   *
   * @param index Skill index.
   * @return Experience to level max level.
   */
  public int getExpToMaxLevel(final int index) {
    if (!isSkill(index)) {
      return -1;
    }
    int lvl = 99;
    if (index == Skills.DUNGEONEERING) {
      lvl = 120;
    }
    return getExpToLevel(index, lvl);
  }

  /**
   * Gets the time remaining until the max level.
   *
   * @param index The index of the skill.
   * @param exp   The start Exp.
   * @param time  The time the script has been running.
   * @return The time till the max level of the skill.
   */
  public long getTimeTillMaxLevel(final int index, final int exp, final long time) {
    if (!isSkill(index)) {
      return -1;
    }
    int lvl = 99;
    if (index == Skills.DUNGEONEERING) {
      lvl = 120;
    }
    return getTimeTillLevel(index, exp, lvl, time);
  }

  /**
   * Gets the number of actions needed until the max level.
   *
   * @param index The index.
   * @param exp   The exp each action gives.
   * @return How many you need to do until the max level.
   */
  public int ammountTillMaxLevel(final int index, final double exp) {
    if (!isSkill(index)) {
      return -1;
    }
    int lvl = 99;
    if (index == Skills.DUNGEONEERING) {
      lvl = 120;
    }
    return ammountTillLevel(index, exp, lvl);
  }

  /**
   * Moves the mouse over a given component in the stats tab.
   *
   * @param component The component index.
   * @return <tt>true</tt> if the mouse was moved over the given component
   *         index.
   */
  public boolean doHover(final int component) {
    methods.game.openTab(Game.Tab.STATS);
    sleep(random(10, 100));
    return methods.interfaces.getComponent(INTERFACE_TAB_STATS, component).doHover();
  }

  /**
   * Checks if one of the given skills is boosted.
   *
   * @param index The index of the skill.
   * @return <tt>true</tt> if one the given skills is boosted.
   */
  public boolean isSkillBoosted(final int... index) {
    if (!isSkill(index)) {
      return false;
    }
    for (int i : index) {
      int realLevel = getRealLevel(i);
      if (realLevel > getMaxLevel(i)) {
        switch (i) {
          case Skills.DUNGEONEERING:
            realLevel = 120;
            break;
          default:
            realLevel = 99;
            break;
        }
      }
      if (realLevel == getCurrentLevel(i)) {
        return false;
      }
    }
    return true;
  }

  /**
   * Checks if this index is not out of range.
   *
   * @param index The index of the skill.
   * @return <tt>true</tt> if this index is not out of range.
   */
  private boolean isSkill(final int... index) {
    for (int i : index) {
      if (i > Skills.SKILL_NAMES.length - 1) {
        return false;
      }
    }
    return true;
  }

  /**
   * Gets a skill data class.
   *
   * @return The <tt>SkillData</tt> class.
   */
  public SkillData getSkillDataInstance() {
    return new SkillData(methods, null);
  }

  /**
   * Gets the current experience for all skills.
   *
   * @return int array of all skill experiences
   */
  public int[] getCurrentExp() {
    return methods.client.getSkillExperiences();
  }
}
TOP

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

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.