Merge branch 'runelite-master'

Finalize pre patch day merge
This commit is contained in:
zeruth
2019-05-23 01:41:02 -04:00
18 changed files with 694 additions and 824 deletions

View File

@@ -96,28 +96,56 @@ public class RuneLiteAPI
.build();
}
public static HttpUrl getApiRoot()
public static HttpUrl getSessionBase()
{
return HttpUrl.parse(BASE);
final String prop = System.getProperty("runelite.session.url");
if (prop != null && !prop.isEmpty())
{
return HttpUrl.parse(prop);
}
return HttpUrl.parse(BASE + "/session");
}
public static HttpUrl getSessionBase()
public static HttpUrl getRuneLitePlusSessionBase()
{
return HttpUrl.parse(RLPLUS);
}
public static HttpUrl getApiBase()
{
final String prop = System.getProperty("runelite.http-service.url");
if (prop != null && !prop.isEmpty())
{
return HttpUrl.parse(prop);
}
return HttpUrl.parse(BASE + "/runelite-" + getVersion());
}
public static HttpUrl getStaticBase()
{
final String prop = System.getProperty("runelite.static.url");
if (prop != null && !prop.isEmpty())
{
return HttpUrl.parse(prop);
}
return HttpUrl.parse(STATICBASE);
}
public static HttpUrl getWsEndpoint()
{
final String prop = System.getProperty("runelite.ws.url");
if (prop != null && !prop.isEmpty())
{
return HttpUrl.parse(prop);
}
return HttpUrl.parse(WSBASE);
}

View File

@@ -24,9 +24,6 @@
*/
package net.runelite.api;
import static java.lang.Math.floor;
import static java.lang.Math.max;
/**
* A utility class used for calculating experience related values.
* <p>
@@ -127,6 +124,15 @@ public class Experience
return high + 1;
}
private static double getMeleeRangeOrMagicCombatLevelContribution(int attackLevel, int strengthLevel, int magicLevel, int rangeLevel)
{
double melee = 0.325 * (attackLevel + strengthLevel);
double range = 0.325 * (Math.floor(rangeLevel / 2) + rangeLevel);
double magic = 0.325 * (Math.floor(magicLevel / 2) + magicLevel);
return Math.max(melee, Math.max(range, magic));
}
/**
* Calculates a non-virtual high-precision combat level without integer
* rounding.
@@ -146,13 +152,11 @@ public class Experience
int defenceLevel, int hitpointsLevel, int magicLevel,
int rangeLevel, int prayerLevel)
{
double base = 0.25 * (defenceLevel + hitpointsLevel + floor(prayerLevel / 2));
double base = 0.25 * (defenceLevel + hitpointsLevel + Math.floor(prayerLevel / 2));
double melee = 0.325 * (attackLevel + strengthLevel);
double range = 0.325 * (floor(rangeLevel / 2) + rangeLevel);
double magic = 0.325 * (floor(magicLevel / 2) + magicLevel);
double typeContribution = getMeleeRangeOrMagicCombatLevelContribution(attackLevel, strengthLevel, magicLevel, rangeLevel);
return base + max(melee, max(range, magic));
return base + typeContribution;
}
/**
@@ -173,4 +177,101 @@ public class Experience
{
return (int) getCombatLevelPrecise(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, magicLevel, rangeLevel, prayerLevel);
}
/**
* Calculate number of attack/strength levels required to increase combat level.
*
* @param attackLevel the attack level
* @param strengthLevel the strength level
* @param defenceLevel the defence level
* @param hitpointsLevel the hitpoints level
* @param magicLevel the magic level
* @param rangeLevel the range level
* @param prayerLevel the prayer level
* @return the number of levels required
*/
public static int getNextCombatLevelMelee(int attackLevel, int strengthLevel, int defenceLevel, int hitpointsLevel,
int magicLevel, int rangeLevel, int prayerLevel)
{
int nextCombatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, magicLevel, rangeLevel, prayerLevel) + 1;
return (int) Math.ceil(-10. / 13 * (defenceLevel + hitpointsLevel + Math.floor(prayerLevel / 2) - 4 * nextCombatLevel)) - strengthLevel - attackLevel;
}
/**
* Calculate number of hitpoints/defence levels required to increase combat level.
*
* @param attackLevel the attack level
* @param strengthLevel the strength level
* @param defenceLevel the defence level
* @param hitpointsLevel the hitpoints level
* @param magicLevel the magic level
* @param rangeLevel the range level
* @param prayerLevel the prayer level
* @return the number of levels required
*/
public static int getNextCombatLevelHpDef(int attackLevel, int strengthLevel, int defenceLevel, int hitpointsLevel,
int magicLevel, int rangeLevel, int prayerLevel)
{
int nextCombatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, magicLevel, rangeLevel, prayerLevel) + 1;
double typeContribution = Experience.getMeleeRangeOrMagicCombatLevelContribution(attackLevel, strengthLevel, magicLevel, rangeLevel);
return (int) Math.ceil(4 * nextCombatLevel - Math.floor(prayerLevel / 2) - 4 * typeContribution) - hitpointsLevel - defenceLevel;
}
/**
* Calculate number of magic levels required to increase combat level.
*
* @param attackLevel the attack level
* @param strengthLevel the strength level
* @param defenceLevel the defence level
* @param hitpointsLevel the hitpoints level
* @param magicLevel the magic level
* @param rangeLevel the range level
* @param prayerLevel the prayer level
* @return the number of levels required
*/
public static int getNextCombatLevelMagic(int attackLevel, int strengthLevel, int defenceLevel, int hitpointsLevel,
int magicLevel, int rangeLevel, int prayerLevel)
{
int nextCombatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, magicLevel, rangeLevel, prayerLevel) + 1;
return (int) Math.ceil(2. / 3 * Math.ceil(-10. / 13 * (hitpointsLevel + defenceLevel - 4 * nextCombatLevel + Math.floor(prayerLevel / 2)))) - magicLevel;
}
/**
* Calculate number of ranged levels required to increase combat level.
*
* @param attackLevel the attack level
* @param strengthLevel the strength level
* @param defenceLevel the defence level
* @param hitpointsLevel the hitpoints level
* @param magicLevel the magic level
* @param rangeLevel the range level
* @param prayerLevel the prayer level
* @return the number of levels required
*/
public static int getNextCombatLevelRange(int attackLevel, int strengthLevel, int defenceLevel, int hitpointsLevel,
int magicLevel, int rangeLevel, int prayerLevel)
{
int nextCombatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, magicLevel, rangeLevel, prayerLevel) + 1;
return (int) Math.ceil(2. / 3 * Math.ceil(-10. / 13 * (hitpointsLevel + defenceLevel - 4 * nextCombatLevel + Math.floor(prayerLevel / 2)))) - rangeLevel;
}
/**
* Calculate number of prayer levels required to increase combat level.
*
* @param attackLevel the attack level
* @param strengthLevel the strength level
* @param defenceLevel the defence level
* @param hitpointsLevel the hitpoints level
* @param magicLevel the magic level
* @param rangeLevel the range level
* @param prayerLevel the prayer level
* @return the number of levels required
*/
public static int getNextCombatLevelPrayer(int attackLevel, int strengthLevel, int defenceLevel, int hitpointsLevel,
int magicLevel, int rangeLevel, int prayerLevel)
{
int nextCombatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel, magicLevel, rangeLevel, prayerLevel) + 1;
double typeContribution = Experience.getMeleeRangeOrMagicCombatLevelContribution(attackLevel, strengthLevel, magicLevel, rangeLevel);
return 2 * (int) Math.ceil(-hitpointsLevel - defenceLevel + 4 * nextCombatLevel - 4 * typeContribution) - prayerLevel;
}
}

View File

