diff --git a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java index c79d04056a..9155b39ecf 100644 --- a/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java +++ b/http-api/src/main/java/net/runelite/http/api/RuneLiteAPI.java @@ -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); } diff --git a/runelite-api/src/main/java/net/runelite/api/Experience.java b/runelite-api/src/main/java/net/runelite/api/Experience.java index 088a88d544..d83a61c97b 100644 --- a/runelite-api/src/main/java/net/runelite/api/Experience.java +++ b/runelite-api/src/main/java/net/runelite/api/Experience.java @@ -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. *

@@ -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; + } } diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 2fb6302e68..d6dd3bdd3f 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -521,7 +521,7 @@ public enum Varbits /** * The active tab within the quest interface */ - QUEST_TAB(8168); + QUEST_TAB(8168), /** * Explorer ring diff --git a/runelite-client/src/main/java/net/runelite/client/SessionClient.java b/runelite-client/src/main/java/net/runelite/client/SessionClient.java index dd85b83aad..e88d558136 100644 --- a/runelite-client/src/main/java/net/runelite/client/SessionClient.java +++ b/runelite-client/src/main/java/net/runelite/client/SessionClient.java @@ -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(); diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java index d4a3964e08..b1aa9b3ac2 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatCommandManager.java @@ -98,6 +98,7 @@ public class ChatCommandManager implements ChatboxInputListener case MODCHAT: case FRIENDSCHAT: case PRIVATECHAT: + case MODPRIVATECHAT: case PRIVATECHATOUT: break; default: diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java index b0e70bcd49..b0bb628fed 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java @@ -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(); } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java index a88552e37e..6b82e45aca 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cannon/CannonPlugin.java @@ -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; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java index 95bc61fbb8..2f5aca61c2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/combatlevel/CombatLevelOverlay.java @@ -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
"); } - if ((hitpointsLevel + defenceLevel + hpdefNeed) <= Experience.MAX_REAL_LEVEL * 2) + if ((hitpointsLevel + defenceLevel + hpDefNeed) <= Experience.MAX_REAL_LEVEL * 2) { - sb.append(hpdefNeed).append(" Defence/Hitpoints
"); + sb.append(hpDefNeed).append(" Defence/Hitpoints
"); } - if ((rangedLevel + rangeNeed) <= Experience.MAX_REAL_LEVEL) + if ((rangeLevel + rangeNeed) <= Experience.MAX_REAL_LEVEL) { sb.append(rangeNeed).append(" Ranged
"); } @@ -133,76 +125,10 @@ class CombatLevelOverlay extends Overlay { sb.append(magicNeed).append(" Magic
"); } - 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. - *

- * Note: Prayer is a special case, only leveling up upon even level numbers. This is accounted - * for in this function. - *

- * - * @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)); - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java index bfca89c184..988e73a625 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/EmojiPlugin.java @@ -122,6 +122,7 @@ public class EmojiPlugin extends Plugin case FRIENDSCHAT: case PRIVATECHAT: case PRIVATECHATOUT: + case MODPRIVATECHAT: break; default: return; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java index 7bb41bfabf..18b9d6386b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeConfig.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2017, Devin French + * Copyright (c) 2019, 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; } -} \ No newline at end of file + + @ConfigItem( + keyName = "chronicle", + name = "", + description = "", + hidden = true + ) + default int chronicle() + { + return -1; + } + + @ConfigItem( + keyName = "chronicle", + name = "", + description = "" + ) + void chronicle(int chronicle); + +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java index 5cdb7ae66e..19f9ff94f7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeOverlay.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2017, Seth + * Copyright (c) 2019, 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(); } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java index 6ffe412258..e020b96c1b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargePlugin.java @@ -1,6 +1,7 @@ /* * Copyright (c) 2017, Seth * Copyright (c) 2018, Hydrox6 + * Copyright (c) 2019, 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()) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java index 8f40b8887d..3d131aec20 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemChargeType.java @@ -36,5 +36,6 @@ enum ItemChargeType DODGY_NECKLACE, BRACELET_OF_SLAUGHTER, EXPEDITIOUS_BRACELET, - BINDING_NECKLACE -} \ No newline at end of file + BINDING_NECKLACE, + EXPLORER_RING +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java index afe0276a13..4e7aec6b52 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemcharges/ItemWithSlot.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2019, Tomas Slusny + * Copyright (c) 2019, 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; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java index 3455af4916..2f07d07389 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpInfoBoxOverlay.java @@ -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() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerConfig.java index d3ded4f54c..616844739b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerConfig.java @@ -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; + } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json index 15905e0a0c..0c53391ba7 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_magic.json @@ -460,7 +460,7 @@ "level": 60, "sprite": 354, "name": "Bones To Peaches", - "xp": 65 + "xp": 35.5 }, { "level": 61, diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java index 361fa04aea..e372ef763f 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/combatlevel/CombatLevelPluginTest.java @@ -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 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 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 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 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 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 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 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 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); } }