From b2a69da8f24c0de2a2294f406141a02347a5a29f Mon Sep 17 00:00:00 2001 From: sdburns1998 <49877861+sdburns1998@users.noreply.github.com> Date: Thu, 2 May 2019 17:12:32 +0200 Subject: [PATCH] 1.5.23 snapshot (#169) * clue plugin: add widget scroll feature * travis: update dist to xenial * travis: switch to openjdk8 travis broke the install of oraclejdk8, but our release builds are built with openjdk8 anyway. * client: add custom cursor plugin Co-authored-by: Kruithne Co-authored-by: Trevor * daily task plugin: add Thirus's dynamite * Use proxy methods for settings cursor via ClientUI To not expose swing components directly just to set cursor on them, create convenient proxy methods for updating and resetting cursor. Also document that it is working properly only on Windows. Signed-off-by: Tomas Slusny * worldmap: add Battlefront teleport * idlenotifier: add support pottery crafting (#8674) adds potter's wheel & pottery oven * Add Herbiboar support to the Loottracker (#8663) Close #6136 * world hopper: disable Hop-to pvp worlds from regular worlds * Fix bronze dart requirement in skillcalculator (1->10) (#8690) * npcindicators: Add option to highlight NPC name in right click menu (#8673) Resolves #8667 * client: add item identification plugin * Optionally prevent virtual levels from effecting total level * slayer: add 'south of' to task regex * slayer: add test including 'south of' * clue scroll plugin: add Falo the Bard clues * Update Object IDs to 2019-05-02-rev179 * Update Widget IDs to 2019-05-02-rev179 * clanchat: Shorten message so it fits on the new interface * [maven-release-plugin] prepare release runelite-parent-1.5.22 * [maven-release-plugin] prepare for next development iteration * item identification: Grimy Toadflax isn't Irit * Revert "npcindicators: Add option to highlight NPC name in right click menu (#8673)" This reverts commit 8ff1aacfd8805924e9256216cf62a5e8d2024a36. --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 2 +- protocol-api/pom.xml | 2 +- protocol/pom.xml | 2 +- runelite-api/pom.xml | 2 +- .../java/net/runelite/api/AnimationID.java | 2 + .../main/java/net/runelite/api/ObjectID.java | 1 + .../main/java/net/runelite/api/Varbits.java | 1031 +++++++++-------- .../net/runelite/api/widgets/WidgetID.java | 11 +- .../net/runelite/api/widgets/WidgetInfo.java | 16 +- runelite-client/pom.xml | 2 +- .../plugins/clanchat/ClanChatPlugin.java | 4 +- .../cluescrolls/ClueScrollEmoteOverlay.java | 13 + .../cluescrolls/ClueScrollMusicOverlay.java | 8 + .../plugins/cluescrolls/ClueScrollPlugin.java | 38 + .../cluescrolls/clues/FaloTheBardClue.java | 202 ++++ .../plugins/customcursor/CustomCursor.java | 54 + .../customcursor/CustomCursorConfig.java | 43 + .../customcursor/CustomCursorPlugin.java | 81 ++ .../dailytaskindicators/DailyTasksConfig.java | 19 +- .../dailytaskindicators/DailyTasksPlugin.java | 21 + .../idlenotifier/IdleNotifierPlugin.java | 4 +- .../ItemIdentification.java | 127 ++ .../ItemIdentificationConfig.java | 86 ++ .../ItemIdentificationMode.java | 44 + .../ItemIdentificationOverlay.java | 103 ++ .../ItemIdentificationPlugin.java | 64 + .../loottracker/LootTrackerPlugin.java | 32 +- .../client/plugins/slayer/SlayerPlugin.java | 6 +- .../virtuallevels/VirtualLevelsConfig.java | 44 + .../virtuallevels/VirtualLevelsPlugin.java | 29 +- .../worldhopper/WorldHopperPlugin.java | 12 +- .../worldmap/TeleportLocationData.java | 1 + .../java/net/runelite/client/ui/ClientUI.java | 33 + .../customcursor/cursor-dragon-dagger.png | Bin 0 -> 18008 bytes .../customcursor/cursor-dragon-scimitar.png | Bin 0 -> 570 bytes .../plugins/customcursor/cursor-rs3-gold.png | Bin 0 -> 18738 bytes .../customcursor/cursor-rs3-silver.png | Bin 0 -> 15630 bytes .../plugins/customcursor/cursor-trout.png | Bin 0 -> 15609 bytes .../skillcalculator/skill_fletching.json | 14 +- .../worldmap/battlefront_teleport_icon.png | Bin 0 -> 266 bytes .../plugins/slayer/SlayerPluginTest.java | 14 + runelite-mixins/pom.xml | 2 +- runelite-plugin-archetype/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- runescape-api/pom.xml | 2 +- 50 files changed, 1621 insertions(+), 564 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationConfig.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationMode.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationPlugin.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsConfig.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-scimitar.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-silver.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/battlefront_teleport_icon.png diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 1daaf23e24..691bb1d95c 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index fb3edeb171..9c925c8cb4 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 051e0bbcfc..efb80c0240 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT cache diff --git a/http-api/pom.xml b/http-api/pom.xml index bdebfd7020..abe47d6a61 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index c12a91fa11..81d8de533c 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT Web Service diff --git a/pom.xml b/pom.xml index 74d390ba97..b661e0729e 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT pom RuneLite diff --git a/protocol-api/pom.xml b/protocol-api/pom.xml index 09b1d2c28c..fae727ac70 100644 --- a/protocol-api/pom.xml +++ b/protocol-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT protocol-api diff --git a/protocol/pom.xml b/protocol/pom.xml index 8416894b5e..814c33de88 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT protocol diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index 00117b581e..38f6ace8a7 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT runelite-api diff --git a/runelite-api/src/main/java/net/runelite/api/AnimationID.java b/runelite-api/src/main/java/net/runelite/api/AnimationID.java index 0a6060953a..ea8f955a9c 100644 --- a/runelite-api/src/main/java/net/runelite/api/AnimationID.java +++ b/runelite-api/src/main/java/net/runelite/api/AnimationID.java @@ -81,6 +81,8 @@ public final class AnimationID public static final int CRAFTING_LEATHER = 1249; public static final int CRAFTING_GLASSBLOWING = 884; public static final int CRAFTING_SPINNING = 894; + public static final int CRAFTING_POTTERS_WHEEL = 883; + public static final int CRAFTING_POTTERY_OVEN = 24975; public static final int SMITHING_SMELTING = 899; public static final int SMITHING_CANNONBALL = 827; //cball smithing uses this and SMITHING_SMELTING public static final int SMITHING_ANVIL = 898; diff --git a/runelite-api/src/main/java/net/runelite/api/ObjectID.java b/runelite-api/src/main/java/net/runelite/api/ObjectID.java index 5ceb5ee8bc..82bfa6b5d2 100644 --- a/runelite-api/src/main/java/net/runelite/api/ObjectID.java +++ b/runelite-api/src/main/java/net/runelite/api/ObjectID.java @@ -18575,5 +18575,6 @@ public final class ObjectID public static final int STRANGE_CASKET = 34733; public static final int INCONSPICUOUS_BUSH_BEGINNER = 34734; public static final int STASH_BEGINNER = 34735; + public static final int ROCKS_34741 = 34741; /* This file is automatically generated. Do not edit. */ } 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 7ef58aaf4e..8d33776269 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -34,583 +34,590 @@ import lombok.Getter; @Getter public enum Varbits { - /* - * If chatbox is transparent or not - */ - TRANSPARENT_CHATBOX(4608), + /* + * If chatbox is transparent or not + */ + TRANSPARENT_CHATBOX(4608), - /* - * If the player has an active stamina potion effect or not - */ - RUN_SLOWED_DEPLETION_ACTIVE(25), + /* + * If the player has an active stamina potion effect or not + */ + RUN_SLOWED_DEPLETION_ACTIVE(25), - /** - * If scrollbar in resizable mode chat is on the left - */ - CHAT_SCROLLBAR_ON_LEFT(6374), + /** + * If scrollbar in resizable mode chat is on the left + */ + CHAT_SCROLLBAR_ON_LEFT(6374), - /** - * Runepouch - */ - RUNE_POUCH_RUNE1(29), - RUNE_POUCH_RUNE2(1622), - RUNE_POUCH_RUNE3(1623), - RUNE_POUCH_AMOUNT1(1624), - RUNE_POUCH_AMOUNT2(1625), - RUNE_POUCH_AMOUNT3(1626), + /** + * Runepouch + */ + RUNE_POUCH_RUNE1(29), + RUNE_POUCH_RUNE2(1622), + RUNE_POUCH_RUNE3(1623), + RUNE_POUCH_AMOUNT1(1624), + RUNE_POUCH_AMOUNT2(1625), + RUNE_POUCH_AMOUNT3(1626), - /** - * Prayers - */ - QUICK_PRAYER(4103), - PRAYER_THICK_SKIN(4104), - PRAYER_BURST_OF_STRENGTH(4105), - PRAYER_CLARITY_OF_THOUGHT(4106), - PRAYER_SHARP_EYE(4122), - PRAYER_MYSTIC_WILL(4123), - PRAYER_ROCK_SKIN(4107), - PRAYER_SUPERHUMAN_STRENGTH(4108), - PRAYER_IMPROVED_REFLEXES(4109), - PRAYER_RAPID_RESTORE(4110), - PRAYER_RAPID_HEAL(4111), - PRAYER_PROTECT_ITEM(4112), - PRAYER_HAWK_EYE(4124), - PRAYER_MYSTIC_LORE(4125), - PRAYER_STEEL_SKIN(4113), - PRAYER_ULTIMATE_STRENGTH(4114), - PRAYER_INCREDIBLE_REFLEXES(4115), - PRAYER_PROTECT_FROM_MAGIC(4116), - PRAYER_PROTECT_FROM_MISSILES(4117), - PRAYER_PROTECT_FROM_MELEE(4118), - PRAYER_EAGLE_EYE(4126), - PRAYER_MYSTIC_MIGHT(4127), - PRAYER_RETRIBUTION(4119), - PRAYER_REDEMPTION(4120), - PRAYER_SMITE(4121), - PRAYER_CHIVALRY(4128), - PRAYER_PIETY(4129), - PRAYER_PRESERVE(5466), - PRAYER_RIGOUR(5464), - PRAYER_AUGURY(5465), + /** + * Prayers + */ + QUICK_PRAYER(4103), + PRAYER_THICK_SKIN(4104), + PRAYER_BURST_OF_STRENGTH(4105), + PRAYER_CLARITY_OF_THOUGHT(4106), + PRAYER_SHARP_EYE(4122), + PRAYER_MYSTIC_WILL(4123), + PRAYER_ROCK_SKIN(4107), + PRAYER_SUPERHUMAN_STRENGTH(4108), + PRAYER_IMPROVED_REFLEXES(4109), + PRAYER_RAPID_RESTORE(4110), + PRAYER_RAPID_HEAL(4111), + PRAYER_PROTECT_ITEM(4112), + PRAYER_HAWK_EYE(4124), + PRAYER_MYSTIC_LORE(4125), + PRAYER_STEEL_SKIN(4113), + PRAYER_ULTIMATE_STRENGTH(4114), + PRAYER_INCREDIBLE_REFLEXES(4115), + PRAYER_PROTECT_FROM_MAGIC(4116), + PRAYER_PROTECT_FROM_MISSILES(4117), + PRAYER_PROTECT_FROM_MELEE(4118), + PRAYER_EAGLE_EYE(4126), + PRAYER_MYSTIC_MIGHT(4127), + PRAYER_RETRIBUTION(4119), + PRAYER_REDEMPTION(4120), + PRAYER_SMITE(4121), + PRAYER_CHIVALRY(4128), + PRAYER_PIETY(4129), + PRAYER_PRESERVE(5466), + PRAYER_RIGOUR(5464), + PRAYER_AUGURY(5465), - /** - * Diary Entries - */ - DIARY_ARDOUGNE_EASY(4458), - DIARY_ARDOUGNE_MEDIUM(4459), - DIARY_ARDOUGNE_HARD(4460), - DIARY_ARDOUGNE_ELITE(4461), + /** + * Diary Entries + */ + DIARY_ARDOUGNE_EASY(4458), + DIARY_ARDOUGNE_MEDIUM(4459), + DIARY_ARDOUGNE_HARD(4460), + DIARY_ARDOUGNE_ELITE(4461), - DIARY_DESERT_EASY(4483), - DIARY_DESERT_MEDIUM(4484), - DIARY_DESERT_HARD(4485), - DIARY_DESERT_ELITE(4486), + DIARY_DESERT_EASY(4483), + DIARY_DESERT_MEDIUM(4484), + DIARY_DESERT_HARD(4485), + DIARY_DESERT_ELITE(4486), - DIARY_FALADOR_EASY(4462), - DIARY_FALADOR_MEDIUM(4463), - DIARY_FALADOR_HARD(4464), - DIARY_FALADOR_ELITE(4465), + DIARY_FALADOR_EASY(4462), + DIARY_FALADOR_MEDIUM(4463), + DIARY_FALADOR_HARD(4464), + DIARY_FALADOR_ELITE(4465), - DIARY_FREMENNIK_EASY(4491), - DIARY_FREMENNIK_MEDIUM(4492), - DIARY_FREMENNIK_HARD(4493), - DIARY_FREMENNIK_ELITE(4494), + DIARY_FREMENNIK_EASY(4491), + DIARY_FREMENNIK_MEDIUM(4492), + DIARY_FREMENNIK_HARD(4493), + DIARY_FREMENNIK_ELITE(4494), - DIARY_KANDARIN_EASY(4475), - DIARY_KANDARIN_MEDIUM(4476), - DIARY_KANDARIN_HARD(4477), - DIARY_KANDARIN_ELITE(4478), + DIARY_KANDARIN_EASY(4475), + DIARY_KANDARIN_MEDIUM(4476), + DIARY_KANDARIN_HARD(4477), + DIARY_KANDARIN_ELITE(4478), - DIARY_KARAMJA_EASY(3578), - DIARY_KARAMJA_MEDIUM(3599), - DIARY_KARAMJA_HARD(3611), - DIARY_KARAMJA_ELITE(4566), + DIARY_KARAMJA_EASY(3578), + DIARY_KARAMJA_MEDIUM(3599), + DIARY_KARAMJA_HARD(3611), + DIARY_KARAMJA_ELITE(4566), - DIARY_LUMBRIDGE_EASY(4495), - DIARY_LUMBRIDGE_MEDIUM(4496), - DIARY_LUMBRIDGE_HARD(4497), - DIARY_LUMBRIDGE_ELITE(4498), + DIARY_KOUREND_EASY(7925), + DIARY_KOUREND_MEDIUM(7926), + DIARY_KOUREND_HARD(7927), + DIARY_KOUREND_ELITE(7928), - DIARY_MORYTANIA_EASY(4487), - DIARY_MORYTANIA_MEDIUM(4488), - DIARY_MORYTANIA_HARD(4489), - DIARY_MORYTANIA_ELITE(4490), + DIARY_LUMBRIDGE_EASY(4495), + DIARY_LUMBRIDGE_MEDIUM(4496), + DIARY_LUMBRIDGE_HARD(4497), + DIARY_LUMBRIDGE_ELITE(4498), - DIARY_VARROCK_EASY(4479), - DIARY_VARROCK_MEDIUM(4480), - DIARY_VARROCK_HARD(4481), - DIARY_VARROCK_ELITE(4482), + DIARY_MORYTANIA_EASY(4487), + DIARY_MORYTANIA_MEDIUM(4488), + DIARY_MORYTANIA_HARD(4489), + DIARY_MORYTANIA_ELITE(4490), - DIARY_WESTERN_EASY(4471), - DIARY_WESTERN_MEDIUM(4472), - DIARY_WESTERN_HARD(4473), - DIARY_WESTERN_ELITE(4474), + DIARY_VARROCK_EASY(4479), + DIARY_VARROCK_MEDIUM(4480), + DIARY_VARROCK_HARD(4481), + DIARY_VARROCK_ELITE(4482), - DIARY_WILDERNESS_EASY(4466), - DIARY_WILDERNESS_MEDIUM(4467), - DIARY_WILDERNESS_HARD(4468), - DIARY_WILDERNESS_ELITE(4469), + DIARY_WESTERN_EASY(4471), + DIARY_WESTERN_MEDIUM(4472), + DIARY_WESTERN_HARD(4473), + DIARY_WESTERN_ELITE(4474), - /** - * Kourend house favours - */ - KOUREND_FAVOR_ARCEUUS(4896), - KOUREND_FAVOR_HOSIDIUS(4895), - KOUREND_FAVOR_LOVAKENGJ(4898), - KOUREND_FAVOR_PISCARILIUS(4899), - KOUREND_FAVOR_SHAYZIEN(4894), + DIARY_WILDERNESS_EASY(4466), + DIARY_WILDERNESS_MEDIUM(4467), + DIARY_WILDERNESS_HARD(4468), + DIARY_WILDERNESS_ELITE(4469), - /** - * Equipped weapon type - */ - EQUIPPED_WEAPON_TYPE(357), + /** + * Kourend house favours + */ + KOUREND_FAVOR_ARCEUUS(4896), + KOUREND_FAVOR_HOSIDIUS(4895), + KOUREND_FAVOR_LOVAKENGJ(4898), + KOUREND_FAVOR_PISCARILIUS(4899), + KOUREND_FAVOR_SHAYZIEN(4894), - /** - * Defensive casting mode - */ - DEFENSIVE_CASTING_MODE(2668), + /** + * Equipped weapon type + */ + EQUIPPED_WEAPON_TYPE(357), - /** - * Options - */ - SIDE_PANELS(4607), + /** + * Defensive casting mode + */ + DEFENSIVE_CASTING_MODE(2668), - /** - * Herbiboar Trails - */ - HB_TRAIL_31303(5737), - HB_TRAIL_31306(5738), - HB_TRAIL_31309(5739), - HB_TRAIL_31312(5740), - HB_TRAIL_31315(5741), - HB_TRAIL_31318(5742), - HB_TRAIL_31321(5743), - HB_TRAIL_31324(5744), - HB_TRAIL_31327(5745), - HB_TRAIL_31330(5746), + /** + * Options + */ + SIDE_PANELS(4607), - HB_TRAIL_31333(5768), - HB_TRAIL_31336(5769), - HB_TRAIL_31339(5770), - HB_TRAIL_31342(5771), - HB_TRAIL_31345(5772), - HB_TRAIL_31348(5773), - HB_TRAIL_31351(5774), - HB_TRAIL_31354(5775), - HB_TRAIL_31357(5776), - HB_TRAIL_31360(5777), + /** + * Herbiboar Trails + */ + HB_TRAIL_31303(5737), + HB_TRAIL_31306(5738), + HB_TRAIL_31309(5739), + HB_TRAIL_31312(5740), + HB_TRAIL_31315(5741), + HB_TRAIL_31318(5742), + HB_TRAIL_31321(5743), + HB_TRAIL_31324(5744), + HB_TRAIL_31327(5745), + HB_TRAIL_31330(5746), - HB_TRAIL_31363(5747), - HB_TRAIL_31366(5748), - HB_TRAIL_31369(5749), - HB_TRAIL_31372(5750), + HB_TRAIL_31333(5768), + HB_TRAIL_31336(5769), + HB_TRAIL_31339(5770), + HB_TRAIL_31342(5771), + HB_TRAIL_31345(5772), + HB_TRAIL_31348(5773), + HB_TRAIL_31351(5774), + HB_TRAIL_31354(5775), + HB_TRAIL_31357(5776), + HB_TRAIL_31360(5777), - HB_FINISH(5766), - HB_STARTED(5767), //not working + HB_TRAIL_31363(5747), + HB_TRAIL_31366(5748), + HB_TRAIL_31369(5749), + HB_TRAIL_31372(5750), - /** - * Barbarian Assault - */ - IN_GAME_BA(3923), + HB_FINISH(5766), + HB_STARTED(5767), //not working - /** - * 0 = Outside wilderness - * 1 = In wilderness - */ - IN_WILDERNESS(5963), + /** + * Barbarian Assault + */ + IN_GAME_BA(3923), - /** - * Fishing Trawler - * FISHING_TRAWLER_ACTIVITY Expected values: 0-255 - */ - FISHING_TRAWLER_ACTIVITY(3377), + /** + * 0 = Outside wilderness + * 1 = In wilderness + */ + IN_WILDERNESS(5963), - /** - * Blast Furnace Bar Dispenser - *

- * These are the expected values: - * 0 = No bars being processed - * 1 = Ores are being processed on the conveyor belt, bar dispenser cannot be checked - * 2 = Bars are cooling down - * 3 = Bars can be collected - */ - BAR_DISPENSER(936), + /** + * Fishing Trawler + * FISHING_TRAWLER_ACTIVITY Expected values: 0-255 + */ + FISHING_TRAWLER_ACTIVITY(3377), - /** - * Motherlode mine sack - */ - SACK_NUMBER(5558), - SACK_UPGRADED(5556), + /** + * Blast Furnace Bar Dispenser + *

+ * These are the expected values: + * 0 = No bars being processed + * 1 = Ores are being processed on the conveyor belt, bar dispenser cannot be checked + * 2 = Bars are cooling down + * 3 = Bars can be collected + */ + BAR_DISPENSER(936), - /** - * Experience tracker - *

- * EXPERIENCE_TRACKER_POSITION expected values: - * 0 = Right - * 1 = Middle - * 2 = Left - */ - EXPERIENCE_TRACKER_POSITION(4692), - EXPERIENCE_TRACKER_COUNTER(4697), - EXPERIENCE_TRACKER_PROGRESS_BAR(4698), + /** + * Motherlode mine sack + */ + SACK_NUMBER(5558), + SACK_UPGRADED(5556), - /** - * Experience drop color - */ - EXPERIENCE_DROP_COLOR(4695), + /** + * Experience tracker + *

+ * EXPERIENCE_TRACKER_POSITION expected values: + * 0 = Right + * 1 = Middle + * 2 = Left + */ + EXPERIENCE_TRACKER_POSITION(4692), + EXPERIENCE_TRACKER_COUNTER(4697), + EXPERIENCE_TRACKER_PROGRESS_BAR(4698), - /** - * Tithe Farm - */ - TITHE_FARM_SACK_AMOUNT(4900), - TITHE_FARM_SACK_ICON(5370), - TITHE_FARM_POINTS(4893), + /** + * Experience drop color + */ + EXPERIENCE_DROP_COLOR(4695), - /** - * Blast Mine - */ - BLAST_MINE_COAL(4924), - BLAST_MINE_GOLD(4925), - BLAST_MINE_MITHRIL(4926), - BLAST_MINE_ADAMANTITE(4921), - BLAST_MINE_RUNITE(4922), + /** + * Tithe Farm + */ + TITHE_FARM_SACK_AMOUNT(4900), + TITHE_FARM_SACK_ICON(5370), + TITHE_FARM_POINTS(4893), - /** - * Raids - */ - IN_RAID(5432), - TOTAL_POINTS(5431), - PERSONAL_POINTS(5422), - RAID_PARTY_SIZE(5424), + /** + * Blast Mine + */ + BLAST_MINE_COAL(4924), + BLAST_MINE_GOLD(4925), + BLAST_MINE_MITHRIL(4926), + BLAST_MINE_ADAMANTITE(4921), + BLAST_MINE_RUNITE(4922), - /** - * Theatre of Blood 1=In Party, 2=Inside/Spectator, 3=Dead Spectating - */ - THEATRE_OF_BLOOD(6440), + /** + * Raids + */ + IN_RAID(5432), + TOTAL_POINTS(5431), + PERSONAL_POINTS(5422), + RAID_PARTY_SIZE(5424), - /** - * Nightmare Zone - */ - NMZ_ABSORPTION(3956), - NMZ_POINTS(3949), - NMZ_OVERLOAD(3955), + /** + * Theatre of Blood 1=In Party, 2=Inside/Spectator, 3=Dead Spectating + */ + THEATRE_OF_BLOOD(6440), - /** - * Blast Furnace - */ - BLAST_FURNACE_COPPER_ORE(959), - BLAST_FURNACE_TIN_ORE(950), - BLAST_FURNACE_IRON_ORE(951), - BLAST_FURNACE_COAL(949), - BLAST_FURNACE_MITHRIL_ORE(952), - BLAST_FURNACE_ADAMANTITE_ORE(953), - BLAST_FURNACE_RUNITE_ORE(954), - BLAST_FURNACE_SILVER_ORE(956), - BLAST_FURNACE_GOLD_ORE(955), + /** + * Nightmare Zone + */ + NMZ_ABSORPTION(3956), + NMZ_POINTS(3949), + NMZ_OVERLOAD(3955), - BLAST_FURNACE_BRONZE_BAR(941), - BLAST_FURNACE_IRON_BAR(942), - BLAST_FURNACE_STEEL_BAR(943), - BLAST_FURNACE_MITHRIL_BAR(944), - BLAST_FURNACE_ADAMANTITE_BAR(945), - BLAST_FURNACE_RUNITE_BAR(946), - BLAST_FURNACE_SILVER_BAR(948), - BLAST_FURNACE_GOLD_BAR(947), + /** + * Blast Furnace + */ + BLAST_FURNACE_COPPER_ORE(959), + BLAST_FURNACE_TIN_ORE(950), + BLAST_FURNACE_IRON_ORE(951), + BLAST_FURNACE_COAL(949), + BLAST_FURNACE_MITHRIL_ORE(952), + BLAST_FURNACE_ADAMANTITE_ORE(953), + BLAST_FURNACE_RUNITE_ORE(954), + BLAST_FURNACE_SILVER_ORE(956), + BLAST_FURNACE_GOLD_ORE(955), - BLAST_FURNACE_COFFER(5357), + BLAST_FURNACE_BRONZE_BAR(941), + BLAST_FURNACE_IRON_BAR(942), + BLAST_FURNACE_STEEL_BAR(943), + BLAST_FURNACE_MITHRIL_BAR(944), + BLAST_FURNACE_ADAMANTITE_BAR(945), + BLAST_FURNACE_RUNITE_BAR(946), + BLAST_FURNACE_SILVER_BAR(948), + BLAST_FURNACE_GOLD_BAR(947), - /** - * Pyramid plunder - */ - PYRAMID_PLUNDER_TIMER(2375), - PYRAMID_PLUNDER_ROOM(2377), + BLAST_FURNACE_COFFER(5357), - /** - * Barrows - */ - BARROWS_KILLED_AHRIM(457), - BARROWS_KILLED_DHAROK(458), - BARROWS_KILLED_GUTHAN(459), - BARROWS_KILLED_KARIL(460), - BARROWS_KILLED_TORAG(461), - BARROWS_KILLED_VERAC(462), - BARROWS_REWARD_POTENTIAL(463), - BARROWS_NPCS_SLAIN(464), + /** + * Pyramid plunder + */ + PYRAMID_PLUNDER_TIMER(2375), + PYRAMID_PLUNDER_ROOM(2377), - /** - * Spicy stew ingredients - */ - SPICY_STEW_RED_SPICES(1879), - SPICY_STEW_YELLOW_SPICES(1880), - SPICY_STEW_BROWN_SPICES(1881), - SPICY_STEW_ORANGE_SPICES(1882), + /** + * Barrows + */ + BARROWS_KILLED_AHRIM(457), + BARROWS_KILLED_DHAROK(458), + BARROWS_KILLED_GUTHAN(459), + BARROWS_KILLED_KARIL(460), + BARROWS_KILLED_TORAG(461), + BARROWS_KILLED_VERAC(462), + BARROWS_REWARD_POTENTIAL(463), + BARROWS_NPCS_SLAIN(464), - /** - * Multicombat area - */ - MULTICOMBAT_AREA(4605), + /** + * Spicy stew ingredients + */ + SPICY_STEW_RED_SPICES(1879), + SPICY_STEW_YELLOW_SPICES(1880), + SPICY_STEW_BROWN_SPICES(1881), + SPICY_STEW_ORANGE_SPICES(1882), - /** - * In the Wilderness - */ - IN_THE_WILDERNESS(5963), + /** + * Multicombat area + */ + MULTICOMBAT_AREA(4605), - /** - * Kingdom Management - */ - KINGDOM_FAVOR(72), - KINGDOM_COFFER(74), + /** + * In the Wilderness + */ + IN_THE_WILDERNESS(5963), - /** - * The Hand in the Sand quest status - */ - QUEST_THE_HAND_IN_THE_SAND(1527), + /** + * Kingdom Management + */ + KINGDOM_FAVOR(72), + KINGDOM_COFFER(74), - /** - * Daily Tasks (Collection availability) - */ - DAILY_HERB_BOXES_COLLECTED(3961), - DAILY_STAVES_COLLECTED(4539), - DAILY_ESSENCE_COLLECTED(4547), - DAILY_RUNES_COLLECTED(4540), - DAILY_SAND_COLLECTED(4549), - DAILY_ARROWS_STATE(4563), - DAILY_FLAX_STATE(4559), - /** - * This varbit tracks how much bonemeal has been redeemed from Robin - * The player gets 13 for each diary completed above and including Medium, for a maxiumum of 39 - */ - DAILY_BONEMEAL_STATE(4543), + /** + * The Hand in the Sand quest status + */ + QUEST_THE_HAND_IN_THE_SAND(1527), - /** - * Fairy Ring - */ - FAIR_RING_LAST_DESTINATION(5374), - FAIRY_RING_DIAL_ADCB(3985), //Left dial - FAIRY_RIGH_DIAL_ILJK(3986), //Middle dial - FAIRY_RING_DIAL_PSRQ(3987), //Right dial + /** + * Daily Tasks (Collection availability) + */ + DAILY_HERB_BOXES_COLLECTED(3961), + DAILY_STAVES_COLLECTED(4539), + DAILY_ESSENCE_COLLECTED(4547), + DAILY_RUNES_COLLECTED(4540), + DAILY_SAND_COLLECTED(4549), + DAILY_ARROWS_STATE(4563), + DAILY_FLAX_STATE(4559), + /** + * This varbit tracks how much bonemeal has been redeemed from Robin + * The player gets 13 for each diary completed above and including Medium, for a maxiumum of 39 + */ + DAILY_BONEMEAL_STATE(4543), - /** - * Transmog controllers for farming - */ - FARMING_4771(4771), - FARMING_4772(4772), - FARMING_4773(4773), - FARMING_4774(4774), - FARMING_4775(4775), - FARMING_7904(7904), - FARMING_7905(7905), - FARMING_7906(7906), - FARMING_7907(7907), - FARMING_7908(7908), - FARMING_7909(7909), - FARMING_7910(7910), - FARMING_7911(7911), + DAILY_DYNAMITE_COLLECTED(7939), - /** - * Transmog controllers for grapes - */ - GRAPES_4953(4953), - GRAPES_4954(4954), - GRAPES_4955(4955), - GRAPES_4956(4956), - GRAPES_4957(4957), - GRAPES_4958(4958), - GRAPES_4959(4959), - GRAPES_4960(4960), - GRAPES_4961(4961), - GRAPES_4962(4962), - GRAPES_4963(4963), - GRAPES_4964(4964), + /** + * Fairy Ring + */ + FAIR_RING_LAST_DESTINATION(5374), + FAIRY_RING_DIAL_ADCB(3985), //Left dial + FAIRY_RIGH_DIAL_ILJK(3986), //Middle dial + FAIRY_RING_DIAL_PSRQ(3987), //Right dial - /** - * Automatically weed farming patches - */ - AUTOWEED(5557), + /** + * Transmog controllers for farming + */ + FARMING_4771(4771), + FARMING_4772(4772), + FARMING_4773(4773), + FARMING_4774(4774), + FARMING_4775(4775), + FARMING_7904(7904), + FARMING_7905(7905), + FARMING_7906(7906), + FARMING_7907(7907), + FARMING_7908(7908), + FARMING_7909(7909), + FARMING_7910(7910), + FARMING_7911(7911), - /** - * The varbit that stores the players {@code AccountType}. - */ - ACCOUNT_TYPE(1777), + /** + * Transmog controllers for grapes + */ + GRAPES_4953(4953), + GRAPES_4954(4954), + GRAPES_4955(4955), + GRAPES_4956(4956), + GRAPES_4957(4957), + GRAPES_4958(4958), + GRAPES_4959(4959), + GRAPES_4960(4960), + GRAPES_4961(4961), + GRAPES_4962(4962), + GRAPES_4963(4963), + GRAPES_4964(4964), + + /** + * Automatically weed farming patches + */ + AUTOWEED(5557), + + /** + * The varbit that stores the players {@code AccountType}. + */ + ACCOUNT_TYPE(1777), /** * Varbit used for Slayer reward points */ SLAYER_REWARD_POINTS(4068), - /** - * The varbit that stores the oxygen percentage for player - */ - OXYGEN_LEVEL(5811), - - /** - * Corp beast damage - */ - CORP_DAMAGE(999), - - /** - * Toggleable slayer unlocks - */ - SUPERIOR_ENABLED(5362), - FOSSIL_ISLAND_WYVERN_DISABLE(6251), - - CURRENT_BANK_TAB(4150), - - WORLDHOPPER_FAVROITE_1(4597), - WORLDHOPPER_FAVROITE_2(4598), - - /** - * Vengeance is active - */ - VENGEANCE_ACTIVE(2450), - - /** - * Spell cooldowns - */ - VENGEANCE_COOLDOWN(2451), - /** - * 0 = standard - * 1 = ancients - * 2 = lunars - * 3 = arrceus - **/ - SPELLBOOK_ID(4070), - + * The varbit that stores the oxygen percentage for player + */ + OXYGEN_LEVEL(5811), + /** - * 0 = no - * 1 = yes - **/ + * Corp beast damage + */ + CORP_DAMAGE(999), + + /** + * Toggleable slayer unlocks + */ + SUPERIOR_ENABLED(5362), + FOSSIL_ISLAND_WYVERN_DISABLE(6251), + + CURRENT_BANK_TAB(4150), + + WORLDHOPPER_FAVROITE_1(4597), + WORLDHOPPER_FAVROITE_2(4598), + + /** + * Vengeance is active + */ + VENGEANCE_ACTIVE(2450), + + /** + * Spell cooldowns + */ + VENGEANCE_COOLDOWN(2451), + + /** + * 0 = standard + * 1 = ancients + * 2 = lunars + * 3 = arrceus + **/ + SPELLBOOK_ID(4070), + + /** + * 0 = no + * 1 = yes + **/ SPELLBOOK_HIDDEN(6718), - /** - * Amount of items in each bank tab - */ - BANK_TAB_ONE_COUNT(4171), - BANK_TAB_TWO_COUNT(4172), - BANK_TAB_THREE_COUNT(4173), - BANK_TAB_FOUR_COUNT(4174), - BANK_TAB_FIVE_COUNT(4175), - BANK_TAB_SIX_COUNT(4176), - BANK_TAB_SEVEN_COUNT(4177), - BANK_TAB_EIGHT_COUNT(4178), - BANK_TAB_NINE_COUNT(4179), + /** + * Amount of items in each bank tab + */ + BANK_TAB_ONE_COUNT(4171), + BANK_TAB_TWO_COUNT(4172), + BANK_TAB_THREE_COUNT(4173), + BANK_TAB_FOUR_COUNT(4174), + BANK_TAB_FIVE_COUNT(4175), + BANK_TAB_SIX_COUNT(4176), + BANK_TAB_SEVEN_COUNT(4177), + BANK_TAB_EIGHT_COUNT(4178), + BANK_TAB_NINE_COUNT(4179), - /** - * Type of GE offer currently being created - * 0 = buy - * 1 = sell - */ - GE_OFFER_CREATION_TYPE(4397), + /** + * Type of GE offer currently being created + * 0 = buy + * 1 = sell + */ + GE_OFFER_CREATION_TYPE(4397), - /** - * Spells being auto-casted - */ - AUTO_CAST_SPELL(276), + /** + * Spells being auto-casted + */ + AUTO_CAST_SPELL(276), - /** - * The active tab within the quest interface - */ - QUEST_TAB(8168), + /** + * The active tab within the quest interface + */ + QUEST_TAB(8168), - /** - * Temple Trekking - */ - TREK_POINTS(1955), - TREK_STARTED(1956), - TREK_EVENT(1958), - TREK_STATUS(6719), - BLOAT_ENTERED_ROOM(6447), + /** + * Temple Trekking + */ + TREK_POINTS(1955), + TREK_STARTED(1956), + TREK_EVENT(1958), + TREK_STATUS(6719), + BLOAT_ENTERED_ROOM(6447), - /** - * f2p Quest varbits, these don't hold the completion value. - */ - QUEST_DEMON_SLAYER(2561), - QUEST_GOBLIN_DIPLOMACY(2378), - QUEST_MISTHALIN_MYSTERY(3468), - QUEST_THE_CORSAIR_CURSE(6071), - QUEST_X_MARKS_THE_SPOT(8063), + /** + * f2p Quest varbits, these don't hold the completion value. + */ + QUEST_DEMON_SLAYER(2561), + QUEST_GOBLIN_DIPLOMACY(2378), + QUEST_MISTHALIN_MYSTERY(3468), + QUEST_THE_CORSAIR_CURSE(6071), + QUEST_X_MARKS_THE_SPOT(8063), - /** - * member Quest varbits, these don't hold the completion value. - */ - QUEST_ANIMAL_MAGNETISM(3185), - QUEST_BETWEEN_A_ROCK(299), - QUEST_CONTACT(3274), - QUEST_ZOGRE_FLESH_EATERS(487), - QUEST_DARKNESS_OF_HALLOWVALE(2573), - QUEST_DEATH_TO_THE_DORGESHUUN(2258), - QUEST_DESERT_TREASURE(358), - QUEST_DEVIOUS_MINDS(1465), - QUEST_EAGLES_PEAK(2780), - QUEST_ELEMENTAL_WORKSHOP_II(2639), - QUEST_ENAKHRAS_LAMENT(1560), - QUEST_ENLIGHTENED_JOURNEY(2866), - QUEST_THE_EYES_OF_GLOUPHRIE(2497), - QUEST_FAIRYTALE_I_GROWING_PAINS(1803), - QUEST_FAIRYTALE_II_CURE_A_QUEEN(2326), - QUEST_THE_FEUD(334), - QUEST_FORGETTABLE_TALE(822), - QUEST_GARDEN_OF_TRANQUILLITY(961), - QUEST_GHOSTS_AHOY(217), - QUEST_THE_GIANT_DWARF(571), - QUEST_THE_GOLEM(346), - QUEST_HORROR_FROM_THE_DEEP(34), - QUEST_ICTHLARINS_LITTLE_HELPER(418), - QUEST_IN_AID_OF_THE_MYREQUE(1990), - QUEST_THE_LOST_TRIBE(532), - QUEST_LUNAR_DIPLOMACY(2448), - QUEST_MAKING_HISTORY(1383), - QUEST_MOUNTAIN_DAUGHTER(260), - QUEST_MOURNINGS_ENDS_PART_II(1103), - QUEST_MY_ARMS_BIG_ADVENTURE(2790), - QUEST_RATCATCHERS(1404), - QUEST_RECIPE_FOR_DISASTER(1850), - QUEST_RECRUITMENT_DRIVE(657), - QUEST_ROYAL_TROUBLE(2140), - QUEST_THE_SLUG_MENACE(2610), - QUEST_SHADOW_OF_THE_STORM(1372), - QUEST_A_SOULS_BANE(2011), - QUEST_SPIRITS_OF_THE_ELID(1444), - QUEST_SWAN_SONG(2098), - QUEST_A_TAIL_OF_TWO_CATS(1028), - QUEST_TEARS_OF_GUTHIX(451), - QUEST_WANTED(1051), - QUEST_COLD_WAR(3293), - QUEST_THE_FREMENNIK_ISLES(3311), - QUEST_TOWER_OF_LIFE(3337), - QUEST_WHAT_LIES_BELOW(3523), - QUEST_OLAFS_QUEST(3534), - QUEST_ANOTHER_SLICE_OF_HAM(3550), - QUEST_DREAM_MENTOR(3618), - QUEST_GRIM_TALES(2783), - QUEST_KINGS_RANSOM(3888), - QUEST_MONKEY_MADNESS_II(5027), - QUEST_CLIENT_OF_KOUREND(5619), - QUEST_BONE_VOYAGE(5795), - QUEST_THE_QUEEN_OF_THIEVES(6037), - QUEST_THE_DEPTHS_OF_DESPAIR(6027), - QUEST_DRAGON_SLAYER_II(6104), - QUEST_TALE_OF_THE_RIGHTEOUS(6358), - QUEST_A_TASTE_OF_HOPE(6396), - QUEST_MAKING_FRIENDS_WITH_MY_ARM(6528), - QUEST_THE_ASCENT_OF_ARCEUUS(7856), - QUEST_THE_FORSAKEN_TOWER(7796), + /** + * member Quest varbits, these don't hold the completion value. + */ + QUEST_ANIMAL_MAGNETISM(3185), + QUEST_BETWEEN_A_ROCK(299), + QUEST_CONTACT(3274), + QUEST_ZOGRE_FLESH_EATERS(487), + QUEST_DARKNESS_OF_HALLOWVALE(2573), + QUEST_DEATH_TO_THE_DORGESHUUN(2258), + QUEST_DESERT_TREASURE(358), + QUEST_DEVIOUS_MINDS(1465), + QUEST_EAGLES_PEAK(2780), + QUEST_ELEMENTAL_WORKSHOP_II(2639), + QUEST_ENAKHRAS_LAMENT(1560), + QUEST_ENLIGHTENED_JOURNEY(2866), + QUEST_THE_EYES_OF_GLOUPHRIE(2497), + QUEST_FAIRYTALE_I_GROWING_PAINS(1803), + QUEST_FAIRYTALE_II_CURE_A_QUEEN(2326), + QUEST_THE_FEUD(334), + QUEST_FORGETTABLE_TALE(822), + QUEST_GARDEN_OF_TRANQUILLITY(961), + QUEST_GHOSTS_AHOY(217), + QUEST_THE_GIANT_DWARF(571), + QUEST_THE_GOLEM(346), + QUEST_HORROR_FROM_THE_DEEP(34), + QUEST_ICTHLARINS_LITTLE_HELPER(418), + QUEST_IN_AID_OF_THE_MYREQUE(1990), + QUEST_THE_LOST_TRIBE(532), + QUEST_LUNAR_DIPLOMACY(2448), + QUEST_MAKING_HISTORY(1383), + QUEST_MOUNTAIN_DAUGHTER(260), + QUEST_MOURNINGS_ENDS_PART_II(1103), + QUEST_MY_ARMS_BIG_ADVENTURE(2790), + QUEST_RATCATCHERS(1404), + QUEST_RECIPE_FOR_DISASTER(1850), + QUEST_RECRUITMENT_DRIVE(657), + QUEST_ROYAL_TROUBLE(2140), + QUEST_THE_SLUG_MENACE(2610), + QUEST_SHADOW_OF_THE_STORM(1372), + QUEST_A_SOULS_BANE(2011), + QUEST_SPIRITS_OF_THE_ELID(1444), + QUEST_SWAN_SONG(2098), + QUEST_A_TAIL_OF_TWO_CATS(1028), + QUEST_TEARS_OF_GUTHIX(451), + QUEST_WANTED(1051), + QUEST_COLD_WAR(3293), + QUEST_THE_FREMENNIK_ISLES(3311), + QUEST_TOWER_OF_LIFE(3337), + QUEST_WHAT_LIES_BELOW(3523), + QUEST_OLAFS_QUEST(3534), + QUEST_ANOTHER_SLICE_OF_HAM(3550), + QUEST_DREAM_MENTOR(3618), + QUEST_GRIM_TALES(2783), + QUEST_KINGS_RANSOM(3888), + QUEST_MONKEY_MADNESS_II(5027), + QUEST_CLIENT_OF_KOUREND(5619), + QUEST_BONE_VOYAGE(5795), + QUEST_THE_QUEEN_OF_THIEVES(6037), + QUEST_THE_DEPTHS_OF_DESPAIR(6027), + QUEST_DRAGON_SLAYER_II(6104), + QUEST_TALE_OF_THE_RIGHTEOUS(6358), + QUEST_A_TASTE_OF_HOPE(6396), + QUEST_MAKING_FRIENDS_WITH_MY_ARM(6528), + QUEST_THE_ASCENT_OF_ARCEUUS(7856), + QUEST_THE_FORSAKEN_TOWER(7796), - /** - * mini-quest varbits, these don't hold the completion value. - */ - QUEST_ARCHITECTURAL_ALLIANCE(4982), - QUEST_BEAR_YOUR_SOUL(5078), - QUEST_CURSE_OF_THE_EMPTY_LORD(821), - QUEST_ENCHANTED_KEY(1391), - QUEST_THE_GENERALS_SHADOW(3330), - QUEST_SKIPPY_AND_THE_MOGRES(1344), - QUEST_LAIR_OF_TARN_RAZORLOR(3290), - QUEST_FAMILY_PEST(5347), - QUEST_THE_MAGE_ARENA_II(6067), + /** + * mini-quest varbits, these don't hold the completion value. + */ + QUEST_ARCHITECTURAL_ALLIANCE(4982), + QUEST_BEAR_YOUR_SOUL(5078), + QUEST_CURSE_OF_THE_EMPTY_LORD(821), + QUEST_ENCHANTED_KEY(1391), + QUEST_THE_GENERALS_SHADOW(3330), + QUEST_SKIPPY_AND_THE_MOGRES(1344), + QUEST_LAIR_OF_TARN_RAZORLOR(3290), + QUEST_FAMILY_PEST(5347), + QUEST_THE_MAGE_ARENA_II(6067), /** * Active spellbook (see enumID) @@ -622,8 +629,8 @@ public enum Varbits */ FILTER_SPELLBOOK(6718); - /** - * The raw varbit ID. - */ - private final int id; -} + /** + * The raw varbit ID. + */ + private final int id; +} \ No newline at end of file diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index 3f43b97ee8..68ae8c1b85 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -136,7 +136,8 @@ public class WidgetID public static final int MUSIC_GROUP_ID = 239; public static final int MUSICTAB_GROUP_ID = 239; public static final int BARROWS_PUZZLE_GROUP_ID = 25; - public static final int ITEMS_KEPT_ON_DEATH_GROUP_ID = 4; + public static final int KEPT_ON_DEATH_GROUP_ID = 4; + public static final int GUIDE_PRICE_GROUP_ID = 464; static class WorldMap { @@ -228,9 +229,9 @@ public class WidgetID static class ClanChat { static final int TITLE = 1; - static final int NAME = 3; - static final int OWNER = 5; - static final int LIST = 15; + static final int NAME = 4; + static final int OWNER = 6; + static final int LIST = 16; } static class Bank @@ -306,6 +307,7 @@ public class WidgetID { static final int EMOTE_WINDOW = 0; static final int EMOTE_CONTAINER = 1; + static final int EMOTE_SCROLLBAR = 2; } static class Cluescroll @@ -981,6 +983,7 @@ public class WidgetID { static final int CONTAINER = 0; static final int LIST = 3; + static final int SCROLLBAR = 4; } static class Barrows_Puzzle diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index 895de6f1de..1bd7cfa25a 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -76,9 +76,11 @@ public enum WidgetInfo EMOTE_WINDOW(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_WINDOW), EMOTE_CONTAINER(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_CONTAINER), + EMOTE_SCROLLBAR(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_SCROLLBAR), MUSIC_WINDOW(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.CONTAINER), MUSIC_TRACK_LIST(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.LIST), + MUSIC_TRACK_SCROLLBAR(WidgetID.MUSIC_GROUP_ID, WidgetID.Music.SCROLLBAR), DIARY_QUEST_WIDGET_TITLE(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TITLE), DIARY_QUEST_WIDGET_TEXT(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TEXT), @@ -684,13 +686,13 @@ public enum WidgetInfo EQUIPMENT_MAGIC_DAMAGE(WidgetID.EQUIPMENT_PAGE_GROUP_ID, WidgetID.EquipmentWidgetIdentifiers.MAGIC_DAMAGE), EQUIP_YOUR_CHARACTER(WidgetID.EQUIPMENT_PAGE_GROUP_ID, WidgetID.EquipmentWidgetIdentifiers.EQUIP_YOUR_CHARACTER), - ITEMS_KEPT_ON_DEATH_CONTAINER(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.KEPT_ITEMS_CONTAINER), - ITEMS_LOST_ON_DEATH_CONTAINER(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.LOST_ITEMS_CONTAINER), - ITEMS_KEPT_INFORMATION_CONTAINER(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.INFORMATION_CONTAINER), - ITEMS_KEPT_SAFE_ZONE_CONTAINER(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.SAFE_ZONE_CONTAINER), - ITEMS_KEPT_CUSTOM_TEXT_CONTAINER(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.CUSTOM_TEXT_CONTAINER), - ITEMS_LOST_VALUE(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.LOST_ITEMS_VALUE), - ITEMS_KEPT_MAX(WidgetID.ITEMS_KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.MAX_ITEMS_KEPT_ON_DEATH); + ITEMS_KEPT_ON_DEATH_CONTAINER(WidgetID.KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.KEPT_ITEMS_CONTAINER), + ITEMS_LOST_ON_DEATH_CONTAINER(WidgetID.KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.LOST_ITEMS_CONTAINER), + ITEMS_KEPT_INFORMATION_CONTAINER(WidgetID.KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.INFORMATION_CONTAINER), + ITEMS_KEPT_SAFE_ZONE_CONTAINER(WidgetID.KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.SAFE_ZONE_CONTAINER), + ITEMS_KEPT_CUSTOM_TEXT_CONTAINER(WidgetID.KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.CUSTOM_TEXT_CONTAINER), + ITEMS_LOST_VALUE(WidgetID.KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.LOST_ITEMS_VALUE), + ITEMS_KEPT_MAX(WidgetID.KEPT_ON_DEATH_GROUP_ID, WidgetID.KeptOnDeath.MAX_ITEMS_KEPT_ON_DEATH); private final int groupId; private final int childId; diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 3a595bbaae..ddd164c7f0 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT client diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java index 3217d70a91..1ec94fad94 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/clanchat/ClanChatPlugin.java @@ -28,8 +28,8 @@ import java.awt.image.*; public class ClanChatPlugin extends Plugin { private static final int MAX_CHATS = 10; - private static final String CLAN_CHAT_TITLE = "Clan Chat"; - private static final String RECENT_TITLE = "Recent Clan Chats"; + private static final String CLAN_CHAT_TITLE = "CC"; + private static final String RECENT_TITLE = "Recent CCs"; private static final int JOIN_LEAVE_DURATION = 20; private static final int MESSAGE_DELAY = 10; @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java index 4528b0a7be..ecaa85b8ba 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java @@ -41,6 +41,8 @@ class ClueScrollEmoteOverlay extends Overlay private final ClueScrollPlugin plugin; private final Client client; + private boolean hasScrolled; + @Inject private ClueScrollEmoteOverlay(ClueScrollPlugin plugin, Client client) { @@ -57,6 +59,7 @@ class ClueScrollEmoteOverlay extends Overlay if (!(clue instanceof EmoteClue)) { + hasScrolled = false; return null; } @@ -81,19 +84,29 @@ class ClueScrollEmoteOverlay extends Overlay return null; } + Widget firstEmoteWidget = null; + Widget secondEmoteWidget = null; + for (Widget emoteWidget : emoteContainer.getDynamicChildren()) { if (emoteWidget.getSpriteId() == emoteClue.getFirstEmote().getSpriteId()) { + firstEmoteWidget = emoteWidget; plugin.highlightWidget(graphics, emoteWidget, emoteWindow, null, emoteClue.getSecondEmote() != null ? "1st" : null); } else if (emoteClue.getSecondEmote() != null && emoteWidget.getSpriteId() == emoteClue.getSecondEmote().getSpriteId()) { + secondEmoteWidget = emoteWidget; plugin.highlightWidget(graphics, emoteWidget, emoteWindow, null, "2nd"); } } + if (!hasScrolled) + { + hasScrolled = true; + plugin.scrollToWidget(WidgetInfo.EMOTE_CONTAINER, WidgetInfo.EMOTE_SCROLLBAR, firstEmoteWidget, secondEmoteWidget); + } return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollMusicOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollMusicOverlay.java index f220399f72..2b44290fb5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollMusicOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollMusicOverlay.java @@ -44,6 +44,8 @@ class ClueScrollMusicOverlay extends Overlay private final ClueScrollPlugin plugin; private final Client client; + private boolean hasScrolled; + @Inject private ClueScrollMusicOverlay(ClueScrollPlugin plugin, Client client) { @@ -60,6 +62,7 @@ class ClueScrollMusicOverlay extends Overlay if (!(clue instanceof MusicClue)) { + hasScrolled = false; return null; } @@ -95,6 +98,11 @@ class ClueScrollMusicOverlay extends Overlay return null; } + if (!hasScrolled) + { + hasScrolled = true; + plugin.scrollToWidget(WidgetInfo.MUSIC_TRACK_LIST, WidgetInfo.MUSIC_TRACK_SCROLLBAR, found); + } plugin.highlightWidget(graphics, found, trackList, PADDING, null); return null; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 4cd33c3b06..d060f1a3e4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -55,6 +55,7 @@ import net.runelite.api.NPC; import net.runelite.api.ObjectComposition; import net.runelite.api.Point; import net.runelite.api.Scene; +import net.runelite.api.ScriptID; import net.runelite.api.Tile; import net.runelite.api.TileObject; import net.runelite.api.coords.LocalPoint; @@ -81,6 +82,7 @@ import net.runelite.client.plugins.cluescrolls.clues.CoordinateClue; import net.runelite.client.plugins.cluescrolls.clues.CrypticClue; import net.runelite.client.plugins.cluescrolls.clues.EmoteClue; import net.runelite.client.plugins.cluescrolls.clues.FairyRingClue; +import net.runelite.client.plugins.cluescrolls.clues.FaloTheBardClue; import net.runelite.client.plugins.cluescrolls.clues.HotColdClue; import net.runelite.client.plugins.cluescrolls.clues.LocationClueScroll; import net.runelite.client.plugins.cluescrolls.clues.LocationsClueScroll; @@ -507,6 +509,13 @@ public class ClueScrollPlugin extends Plugin return fairyRingClue; } + final FaloTheBardClue faloTheBardClue = FaloTheBardClue.forText(text); + + if (faloTheBardClue != null) + { + return faloTheBardClue; + } + final HotColdClue hotColdClue = HotColdClue.forText(text); if (hotColdClue != null) @@ -739,4 +748,33 @@ public class ClueScrollPlugin extends Plugin textComponent.setText(text); textComponent.render(graphics); } + + void scrollToWidget(WidgetInfo list, WidgetInfo scrollbar, Widget ... toHighlight) + { + final Widget parent = client.getWidget(list); + int averageCentralY = 0; + int nonnullCount = 0; + for (Widget widget : toHighlight) + { + if (widget != null) + { + averageCentralY += widget.getRelativeY() + widget.getHeight() / 2; + nonnullCount += 1; + } + } + if (nonnullCount == 0) + { + return; + } + averageCentralY /= nonnullCount; + final int newScroll = Math.max(0, Math.min(parent.getScrollHeight(), + averageCentralY - parent.getHeight() / 2)); + + client.runScript( + ScriptID.UPDATE_SCROLLBAR, + scrollbar.getId(), + list.getId(), + newScroll + ); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java new file mode 100644 index 0000000000..68ad2e0af8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FaloTheBardClue.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2019, Twiglet1022 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.cluescrolls.clues; + +import com.google.common.collect.ImmutableList; +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.List; +import javax.annotation.Nonnull; +import lombok.Getter; +import net.runelite.api.Item; +import static net.runelite.api.ItemID.ARMADYL_HELMET; +import static net.runelite.api.ItemID.BARRELCHEST_ANCHOR; +import static net.runelite.api.ItemID.BARROWS_GLOVES; +import static net.runelite.api.ItemID.BASALT; +import static net.runelite.api.ItemID.BOOK_OF_BALANCE; +import static net.runelite.api.ItemID.BOOK_OF_DARKNESS; +import static net.runelite.api.ItemID.BOOK_OF_LAW; +import static net.runelite.api.ItemID.BOOK_OF_WAR; +import static net.runelite.api.ItemID.COOKING_GAUNTLETS; +import static net.runelite.api.ItemID.CRYSTAL_BOW_110; +import static net.runelite.api.ItemID.CRYSTAL_BOW_110_I; +import static net.runelite.api.ItemID.DRAGON_DEFENDER; +import static net.runelite.api.ItemID.DRAGON_SCIMITAR; +import static net.runelite.api.ItemID.FIGHTER_TORSO; +import static net.runelite.api.ItemID.GREENMANS_ALEM; +import static net.runelite.api.ItemID.HOLY_BOOK; +import static net.runelite.api.ItemID.INFERNAL_AXE; +import static net.runelite.api.ItemID.IVANDIS_FLAIL; +import static net.runelite.api.ItemID.LAVA_DRAGON_BONES; +import static net.runelite.api.ItemID.MARK_OF_GRACE; +import static net.runelite.api.ItemID.NEW_CRYSTAL_BOW; +import static net.runelite.api.ItemID.NEW_CRYSTAL_BOW_I; +import static net.runelite.api.ItemID.NUMULITE; +import static net.runelite.api.ItemID.ROD_OF_IVANDIS_1; +import static net.runelite.api.ItemID.ROD_OF_IVANDIS_10; +import static net.runelite.api.ItemID.RUNE_PLATEBODY; +import static net.runelite.api.ItemID.TZHAARKETOM; +import static net.runelite.api.ItemID.UNHOLY_BOOK; +import static net.runelite.api.ItemID.WARRIOR_GUILD_TOKEN; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; +import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; +import net.runelite.client.plugins.cluescrolls.clues.emote.AnyRequirementCollection; +import net.runelite.client.plugins.cluescrolls.clues.emote.ItemRequirement; +import net.runelite.client.plugins.cluescrolls.clues.emote.RangeItemRequirement; +import net.runelite.client.plugins.cluescrolls.clues.emote.SingleItemRequirement; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.LineComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.TitleComponent; + +@Getter +public class FaloTheBardClue extends ClueScroll implements TextClueScroll, NpcClueScroll +{ + private static final List CLUES = ImmutableList.of( + new FaloTheBardClue("A blood red weapon, a strong curved sword, found on the island of primate lords.", item(DRAGON_SCIMITAR)), + new FaloTheBardClue("A book that preaches of some great figure, lending strength, might, and vigour.", any("Any god book (must be complete)", item(HOLY_BOOK), item(BOOK_OF_BALANCE), item(UNHOLY_BOOK), item(BOOK_OF_LAW), item(BOOK_OF_WAR), item(BOOK_OF_DARKNESS))), + new FaloTheBardClue("A bow of elven craft was made, it shimmers bright, but will soon fade.", any("Crystal Bow", range(NEW_CRYSTAL_BOW, CRYSTAL_BOW_110), range(NEW_CRYSTAL_BOW_I, CRYSTAL_BOW_110_I))), + new FaloTheBardClue("A fiery axe of great inferno, when you use it, you'll wonder where the logs go.", item(INFERNAL_AXE)), + new FaloTheBardClue("A mark used to increase one's grace, found atop a seer's place.", item(MARK_OF_GRACE)), + new FaloTheBardClue("A molten beast with fiery breath, you acquire these with its death.", item(LAVA_DRAGON_BONES)), + new FaloTheBardClue("A shiny helmet of flight, to obtain this with melee, struggle you might.", item(ARMADYL_HELMET)), + // The wiki doesn't specify whether the trimmed dragon defender will work so I've assumed that it doesn't + new FaloTheBardClue("A sword held in the other hand, red its colour, Cyclops strength you must withstand.", item(DRAGON_DEFENDER)), + new FaloTheBardClue("A token used to kill mythical beasts, in hope of a blade or just for an xp feast.", item(WARRIOR_GUILD_TOKEN)), + new FaloTheBardClue("Green is my favorite, mature ale I do love, this takes your herblore above.", item(GREENMANS_ALEM)), + new FaloTheBardClue("It can hold down a boat or crush a goat, this object, you see, is quite heavy.", item(BARRELCHEST_ANCHOR)), + new FaloTheBardClue("It comes from the ground, underneath the snowy plain. Trolls aplenty, with what looks like a mane.", item(BASALT)), + new FaloTheBardClue("No attack to wield, only strength is required, made of obsidian but with no room for a shield.", item(TZHAARKETOM)), + new FaloTheBardClue("Penance healers runners and more, obtaining this body often gives much deplore.", item(FIGHTER_TORSO)), + new FaloTheBardClue("Strangely found in a chest, many believe these gloves are the best.", item(BARROWS_GLOVES)), + new FaloTheBardClue("These gloves of white won't help you fight, but aid in cooking, they just might.", item(COOKING_GAUNTLETS)), + new FaloTheBardClue("They come from some time ago, from a land unto the east. Fossilised they have become, this small and gentle beast.", item(NUMULITE)), + new FaloTheBardClue("To slay a dragon you must first do, before this chest piece can be put on you.", item(RUNE_PLATEBODY)), + new FaloTheBardClue("Vampyres are agile opponents, damaged best with a weapon of many components.", any("Rod of Ivandis or Ivandis flail", range(ROD_OF_IVANDIS_10, ROD_OF_IVANDIS_1), item(IVANDIS_FLAIL))) + ); + + private static final WorldPoint LOCATION = new WorldPoint(2689, 3550, 0); + private static final String FALO_THE_BARD = "Falo the Bard"; + + private static SingleItemRequirement item(int itemId) + { + return new SingleItemRequirement(itemId); + } + + private static AnyRequirementCollection any(String name, ItemRequirement... requirements) + { + return new AnyRequirementCollection(name, requirements); + } + + private static RangeItemRequirement range(int startItemId, int endItemId) + { + return range(null, startItemId, endItemId); + } + + private static RangeItemRequirement range(String name, int startItemId, int endItemId) + { + return new RangeItemRequirement(name, startItemId, endItemId); + } + + private final String text; + @Nonnull + private final ItemRequirement[] itemRequirements; + + private FaloTheBardClue(String text, @Nonnull ItemRequirement... itemRequirements) + { + this.text = text; + this.itemRequirements = itemRequirements; + } + + @Override + public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) + { + panelComponent.getChildren().add(TitleComponent.builder().text("Falo the Bard Clue").build()); + + panelComponent.getChildren().add(LineComponent.builder().left("NPC:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(FALO_THE_BARD) + .leftColor(TITLED_CONTENT_COLOR) + .build()); + + panelComponent.getChildren().add(LineComponent.builder().left("Item:").build()); + + Item[] inventory = plugin.getInventoryItems(); + + // If inventory is null, the player has nothing in their inventory + if (inventory == null) + { + inventory = new Item[0]; + } + + for (ItemRequirement requirement : itemRequirements) + { + boolean inventoryFulfilled = requirement.fulfilledBy(inventory); + + panelComponent.getChildren().add(LineComponent.builder() + .left(requirement.getCollectiveName(plugin.getClient())) + .leftColor(TITLED_CONTENT_COLOR) + .right(inventoryFulfilled ? "\u2713" : "\u2717") + .rightColor(inventoryFulfilled ? Color.GREEN : Color.RED) + .build()); + } + } + + @Override + public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin) + { + if (!LOCATION.isInScene(plugin.getClient())) + { + return; + } + + for (NPC npc : plugin.getNpcsToMark()) + { + OverlayUtil.renderActorOverlayImage(graphics, npc, plugin.getClueScrollImage(), Color.ORANGE, IMAGE_Z_OFFSET); + } + } + + @Override + public String[] getNpcs() + { + return new String[] {FALO_THE_BARD}; + } + + public static FaloTheBardClue forText(String text) + { + for (FaloTheBardClue clue : CLUES) + { + if (clue.text.equalsIgnoreCase(text)) + { + return clue; + } + } + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java new file mode 100644 index 0000000000..1116ab10c2 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursor.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2018, Kruithne + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.customcursor; + +import java.awt.image.BufferedImage; +import lombok.Getter; +import net.runelite.client.util.ImageUtil; + +public enum CustomCursor +{ + RS3_GOLD("RS3 Gold", "cursor-rs3-gold.png"), + RS3_SILVER("RS3 Silver", "cursor-rs3-silver.png"), + DRAGON_DAGGER("Dragon Dagger", "cursor-dragon-dagger.png"), + TROUT("Trout", "cursor-trout.png"), + DRAGON_SCIMITAR("Dragon Scimitar", "cursor-dragon-scimitar.png"); + + private final String name; + @Getter + private final BufferedImage cursorImage; + + CustomCursor(String name, String icon) + { + this.name = name; + this.cursorImage = ImageUtil.getResourceStreamFromClass(CustomCursorPlugin.class, icon); + } + + @Override + public String toString() + { + return name; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java new file mode 100644 index 0000000000..cf7075a393 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorConfig.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018, Kruithne + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.customcursor; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("customcursor") +public interface CustomCursorConfig extends Config +{ + @ConfigItem( + keyName = "cursorStyle", + name = "Cursor", + description = "Select which cursor you wish to use" + ) + default CustomCursor selectedCursor() + { + return CustomCursor.RS3_GOLD; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java new file mode 100644 index 0000000000..7e0fc4c18e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/customcursor/CustomCursorPlugin.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018, Kruithne + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.customcursor; + +import com.google.inject.Provides; +import javax.inject.Inject; +import net.runelite.api.events.ConfigChanged; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.ClientUI; + +@PluginDescriptor( + name = "Custom Cursor", + description = "Replaces your mouse cursor image", + enabledByDefault = false +) +public class CustomCursorPlugin extends Plugin +{ + @Inject + private ClientUI clientUI; + + @Inject + private CustomCursorConfig config; + + @Provides + CustomCursorConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(CustomCursorConfig.class); + } + + @Override + protected void startUp() + { + updateCursor(); + } + + @Override + protected void shutDown() + { + clientUI.resetCursor(); + } + + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (event.getGroup().equals("customcursor") && event.getKey().equals("cursorStyle")) + { + updateCursor(); + } + } + + private void updateCursor() + { + CustomCursor selectedCursor = config.selectedCursor(); + clientUI.setCursor(selectedCursor.getCursorImage(), selectedCursor.toString()); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksConfig.java index a1bd666f93..f461f06680 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksConfig.java @@ -111,13 +111,24 @@ public interface DailyTasksConfig extends Config } @ConfigItem( - position = 8, - keyName = "showArrows", - name = "Show Claimable Ogre Arrows", - description = "Show a message when you can collect ogre arrows from Rantz." + position = 8, + keyName = "showArrows", + name = "Show Claimable Ogre Arrows", + description = "Show a message when you can collect ogre arrows from Rantz." ) default boolean showArrows() { return true; } + + @ConfigItem( + position = 9, + keyName = "showDynamite", + name = "Show Claimable Dynamite", + description = "Show a message when you can collect Dynamite from Thirus." + ) + default boolean showDynamite() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java index 97404aacd6..e3bece82ac 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dailytaskindicators/DailyTasksPlugin.java @@ -66,6 +66,7 @@ public class DailyTasksPlugin extends Plugin private static final String ARROWS_MESSAGE = "You have ogre arrows waiting to be collected from Rantz."; private static final String BONEMEAL_MESSAGE = "You have bonemeal and slime waiting to be collected from Robin."; private static final int BONEMEAL_PER_DIARY = 13; + private static final String DYNAMITE_MESSAGE = "You have dynamite waiting to be collected from Thirus."; private static final String RELOG_MESSAGE = " (May require a relog)"; @Inject @@ -159,6 +160,11 @@ public class DailyTasksPlugin extends Plugin { checkArrows(dailyReset); } + + if (config.showDynamite()) + { + checkDynamite(dailyReset); + } } } @@ -253,6 +259,21 @@ public class DailyTasksPlugin extends Plugin } } + private void checkDynamite(boolean dailyReset) + { + if (client.getVar(Varbits.DIARY_KOUREND_MEDIUM) == 1) + { + if (client.getVar(Varbits.DAILY_DYNAMITE_COLLECTED) == 0) + { + sendChatMessage(DYNAMITE_MESSAGE); + } + else if (dailyReset) + { + sendChatMessage(DYNAMITE_MESSAGE); + } + } + } + private void sendChatMessage(String chatMessage) { final String message = new ChatMessageBuilder() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java index 94495ab434..0d57f682ac 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/idlenotifier/IdleNotifierPlugin.java @@ -145,7 +145,7 @@ public class IdleNotifierPlugin extends Plugin case COOKING_FIRE: case COOKING_RANGE: case COOKING_WINE: - /* Crafting(Gem Cutting, Glassblowing, Spinning, Battlestaves) */ + /* Crafting(Gem Cutting, Glassblowing, Spinning, Battlestaves, Pottery) */ case GEM_CUTTING_OPAL: case GEM_CUTTING_JADE: case GEM_CUTTING_REDTOPAZ: @@ -158,6 +158,8 @@ public class IdleNotifierPlugin extends Plugin case CRAFTING_SPINNING: case CRAFTING_BATTLESTAVES: case CRAFTING_LEATHER: + case CRAFTING_POTTERS_WHEEL: + case CRAFTING_POTTERY_OVEN: /* Fletching(Cutting, Stringing) */ case FLETCHING_BOW_CUTTING: case FLETCHING_STRING_NORMAL_SHORTBOW: diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java new file mode 100644 index 0000000000..8ef3efcf8b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentification.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2019, Hydrox6 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemidentification; + +import java.util.HashMap; +import java.util.Map; +import net.runelite.api.ItemID; + +enum ItemIdentification +{ + //Seeds + GUAM_SEED(Type.SEED, "Guam", "G", ItemID.GUAM_SEED), + MARRENTILL_SEED(Type.SEED, "Marren", "M", ItemID.MARRENTILL_SEED), + TARROMIN_SEED(Type.SEED, "Tarro", "TAR", ItemID.TARROMIN_SEED), + HARRALANDER_SEED(Type.SEED, "Harra", "H", ItemID.HARRALANDER_SEED), + RANARR_SEED(Type.SEED, "Ranarr", "R", ItemID.RANARR_SEED), + TOADFLAX_SEED(Type.SEED, "Toad", "TOA", ItemID.TOADFLAX_SEED), + IRIT_SEED(Type.SEED, "Irit", "I", ItemID.IRIT_SEED), + AVANTOE_SEED(Type.SEED, "Avantoe", "A", ItemID.AVANTOE_SEED), + KWUARM_SEED(Type.SEED, "Kwuarm", "K", ItemID.KWUARM_SEED), + SNAPDRAGON_SEED(Type.SEED, "Snap", "S", ItemID.SNAPDRAGON_SEED), + CADANTINE_SEED(Type.SEED, "Cadan", "C", ItemID.CADANTINE_SEED), + LANTADYME_SEED(Type.SEED, "Lanta", "L", ItemID.LANTADYME_SEED), + DWARF_WEED_SEED(Type.SEED, "Dwarf", "D", ItemID.DWARF_WEED_SEED), + TORSTOL_SEED(Type.SEED, "Torstol", "TOR", ItemID.TORSTOL_SEED), + POISON_IVY_SEED(Type.SEED, "Ivy", "I", ItemID.POISON_IVY_SEED), + WHITEBERRY_SEED( Type.SEED, "White", "W", ItemID.WHITEBERRY_SEED), + + //Herbs + GUAM(Type.HERB, "Guam", "G", ItemID.GUAM_LEAF, ItemID.GRIMY_GUAM_LEAF), + MARRENTILL(Type.HERB, "Marren", "M", ItemID.MARRENTILL, ItemID.GRIMY_MARRENTILL), + TARROMIN(Type.HERB, "Tarro", "TAR", ItemID.TARROMIN, ItemID.GRIMY_TARROMIN), + HARRALANDER(Type.HERB, "Harra", "H", ItemID.HARRALANDER, ItemID.GRIMY_HARRALANDER), + RANARR(Type.HERB, "Ranarr", "R", ItemID.RANARR_WEED, ItemID.GRIMY_RANARR_WEED), + TOADFLAX(Type.HERB, "Toad", "TOA", ItemID.TOADFLAX, ItemID.GRIMY_TOADFLAX), + IRIT(Type.HERB, "Irit", "I", ItemID.IRIT_LEAF, ItemID.GRIMY_IRIT_LEAF), + AVANTOE(Type.HERB, "Avantoe", "A", ItemID.AVANTOE, ItemID.GRIMY_AVANTOE), + KWUARM(Type.HERB, "Kwuarm", "K", ItemID.KWUARM, ItemID.GRIMY_KWUARM), + SNAPDRAGON(Type.HERB, "Snap", "S", ItemID.SNAPDRAGON, ItemID.GRIMY_SNAPDRAGON), + CADANTINE(Type.HERB, "Cadan", "C", ItemID.CADANTINE, ItemID.GRIMY_CADANTINE), + LANTADYME(Type.HERB, "Lanta", "L", ItemID.LANTADYME, ItemID.GRIMY_LANTADYME), + DWARF_WEED(Type.HERB, "Dwarf", "D", ItemID.DWARF_WEED, ItemID.GRIMY_DWARF_WEED), + TORSTOL(Type.HERB, "Torstol", "TOR", ItemID.TORSTOL, ItemID.GRIMY_TORSTOL), + + //Saplings + OAK_SAPLING(Type.SAPLING, "Oak", "OAK", ItemID.OAK_SAPLING, ItemID.OAK_SEEDLING, ItemID.OAK_SEEDLING_W), + WILLOW_SAPLING(Type.SAPLING, "Willow", "WIL", ItemID.WILLOW_SAPLING, ItemID.WILLOW_SEEDLING, ItemID.WILLOW_SEEDLING_W), + MAPLE_SAPLING(Type.SAPLING, "Maple", "MAP", ItemID.MAPLE_SAPLING, ItemID.MAPLE_SEEDLING, ItemID.MAPLE_SEEDLING_W), + YEW_SAPLING(Type.SAPLING, "Yew", "YEW", ItemID.YEW_SAPLING, ItemID.YEW_SEEDLING, ItemID.YEW_SEEDLING_W), + MAGIC_SAPLING(Type.SAPLING, "Magic", "MAG", ItemID.MAGIC_SAPLING, ItemID.MAGIC_SEEDLING, ItemID.MAGIC_SEEDLING_W), + REDWOOD_SAPLING(Type.SAPLING, "Red", "RED", ItemID.REDWOOD_SAPLING, ItemID.REDWOOD_SEEDLING, ItemID.REDWOOD_SEEDLING_W), + SPIRIT_SAPLING(Type.SAPLING, "Spirit", "SPI", ItemID.SPIRIT_SAPLING, ItemID.SPIRIT_SEEDLING, ItemID.SPIRIT_SEEDLING_W), + + APPLE_SAPLING(Type.SAPLING, "Apple", "APP", ItemID.APPLE_SAPLING, ItemID.APPLE_SEEDLING, ItemID.APPLE_SEEDLING_W), + BANANA_SAPLING(Type.SAPLING, "Banana", "BAN", ItemID.BANANA_SAPLING, ItemID.BANANA_SEEDLING, ItemID.BANANA_SEEDLING_W), + ORANGE_SAPLING(Type.SAPLING, "Orange", "ORA", ItemID.ORANGE_SAPLING, ItemID.ORANGE_SEEDLING, ItemID.ORANGE_SEEDLING_W), + CURRY_SAPLING(Type.SAPLING, "Curry", "CUR", ItemID.CURRY_SAPLING, ItemID.CURRY_SEEDLING, ItemID.CURRY_SEEDLING_W), + PINEAPPLE_SAPLING(Type.SAPLING, "Pine", "PINE", ItemID.PINEAPPLE_SAPLING, ItemID.PINEAPPLE_SEEDLING, ItemID.PINEAPPLE_SEEDLING_W), + PAPAYA_SAPLING(Type.SAPLING, "Papaya", "PAP", ItemID.PAPAYA_SAPLING, ItemID.PAPAYA_SEEDLING, ItemID.PAPAYA_SEEDLING_W), + PALM_SAPLING(Type.SAPLING, "Palm", "PALM", ItemID.PALM_SAPLING, ItemID.PALM_SEEDLING, ItemID.PALM_SEEDLING_W), + DRAGONFRUIT_SAPLING(Type.SAPLING, "Dragon", "DRAG", ItemID.DRAGONFRUIT_SAPLING, ItemID.DRAGONFRUIT_SEEDLING, ItemID.DRAGONFRUIT_SEEDLING_W), + + TEAK_SAPLING(Type.SAPLING, "Teak", "TEAK", ItemID.TEAK_SAPLING, ItemID.TEAK_SEEDLING, ItemID.TEAK_SEEDLING_W), + MAHOGANY_SAPLING(Type.SAPLING, "Mahog", "MAHOG", ItemID.MAHOGANY_SAPLING, ItemID.MAHOGANY_SEEDLING, ItemID.MAHOGANY_SEEDLING_W), + CALQUAT_SAPLING(Type.SAPLING, "Calquat", "CALQ", ItemID.CALQUAT_SAPLING, ItemID.CALQUAT_SEEDLING, ItemID.CALQUAT_SEEDLING_W), + CELASTRUS_SAPLING(Type.SAPLING, "Celas", "CEL", ItemID.CELASTRUS_SAPLING, ItemID.CELASTRUS_SEEDLING, ItemID.CELASTRUS_SEEDLING_W); + + final Type type; + final String medName; + final String shortName; + final int[] itemIDs; + + ItemIdentification(Type type, String medName, String shortName, int ... ids) + { + this.type = type; + this.medName = medName; + this.shortName = shortName; + this.itemIDs = ids; + } + + private static final Map itemIdentifications = new HashMap<>(); + + static + { + for (ItemIdentification i : values()) + { + for (int id : i.itemIDs) + { + itemIdentifications.put(id, i); + } + } + } + + static ItemIdentification get(int id) + { + return itemIdentifications.get(id); + } + + enum Type + { + SEED, + HERB, + SAPLING + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationConfig.java new file mode 100644 index 0000000000..12009a284f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationConfig.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2019, Hydrox6 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemidentification; + +import java.awt.Color; +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("itemidentification") +public interface ItemIdentificationConfig extends Config +{ + @ConfigItem( + keyName = "identificationType", + name = "Identification Type", + position = -4, + description = "How much to show of the item name" + ) + default ItemIdentificationMode identificationType() + { + return ItemIdentificationMode.SHORT; + } + + @ConfigItem( + keyName = "textColor", + name = "Color", + position = -3, + description = "The colour of the identification text" + ) + default Color textColor() + { + return Color.WHITE; + } + + @ConfigItem( + keyName = "showSeeds", + name = "Seeds", + description = "Show identification on Seeds" + ) + default boolean showSeeds() + { + return true; + } + + @ConfigItem( + keyName = "showHerbs", + name = "Herbs", + description = "Show identification on Herbs" + ) + default boolean showHerbs() + { + return false; + } + + @ConfigItem( + keyName = "showSaplings", + name = "Saplings", + description = "Show identification on Saplings and Seedlings" + ) + default boolean showSaplings() + { + return true; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationMode.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationMode.java new file mode 100644 index 0000000000..7b9f11217c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationMode.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019, Hydrox6 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemidentification; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ItemIdentificationMode +{ + SHORT("Short"), + MEDIUM("Medium"); + + private final String type; + + @Override + public String toString() + { + return type; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java new file mode 100644 index 0000000000..badd46bdd3 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationOverlay.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2019, Hydrox6 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemidentification; + +import com.google.inject.Inject; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import static net.runelite.api.widgets.WidgetID.GUIDE_PRICE_GROUP_ID; +import static net.runelite.api.widgets.WidgetID.KEPT_ON_DEATH_GROUP_ID; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.overlay.WidgetItemOverlay; +import net.runelite.client.ui.overlay.components.TextComponent; + +class ItemIdentificationOverlay extends WidgetItemOverlay +{ + private final ItemIdentificationConfig config; + + @Inject + ItemIdentificationOverlay(ItemIdentificationConfig config) + { + this.config = config; + showOnInventory(); + showOnBank(); + showOnInterfaces(KEPT_ON_DEATH_GROUP_ID, GUIDE_PRICE_GROUP_ID); + } + + @Override + public void renderItemOverlay(Graphics2D graphics, int itemId, WidgetItem itemWidget) + { + ItemIdentification iden = ItemIdentification.get(itemId); + if (iden == null) + { + return; + } + + switch (iden.type) + { + case SEED: + if (!config.showSeeds()) + { + return; + } + break; + case HERB: + if (!config.showHerbs()) + { + return; + } + break; + case SAPLING: + if (!config.showSaplings()) + { + return; + } + break; + } + + graphics.setFont(FontManager.getRunescapeSmallFont()); + renderText(graphics, itemWidget.getCanvasBounds(), iden); + + } + + private void renderText(Graphics2D graphics, Rectangle bounds, ItemIdentification iden) + { + final TextComponent textComponent = new TextComponent(); + textComponent.setPosition(new Point(bounds.x, bounds.y + bounds.height)); + textComponent.setColor(config.textColor()); + switch (config.identificationType()) + { + case SHORT: + textComponent.setText(iden.shortName); + break; + case MEDIUM: + textComponent.setText(iden.medName); + break; + } + textComponent.render(graphics); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationPlugin.java new file mode 100644 index 0000000000..6e4f331765 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemidentification/ItemIdentificationPlugin.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2019, Hydrox6 + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemidentification; + +import com.google.inject.Provides; +import javax.inject.Inject; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.overlay.OverlayManager; + +@PluginDescriptor( + name = "Item Identification", + description = "Show identifying text over items with difficult to distinguish sprites", + enabledByDefault = false +) +public class ItemIdentificationPlugin extends Plugin +{ + @Inject + private OverlayManager overlayManager; + + @Inject + private ItemIdentificationOverlay overlay; + + @Provides + ItemIdentificationConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(ItemIdentificationConfig.class); + } + + @Override + protected void startUp() + { + overlayManager.add(overlay); + } + + @Override + protected void shutDown() + { + overlayManager.remove(overlay); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index 50b6c4bb68..5429ec5941 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -99,6 +99,10 @@ public class LootTrackerPlugin extends Plugin private static final Pattern CLUE_SCROLL_PATTERN = Pattern.compile("You have completed [0-9]+ ([a-z]+) Treasure Trails."); private static final int THEATRE_OF_BLOOD_REGION = 12867; + // Herbiboar loot handling + private static final String HERBIBOAR_LOOTED_MESSAGE = "You harvest herbs from the herbiboar, whereupon it escapes."; + private static final String HERBIBOR_EVENT = "Herbiboar"; + // Chest loot handling private static final String CHEST_LOOTED_MESSAGE = "You find some treasure in the chest!"; private static final Map CHEST_EVENT_TYPES = ImmutableMap.of( @@ -389,14 +393,15 @@ public class LootTrackerPlugin extends Plugin } eventType = CHEST_EVENT_TYPES.get(regionID); + takeInventorySnapshot(); - final ItemContainer itemContainer = client.getItemContainer(InventoryID.INVENTORY); - if (itemContainer != null) - { - inventorySnapshot = HashMultiset.create(); - Arrays.stream(itemContainer.getItems()) - .forEach(item -> inventorySnapshot.add(item.getId(), item.getQuantity())); - } + return; + } + + if (message.equals(HERBIBOAR_LOOTED_MESSAGE)) + { + eventType = HERBIBOR_EVENT; + takeInventorySnapshot(); return; } @@ -433,7 +438,7 @@ public class LootTrackerPlugin extends Plugin @Subscribe public void onItemContainerChanged(ItemContainerChanged event) { - if (eventType != null && CHEST_EVENT_TYPES.containsValue(eventType)) + if (eventType != null && (CHEST_EVENT_TYPES.containsValue(eventType) || HERBIBOR_EVENT.equals(eventType))) { if (event.getItemContainer() != client.getItemContainer(InventoryID.INVENTORY)) { @@ -445,6 +450,17 @@ public class LootTrackerPlugin extends Plugin } } + private void takeInventorySnapshot() + { + final ItemContainer itemContainer = client.getItemContainer(InventoryID.INVENTORY); + if (itemContainer != null) + { + inventorySnapshot = HashMultiset.create(); + Arrays.stream(itemContainer.getItems()) + .forEach(item -> inventorySnapshot.add(item.getId(), item.getQuantity())); + } + } + private void processChestLoot(String chestType, ItemContainer inventoryContainer) { if (inventorySnapshot != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 1ae0dc2fa4..a5d859ed7e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -109,7 +109,7 @@ import net.runelite.http.api.chat.ChatClient; public class SlayerPlugin extends Plugin { //Chat messages - private static final Pattern CHAT_GEM_PROGRESS_MESSAGE = Pattern.compile("^(?:You're assigned to kill|You have received a new Slayer assignment from .*:) (?:[Tt]he )?(?.+?)(?: (?:in|on) (?:the )?(?[^;]+))?(?:; only | \\()(?\\d+)(?: more to go\\.|\\))$"); + private static final Pattern CHAT_GEM_PROGRESS_MESSAGE = Pattern.compile("^(?:You're assigned to kill|You have received a new Slayer assignment from .*:) (?:[Tt]he )?(?.+?)(?: (?:in|on|south of) (?:the )?(?[^;]+))?(?:; only | \\()(?\\d+)(?: more to go\\.|\\))$"); private static final String CHAT_GEM_COMPLETE_MESSAGE = "You need something new to hunt."; private static final Pattern CHAT_COMPLETE_MESSAGE = Pattern.compile("(?:\\d+,)*\\d+"); private static final String CHAT_CANCEL_MESSAGE = "Your task has been cancelled."; @@ -118,10 +118,10 @@ public class SlayerPlugin extends Plugin private static final Pattern COMBAT_BRACELET_TASK_UPDATE_MESSAGE = Pattern.compile("^You still need to kill (\\d+) monsters to complete your current Slayer assignment"); //NPC messages - private static final Pattern NPC_ASSIGN_MESSAGE = Pattern.compile(".*(?:Your new task is to kill|You are to bring balance to)\\s*(?\\d+) (?.+?)(?: (?:in|on) (?:the )?(?.+))?\\."); + private static final Pattern NPC_ASSIGN_MESSAGE = Pattern.compile(".*(?:Your new task is to kill|You are to bring balance to)\\s*(?\\d+) (?.+?)(?: (?:in|on|south of) (?:the )?(?.+))?\\."); private static final Pattern NPC_ASSIGN_BOSS_MESSAGE = Pattern.compile("^Excellent. You're now assigned to kill (?:the )?(.*) (\\d+) times.*Your reward point tally is (.*)\\.$"); private static final Pattern NPC_ASSIGN_FIRST_MESSAGE = Pattern.compile("^We'll start you off hunting (.*), you'll need to kill (\\d*) of them."); - private static final Pattern NPC_CURRENT_MESSAGE = Pattern.compile("^You're still (?:hunting|bringing balance to) (?.+)(?: (?:in|on) (?:the )?(?.+), with|; you have) (?\\d+) to go\\..*"); + private static final Pattern NPC_CURRENT_MESSAGE = Pattern.compile("^You're still (?:hunting|bringing balance to) (?.+)(?: (?:in|on|south of) (?:the )?(?.+), with|; you have) (?\\d+) to go\\..*"); private static final int GROTESQUE_GUARDIANS_REGION = 6727; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsConfig.java new file mode 100644 index 0000000000..83bacd8b8f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsConfig.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019, Beau Mitchell + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.virtuallevels; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("virtuallevels") +public interface VirtualLevelsConfig extends Config +{ + @ConfigItem( + keyName = "virtualTotalLevel", + name = "Virtual Total Level", + description = "Count virtual levels towards total level", + position = 0 + ) + default boolean virtualTotalLevel() + { + return true; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java index 879110bb2b..7be76a31b4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/virtuallevels/VirtualLevelsPlugin.java @@ -25,12 +25,15 @@ */ package net.runelite.client.plugins.virtuallevels; +import com.google.inject.Provides; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.Experience; import net.runelite.api.Skill; +import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.callback.ClientThread; +import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.PluginChanged; import net.runelite.client.plugins.Plugin; @@ -38,7 +41,7 @@ import net.runelite.client.plugins.PluginDescriptor; @PluginDescriptor( name = "Virtual Levels", - description = "Configuration for the virtual levels plugin.", + description = "Shows virtual levels (beyond 99) and virtual skill total on the skills tab.", tags = {"skill", "total", "max"}, enabledByDefault = false ) @@ -46,12 +49,21 @@ public class VirtualLevelsPlugin extends Plugin { private static final String TOTAL_LEVEL_TEXT_PREFIX = "Total level:
"; + @Inject + private VirtualLevelsConfig config; + @Inject private Client client; @Inject private ClientThread clientThread; + @Provides + VirtualLevelsConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(VirtualLevelsConfig.class); + } + @Override protected void shutDown() { @@ -68,6 +80,17 @@ public class VirtualLevelsPlugin extends Plugin } } + @Subscribe + public void onConfigChanged(ConfigChanged configChanged) + { + if (!configChanged.getGroup().equals("virtuallevels")) + { + return; + } + + clientThread.invoke(this::simulateSkillChange); + } + @Subscribe public void onScriptCallbackEvent(ScriptCallbackEvent e) { @@ -93,6 +116,10 @@ public class VirtualLevelsPlugin extends Plugin intStack[intStackSize - 1] = Experience.MAX_VIRT_LEVEL; break; case "skillTabTotalLevel": + if (!config.virtualTotalLevel()) + { + break; + } int level = 0; for (Skill s : Skill.values()) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index 9a56f6eeab..64a7806666 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -389,11 +389,21 @@ public class WorldHopperPlugin extends Plugin // Don't add entry if user is offline ChatPlayer player = getChatPlayerFromName(event.getTarget()); - if (player == null || player.getWorld() == 0 || player.getWorld() == client.getWorld()) + if (player == null || player.getWorld() == 0 || player.getWorld() == client.getWorld() + || worldResult == null) { return; } + World currentWorld = worldResult.findWorld(client.getWorld()); + World targetWorld = worldResult.findWorld(player.getWorld()); + if (targetWorld == null || currentWorld == null + || (!currentWorld.getTypes().contains(WorldType.PVP) && targetWorld.getTypes().contains(WorldType.PVP))) + { + // Disable Hop-to a PVP world from a regular world + return; + } + final MenuEntry hopTo = new MenuEntry(); hopTo.setOption(HOP_TO); hopTo.setTarget(event.getTarget()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java index 4430e218cb..b877be8810 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportLocationData.java @@ -61,6 +61,7 @@ enum TeleportLocationData ICE_PLATEAU(TeleportType.LUNAR_MAGIC, "Ice Plateau", 89, new WorldPoint(2973, 3939, 0), "ice_plateau_teleport_icon.png"), LUMBRIDGE_GRAVEYARD(TeleportType.ARCEUUS_MAGIC, "Lumbridge Graveyard", 6, new WorldPoint(3241, 3194, 0), "lumbridge_graveyard_teleport_icon.png"), DRAYNOR_MANOR(TeleportType.ARCEUUS_MAGIC, "Draynor Manor", 17, new WorldPoint(3108, 3352, 0), "draynor_manor_teleport_icon.png"), + BATTLEFRONT(TeleportType.ARCEUUS_MAGIC, "Battlefront", 23, new WorldPoint(1349, 3739, 0), "battlefront_teleport_icon.png"), MIND_ALTAR(TeleportType.ARCEUUS_MAGIC, "Mind Altar", 28, new WorldPoint(2979, 3509, 0), "mind_altar_teleport_icon.png"), SALVE_GRAVEYARD(TeleportType.ARCEUUS_MAGIC, "Salve Graveyard", 40, new WorldPoint(3433, 3461, 0), "salve_graveyard_teleport_icon.png"), FENKENSTRAINS_CASTLE(TeleportType.ARCEUUS_MAGIC, "Fenkenstrain's Castle", 48, new WorldPoint(3548, 3528, 0), "fenkenstrains_castle_teleport_icon.png"), diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index d1588f2d4e..66653e63cb 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -37,6 +37,7 @@ import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.LayoutManager; import java.awt.Rectangle; +import java.awt.Toolkit; import java.awt.TrayIcon; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; @@ -594,6 +595,38 @@ public class ClientUI giveClientFocus(); } + /** + * Changes cursor for client window. Requires ${@link ClientUI#open(RuneLite)} to be called first. + * FIXME: This is working properly only on Windows, Linux and Mac are displaying cursor incorrectly + * @param image cursor image + * @param name cursor name + */ + public void setCursor(final BufferedImage image, final String name) + { + if (container == null) + { + return; + } + + final java.awt.Point hotspot = new java.awt.Point(container.getX(), container.getY()); + final Cursor cursorAwt = Toolkit.getDefaultToolkit().createCustomCursor(image, hotspot, name); + container.setCursor(cursorAwt); + } + + /** + * Resets client window cursor to default one. + * @see ClientUI#setCursor(BufferedImage, String) + */ + public void resetCursor() + { + if (container == null) + { + return; + } + + container.setCursor(Cursor.getDefaultCursor()); + } + /** * Get offset of game canvas in game window * diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-dragon-dagger.png new file mode 100644 index 0000000000000000000000000000000000000000..9a59c1753c56344bde2a25a8095a3c9406507e6c GIT binary patch literal 18008 zcmeI3c{o(>`^S$GvbIo3`i!AMW@Uz%#$d)85=LkrGh{=u~rcUBB<|pWij-n(cn>=Y2otc|G@Y&zZTdvu*JrI~B#5 ziU0tpIM`def$y-Pr-B^#Dhv(%1inoa*n0~BKxyjGQwB&nGy?z>T{u+g;>CV^5nt%X z7r-2-RG1)$@5>2b0YGqFiaVR;-agH|`}rq|V@&uyN4}ee0?duFBV0XhuA$DvNeg3i zjy%j`8Dz-3d#rUja_l!%9)helV5D9EU$Rkg0zfK)Dr-c6!Mum!hT&DpeKw(nh!6L zzXHev-&axqN}Q8R(6gck)!tAJE|&@4DpMkgGjmi3R|hOZcT-LRmbNnCDT#C4fiziQ zbrr*>8CZ+}R?pk?>OK&j(sOXV46tmUj)qKH8~~fjim?X#763UlOSanpUT8qw*Rh-c zJV5|x2Txyn;LHV}qiy1~HKgMhm2M^Dm+`MHzY3_(%{ z^GJny1e=Iu3Wz{?Pfz4*{c4Bl^VRY6ar7ihWLd~TO>BgT+KaB+0FV}^0nWCoKe$>o zx4Ig?yFhgn;>}gLLAZ}k^FV7&w!jhqUW&qM2aHhpGs73ig>wgv&gqo(Td9<`wtI(f zo|@%(Ag#U5vr90<#^%VL!lzGLTUwqhET=4^-}2lzz%E-=;@KbYZy2es`}2z{O?na7 z6%lr_Juk{`e{wo8t7h-Stv(H}V(t1aC=K>$--nkw_!N2>syDk%3EXX+w6hC)0=|v1 z*Wmh`dxOlTMx);GyL?un#0PwMhU;02_VSKpXmX|f+ z!S@#Zc4>2fa9@YLfdH`5S`SIPm2Xk0007o$5r${1v_6&2Fe;IoRXU-eRH<(@ek(<< zyo@r5qR0%N6|~wQXEQ}V>dqN$!_}w4voM~Gf- zdnsCCORN0sg}MVO@6X=%xKgU-z~--$ocb~oEk ztuB^Ktwfi+o*{2s9)LzxT%(*dGnyFBs5%SJQO>TId1gt@_@Zr}88v6cvQr{#N+#lE z#S|EQww1k?lh>jr_8G8QdM1{809 zBL!}!U86ImnygJC+}SeC!STeYqxkg+@KM6OL70g z{d4zg8KP*JStqleXDNAfc~sG2GgrEA%(e9}c5lv{_~1acM^?(>x9(c*?92rj(OK*a zKF#8In0Nm+Iqz#u*IcN_UDM94YA&vTDKRwjgN=0jRkEYjM&Qclp1t#Q!#cyF#D49f z9p+h?M+j8og~p!wZe9C)E##XM1A7jM7ENr^PfzFy+x}ery+MJJM55UbZRn?u}5js$4j4`8+#zZ1secHutCQ&(amsr#YJwKj$K| z{7+~dDY6z{<)wEfre0YYp6bL;e;#tV?dzlinxWZb}v4^(1Y}IyhDwa3vHFGPt702ev&DELf=={dH zGs(@l@T9@X1x^c`D(~FBbM(%mgScdK%wud@a$EA_32!pmdnihSEsDW~QxEY_W3ql z6ay9KdFt_*3n#=`-Sqd<$zRAphnvaGB-7{E=iaMso0eR-aiPlP8b5VaWFvKx?jUn8 zbg&jk51%8$9=|QZDq`8V-k#76I#+jF5bIfA@}72B?My4Q(y)r%d}?!R=_wt*8}Ig< z(&=tXtd6VZs75Xhd;RFHJpC1Y$F(r!d6ChPo>3ON1ukC8t%Y0XW$r0K*n>8lP zk6I#^L%O)Vz>xdUCA-5jAvf&u+)!u#h?S+cHkY24@qer2q1YO^@omH7jukFmDDTGe z^siAVT4arF+jG_HrzdD^dZOPD+^QALzjgIs!@hHw+2w`I8sB@q?XR9AQkSV7$VzyX zpvqHuT6a#Raml%k&tGinQ3-eS>x;G&Pz#S;C0#6LrQfW+v%rFOoc4+Km4@%U_v}3V zaSyMyQ)_+k7n64n>z5UG_mgj4srQiaaDM3fkk#wZo8N7byDh7|=Rhxa#i>Qyz>doC z_r~|j>#7z!E`0D%`<^+?E%wp;w|1(P|6CbJc`rt&;8i?!9ja*36yH+!Z(~$9u2JK^zcfko@}AA$jU4|%A!L>Nx6l~{R=xoFP~rU+ug2}YFhp5)8&v4(*_?s zOeL5)?ain5B?S8fIyV^)4z(%VrgZV+p~Kh~(` z(y{@zNq^Aq-?N|H@22<0YsSY9%8pO$>SGuq>H&a==Fq%EUd~QL2A_+hGxVXpB&Q27w8; zAS;rBiC_ROOGJkSa|3unVz4=UI4%+VJk*SW!-l(v{LSH3Lj%IRoEO8W{2&$#hr}Zo zXuK)Rlz_zGOifKpjbK_CdBV7dT>L84KA5IH+bmT|eiRSHEm>%cSl zHnZOjD5Ql5SSUA^kiRyF!LnJ$;)!&BcM?p-k2r$0K>@>jm<$vvfW-wRLh$4Eb1tPlyzKO!}VMHlgdXncME zc_hn5e?NggpN6surtit&G5KPl0SN__jIQ@+G?q18#3F-AGXxrkz+h-t%y2%M&PQX2 zX!MvMBRwH8oWa~@(na*YiSkolXdFJ1;~VlS1#f!iC0!4FUJXZbIot@(_#Lx}{29@+Rz zJ_8K@BRz;_z8EIc*o1+=;cz}6NR}DGhhc(4uuRRE3|})dA12=T`#@uY{W6eC5C^PF z^nfvahUUT?nhOriFvZi+2nLpkM-W&hW(WcfM@L{xeZhx`4<5~Ad>`UBVSX9Po+AXa zDP&BRfw?wZdE8lnKev8&1aO8ch=3j>WDRXhbNKh2`J?3gs3=34;SEltGlpspnK6{U zEG7x{Q|sty{ZM|BaelL$e}!Nq{uue6#}NCmc#_h8B-C)PKL-)=eMMq=5X*`UX2{>{ z%#o-+%b?*&sG(XN!1+H|2qAsl|8g1rYFGWgSccIoX86&0Y!;J@`kuhw8~$$PM%MG^ zo%MaU{<;%MOa{@HAH=1L$Q&-6%|Z!yY!Yg;adb@5XbqzB1NcGCd?t$wmYUx+|5gS5 z^R{^8k2kW=&5i0Ua!~V28??XIP}K-n zJKWzCiv|xAX6W^sbgUaH^_DCh>xN24l^#5fh>ZO<8l-uQYUrDoI1JStyl7;R!Kp!; zpuHD!f>{Ax)*SG=LO4|OjKNWcHBiTIh2DP>j&Xbwj-=C=OS|DZG13ZNID*%#s2>-t zzm$+4mG-~+VRT0S&8U!A(m^0VB%4xPlKDWqQd|%ql1(Wt$$TJQDJ}>Q$)*&SWIhnD z6c+@DWK)VuG9QRniVFfnvMI$SnGeJ(#RUN(*_7gv%m?C?;(`E?Y)WxS<^%CcaY2Ac zHl?^E^MQD!xFA3zn^Iho`9Qo~#aE(j3GrWBWCJ`k@I7X*l8Q;JJ6 zABb0q3j##4Da9q355z0Q1py-2l;V=i2jZ3Df&h_hN^wc%1My06L4Zg$rMM*Xfq133 zAV4IWQe2YxK)h015FnCGDK5!;AYLgh2oTAp6qjT^5U&&$1c+o)A}+0PtotcyDPU08HoaU3J|S0A%bO ztgUFlb?@$5_?KDEsQl1Yp~Vv@Y%K=bJNLj9kD46UG1%7R?Zh=W53{%Olb4UCL|=Kg zNR#ztZcU}`V>cZi0xivj9i?P<_X9~=c;QPkmPs*SUSk`f(7Arn^I!tcF zBw`F@X_LK`(sL=8G|O3sLQzL2luZ8MO;PtO4Wlm|rykQU-e;|xuTOa$qG6pK9>7a? z*Ru-0+l3aa&<3K~dNpPzRP_lqVM|Na2G(}GkvZN)V9sibUiBq(&&J#fGMbeaXYM+q zG=X`z?O0~S8hO@M+mhH_eP<`^3O6j9@nUV!_4_Nf>nT{4r)dhTbEYXZEbn~<*O!$!+u4=o=2)4U zh6Mz~g@^llcqB$edbzlyCnTiC#=1H>26}sEB_)OU`bLL_{{R1fTh0Agpy`YyL4Lsu z4$p3+fjCLt?k=*gnF}WZIh+L^k;Opz1Q;j(dcGDUSXSVe4x|;pxc%3hxj@DmPZ!4! zjq|mWPcj`+;BlGgskH8DRQK)w^~+mcxk~ORsEAY(=2$IZ#co)(gF$wU(mX$<1xXCr z4?@oHv`o7-#Y!*0Vyai=rjCHvRj-RI^iIm=#Ld>;?Dv{Me$|X)1zszwoT|e2{FM49 z&3xsJYt&-bhuhu=-=0>p!+76$*%@nB{bs&l?Oi34bvx{B$K}eBr@D#aKG!SHm_PW} zKk<3{>RF$S{WE-8&$o*2`mfMp-sr^Ix7*o66zFc%64!{5l*E!$tK_0oAjM#0U}&jp zV4`be8Dd~)Wolw&V5V(gU}a$N>3AL}C=eQQ^HVa@DsgLQo^|a!Py>UftDnm{r-UW| D8kxFa literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-rs3-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..ee89a5b05a016cf5c7202ae82b88215eb57f5836 GIT binary patch literal 18738 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 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png b/runelite-client/src/main/resources/net/runelite/client/plugins/customcursor/cursor-trout.png new file mode 100644 index 0000000000000000000000000000000000000000..b32ddf0ea1fb5546600764031562121bcd7fe141 GIT binary patch literal 15609 zcmeI3Yg7|w8plUPq^K(@hzPrcs8y`Vmspa5 zsB>)vDJr>wBF0Q8g-Z{hA&dYXg%?O?a(O%sZ#IR+U~*vw8)h?TEVh8d5O7$O?iW?$ zibq0|CSDLJ3GFV2{|cfeS}aBZ45y@|&{NoS%#;8#0|NtL1`B4fXt;uAPBmE6R+_;) z)sdtpj|4R%Cauw;#S9c%UUeLnYzd-LZH0PY-Pffz_7*ajyV>CsVXN8*GwBR?Fp~!9 z^%#>)I{VNx2#o4bJ!-I+aUXL~pD_`$VCF<@h?2eCLl(y8L@w{GJ?MD#`aw&ZEg`FL z1l>pnb()o_Mih=j%~-MtK|@yImojy*tG8(5`zEJfCR@*tV@IvpA#AoDht0ke95W=u zuT>y6p=t|eQev1+Oy4V9=Zs0d$=d>VsG zV=|R2rhvm0u=(#Wm;wd^Na9cq$RWox+W6GLa`3{}g^h*;A>7vpD0|nFK#b`y6Fw$X#1_JXH3KgD8WTtjW{cW@pi+qlZ=h?n z8UY(&#&hD>0W>wj)X>-{M@@@E7$}X6AUq9|!{PGOfp&ayIcR?^wFEwGPnO zu0``dUdte9UMm%@HRJ0v64mWEUqGkrKM{`B{`1qbtX`i_q3v)J;A;UNm)brDOdGfdUd2NP{pYaS|gor=^i3_Ab7?ZdN z5rF~{7f6FJCUFrW0tF;4kOpB);vz%@3P@Za4Z@hjMTiI#khnk^gfWSW5D_RKae*`l zV-go3B2Yl$0%;J&BrZZkpn${$(jbgUT!e@~0f`HwK^VUgmuuf6fT#g~?k@#@z|T9U zVjuo+AO#7JltWP3bO>6L0YP1_@b8BZl+1vjmiHk@up5Frv7Fe-PzZ7glS<|)t@V%c zmS#nV_@|Rg?wc=**uarCT4MKLD)6Vt#w!R@GEn3eMRG|8=Jp9b7Em&dxkl_`iJ!9cN=}# zVP7uoa*|08ZFwkK8K7%<z{QRdi;j*-deTd&CozSw6@4d>c{tw13r3zgt!={+!=j;u-rH?lU$_ zy!e&}RClc9L?PvB>XnMxQ8O0La*C9_m-;d=?S(Td>*6p<=9uThB@Ifysc{90>_bUE zuOD+hb=&r2>}luN%+QDHPh>uM(Hqdv;-;(agqU zf?>vc_eyV!fM)BHn$F)YXzzObtwP4McCl8+dWU*%Ub$<@o_I>+Or`tykl|h-=_yYW z0**d*t9}vl#r9zf*7JYu*s#oN%H3c7>2eU^ZYfbE)zsZiFH79|4enF?;K|CmFzK>$ zoNQA5Ics)j%Y>R|orYNj)FS!i*#^S_WmObCZ>Gnl@3Idls-mhMX#JxhMt!_!yzI%N zzb~wouYD*>FHZ1mD#lHKTfc zsy}1-#th%n8v@qXbWAzSw6=9LAou$-onQ<1&=TZJvG=9u##dD* zcV7DLsr#qQGEElN*>=CBq%|2{(E6(EZb-}r74I~RqA%~-F=EuX;^xEOS9Zky<&=5S zKaO(#+H`;UpFhu?|7@m*zlZCV+7{=Xk)J6get8E=mo;zO-wG*Zl^+-0xkZ6;IA_LB z@fDWxLtWRpPw;Q4Sn@#CaeXSp*(rPWB9tB+ye3o{xi#RMv-RnF(|vYqLo&BVo$s2H zG@o4%w{~I5>GERlYiAzu_g=c^XRYDSosoB?;YN9TmCLvi`h^eYv`@_YTeHc_AA9fE zo-c;`S&NSs>1DS%KiHQEKR-KPlvlCgWLJ8-ldsWF;XeuEDt4#nmYvD(T(Prrg@@an wh~mTMuH3U<%PL0x#w;CY^u4`$bbBK-;{25kMca<&wuh6YArX?J^WI literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json index 23f057a59b..5a6f05161d 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_fletching.json @@ -18,12 +18,6 @@ "name": "Bronze Arrow", "xp": 1.3 }, - { - "level": 1, - "icon": 806, - "name": "Bronze Dart", - "xp": 1.8 - }, { "level": 5, "icon": 2866, @@ -66,6 +60,12 @@ "name": "Bronze Crossbow", "xp": 6 }, + { + "level": 10, + "icon": 806, + "name": "Bronze Dart", + "xp": 1.8 + }, { "level": 10, "icon": 839, @@ -553,4 +553,4 @@ "xp": 25 } ] -} \ No newline at end of file +} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/battlefront_teleport_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/battlefront_teleport_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..696c1a0cf6848ee055b9e32f43156e1e6d377a01 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^d>}Rl8<3oNC%zs?aTa()7Bet#3xhBt!>l4w^BqzUk$I!P@GHl=SvPXc_qM3aJ0#G5<%`r?RhvfkiF!V#iWjOXOn9ZD za=;+}8KVQsQjriZM?<^bF1_WYo~z_<`a3ZM92Qy3z!0}Ih^y+}yK`~(OgVO1owzk? zOWd4^TT8cuKR#CB7^Q!t;^CS7`lnuA?Au|JcEp0=#?3sli6JtcNB6qS`w+h*TlMwb zJu6;*Y}k|i!P0q^{LIUbweH2AU$%TtcFsgb?wz@gyqB$CUDM}$$og+{xDO+z!*QTL O7(8A5T-G@yGywnxL1{Js literal 0 HcmV?d00001 diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java index c8234a7dc6..e7e5d914f2 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/slayer/SlayerPluginTest.java @@ -69,6 +69,7 @@ public class SlayerPluginTest private static final String TASK_NEW = "Your new task is to kill 231 Suqahs."; private static final String TASK_NEW_KONAR = "You are to bring balance to 147 Wyrms in the Karuulm Slayer Dungeon."; private static final String TASK_NEW_KONAR_2 = "You are to bring balance to 142 Hellhounds in Witchhaven Dungeon."; + private static final String TASK_NEW_KONAR_3 = "You are to bring balance to 135 Trolls south of Mount Quidamortem."; private static final String TASK_NEW_FIRST = "We'll start you off hunting goblins, you'll need to kill 17 of them."; private static final String TASK_NEW_NPC_CONTACT = "Excellent, you're doing great. Your new task is to kill
211 Suqahs."; private static final String TASK_NEW_FROM_PARTNER = "You have received a new Slayer assignment from breaklulz: Dust Devils (377)"; @@ -188,6 +189,19 @@ public class SlayerPluginTest assertEquals("Witchhaven Dungeon", slayerPlugin.getCurrentTask().getTaskLocation()); } + @Test + public void testNewKonarTask3() + { + Widget npcDialog = mock(Widget.class); + when(npcDialog.getText()).thenReturn(TASK_NEW_KONAR_3); + when(client.getWidget(WidgetInfo.DIALOG_NPC_TEXT)).thenReturn(npcDialog); + slayerPlugin.onGameTick(new GameTick()); + + assertEquals("Trolls", slayerPlugin.getCurrentTask().getTaskName()); + assertEquals(135, slayerPlugin.getCurrentTask().getAmount()); + assertEquals("Mount Quidamortem", slayerPlugin.getCurrentTask().getTaskLocation()); + } + @Test public void testFirstTask() { diff --git a/runelite-mixins/pom.xml b/runelite-mixins/pom.xml index 60644a4b7b..867d1543a3 100644 --- a/runelite-mixins/pom.xml +++ b/runelite-mixins/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT mixins diff --git a/runelite-plugin-archetype/pom.xml b/runelite-plugin-archetype/pom.xml index a5b8832120..3a7fe3b36b 100644 --- a/runelite-plugin-archetype/pom.xml +++ b/runelite-plugin-archetype/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT runelite-plugin-archetype diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 2ee5a13a39..5302a199d1 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT script-assembler-plugin diff --git a/runescape-api/pom.xml b/runescape-api/pom.xml index 8bdcfa8ed2..cc70e2bdd1 100644 --- a/runescape-api/pom.xml +++ b/runescape-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.5.22-SNAPSHOT + 1.5.23-SNAPSHOT net.runelite.rs