@@ -521,7 +521,7 @@ public enum Varbits
/**
* The active tab within the quest interface
*/
QUEST_TAB(8168);
QUEST_TAB(8168),
/**
* Explorer ring

View File

@@ -39,7 +39,7 @@ class SessionClient
{
UUID open() throws IOException
{
HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder()
HttpUrl url = RuneLiteAPI.getRuneLitePlusSessionBase().newBuilder()
.build();
Request request = new Request.Builder()
@@ -61,7 +61,7 @@ class SessionClient
void ping(UUID uuid) throws IOException
{
HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder()
HttpUrl url = RuneLiteAPI.getRuneLitePlusSessionBase().newBuilder()
.addPathSegment("ping")
.addQueryParameter("session", uuid.toString())
.build();
@@ -81,7 +81,7 @@ class SessionClient
void delete(UUID uuid) throws IOException
{
HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder()
HttpUrl url = RuneLiteAPI.getRuneLitePlusSessionBase().newBuilder()
.addQueryParameter("session", uuid.toString())
.build();

View File

@@ -98,6 +98,7 @@ public class ChatCommandManager implements ChatboxInputListener
case MODCHAT:
case FRIENDSCHAT:
case PRIVATECHAT:
case MODPRIVATECHAT:
case PRIVATECHATOUT:
break;
default:

View File

@@ -29,411 +29,8 @@ import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import java.util.Collection;
import java.util.Collections;
import static net.runelite.api.ItemID.ABYSSAL_TENTACLE;
import static net.runelite.api.ItemID.ABYSSAL_WHIP;
import static net.runelite.api.ItemID.AHRIMS_HOOD;
import static net.runelite.api.ItemID.AHRIMS_HOOD_100;
import static net.runelite.api.ItemID.AHRIMS_HOOD_25;
import static net.runelite.api.ItemID.AHRIMS_HOOD_50;
import static net.runelite.api.ItemID.AHRIMS_HOOD_75;
import static net.runelite.api.ItemID.AHRIMS_ROBESKIRT;
import static net.runelite.api.ItemID.AHRIMS_ROBESKIRT_100;
import static net.runelite.api.ItemID.AHRIMS_ROBESKIRT_25;
import static net.runelite.api.ItemID.AHRIMS_ROBESKIRT_50;
import static net.runelite.api.ItemID.AHRIMS_ROBESKIRT_75;
import static net.runelite.api.ItemID.AHRIMS_ROBETOP;
import static net.runelite.api.ItemID.AHRIMS_ROBETOP_100;
import static net.runelite.api.ItemID.AHRIMS_ROBETOP_25;
import static net.runelite.api.ItemID.AHRIMS_ROBETOP_50;
import static net.runelite.api.ItemID.AHRIMS_ROBETOP_75;
import static net.runelite.api.ItemID.AHRIMS_STAFF;
import static net.runelite.api.ItemID.AHRIMS_STAFF_100;
import static net.runelite.api.ItemID.AHRIMS_STAFF_25;
import static net.runelite.api.ItemID.AHRIMS_STAFF_50;
import static net.runelite.api.ItemID.AHRIMS_STAFF_75;
import static net.runelite.api.ItemID.AMULET_OF_FURY;
import static net.runelite.api.ItemID.AMULET_OF_FURY_OR;
import static net.runelite.api.ItemID.AMULET_OF_GLORY;
import static net.runelite.api.ItemID.AMULET_OF_GLORY1;
import static net.runelite.api.ItemID.AMULET_OF_GLORY2;
import static net.runelite.api.ItemID.AMULET_OF_GLORY3;
import static net.runelite.api.ItemID.AMULET_OF_GLORY5;
import static net.runelite.api.ItemID.AMULET_OF_GLORY_T;
import static net.runelite.api.ItemID.AMULET_OF_GLORY_T1;
import static net.runelite.api.ItemID.AMULET_OF_GLORY_T2;
import static net.runelite.api.ItemID.AMULET_OF_GLORY_T3;
import static net.runelite.api.ItemID.AMULET_OF_GLORY_T5;
import static net.runelite.api.ItemID.AMULET_OF_TORTURE;
import static net.runelite.api.ItemID.AMULET_OF_TORTURE_OR;
import static net.runelite.api.ItemID.ANCIENT_WYVERN_SHIELD;
import static net.runelite.api.ItemID.ANCIENT_WYVERN_SHIELD_21634;
import static net.runelite.api.ItemID.ANGUISH_ORNAMENT_KIT;
import static net.runelite.api.ItemID.ARCHERS_RING;
import static net.runelite.api.ItemID.ARCHERS_RING_I;
import static net.runelite.api.ItemID.ARMADYL_GODSWORD;
import static net.runelite.api.ItemID.ARMADYL_GODSWORD_OR;
import static net.runelite.api.ItemID.ARMADYL_GODSWORD_ORNAMENT_KIT;
import static net.runelite.api.ItemID.BANDOS_GODSWORD;
import static net.runelite.api.ItemID.BANDOS_GODSWORD_OR;
import static net.runelite.api.ItemID.BANDOS_GODSWORD_ORNAMENT_KIT;
import static net.runelite.api.ItemID.BERSERKER_RING;
import static net.runelite.api.ItemID.BERSERKER_RING_I;
import static net.runelite.api.ItemID.BLACK_MASK;
import static net.runelite.api.ItemID.BLACK_MASK_1;
import static net.runelite.api.ItemID.BLACK_MASK_10_I;
import static net.runelite.api.ItemID.BLACK_MASK_1_I;
import static net.runelite.api.ItemID.BLACK_MASK_2;
import static net.runelite.api.ItemID.BLACK_MASK_2_I;
import static net.runelite.api.ItemID.BLACK_MASK_3;
import static net.runelite.api.ItemID.BLACK_MASK_3_I;
import static net.runelite.api.ItemID.BLACK_MASK_4;
import static net.runelite.api.ItemID.BLACK_MASK_4_I;
import static net.runelite.api.ItemID.BLACK_MASK_5;
import static net.runelite.api.ItemID.BLACK_MASK_5_I;
import static net.runelite.api.ItemID.BLACK_MASK_6;
import static net.runelite.api.ItemID.BLACK_MASK_6_I;
import static net.runelite.api.ItemID.BLACK_MASK_7;
import static net.runelite.api.ItemID.BLACK_MASK_7_I;
import static net.runelite.api.ItemID.BLACK_MASK_8;
import static net.runelite.api.ItemID.BLACK_MASK_8_I;
import static net.runelite.api.ItemID.BLACK_MASK_9;
import static net.runelite.api.ItemID.BLACK_MASK_9_I;
import static net.runelite.api.ItemID.BLACK_MASK_I;
import static net.runelite.api.ItemID.BLACK_SLAYER_HELMET;
import static net.runelite.api.ItemID.BLACK_SLAYER_HELMET_I;
import static net.runelite.api.ItemID.BONECRUSHER_NECKLACE;
import static net.runelite.api.ItemID.BOTTOMLESS_COMPOST_BUCKET;
import static net.runelite.api.ItemID.BOTTOMLESS_COMPOST_BUCKET_22997;
import static net.runelite.api.ItemID.CRAWS_BOW;
import static net.runelite.api.ItemID.CRAWS_BOW_U;
import static net.runelite.api.ItemID.DARK_BOW;
import static net.runelite.api.ItemID.DARK_BOW_12765;
import static net.runelite.api.ItemID.DARK_BOW_12766;
import static net.runelite.api.ItemID.DARK_BOW_12767;
import static net.runelite.api.ItemID.DARK_BOW_12768;
import static net.runelite.api.ItemID.DARK_BOW_20408;
import static net.runelite.api.ItemID.DARK_INFINITY_BOTTOMS;
import static net.runelite.api.ItemID.DARK_INFINITY_COLOUR_KIT;
import static net.runelite.api.ItemID.DARK_INFINITY_HAT;
import static net.runelite.api.ItemID.DARK_INFINITY_TOP;
import static net.runelite.api.ItemID.DHAROKS_GREATAXE;
import static net.runelite.api.ItemID.DHAROKS_GREATAXE_100;
import static net.runelite.api.ItemID.DHAROKS_GREATAXE_25;
import static net.runelite.api.ItemID.DHAROKS_GREATAXE_50;
import static net.runelite.api.ItemID.DHAROKS_GREATAXE_75;
import static net.runelite.api.ItemID.DHAROKS_HELM;
import static net.runelite.api.ItemID.DHAROKS_HELM_100;
import static net.runelite.api.ItemID.DHAROKS_HELM_25;
import static net.runelite.api.ItemID.DHAROKS_HELM_50;
import static net.runelite.api.ItemID.DHAROKS_HELM_75;
import static net.runelite.api.ItemID.DHAROKS_PLATEBODY;
import static net.runelite.api.ItemID.DHAROKS_PLATEBODY_100;
import static net.runelite.api.ItemID.DHAROKS_PLATEBODY_25;
import static net.runelite.api.ItemID.DHAROKS_PLATEBODY_50;
import static net.runelite.api.ItemID.DHAROKS_PLATEBODY_75;
import static net.runelite.api.ItemID.DHAROKS_PLATELEGS;
import static net.runelite.api.ItemID.DHAROKS_PLATELEGS_100;
import static net.runelite.api.ItemID.DHAROKS_PLATELEGS_25;
import static net.runelite.api.ItemID.DHAROKS_PLATELEGS_50;
import static net.runelite.api.ItemID.DHAROKS_PLATELEGS_75;
import static net.runelite.api.ItemID.DRAGONBONE_NECKLACE;
import static net.runelite.api.ItemID.DRAGONFIRE_SHIELD;
import static net.runelite.api.ItemID.DRAGONFIRE_SHIELD_11284;
import static net.runelite.api.ItemID.DRAGONFIRE_WARD;
import static net.runelite.api.ItemID.DRAGONFIRE_WARD_22003;
import static net.runelite.api.ItemID.DRAGON_BOOTS;
import static net.runelite.api.ItemID.DRAGON_BOOTS_G;
import static net.runelite.api.ItemID.DRAGON_BOOTS_ORNAMENT_KIT;
import static net.runelite.api.ItemID.DRAGON_CHAINBODY_3140;
import static net.runelite.api.ItemID.DRAGON_CHAINBODY_G;
import static net.runelite.api.ItemID.DRAGON_CHAINBODY_ORNAMENT_KIT;
import static net.runelite.api.ItemID.DRAGON_DEFENDER_ORNAMENT_KIT;
import static net.runelite.api.ItemID.DRAGON_DEFENDER_T;
import static net.runelite.api.ItemID.DRAGON_FULL_HELM;
import static net.runelite.api.ItemID.DRAGON_FULL_HELM_G;
import static net.runelite.api.ItemID.DRAGON_FULL_HELM_ORNAMENT_KIT;
import static net.runelite.api.ItemID.DRAGON_KITESHIELD;
import static net.runelite.api.ItemID.DRAGON_KITESHIELD_G;
import static net.runelite.api.ItemID.DRAGON_KITESHIELD_ORNAMENT_KIT;
import static net.runelite.api.ItemID.DRAGON_LEGSSKIRT_ORNAMENT_KIT;
import static net.runelite.api.ItemID.DRAGON_PICKAXE;
import static net.runelite.api.ItemID.DRAGON_PICKAXE_12797;
import static net.runelite.api.ItemID.DRAGON_PLATEBODY;
import static net.runelite.api.ItemID.DRAGON_PLATEBODY_G;
import static net.runelite.api.ItemID.DRAGON_PLATEBODY_ORNAMENT_KIT;
import static net.runelite.api.ItemID.DRAGON_PLATELEGS;
import static net.runelite.api.ItemID.DRAGON_PLATELEGS_G;
import static net.runelite.api.ItemID.DRAGON_PLATESKIRT;
import static net.runelite.api.ItemID.DRAGON_PLATESKIRT_G;
import static net.runelite.api.ItemID.DRAGON_SCIMITAR;
import static net.runelite.api.ItemID.DRAGON_SCIMITAR_OR;
import static net.runelite.api.ItemID.DRAGON_SCIMITAR_ORNAMENT_KIT;
import static net.runelite.api.ItemID.DRAGON_SQ_SHIELD;
import static net.runelite.api.ItemID.DRAGON_SQ_SHIELD_G;
import static net.runelite.api.ItemID.DRAGON_SQ_SHIELD_ORNAMENT_KIT;
import static net.runelite.api.ItemID.ENSOULED_ABYSSAL_HEAD;
import static net.runelite.api.ItemID.ENSOULED_ABYSSAL_HEAD_13508;
import static net.runelite.api.ItemID.ENSOULED_AVIANSIE_HEAD;
import static net.runelite.api.ItemID.ENSOULED_AVIANSIE_HEAD_13505;
import static net.runelite.api.ItemID.ENSOULED_BEAR_HEAD;
import static net.runelite.api.ItemID.ENSOULED_BEAR_HEAD_13463;
import static net.runelite.api.ItemID.ENSOULED_BLOODVELD_HEAD;
import static net.runelite.api.ItemID.ENSOULED_BLOODVELD_HEAD_13496;
import static net.runelite.api.ItemID.ENSOULED_CHAOS_DRUID_HEAD;
import static net.runelite.api.ItemID.ENSOULED_CHAOS_DRUID_HEAD_13472;
import static net.runelite.api.ItemID.ENSOULED_DAGANNOTH_HEAD;
import static net.runelite.api.ItemID.ENSOULED_DAGANNOTH_HEAD_13493;
import static net.runelite.api.ItemID.ENSOULED_DEMON_HEAD;
import static net.runelite.api.ItemID.ENSOULED_DEMON_HEAD_13502;
import static net.runelite.api.ItemID.ENSOULED_DOG_HEAD;
import static net.runelite.api.ItemID.ENSOULED_DOG_HEAD_13469;
import static net.runelite.api.ItemID.ENSOULED_DRAGON_HEAD;
import static net.runelite.api.ItemID.ENSOULED_DRAGON_HEAD_13511;
import static net.runelite.api.ItemID.ENSOULED_ELF_HEAD;
import static net.runelite.api.ItemID.ENSOULED_ELF_HEAD_13481;
import static net.runelite.api.ItemID.ENSOULED_GIANT_HEAD;
import static net.runelite.api.ItemID.ENSOULED_GIANT_HEAD_13475;
import static net.runelite.api.ItemID.ENSOULED_GOBLIN_HEAD;
import static net.runelite.api.ItemID.ENSOULED_GOBLIN_HEAD_13448;
import static net.runelite.api.ItemID.ENSOULED_HORROR_HEAD;
import static net.runelite.api.ItemID.ENSOULED_HORROR_HEAD_13487;
import static net.runelite.api.ItemID.ENSOULED_IMP_HEAD;
import static net.runelite.api.ItemID.ENSOULED_IMP_HEAD_13454;
import static net.runelite.api.ItemID.ENSOULED_KALPHITE_HEAD;
import static net.runelite.api.ItemID.ENSOULED_KALPHITE_HEAD_13490;
import static net.runelite.api.ItemID.ENSOULED_MINOTAUR_HEAD;
import static net.runelite.api.ItemID.ENSOULED_MINOTAUR_HEAD_13457;
import static net.runelite.api.ItemID.ENSOULED_MONKEY_HEAD;
import static net.runelite.api.ItemID.ENSOULED_MONKEY_HEAD_13451;
import static net.runelite.api.ItemID.ENSOULED_OGRE_HEAD;
import static net.runelite.api.ItemID.ENSOULED_OGRE_HEAD_13478;
import static net.runelite.api.ItemID.ENSOULED_SCORPION_HEAD;
import static net.runelite.api.ItemID.ENSOULED_SCORPION_HEAD_13460;
import static net.runelite.api.ItemID.ENSOULED_TROLL_HEAD;
import static net.runelite.api.ItemID.ENSOULED_TROLL_HEAD_13484;
import static net.runelite.api.ItemID.ENSOULED_TZHAAR_HEAD;
import static net.runelite.api.ItemID.ENSOULED_TZHAAR_HEAD_13499;
import static net.runelite.api.ItemID.ENSOULED_UNICORN_HEAD;
import static net.runelite.api.ItemID.ENSOULED_UNICORN_HEAD_13466;
import static net.runelite.api.ItemID.FEROCIOUS_GLOVES;
import static net.runelite.api.ItemID.FROZEN_ABYSSAL_WHIP;
import static net.runelite.api.ItemID.FURY_ORNAMENT_KIT;
import static net.runelite.api.ItemID.GAMES_NECKLACE1;
import static net.runelite.api.ItemID.GAMES_NECKLACE2;
import static net.runelite.api.ItemID.GAMES_NECKLACE3;
import static net.runelite.api.ItemID.GAMES_NECKLACE4;
import static net.runelite.api.ItemID.GAMES_NECKLACE5;
import static net.runelite.api.ItemID.GAMES_NECKLACE6;
import static net.runelite.api.ItemID.GAMES_NECKLACE7;
import static net.runelite.api.ItemID.GAMES_NECKLACE8;
import static net.runelite.api.ItemID.GRANITE_MAUL;
import static net.runelite.api.ItemID.GRANITE_MAUL_12848;
import static net.runelite.api.ItemID.GRANITE_RING;
import static net.runelite.api.ItemID.GRANITE_RING_I;
import static net.runelite.api.ItemID.GREEN_SLAYER_HELMET;
import static net.runelite.api.ItemID.GREEN_SLAYER_HELMET_I;
import static net.runelite.api.ItemID.GUTHANS_CHAINSKIRT;
import static net.runelite.api.ItemID.GUTHANS_CHAINSKIRT_100;
import static net.runelite.api.ItemID.GUTHANS_CHAINSKIRT_25;
import static net.runelite.api.ItemID.GUTHANS_CHAINSKIRT_50;
import static net.runelite.api.ItemID.GUTHANS_CHAINSKIRT_75;
import static net.runelite.api.ItemID.GUTHANS_HELM;
import static net.runelite.api.ItemID.GUTHANS_HELM_100;
import static net.runelite.api.ItemID.GUTHANS_HELM_25;
import static net.runelite.api.ItemID.GUTHANS_HELM_50;
import static net.runelite.api.ItemID.GUTHANS_HELM_75;
import static net.runelite.api.ItemID.GUTHANS_PLATEBODY;
import static net.runelite.api.ItemID.GUTHANS_PLATEBODY_100;
import static net.runelite.api.ItemID.GUTHANS_PLATEBODY_25;
import static net.runelite.api.ItemID.GUTHANS_PLATEBODY_50;
import static net.runelite.api.ItemID.GUTHANS_PLATEBODY_75;
import static net.runelite.api.ItemID.GUTHANS_WARSPEAR;
import static net.runelite.api.ItemID.GUTHANS_WARSPEAR_100;
import static net.runelite.api.ItemID.GUTHANS_WARSPEAR_25;
import static net.runelite.api.ItemID.GUTHANS_WARSPEAR_50;
import static net.runelite.api.ItemID.GUTHANS_WARSPEAR_75;
import static net.runelite.api.ItemID.HYDRA_LEATHER;
import static net.runelite.api.ItemID.HYDRA_SLAYER_HELMET;
import static net.runelite.api.ItemID.HYDRA_SLAYER_HELMET_I;
import static net.runelite.api.ItemID.HYDRA_TAIL;
import static net.runelite.api.ItemID.INFINITY_BOTTOMS;
import static net.runelite.api.ItemID.INFINITY_BOTTOMS_20575;
import static net.runelite.api.ItemID.INFINITY_HAT;
import static net.runelite.api.ItemID.INFINITY_TOP;
import static net.runelite.api.ItemID.INFINITY_TOP_10605;
import static net.runelite.api.ItemID.INFINITY_TOP_20574;
import static net.runelite.api.ItemID.KARILS_COIF;
import static net.runelite.api.ItemID.KARILS_COIF_100;
import static net.runelite.api.ItemID.KARILS_COIF_25;
import static net.runelite.api.ItemID.KARILS_COIF_50;
import static net.runelite.api.ItemID.KARILS_COIF_75;
import static net.runelite.api.ItemID.KARILS_CROSSBOW;
import static net.runelite.api.ItemID.KARILS_CROSSBOW_100;
import static net.runelite.api.ItemID.KARILS_CROSSBOW_25;
import static net.runelite.api.ItemID.KARILS_CROSSBOW_50;
import static net.runelite.api.ItemID.KARILS_CROSSBOW_75;
import static net.runelite.api.ItemID.KARILS_LEATHERSKIRT;
import static net.runelite.api.ItemID.KARILS_LEATHERSKIRT_100;
import static net.runelite.api.ItemID.KARILS_LEATHERSKIRT_25;
import static net.runelite.api.ItemID.KARILS_LEATHERSKIRT_50;
import static net.runelite.api.ItemID.KARILS_LEATHERSKIRT_75;
import static net.runelite.api.ItemID.KARILS_LEATHERTOP;
import static net.runelite.api.ItemID.KARILS_LEATHERTOP_100;
import static net.runelite.api.ItemID.KARILS_LEATHERTOP_25;
import static net.runelite.api.ItemID.KARILS_LEATHERTOP_50;
import static net.runelite.api.ItemID.KARILS_LEATHERTOP_75;
import static net.runelite.api.ItemID.KRAKEN_TENTACLE;
import static net.runelite.api.ItemID.LAVA_BATTLESTAFF;
import static net.runelite.api.ItemID.LAVA_BATTLESTAFF_21198;
import static net.runelite.api.ItemID.LIGHT_INFINITY_BOTTOMS;
import static net.runelite.api.ItemID.LIGHT_INFINITY_COLOUR_KIT;
import static net.runelite.api.ItemID.LIGHT_INFINITY_HAT;
import static net.runelite.api.ItemID.LIGHT_INFINITY_TOP;
import static net.runelite.api.ItemID.MAGIC_SHORTBOW;
import static net.runelite.api.ItemID.MAGIC_SHORTBOW_I;
import static net.runelite.api.ItemID.MAGMA_HELM;
import static net.runelite.api.ItemID.MAGMA_HELM_UNCHARGED;
import static net.runelite.api.ItemID.MALEDICTION_WARD;
import static net.runelite.api.ItemID.MALEDICTION_WARD_12806;
import static net.runelite.api.ItemID.NECKLACE_OF_ANGUISH;
import static net.runelite.api.ItemID.NECKLACE_OF_ANGUISH_OR;
import static net.runelite.api.ItemID.OCCULT_NECKLACE;
import static net.runelite.api.ItemID.OCCULT_NECKLACE_OR;
import static net.runelite.api.ItemID.OCCULT_ORNAMENT_KIT;
import static net.runelite.api.ItemID.ODIUM_WARD;
import static net.runelite.api.ItemID.ODIUM_WARD_12807;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_1;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_2;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_4;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_5;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_6;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_7;
import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_8;
import static net.runelite.api.ItemID.PURPLE_SLAYER_HELMET;
import static net.runelite.api.ItemID.PURPLE_SLAYER_HELMET_I;
import static net.runelite.api.ItemID.RED_SLAYER_HELMET;
import static net.runelite.api.ItemID.RED_SLAYER_HELMET_I;
import static net.runelite.api.ItemID.RING_OF_DUELING1;
import static net.runelite.api.ItemID.RING_OF_DUELING2;
import static net.runelite.api.ItemID.RING_OF_DUELING3;
import static net.runelite.api.ItemID.RING_OF_DUELING4;
import static net.runelite.api.ItemID.RING_OF_DUELING5;
import static net.runelite.api.ItemID.RING_OF_DUELING6;
import static net.runelite.api.ItemID.RING_OF_DUELING7;
import static net.runelite.api.ItemID.RING_OF_DUELING8;
import static net.runelite.api.ItemID.RING_OF_SUFFERING;
import static net.runelite.api.ItemID.RING_OF_SUFFERING_I;
import static net.runelite.api.ItemID.RING_OF_SUFFERING_R;
import static net.runelite.api.ItemID.RING_OF_SUFFERING_RI;
import static net.runelite.api.ItemID.RING_OF_THE_GODS;
import static net.runelite.api.ItemID.RING_OF_THE_GODS_I;
import static net.runelite.api.ItemID.RING_OF_WEALTH;
import static net.runelite.api.ItemID.RING_OF_WEALTH_1;
import static net.runelite.api.ItemID.RING_OF_WEALTH_2;
import static net.runelite.api.ItemID.RING_OF_WEALTH_3;
import static net.runelite.api.ItemID.RING_OF_WEALTH_4;
import static net.runelite.api.ItemID.RING_OF_WEALTH_I;
import static net.runelite.api.ItemID.RING_OF_WEALTH_I1;
import static net.runelite.api.ItemID.RING_OF_WEALTH_I2;
import static net.runelite.api.ItemID.RING_OF_WEALTH_I3;
import static net.runelite.api.ItemID.RING_OF_WEALTH_I4;
import static net.runelite.api.ItemID.RING_OF_WEALTH_I5;
import static net.runelite.api.ItemID.SANGUINESTI_STAFF;
import static net.runelite.api.ItemID.SANGUINESTI_STAFF_UNCHARGED;
import static net.runelite.api.ItemID.SARADOMINS_BLESSED_SWORD;
import static net.runelite.api.ItemID.SARADOMINS_TEAR;
import static net.runelite.api.ItemID.SARADOMIN_GODSWORD;
import static net.runelite.api.ItemID.SARADOMIN_GODSWORD_OR;
import static net.runelite.api.ItemID.SARADOMIN_GODSWORD_ORNAMENT_KIT;
import static net.runelite.api.ItemID.SCYTHE_OF_VITUR;
import static net.runelite.api.ItemID.SCYTHE_OF_VITUR_UNCHARGED;
import static net.runelite.api.ItemID.SEERS_RING;
import static net.runelite.api.ItemID.SEERS_RING_I;
import static net.runelite.api.ItemID.SERPENTINE_HELM;
import static net.runelite.api.ItemID.SERPENTINE_HELM_UNCHARGED;
import static net.runelite.api.ItemID.SKILLS_NECKLACE;
import static net.runelite.api.ItemID.SKILLS_NECKLACE1;
import static net.runelite.api.ItemID.SKILLS_NECKLACE2;
import static net.runelite.api.ItemID.SKILLS_NECKLACE3;
import static net.runelite.api.ItemID.SKILLS_NECKLACE5;
import static net.runelite.api.ItemID.SLAYER_HELMET;
import static net.runelite.api.ItemID.SLAYER_HELMET_I;
import static net.runelite.api.ItemID.STEAM_BATTLESTAFF;
import static net.runelite.api.ItemID.STEAM_BATTLESTAFF_12795;
import static net.runelite.api.ItemID.TANZANITE_HELM;
import static net.runelite.api.ItemID.TANZANITE_HELM_UNCHARGED;
import static net.runelite.api.ItemID.THAMMARONS_SCEPTRE;
import static net.runelite.api.ItemID.THAMMARONS_SCEPTRE_U;
import static net.runelite.api.ItemID.TOME_OF_FIRE;
import static net.runelite.api.ItemID.TOME_OF_FIRE_EMPTY;
import static net.runelite.api.ItemID.TORAGS_HAMMERS;
import static net.runelite.api.ItemID.TORAGS_HAMMERS_100;
import static net.runelite.api.ItemID.TORAGS_HAMMERS_25;
import static net.runelite.api.ItemID.TORAGS_HAMMERS_50;
import static net.runelite.api.ItemID.TORAGS_HAMMERS_75;
import static net.runelite.api.ItemID.TORAGS_HELM;
import static net.runelite.api.ItemID.TORAGS_HELM_100;
import static net.runelite.api.ItemID.TORAGS_HELM_25;
import static net.runelite.api.ItemID.TORAGS_HELM_50;
import static net.runelite.api.ItemID.TORAGS_HELM_75;
import static net.runelite.api.ItemID.TORAGS_PLATEBODY;
import static net.runelite.api.ItemID.TORAGS_PLATEBODY_100;
import static net.runelite.api.ItemID.TORAGS_PLATEBODY_25;
import static net.runelite.api.ItemID.TORAGS_PLATEBODY_50;
import static net.runelite.api.ItemID.TORAGS_PLATEBODY_75;
import static net.runelite.api.ItemID.TORAGS_PLATELEGS;
import static net.runelite.api.ItemID.TORAGS_PLATELEGS_100;
import static net.runelite.api.ItemID.TORAGS_PLATELEGS_25;
import static net.runelite.api.ItemID.TORAGS_PLATELEGS_50;
import static net.runelite.api.ItemID.TORAGS_PLATELEGS_75;
import static net.runelite.api.ItemID.TORTURE_ORNAMENT_KIT;
import static net.runelite.api.ItemID.TOXIC_BLOWPIPE;
import static net.runelite.api.ItemID.TOXIC_BLOWPIPE_EMPTY;
import static net.runelite.api.ItemID.TOXIC_STAFF_OF_THE_DEAD;
import static net.runelite.api.ItemID.TOXIC_STAFF_UNCHARGED;
import static net.runelite.api.ItemID.TREASONOUS_RING;
import static net.runelite.api.ItemID.TREASONOUS_RING_I;
import static net.runelite.api.ItemID.TRIDENT_OF_THE_SEAS;
import static net.runelite.api.ItemID.TRIDENT_OF_THE_SEAS_E;
import static net.runelite.api.ItemID.TRIDENT_OF_THE_SWAMP;
import static net.runelite.api.ItemID.TRIDENT_OF_THE_SWAMP_E;
import static net.runelite.api.ItemID.TURQUOISE_SLAYER_HELMET;
import static net.runelite.api.ItemID.TURQUOISE_SLAYER_HELMET_I;
import static net.runelite.api.ItemID.TYRANNICAL_RING;
import static net.runelite.api.ItemID.TYRANNICAL_RING_I;
import static net.runelite.api.ItemID.UNCHARGED_TOXIC_TRIDENT;
import static net.runelite.api.ItemID.UNCHARGED_TOXIC_TRIDENT_E;
import static net.runelite.api.ItemID.UNCHARGED_TRIDENT;
import static net.runelite.api.ItemID.UNCHARGED_TRIDENT_E;
import static net.runelite.api.ItemID.VERACS_BRASSARD;
import static net.runelite.api.ItemID.VERACS_BRASSARD_100;
import static net.runelite.api.ItemID.VERACS_BRASSARD_25;
import static net.runelite.api.ItemID.VERACS_BRASSARD_50;
import static net.runelite.api.ItemID.VERACS_BRASSARD_75;
import static net.runelite.api.ItemID.VERACS_FLAIL;
import static net.runelite.api.ItemID.VERACS_FLAIL_100;
import static net.runelite.api.ItemID.VERACS_FLAIL_25;
import static net.runelite.api.ItemID.VERACS_FLAIL_50;
import static net.runelite.api.ItemID.VERACS_FLAIL_75;
import static net.runelite.api.ItemID.VERACS_HELM;
import static net.runelite.api.ItemID.VERACS_HELM_100;
import static net.runelite.api.ItemID.VERACS_HELM_25;
import static net.runelite.api.ItemID.VERACS_HELM_50;
import static net.runelite.api.ItemID.VERACS_HELM_75;
import static net.runelite.api.ItemID.VERACS_PLATESKIRT;
import static net.runelite.api.ItemID.VERACS_PLATESKIRT_100;
import static net.runelite.api.ItemID.VERACS_PLATESKIRT_25;
import static net.runelite.api.ItemID.VERACS_PLATESKIRT_50;
import static net.runelite.api.ItemID.VERACS_PLATESKIRT_75;
import static net.runelite.api.ItemID.VIGGORAS_CHAINMACE;
import static net.runelite.api.ItemID.VIGGORAS_CHAINMACE_U;
import static net.runelite.api.ItemID.VOLCANIC_ABYSSAL_WHIP;
import static net.runelite.api.ItemID.WARRIOR_RING;
import static net.runelite.api.ItemID.WARRIOR_RING_I;
import static net.runelite.api.ItemID.ZAMORAK_GODSWORD;
import static net.runelite.api.ItemID.ZAMORAK_GODSWORD_OR;
import static net.runelite.api.ItemID.ZAMORAK_GODSWORD_ORNAMENT_KIT;
import static net.runelite.api.ItemID.*;
/**
* Converts untradeable items to it's tradeable counterparts
@@ -507,6 +104,8 @@ public enum ItemMapping
ITEM_OCCULT_ORNAMENT_KIT(OCCULT_ORNAMENT_KIT, OCCULT_NECKLACE_OR),
ITE_AMULET_OF_FURY(AMULET_OF_FURY, AMULET_OF_FURY_OR),
ITE_FURY_ORNAMENT_KIT(FURY_ORNAMENT_KIT, AMULET_OF_FURY_OR),
ITEM_TORMENTED_BRACELET(TORMENTED_BRACELET, TORMENTED_BRACELET_OR),
ITEM_TORMENTED_ORNAMENT_KIT(TORMENTED_ORNAMENT_KIT, TORMENTED_BRACELET_OR),
// Ensouled heads
ITEM_ENSOULED_GOBLIN_HEAD(ENSOULED_GOBLIN_HEAD_13448, ENSOULED_GOBLIN_HEAD),
@@ -672,4 +271,4 @@ public enum ItemMapping
return mapping.iterator().next();
}
}
}

View File

@@ -264,7 +264,8 @@ public class CannonPlugin extends Plugin
cballsLeft = 0;
}
if (event.getMessage().contains("You pick up the cannon"))
if (event.getMessage().contains("You pick up the cannon")
|| event.getMessage().contains("Your cannon has decayed. Speak to Nulodion to get a new one!"))
{
cannonPlaced = false;
cballsLeft = 0;

View File

@@ -43,11 +43,6 @@ import net.runelite.client.util.ColorUtil;
class CombatLevelOverlay extends Overlay
{
private static final Color COMBAT_LEVEL_COLOUR = new Color(0xff981f);
private static final double PRAY_MULT = 0.125;
static final double ATT_STR_MULT = 0.325;
static final double DEF_HP_MULT = 0.25;
static final double RANGE_MAGIC_LEVEL_MULT = 1.5;
static final double RANGE_MAGIC_MULT = 0.325;
private final Client client;
private final CombatLevelConfig config;
@@ -95,23 +90,20 @@ class CombatLevelOverlay extends Overlay
int defenceLevel = client.getRealSkillLevel(Skill.DEFENCE);
int hitpointsLevel = client.getRealSkillLevel(Skill.HITPOINTS);
int magicLevel = client.getRealSkillLevel(Skill.MAGIC);
int rangedLevel = client.getRealSkillLevel(Skill.RANGED);
int rangeLevel = client.getRealSkillLevel(Skill.RANGED);
int prayerLevel = client.getRealSkillLevel(Skill.PRAYER);
// calculate initial required numbers
double base = DEF_HP_MULT * (defenceLevel + hitpointsLevel + Math.floor(prayerLevel / 2D));
double melee = ATT_STR_MULT * (attackLevel + strengthLevel);
double range = RANGE_MAGIC_MULT * Math.floor(rangedLevel * RANGE_MAGIC_LEVEL_MULT);
double mage = RANGE_MAGIC_MULT * Math.floor(magicLevel * RANGE_MAGIC_LEVEL_MULT);
double max = Math.max(melee, Math.max(range, mage));
// find the needed levels until level up
int next = client.getLocalPlayer().getCombatLevel() + 1;
int meleeNeed = calcLevels(base + melee, next, ATT_STR_MULT);
int hpdefNeed = calcLevels(base + max, next, DEF_HP_MULT);
int prayNeed = calcLevelsPray(base + max, next, prayerLevel);
int rangeNeed = calcLevelsRM(rangedLevel, next, base);
int magicNeed = calcLevelsRM(magicLevel, next, base);
int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// create tooltip string
StringBuilder sb = new StringBuilder();
@@ -121,11 +113,11 @@ class CombatLevelOverlay extends Overlay
{
sb.append(meleeNeed).append(" Attack/Strength</br>");
}
if ((hitpointsLevel + defenceLevel + hpdefNeed) <= Experience.MAX_REAL_LEVEL * 2)
if ((hitpointsLevel + defenceLevel + hpDefNeed) <= Experience.MAX_REAL_LEVEL * 2)
{
sb.append(hpdefNeed).append(" Defence/Hitpoints</br>");
sb.append(hpDefNeed).append(" Defence/Hitpoints</br>");
}
if ((rangedLevel + rangeNeed) <= Experience.MAX_REAL_LEVEL)
if ((rangeLevel + rangeNeed) <= Experience.MAX_REAL_LEVEL)
{
sb.append(rangeNeed).append(" Ranged</br>");
}
@@ -133,76 +125,10 @@ class CombatLevelOverlay extends Overlay
{
sb.append(magicNeed).append(" Magic</br>");
}
if ((prayerLevel + prayNeed) <= Experience.MAX_REAL_LEVEL)
if ((prayerLevel + prayerNeed) <= Experience.MAX_REAL_LEVEL)
{
sb.append(prayNeed).append(" Prayer");
sb.append(prayerNeed).append(" Prayer");
}
return sb.toString();
}
/**
* Calculate skill levels required for increasing combat level, meant
* for all combat skills besides prayer, ranged, and magic.
*
* @param start initial value
* @param end ending value (combat level + 1)
* @param multiple how much adding one skill level will change combat
* @return levels required for a specific skill to level up combat
*/
@VisibleForTesting
static int calcLevels(double start, int end, double multiple)
{
return (int) Math.ceil(calcMultipliedLevels(start, end, multiple));
}
/**
* Calculate skill levels for increasing combat level, meant ONLY for the Prayer skill.
* <p>
* Note: Prayer is a special case, only leveling up upon even level numbers. This is accounted
* for in this function.
* </p>
*
* @param start current combat level
* @param end ending value (combat level + 1)
* @param prayerLevel the player's current prayer level
* @return Prayer levels required to level up combat
*/
@VisibleForTesting
static int calcLevelsPray(double start, int end, int prayerLevel)
{
int neededLevels = (int) Math.ceil(calcMultipliedLevels(start, end, PRAY_MULT));
if (prayerLevel % 2 != 0)
{
neededLevels--;
}
if ((prayerLevel + neededLevels) % 2 != 0)
{
return neededLevels + 1;
}
return neededLevels;
}
private static double calcMultipliedLevels(double start, int end, double multiple)
{
return (end - start) / multiple;
}
/**
* Calculate skill levels required for increasing combat level, meant
* ONLY for Ranged and Magic skills.
*
* @param start either the current ranged or magic level
* @param end ending value (combat level + 1)
* @param dhp defence, hitpoints, and prayer; this is the initial calculated "base" value
* @return levels required for a specific skill to level up combat
*/
@VisibleForTesting
static int calcLevelsRM(double start, int end, double dhp)
{
start = Math.floor(start * RANGE_MAGIC_LEVEL_MULT) * RANGE_MAGIC_MULT;
return (int) Math.ceil((end - dhp - start) / (RANGE_MAGIC_MULT * RANGE_MAGIC_LEVEL_MULT));
}
}

View File

@@ -122,6 +122,7 @@ public class EmojiPlugin extends Plugin
case FRIENDSCHAT:
case PRIVATECHAT:
case PRIVATECHATOUT:
case MODPRIVATECHAT:
break;
default:
return;

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Devin French <https://github.com/devinfrench>
* Copyright (c) 2019, Aleios <https://github.com/aleios>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -172,10 +173,10 @@ public interface ItemChargeConfig extends Config
}
@ConfigItem(
keyName = "showBellowCharges",
name = "Show Bellow Charges",
description = "Configures if ogre bellow item charge is shown",
position = 12
keyName = "showBellowCharges",
name = "Show Bellow Charges",
description = "Configures if ogre bellow item charge is shown",
position = 12
)
default boolean showBellowCharges()
{
@@ -183,10 +184,10 @@ public interface ItemChargeConfig extends Config
}
@ConfigItem(
keyName = "showAbyssalBraceletCharges",
name = "Show Abyssal Bracelet Charges",
description = "Configures if abyssal bracelet item charge is shown",
position = 13
keyName = "showAbyssalBraceletCharges",
name = "Show Abyssal Bracelet Charges",
description = "Configures if abyssal bracelet item charge is shown",
position = 13
)
default boolean showAbyssalBraceletCharges()
{
@@ -204,58 +205,11 @@ public interface ItemChargeConfig extends Config
return false;
}
@ConfigItem(
keyName = "showSlayerBracelets",
name = "Show Slayer Bracelets Charges",
description = "Configures if slayer bracelets' item charges are shown",
position = 15
)
default boolean showSlayerBracelets()
{
return true;
}
@ConfigItem(
keyName = "expeditious",
name = "",
description = "",
hidden = true
)
default int expeditious()
{
return -1;
}
@ConfigItem(
keyName = "expeditious",
name = "",
description = ""
)
void expeditious(int expeditious);
@ConfigItem(
keyName = "slaughter",
name = "",
description = "",
hidden = true
)
default int slaughter()
{
return -1;
}
@ConfigItem(
keyName = "slaughter",
name = "",
description = ""
)
void slaughter(int slaughter);
@ConfigItem(
keyName = "showBindingNecklaceCharges",
name = "Show Binding Necklace Charges",
description = "Configures if binding necklace item charge is shown",
position = 16
position = 15
)
default boolean showBindingNecklaceCharges()
{
@@ -284,7 +238,7 @@ public interface ItemChargeConfig extends Config
keyName = "bindingNotification",
name = "Binding Necklace Notification",
description = "Configures if the binding necklace breaking notification is shown",
position = 17
position = 16
)
default boolean bindingNotification()
{
@@ -292,39 +246,119 @@ public interface ItemChargeConfig extends Config
}
@ConfigItem(
keyName = "showXericTalismanCharges",
name = "Show Xeric's Talisman Charges",
description = "Configures if Xeric's Talisman item charge is shown",
position = 18
keyName = "showExplorerRingCharges",
name = "Show Explorer's Ring Alch Charges",
description = "Configures if explorer's ring alchemy charges are shown",
position = 17
)
default boolean showXericTalismanCharges()
default boolean showExplorerRingCharges()
{
return false;
return true;
}
@ConfigItem(
keyName = "xericTalisman",
keyName = "explorerRing",
name = "",
description = "",
hidden = true
)
default int explorerRing()
{
return -1;
}
@ConfigItem(
keyName = "explorerRing",
name = "",
description = ""
)
void explorerRing(int explorerRing);
@ConfigItem(
keyName = "showInfoboxes",
name = "Show Infoboxes",
description = "Configures whether to show an infobox equipped charge items",
position = 18
)
default boolean showInfoboxes()
{
return false;
}
@ConfigItem(
keyName = "showSlayerBracelets",
name = "Show Slayer Bracelets Charges",
description = "Configures if slayer bracelets' item charges are shown",
position = 19
)
default boolean showSlayerBracelets()
{
return true;
}
@ConfigItem(
keyName = "expeditious",
name = "",
description = "",
hidden = true
)
default int expeditious()
{
return -1;
}
@ConfigItem(
keyName = "expeditious",
name = "",
description = ""
)
void expeditious(int expeditious);
@ConfigItem(
keyName = "slaughter",
name = "",
description = "",
hidden = true
)
default int slaughter()
{
return -1;
}
@ConfigItem(
keyName = "slaughter",
name = "",
description = ""
)
void slaughter(int slaughter);
@ConfigItem(
keyName = "xericTalisman",
name = "",
description = "",
hidden = true
)
default int xericTalisman()
{
return -1;
}
@ConfigItem(
keyName = "xericTalisman",
name = "",
description = ""
keyName = "xericTalisman",
name = "",
description = ""
)
void xericTalisman(int xericTalisman);
@ConfigItem(
keyName = "showSoulBearerCharges",
name = "Show Soul Bearer Charges",
description = "Configures if Soul Bearer item charge is shown",
position = 19
keyName = "showSoulBearerCharges",
name = "Show Soul Bearer Charges",
description = "Configures if Soul Bearer item charge is shown",
position = 19
)
default boolean showSoulBearerCharges()
{
@@ -332,10 +366,10 @@ public interface ItemChargeConfig extends Config
}
@ConfigItem(
keyName = "soulBearer",
name = "",
description = "",
hidden = true
keyName = "soulBearer",
name = "",
description = "",
hidden = true
)
default int soulBearer()
{
@@ -343,17 +377,17 @@ public interface ItemChargeConfig extends Config
}
@ConfigItem(
keyName = "soulBearer",
name = "",
description = ""
keyName = "soulBearer",
name = "",
description = ""
)
void soulBearer(int soulBearer);
@ConfigItem(
keyName = "showChronicleCharges",
name = "Show Chronicle Charges",
description = "Configures if Chronicle item charge is shown",
position = 20
keyName = "showChronicleCharges",
name = "Show Chronicle Charges",
description = "Configures if Chronicle item charge is shown",
position = 20
)
default boolean showChronicleCharges()
{
@@ -361,34 +395,18 @@ public interface ItemChargeConfig extends Config
}
@ConfigItem(
keyName = "chronicle",
name = "",
description = "",
hidden = true
keyName = "showXericTalismanCharges",
name = "Show Xeric's Talisman Charges",
description = "Configures if Xeric's Talisman item charge is shown",
position = 21
)
default int chronicle()
{
return -1;
}
@ConfigItem(
keyName = "chronicle",
name = "",
description = ""
)
void chronicle(int chronicle);
@ConfigItem(
keyName = "showInfoboxes",
name = "Show Infoboxes",
description = "Configures whether to show an infobox equipped charge items",
position = 21
)
default boolean showInfoboxes()
default boolean showXericTalismanCharges()
{
return false;
}
@ConfigItem(
keyName = "showrecoil",
name = "Show If Recoil is activated",
@@ -399,4 +417,23 @@ public interface ItemChargeConfig extends Config
{
return false;
}
}
@ConfigItem(
keyName = "chronicle",
name = "",
description = "",
hidden = true
)
default int chronicle()
{
return -1;
}
@ConfigItem(
keyName = "chronicle",
name = "",
description = ""
)
void chronicle(int chronicle);
}

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2017, Seth <Sethtroll3@gmail.com>
* Copyright (c) 2019, Aleios <https://github.com/aleios>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -126,6 +127,15 @@ class ItemChargeOverlay extends WidgetItemOverlay
}
charges = config.chronicle();
}
else if (itemId >= ItemID.EXPLORERS_RING_1 && itemId <= ItemID.EXPLORERS_RING_4)
{
if (!config.showExplorerRingCharges())
{
return;
}
charges = config.explorerRing();
}
else
{
@@ -164,6 +174,6 @@ class ItemChargeOverlay extends WidgetItemOverlay
{
return config.showTeleportCharges() || config.showDodgyCount() || config.showFungicideCharges()
|| config.showImpCharges() || config.showWateringCanCharges() || config.showWaterskinCharges()
|| config.showBellowCharges() || config.showAbyssalBraceletCharges();
|| config.showBellowCharges() || config.showAbyssalBraceletCharges() || config.showExplorerRingCharges();
}
}

View File

@@ -1,6 +1,7 @@
/*
* Copyright (c) 2017, Seth <Sethtroll3@gmail.com>
* Copyright (c) 2018, Hydrox6 <ikada@protonmail.ch>
* Copyright (c) 2019, Aleios <https://github.com/aleios>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -41,13 +42,14 @@ import net.runelite.api.InventoryID;
import net.runelite.api.Item;
import net.runelite.api.ItemContainer;
import net.runelite.api.ItemID;
import static net.runelite.api.ItemID.RING_OF_RECOIL;
import net.runelite.api.Varbits;
import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.GraphicChanged;
import net.runelite.api.events.ItemContainerChanged;
import net.runelite.api.events.ScriptCallbackEvent;
import net.runelite.api.events.VarbitChanged;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.Notifier;
@@ -60,6 +62,8 @@ import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.ui.overlay.infobox.InfoBoxManager;
import net.runelite.client.util.Text;
import static net.runelite.api.ItemID.RING_OF_RECOIL;
@PluginDescriptor(
name = "Item Charges",
description = "Show number of item charges remaining",
@@ -120,6 +124,9 @@ public class ItemChargePlugin extends Plugin
private static final int MAX_SLAUGHTER_CHARGES = 30;
private static final int MAX_EXPEDITIOUS_CHARGES = 30;
private static final int MAX_BINDING_CHARGES = 16;
private static final int MAX_EXPLORER_RING_CHARGES = 30;
private int lastExplorerRingCharge = -1;
@Getter(AccessLevel.PACKAGE)
private boolean ringOfRecoilAvailable = false;
@@ -219,6 +226,11 @@ public class ItemChargePlugin extends Plugin
{
removeInfobox(ItemWithSlot.BINDING_NECKLACE);
}
if (!config.showExplorerRingCharges())
{
removeInfobox(ItemWithSlot.EXPLORER_RING);
}
}
@Subscribe
@@ -380,6 +392,11 @@ public class ItemChargePlugin extends Plugin
{
updateJewelleryInfobox(ItemWithSlot.BINDING_NECKLACE, items);
}
if (config.showExplorerRingCharges())
{
updateJewelleryInfobox(ItemWithSlot.EXPLORER_RING, items);
}
}
@Subscribe
@@ -510,6 +527,16 @@ public class ItemChargePlugin extends Plugin
}
}
@Subscribe
private void onVarbitChanged(VarbitChanged event)
{
int explorerRingCharge = client.getVar(Varbits.EXPLORER_RING_ALCHS);
if (lastExplorerRingCharge != explorerRingCharge)
{
updateExplorerRingCharges(explorerRingCharge);
}
}
private void updateDodgyNecklaceCharges(final int value)
{
config.dodgyNecklace(value);
@@ -577,7 +604,7 @@ public class ItemChargePlugin extends Plugin
updateJewelleryInfobox(ItemWithSlot.BINDING_NECKLACE, itemContainer.getItems());
}
}
private void updateXericCharges(int xericCharges)
{
config.xericTalisman(xericCharges);
@@ -592,6 +619,24 @@ public class ItemChargePlugin extends Plugin
{
config.chronicle(chronicleCharges);
}
private void updateExplorerRingCharges(final int value)
{
// Note: Varbit counts upwards. We count down from the maximum charges.
config.explorerRing(MAX_EXPLORER_RING_CHARGES - value);
if (config.showInfoboxes() && config.showExplorerRingCharges())
{
final ItemContainer itemContainer = client.getItemContainer(InventoryID.EQUIPMENT);
if (itemContainer == null)
{
return;
}
updateJewelleryInfobox(ItemWithSlot.EXPLORER_RING, itemContainer.getItems());
}
}
private void checkDestroyWidget()
{
@@ -663,6 +708,10 @@ public class ItemChargePlugin extends Plugin
{
charges = config.bindingNecklace();
}
else if ((id >= ItemID.EXPLORERS_RING_1 && id <= ItemID.EXPLORERS_RING_4) && type == ItemWithSlot.EXPLORER_RING)
{
charges = config.explorerRing();
}
}
else if (itemWithCharge.getType() == type.getType())
{

View File

@@ -36,5 +36,6 @@ enum ItemChargeType
DODGY_NECKLACE,
BRACELET_OF_SLAUGHTER,
EXPEDITIOUS_BRACELET,
BINDING_NECKLACE
}
BINDING_NECKLACE,
EXPLORER_RING
}

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2019, Tomas Slusny <slusnucky@gmail.com>
* Copyright (c) 2019, Aleios <https://github.com/aleios>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -37,6 +38,7 @@ enum ItemWithSlot
EXPEDITIOUS_BRACELET(ItemChargeType.EXPEDITIOUS_BRACELET, EquipmentInventorySlot.GLOVES),
DODGY_NECKLACE(ItemChargeType.DODGY_NECKLACE, EquipmentInventorySlot.AMULET),
BINDING_NECKLACE(ItemChargeType.BINDING_NECKLACE, EquipmentInventorySlot.AMULET),
EXPLORER_RING(ItemChargeType.EXPLORER_RING, EquipmentInventorySlot.RING),
TELEPORT(ItemChargeType.TELEPORT, EquipmentInventorySlot.WEAPON, EquipmentInventorySlot.AMULET, EquipmentInventorySlot.GLOVES, EquipmentInventorySlot.RING);
private final ItemChargeType type;

View File

@@ -125,16 +125,32 @@ class XpInfoBoxOverlay extends Overlay
.right(StackFormatter.quantityToRSDecimalStack(rightNum, true))
.build();
final LineComponent xpHour = LineComponent.builder()
.left("XP/Hour:")
.right(StackFormatter.quantityToRSDecimalStack(snapshot.getXpPerHour(), true))
.build();
final String bottemLeftStr;
final int bottomRightNum;
switch (config.onScreenDisplayModeBottom())
{
case ACTIONS_HOUR:
bottemLeftStr = snapshot.getActionType().getLabel() + "/Hour";
bottomRightNum = snapshot.getActionsPerHour();
break;
case XP_HOUR:
default:
bottemLeftStr = "XP/Hour";
bottomRightNum = snapshot.getXpPerHour();
break;
}
final LineComponent xpLineBottom = LineComponent.builder()
.left(bottemLeftStr + ":")
.right(StackFormatter.quantityToRSDecimalStack(bottomRightNum, true))
.build();
final SplitComponent xpSplit = SplitComponent.builder()
.first(xpLine)
.second(xpHour)
.orientation(ComponentOrientation.VERTICAL)
.build();
.first(xpLine)
.second(xpLineBottom)
.orientation(ComponentOrientation.VERTICAL)
.build();
final ImageComponent imageComponent = new ImageComponent(icon);
final SplitComponent iconXpSplit = SplitComponent.builder()

View File

@@ -41,6 +41,13 @@ public interface XpTrackerConfig extends Config
ACTIONS_LEFT
}
@AllArgsConstructor
enum OnScreenDisplayModeBottom
{
XP_HOUR,
ACTIONS_HOUR,
}
@ConfigItem(
position = 0,
keyName = "hideMaxed",
@@ -88,11 +95,22 @@ public interface XpTrackerConfig extends Config
@ConfigItem(
position = 4,
keyName = "onScreenDisplayMode",
name = "On-screen tracker display mode",
name = "On-screen tracker display mode (top)",
description = "Configures the information displayed in the first line of on-screen XP overlays"
)
default OnScreenDisplayMode onScreenDisplayMode()
{
return OnScreenDisplayMode.XP_GAINED;
}
@ConfigItem(
position = 4,
keyName = "onScreenDisplayModeBottom",
name = "On-screen tracker display mode (bottom)",
description = "Configures the information displayed in the second line of on-screen XP overlays"
)
default OnScreenDisplayModeBottom onScreenDisplayModeBottom()
{
return OnScreenDisplayModeBottom.XP_HOUR;
}
}

View File

@@ -460,7 +460,7 @@
"level": 60,
"sprite": 354,
"name": "Bones To Peaches",
"xp": 65
"xp": 35.5
},
{
"level": 61,

View File

@@ -24,209 +24,184 @@
*/
package net.runelite.client.plugins.combatlevel;
import com.google.inject.Guice;
import com.google.inject.testing.fieldbinder.Bind;
import com.google.inject.testing.fieldbinder.BoundFieldModule;
import net.runelite.api.Client;
import net.runelite.api.Player;
import net.runelite.api.Skill;
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.calcLevels;
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.calcLevelsPray;
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.calcLevelsRM;
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.ATT_STR_MULT;
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.DEF_HP_MULT;
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.RANGE_MAGIC_LEVEL_MULT;
import static net.runelite.client.plugins.combatlevel.CombatLevelOverlay.RANGE_MAGIC_MULT;
import net.runelite.api.Experience;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import static org.mockito.Mockito.when;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.HashMap;
@RunWith(MockitoJUnitRunner.class)
public class CombatLevelPluginTest
{
@Mock
@Bind
private Client client;
@Mock
private Player player;
@Before
public void setUp()
{
Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this);
when(client.getLocalPlayer()).thenReturn(player);
}
private HashMap<String, Double> getBaseValues()
{
int attackLevel = client.getRealSkillLevel(Skill.ATTACK);
int strengthLevel = client.getRealSkillLevel(Skill.STRENGTH);
int defenceLevel = client.getRealSkillLevel(Skill.DEFENCE);
int hitpointsLevel = client.getRealSkillLevel(Skill.HITPOINTS);
int magicLevel = client.getRealSkillLevel(Skill.MAGIC);
int rangedLevel = client.getRealSkillLevel(Skill.RANGED);
int prayerLevel = client.getRealSkillLevel(Skill.PRAYER);
double base = DEF_HP_MULT * (defenceLevel + hitpointsLevel + Math.floor(prayerLevel / 2));
double melee = ATT_STR_MULT * (attackLevel + strengthLevel);
double range = RANGE_MAGIC_MULT * Math.floor(rangedLevel * RANGE_MAGIC_LEVEL_MULT);
double mage = RANGE_MAGIC_MULT * Math.floor(magicLevel * RANGE_MAGIC_LEVEL_MULT);
double max = Math.max(melee, Math.max(range, mage));
HashMap<String, Double> result = new HashMap<>();
result.put("base", base);
result.put("melee", melee);
result.put("max", max);
return result;
}
@Test
public void testNewPlayer()
{
when(player.getCombatLevel()).thenReturn(3);
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(1);
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(1);
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(1);
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(1);
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(1);
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(1);
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(10);
int attackLevel = 1;
int strengthLevel = 1;
int defenceLevel = 1;
int hitpointsLevel = 10;
int magicLevel = 1;
int rangeLevel = 1;
int prayerLevel = 1;
HashMap<String, Double> baseValues = getBaseValues();
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(3, combatLevel);
// test attack/strength
assertEquals(2, calcLevels(baseValues.get("base") + baseValues.get("melee"),
player.getCombatLevel() + 1, ATT_STR_MULT));
assertEquals(2, meleeNeed);
// test defence/hitpoints
assertEquals(3, calcLevels(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, DEF_HP_MULT));
// test prayer
assertEquals(5, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
assertEquals(3, hpDefNeed);
// test ranged
assertEquals(2, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
player.getCombatLevel() + 1, baseValues.get("base")));
assertEquals(2, rangeNeed);
// test magic
assertEquals(2, calcLevelsRM(client.getRealSkillLevel(Skill.MAGIC),
player.getCombatLevel() + 1, baseValues.get("base")));
assertEquals(2, magicNeed);
// test prayer
assertEquals(5, prayerNeed);
}
@Test
public void testAll10()
{
when(player.getCombatLevel()).thenReturn(12);
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(10);
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(10);
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(10);
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(10);
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(10);
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(10);
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(10);
int attackLevel = 10;
int strengthLevel = 10;
int defenceLevel = 10;
int hitpointsLevel = 10;
int magicLevel = 10;
int rangeLevel = 10;
int prayerLevel = 10;
HashMap<String, Double> baseValues = getBaseValues();
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(12, combatLevel);
// test attack/strength
assertEquals(1, calcLevels(baseValues.get("base") + baseValues.get("melee"),
player.getCombatLevel() + 1, ATT_STR_MULT));
assertEquals(1, meleeNeed);
// test defence/hitpoints
assertEquals(1, calcLevels(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, DEF_HP_MULT));
// test prayer
assertEquals(2, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
assertEquals(1, hpDefNeed);
// test ranged
assertEquals(4, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
player.getCombatLevel() + 1, baseValues.get("base")));
assertEquals(4, rangeNeed);
// test magic
assertEquals(4, calcLevelsRM(client.getRealSkillLevel(Skill.MAGIC),
player.getCombatLevel() + 1, baseValues.get("base")));
assertEquals(4, magicNeed);
// test prayer
assertEquals(2, prayerNeed);
}
@Test
public void testPlayerBmid()
{
// snapshot of current stats 2018-10-2
when(player.getCombatLevel()).thenReturn(83);
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(65);
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(70);
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(60);
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(56);
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(75);
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(73);
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(71);
int attackLevel = 65;
int strengthLevel = 70;
int defenceLevel = 60;
int hitpointsLevel = 71;
int magicLevel = 73;
int rangeLevel = 75;
int prayerLevel = 56;
HashMap<String, Double> baseValues = getBaseValues();
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(83, combatLevel);
// test attack/strength
assertEquals(2, calcLevels(baseValues.get("base") + baseValues.get("melee"),
player.getCombatLevel() + 1, ATT_STR_MULT));
assertEquals(2, meleeNeed);
// test defence/hitpoints
assertEquals(2, calcLevels(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, DEF_HP_MULT));
// test prayer
assertEquals(4, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
assertEquals(2, hpDefNeed);
// test ranged
assertEquals(17, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
player.getCombatLevel() + 1, baseValues.get("base")));
assertEquals(17, rangeNeed);
// test magic
assertEquals(19, calcLevelsRM(client.getRealSkillLevel(Skill.MAGIC),
player.getCombatLevel() + 1, baseValues.get("base")));
assertEquals(19, magicNeed);
// test prayer
assertEquals(4, prayerNeed);
}
@Test
public void testPlayerRunelite()
{
// snapshot of current stats 2018-10-2
when(player.getCombatLevel()).thenReturn(43);
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(43);
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(36);
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(1);
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(15);
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(51);
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(64);
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(42);
int attackLevel = 43;
int strengthLevel = 36;
int defenceLevel = 1;
int hitpointsLevel = 42;
int magicLevel = 64;
int rangeLevel = 51;
int prayerLevel = 15;
HashMap<String, Double> baseValues = getBaseValues();
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(43, combatLevel);
// test attack/strength
assertEquals(18, calcLevels(baseValues.get("base") + baseValues.get("melee"),
player.getCombatLevel() + 1, ATT_STR_MULT));
assertEquals(18, meleeNeed);
// test defence/hitpoints
assertEquals(2, calcLevels(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, DEF_HP_MULT));
// test prayer
assertEquals(3, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
assertEquals(2, hpDefNeed);
// test ranged
assertEquals(14, calcLevelsRM(client.getRealSkillLevel(Skill.RANGED),
player.getCombatLevel() + 1, baseValues.get("base")));
assertEquals(14, rangeNeed);
// test magic
assertEquals(1, calcLevelsRM(client.getRealSkillLevel(Skill.MAGIC),
player.getCombatLevel() + 1, baseValues.get("base")));
assertEquals(1, magicNeed);
// test prayer
assertEquals(3, prayerNeed);
}
@Test
@@ -234,83 +209,188 @@ public class CombatLevelPluginTest
{
// snapshot of current stats 2018-10-3
// Zezima cannot earn a combat level from ranged/magic anymore, so it won't show as the result is too high
when(player.getCombatLevel()).thenReturn(90);
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(74);
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(74);
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(72);
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(52);
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(44);
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(60);
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(72);
int attackLevel = 74;
int strengthLevel = 74;
int defenceLevel = 72;
int hitpointsLevel = 72;
int magicLevel = 60;
int rangeLevel = 44;
int prayerLevel = 52;
HashMap<String, Double> baseValues = getBaseValues();
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(90, combatLevel);
// test attack/strength
assertEquals(2, calcLevels(baseValues.get("base") + baseValues.get("melee"),
player.getCombatLevel() + 1, ATT_STR_MULT));
assertEquals(2, meleeNeed);
// test defence/hitpoints
assertEquals(2, calcLevels(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, DEF_HP_MULT));
assertEquals(2, hpDefNeed);
// test prayer
assertEquals(4, calcLevelsPray(baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1, client.getRealSkillLevel(Skill.PRAYER)));
assertEquals(4, prayerNeed);
}
@Test
public void testPrayerLevelsNeeded()
{
when(player.getCombatLevel()).thenReturn(124);
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(99);
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(99);
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(99);
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(89);
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(99);
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(99);
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(99);
int attackLevel = 99;
int strengthLevel = 99;
int defenceLevel = 99;
int hitpointsLevel = 99;
int magicLevel = 99;
int rangeLevel = 99;
int prayerLevel = 89;
assertEquals(1, neededPrayerLevels());
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(124, combatLevel);
// test prayer
assertEquals(1, prayerNeed);
}
@Test
public void testEvenPrayerLevelsNeededWhenNearNextCombatLevel()
{
when(player.getCombatLevel()).thenReturn(90);
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(74);
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(75);
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(72);
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(52);
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(44);
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(60);
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(72);
int attackLevel = 74;
int strengthLevel = 75;
int defenceLevel = 72;
int hitpointsLevel = 72;
int magicLevel = 60;
int rangeLevel = 44;
int prayerLevel = 52;
assertEquals(2, neededPrayerLevels());
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(90, combatLevel);
// test prayer
assertEquals(2, prayerNeed);
}
@Test
public void testOddPrayerLevelsNeededWhenNearNextCombatLevel()
{
when(player.getCombatLevel()).thenReturn(90);
when(client.getRealSkillLevel(Skill.ATTACK)).thenReturn(74);
when(client.getRealSkillLevel(Skill.STRENGTH)).thenReturn(75);
when(client.getRealSkillLevel(Skill.DEFENCE)).thenReturn(72);
when(client.getRealSkillLevel(Skill.PRAYER)).thenReturn(53);
when(client.getRealSkillLevel(Skill.RANGED)).thenReturn(44);
when(client.getRealSkillLevel(Skill.MAGIC)).thenReturn(60);
when(client.getRealSkillLevel(Skill.HITPOINTS)).thenReturn(72);
int attackLevel = 74;
int strengthLevel = 75;
int defenceLevel = 72;
int hitpointsLevel = 72;
int magicLevel = 60;
int rangeLevel = 44;
int prayerLevel = 53;
assertEquals(1, neededPrayerLevels());
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(90, combatLevel);
// test prayer
assertEquals(1, prayerNeed);
}
private int neededPrayerLevels()
@Test
public void testNextMagicLevelBarelyReachesNextCombatLevel()
{
HashMap<String, Double> baseValues = getBaseValues();
int attackLevel = 40;
int strengthLevel = 44;
int defenceLevel = 46;
int hitpointsLevel = 39;
int magicLevel = 57;
int rangeLevel = 40;
int prayerLevel = 29;
return calcLevelsPray(
baseValues.get("base") + baseValues.get("max"),
player.getCombatLevel() + 1,
client.getRealSkillLevel(Skill.PRAYER)
);
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(52, combatLevel);
// test attack/strength
assertEquals(3, meleeNeed);
// test defence/hitpoints
assertEquals(3, hpDefNeed);
// test ranged
assertEquals(18, rangeNeed);
// test magic
assertEquals(1, magicNeed);
// test prayer
assertEquals(5, prayerNeed);
}
@Test
public void testRangeMagicLevelsNeeded()
{
int attackLevel = 60;
int strengthLevel = 69;
int defenceLevel = 1;
int hitpointsLevel = 78;
int magicLevel = 85;
int rangeLevel = 85;
int prayerLevel = 52;
int combatLevel = Experience.getCombatLevel(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int meleeNeed = Experience.getNextCombatLevelMelee(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int hpDefNeed = Experience.getNextCombatLevelHpDef(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int rangeNeed = Experience.getNextCombatLevelRange(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int magicNeed = Experience.getNextCombatLevelMagic(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
int prayerNeed = Experience.getNextCombatLevelPrayer(attackLevel, strengthLevel, defenceLevel, hitpointsLevel,
magicLevel, rangeLevel, prayerLevel);
// test combat level
assertEquals(68, combatLevel);
// test attack/strength
assertEquals(3, meleeNeed);
// test defence/hitpoints
assertEquals(4, hpDefNeed);
// test ranged
assertEquals(3, rangeNeed);
// test magic
assertEquals(3, magicNeed);
// test prayer
assertEquals(8, prayerNeed);
}
}