From 3cf777d274c7e654583baac247ff415e8fa07dda Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 4 Jan 2020 18:26:56 -0500 Subject: [PATCH] hiscore plugin: add boss hiscores Co-authored-by: Abex Co-authored-by: Gamma91 --- .../http/api/hiscore/HiscoreSkill.java | 160 +++++------ .../http/api/hiscore/HiscoreSkillType.java | 33 +++ .../client/plugins/hiscore/HiscorePanel.java | 248 ++++++++++-------- .../net/runelite/client/util/ImageUtil.java | 6 +- .../plugins/hiscore/bosses/abyssal_sire.png | Bin 0 -> 958 bytes .../hiscore/bosses/alchemical_hydra.png | Bin 0 -> 969 bytes .../plugins/hiscore/bosses/barrows_chests.png | Bin 0 -> 648 bytes .../plugins/hiscore/bosses/bryophyta.png | Bin 0 -> 697 bytes .../plugins/hiscore/bosses/callisto.png | Bin 0 -> 1024 bytes .../plugins/hiscore/bosses/cerberus.png | Bin 0 -> 745 bytes .../hiscore/bosses/chambers_of_xeric.png | Bin 0 -> 952 bytes .../chambers_of_xeric_challenge_mode.png | Bin 0 -> 985 bytes .../hiscore/bosses/chaos_elemental.png | Bin 0 -> 910 bytes .../plugins/hiscore/bosses/chaos_fanatic.png | Bin 0 -> 593 bytes .../hiscore/bosses/commander_zilyana.png | Bin 0 -> 998 bytes .../hiscore/bosses/corporeal_beast.png | Bin 0 -> 977 bytes .../hiscore/bosses/crazy_archaeologist.png | Bin 0 -> 881 bytes .../hiscore/bosses/dagannoth_prime.png | Bin 0 -> 697 bytes .../plugins/hiscore/bosses/dagannoth_rex.png | Bin 0 -> 688 bytes .../hiscore/bosses/dagannoth_supreme.png | Bin 0 -> 697 bytes .../hiscore/bosses/deranged_archaeologist.png | Bin 0 -> 1162 bytes .../hiscore/bosses/general_graardor.png | Bin 0 -> 890 bytes .../plugins/hiscore/bosses/giant_mole.png | Bin 0 -> 904 bytes .../hiscore/bosses/grotesque_guardians.png | Bin 0 -> 884 bytes .../client/plugins/hiscore/bosses/hespori.png | Bin 0 -> 766 bytes .../plugins/hiscore/bosses/kalphite_queen.png | Bin 0 -> 807 bytes .../hiscore/bosses/king_black_dragon.png | Bin 0 -> 848 bytes .../client/plugins/hiscore/bosses/kraken.png | Bin 0 -> 720 bytes .../plugins/hiscore/bosses/kreearra.png | Bin 0 -> 800 bytes .../hiscore/bosses/kril_tsutsaroth.png | Bin 0 -> 1075 bytes .../client/plugins/hiscore/bosses/mimic.png | Bin 0 -> 1139 bytes .../client/plugins/hiscore/bosses/obor.png | Bin 0 -> 648 bytes .../plugins/hiscore/bosses/sarachnis.png | Bin 0 -> 884 bytes .../client/plugins/hiscore/bosses/scorpia.png | Bin 0 -> 706 bytes .../client/plugins/hiscore/bosses/skotizo.png | Bin 0 -> 994 bytes .../hiscore/bosses/the_corrupted_gauntlet.png | Bin 0 -> 823 bytes .../plugins/hiscore/bosses/the_gauntlet.png | Bin 0 -> 909 bytes .../hiscore/bosses/theatre_of_blood.png | Bin 0 -> 788 bytes .../bosses/thermonuclear_smoke_devil.png | Bin 0 -> 700 bytes .../plugins/hiscore/bosses/tzkal_zuk.png | Bin 0 -> 868 bytes .../plugins/hiscore/bosses/tztok_jad.png | Bin 0 -> 764 bytes .../plugins/hiscore/bosses/venenatis.png | Bin 0 -> 882 bytes .../client/plugins/hiscore/bosses/vetion.png | Bin 0 -> 728 bytes .../client/plugins/hiscore/bosses/vorkath.png | Bin 0 -> 1041 bytes .../plugins/hiscore/bosses/wintertodt.png | Bin 0 -> 957 bytes .../client/plugins/hiscore/bosses/zalcano.png | Bin 0 -> 929 bytes .../client/plugins/hiscore/bosses/zulrah.png | Bin 0 -> 489 bytes .../client/plugins/hiscore/overall.png | Bin 0 -> 802 bytes ... - hunter.png => bounty_hunter_hunter.png} | Bin ...er - rogue.png => bounty_hunter_rogue.png} | Bin ... scrolls (all).png => clue_scroll_all.png} | Bin ...man standing.png => last_man_standing.png} | Bin .../{league points.png => league_points.png} | Bin .../plugins/hiscore/HiscorePanelTest.java | 12 + 54 files changed, 267 insertions(+), 192 deletions(-) create mode 100644 http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkillType.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/abyssal_sire.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/alchemical_hydra.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/barrows_chests.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/bryophyta.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/callisto.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/cerberus.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/chambers_of_xeric.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/chambers_of_xeric_challenge_mode.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/chaos_elemental.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/chaos_fanatic.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/commander_zilyana.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/corporeal_beast.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/crazy_archaeologist.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/dagannoth_prime.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/dagannoth_rex.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/dagannoth_supreme.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/deranged_archaeologist.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/general_graardor.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/giant_mole.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/grotesque_guardians.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/hespori.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/kalphite_queen.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/king_black_dragon.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/kraken.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/kreearra.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/kril_tsutsaroth.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/mimic.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/obor.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/sarachnis.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/scorpia.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/skotizo.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/the_corrupted_gauntlet.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/the_gauntlet.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/theatre_of_blood.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/thermonuclear_smoke_devil.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/tzkal_zuk.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/tztok_jad.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/venenatis.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/vetion.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/vorkath.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/wintertodt.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/zalcano.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/zulrah.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/overall.png rename runelite-client/src/main/resources/skill_icons_small/{bounty hunter - hunter.png => bounty_hunter_hunter.png} (100%) rename runelite-client/src/main/resources/skill_icons_small/{bounty hunter - rogue.png => bounty_hunter_rogue.png} (100%) rename runelite-client/src/main/resources/skill_icons_small/{clue scrolls (all).png => clue_scroll_all.png} (100%) rename runelite-client/src/main/resources/skill_icons_small/{last man standing.png => last_man_standing.png} (100%) rename runelite-client/src/main/resources/skill_icons_small/{league points.png => league_points.png} (100%) diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java index c730917863..ac57522a5b 100644 --- a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkill.java @@ -26,89 +26,93 @@ package net.runelite.http.api.hiscore; import lombok.AllArgsConstructor; import lombok.Getter; +import static net.runelite.http.api.hiscore.HiscoreSkillType.SKILL; +import static net.runelite.http.api.hiscore.HiscoreSkillType.ACTIVITY; +import static net.runelite.http.api.hiscore.HiscoreSkillType.BOSS; @AllArgsConstructor @Getter public enum HiscoreSkill { - OVERALL("Overall"), - ATTACK("Attack"), - DEFENCE("Defence"), - STRENGTH("Strength"), - HITPOINTS("Hitpoints"), - RANGED("Ranged"), - PRAYER("Prayer"), - MAGIC("Magic"), - COOKING("Cooking"), - WOODCUTTING("Woodcutting"), - FLETCHING("Fletching"), - FISHING("Fishing"), - FIREMAKING("Firemaking"), - CRAFTING("Crafting"), - SMITHING("Smithing"), - MINING("Mining"), - HERBLORE("Herblore"), - AGILITY("Agility"), - THIEVING("Thieving"), - SLAYER("Slayer"), - FARMING("Farming"), - RUNECRAFT("Runecraft"), - HUNTER("Hunter"), - CONSTRUCTION("Construction"), - LEAGUE_POINTS("League Points"), - BOUNTY_HUNTER_HUNTER("Bounty Hunter - Hunter"), - BOUNTY_HUNTER_ROGUE("Bounty Hunter - Rogue"), - CLUE_SCROLL_ALL("Clue Scrolls (all)"), - CLUE_SCROLL_BEGINNER("Clue Scrolls (beginner)"), - CLUE_SCROLL_EASY("Clue Scrolls (easy)"), - CLUE_SCROLL_MEDIUM("Clue Scrolls (medium)"), - CLUE_SCROLL_HARD("Clue Scrolls (hard)"), - CLUE_SCROLL_ELITE("Clue Scrolls (elite)"), - CLUE_SCROLL_MASTER("Clue Scrolls (master)"), - LAST_MAN_STANDING("Last Man Standing"), - ABYSSAL_SIRE("Abyssal Sire"), - ALCHEMICAL_HYDRA("Alchemical Hydra"), - BARROWS_CHESTS("Barrows Chests"), - BRYOPHYTA("Bryophyta"), - CALLISTO("Callisto"), - CERBERUS("Cerberus"), - CHAMBERS_OF_XERIC("Chambers of Xeric"), - CHAMBERS_OF_XERIC_CHALLENGE_MODE("Chambers of Xeric: Challenge Mode"), - CHAOS_ELEMENTAL("Chaos Elemental"), - CHAOS_FANATIC("Chaos Fanatic"), - COMMANDER_ZILYANA("Commander Zilyana"), - CORPOREAL_BEAST("Corporeal Beast"), - CRAZY_ARCHAEOLOGIST("Crazy Archaeologist"), - DAGANNOTH_PRIME("Dagannoth Prime"), - DAGANNOTH_REX("Dagannoth Rex"), - DAGANNOTH_SUPREME("Dagannoth Supreme"), - DERANGED_ARCHAEOLOGIST("Deranged Archaeologist"), - GENERAL_GRAARDOR("General Graardor"), - GIANT_MOLE("Giant Mole"), - GROTESQUE_GUARDIANS("Grotesque Guardians"), - HESPORI("Hespori"), - KALPHITE_QUEEN("Kalphite Queen"), - KING_BLACK_DRAGON("King Black Dragon"), - KRAKEN("Kraken"), - KREEARRA("Kree'Arra"), - KRIL_TSUTSAROTH("K'ril Tsutsaroth"), - MIMIC("Mimic"), - OBOR("Obor"), - SARACHNIS("Sarachnis"), - SCORPIA("Scorpia"), - SKOTIZO("Skotizo"), - THE_GAUNTLET("The Gauntlet"), - THE_CORRUPTED_GAUNTLET("The Corrupted Gauntlet"), - THEATRE_OF_BLOOD("Theatre of Blood"), - THERMONUCLEAR_SMOKE_DEVIL("Thermonuclear Smoke Devil"), - TZKAL_ZUK("TzKal-Zuk"), - TZTOK_JAD("TzTok-Jad"), - VENENATIS("Venenatis"), - VETION("Vet'ion"), - VORKATH("Vorkath"), - WINTERTODT("Wintertodt"), - ZALCANO("Zalcano"), - ZULRAH("Zulrah"); + OVERALL("Overall", HiscoreSkillType.OVERALL), + ATTACK("Attack", SKILL), + DEFENCE("Defence", SKILL), + STRENGTH("Strength", SKILL), + HITPOINTS("Hitpoints", SKILL), + RANGED("Ranged", SKILL), + PRAYER("Prayer", SKILL), + MAGIC("Magic", SKILL), + COOKING("Cooking", SKILL), + WOODCUTTING("Woodcutting", SKILL), + FLETCHING("Fletching", SKILL), + FISHING("Fishing", SKILL), + FIREMAKING("Firemaking", SKILL), + CRAFTING("Crafting", SKILL), + SMITHING("Smithing", SKILL), + MINING("Mining", SKILL), + HERBLORE("Herblore", SKILL), + AGILITY("Agility", SKILL), + THIEVING("Thieving", SKILL), + SLAYER("Slayer", SKILL), + FARMING("Farming", SKILL), + RUNECRAFT("Runecraft", SKILL), + HUNTER("Hunter", SKILL), + CONSTRUCTION("Construction", SKILL), + LEAGUE_POINTS("League Points", ACTIVITY), + BOUNTY_HUNTER_HUNTER("Bounty Hunter - Hunter", ACTIVITY), + BOUNTY_HUNTER_ROGUE("Bounty Hunter - Rogue", ACTIVITY), + CLUE_SCROLL_ALL("Clue Scrolls (all)", ACTIVITY), + CLUE_SCROLL_BEGINNER("Clue Scrolls (beginner)", ACTIVITY), + CLUE_SCROLL_EASY("Clue Scrolls (easy)", ACTIVITY), + CLUE_SCROLL_MEDIUM("Clue Scrolls (medium)", ACTIVITY), + CLUE_SCROLL_HARD("Clue Scrolls (hard)", ACTIVITY), + CLUE_SCROLL_ELITE("Clue Scrolls (elite)", ACTIVITY), + CLUE_SCROLL_MASTER("Clue Scrolls (master)", ACTIVITY), + LAST_MAN_STANDING("Last Man Standing", ACTIVITY), + ABYSSAL_SIRE("Abyssal Sire", BOSS), + ALCHEMICAL_HYDRA("Alchemical Hydra", BOSS), + BARROWS_CHESTS("Barrows Chests", BOSS), + BRYOPHYTA("Bryophyta", BOSS), + CALLISTO("Callisto", BOSS), + CERBERUS("Cerberus", BOSS), + CHAMBERS_OF_XERIC("Chambers of Xeric", BOSS), + CHAMBERS_OF_XERIC_CHALLENGE_MODE("Chambers of Xeric: Challenge Mode", BOSS), + CHAOS_ELEMENTAL("Chaos Elemental", BOSS), + CHAOS_FANATIC("Chaos Fanatic", BOSS), + COMMANDER_ZILYANA("Commander Zilyana", BOSS), + CORPOREAL_BEAST("Corporeal Beast", BOSS), + CRAZY_ARCHAEOLOGIST("Crazy Archaeologist", BOSS), + DAGANNOTH_PRIME("Dagannoth Prime", BOSS), + DAGANNOTH_REX("Dagannoth Rex", BOSS), + DAGANNOTH_SUPREME("Dagannoth Supreme", BOSS), + DERANGED_ARCHAEOLOGIST("Deranged Archaeologist", BOSS), + GENERAL_GRAARDOR("General Graardor", BOSS), + GIANT_MOLE("Giant Mole", BOSS), + GROTESQUE_GUARDIANS("Grotesque Guardians", BOSS), + HESPORI("Hespori", BOSS), + KALPHITE_QUEEN("Kalphite Queen", BOSS), + KING_BLACK_DRAGON("King Black Dragon", BOSS), + KRAKEN("Kraken", BOSS), + KREEARRA("Kree'Arra", BOSS), + KRIL_TSUTSAROTH("K'ril Tsutsaroth", BOSS), + MIMIC("Mimic", BOSS), + OBOR("Obor", BOSS), + SARACHNIS("Sarachnis", BOSS), + SCORPIA("Scorpia", BOSS), + SKOTIZO("Skotizo", BOSS), + THE_GAUNTLET("The Gauntlet", BOSS), + THE_CORRUPTED_GAUNTLET("The Corrupted Gauntlet", BOSS), + THEATRE_OF_BLOOD("Theatre of Blood", BOSS), + THERMONUCLEAR_SMOKE_DEVIL("Thermonuclear Smoke Devil", BOSS), + TZKAL_ZUK("TzKal-Zuk", BOSS), + TZTOK_JAD("TzTok-Jad", BOSS), + VENENATIS("Venenatis", BOSS), + VETION("Vet'ion", BOSS), + VORKATH("Vorkath", BOSS), + WINTERTODT("Wintertodt", BOSS), + ZALCANO("Zalcano", BOSS), + ZULRAH("Zulrah", BOSS); private final String name; + private final HiscoreSkillType type; } diff --git a/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkillType.java b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkillType.java new file mode 100644 index 0000000000..67e695364b --- /dev/null +++ b/http-api/src/main/java/net/runelite/http/api/hiscore/HiscoreSkillType.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2019, Bram91 + * 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.http.api.hiscore; + +public enum HiscoreSkillType +{ + OVERALL, + SKILL, + ACTIVITY, + BOSS +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java index 2a11a59d2c..23ff6521d2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -1,6 +1,7 @@ /* * Copyright (c) 2017, Adam * Copyright (c) 2018, Psikoi + * Copyright (c) 2019, Bram91 * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -25,6 +26,7 @@ */ package net.runelite.client.plugins.hiscore; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import java.awt.Dimension; @@ -37,9 +39,10 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; -import java.util.ArrayList; import java.util.EnumSet; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; import javax.inject.Inject; @@ -64,36 +67,10 @@ import net.runelite.http.api.hiscore.HiscoreClient; import net.runelite.http.api.hiscore.HiscoreEndpoint; import net.runelite.http.api.hiscore.HiscoreResult; import net.runelite.http.api.hiscore.HiscoreSkill; -import static net.runelite.http.api.hiscore.HiscoreSkill.AGILITY; -import static net.runelite.http.api.hiscore.HiscoreSkill.ATTACK; -import static net.runelite.http.api.hiscore.HiscoreSkill.BOUNTY_HUNTER_HUNTER; -import static net.runelite.http.api.hiscore.HiscoreSkill.BOUNTY_HUNTER_ROGUE; -import static net.runelite.http.api.hiscore.HiscoreSkill.CLUE_SCROLL_ALL; -import static net.runelite.http.api.hiscore.HiscoreSkill.CONSTRUCTION; -import static net.runelite.http.api.hiscore.HiscoreSkill.COOKING; -import static net.runelite.http.api.hiscore.HiscoreSkill.CRAFTING; -import static net.runelite.http.api.hiscore.HiscoreSkill.DEFENCE; -import static net.runelite.http.api.hiscore.HiscoreSkill.FARMING; -import static net.runelite.http.api.hiscore.HiscoreSkill.FIREMAKING; -import static net.runelite.http.api.hiscore.HiscoreSkill.FISHING; -import static net.runelite.http.api.hiscore.HiscoreSkill.FLETCHING; -import static net.runelite.http.api.hiscore.HiscoreSkill.HERBLORE; -import static net.runelite.http.api.hiscore.HiscoreSkill.HITPOINTS; -import static net.runelite.http.api.hiscore.HiscoreSkill.HUNTER; -import static net.runelite.http.api.hiscore.HiscoreSkill.LAST_MAN_STANDING; -import static net.runelite.http.api.hiscore.HiscoreSkill.LEAGUE_POINTS; -import static net.runelite.http.api.hiscore.HiscoreSkill.MAGIC; -import static net.runelite.http.api.hiscore.HiscoreSkill.MINING; -import static net.runelite.http.api.hiscore.HiscoreSkill.OVERALL; -import static net.runelite.http.api.hiscore.HiscoreSkill.PRAYER; -import static net.runelite.http.api.hiscore.HiscoreSkill.RANGED; -import static net.runelite.http.api.hiscore.HiscoreSkill.RUNECRAFT; -import static net.runelite.http.api.hiscore.HiscoreSkill.SLAYER; -import static net.runelite.http.api.hiscore.HiscoreSkill.SMITHING; -import static net.runelite.http.api.hiscore.HiscoreSkill.STRENGTH; -import static net.runelite.http.api.hiscore.HiscoreSkill.THIEVING; -import static net.runelite.http.api.hiscore.HiscoreSkill.WOODCUTTING; +import static net.runelite.http.api.hiscore.HiscoreSkill.*; +import net.runelite.http.api.hiscore.HiscoreSkillType; import net.runelite.http.api.hiscore.Skill; +import org.apache.commons.lang3.StringUtils; @Slf4j public class HiscorePanel extends PluginPanel @@ -115,6 +92,27 @@ public class HiscorePanel extends PluginPanel CONSTRUCTION, HUNTER ); + /** + * Bosses, ordered in the way they should be displayed in the panel. + */ + private static final List BOSSES = ImmutableList.of( + ABYSSAL_SIRE, ALCHEMICAL_HYDRA, BARROWS_CHESTS, + BRYOPHYTA, CALLISTO, CERBERUS, + CHAMBERS_OF_XERIC, CHAMBERS_OF_XERIC_CHALLENGE_MODE, CHAOS_ELEMENTAL, + CHAOS_FANATIC, COMMANDER_ZILYANA, CORPOREAL_BEAST, + DAGANNOTH_PRIME, DAGANNOTH_REX, DAGANNOTH_SUPREME, + CRAZY_ARCHAEOLOGIST, DERANGED_ARCHAEOLOGIST, GENERAL_GRAARDOR, + GIANT_MOLE, GROTESQUE_GUARDIANS, HESPORI, + KALPHITE_QUEEN, KING_BLACK_DRAGON, KRAKEN, + KREEARRA, KRIL_TSUTSAROTH, MIMIC, + OBOR, SARACHNIS, SCORPIA, + SKOTIZO, THE_GAUNTLET, THE_CORRUPTED_GAUNTLET, + THEATRE_OF_BLOOD, THERMONUCLEAR_SMOKE_DEVIL, TZKAL_ZUK, + TZTOK_JAD, VENENATIS, VETION, + VORKATH, WINTERTODT, ZALCANO, + ZULRAH + ); + @Inject ScheduledExecutorService executor; @@ -126,9 +124,8 @@ public class HiscorePanel extends PluginPanel private final IconTextField searchBar; - private final List skillLabels = new ArrayList<>(); - - private final JPanel statsPanel = new JPanel(); + // Not an enummap because we need null keys for combat + private final Map skillLabels = new HashMap<>(); /* Container of all the selectable endpoints (ironman, deadman, etc) */ private final MaterialTabGroup tabGroup; @@ -245,15 +242,15 @@ public class HiscorePanel extends PluginPanel c.gridy++; // Panel that holds skill icons - GridLayout stats = new GridLayout(8, 3); - statsPanel.setLayout(stats); + JPanel statsPanel = new JPanel(); + statsPanel.setLayout(new GridLayout(8, 3)); statsPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); statsPanel.setBorder(new EmptyBorder(5, 0, 5, 0)); // For each skill on the ingame skill panel, create a Label and add it to the UI for (HiscoreSkill skill : SKILLS) { - JPanel panel = makeSkillPanel(skill); + JPanel panel = makeHiscorePanel(skill); statsPanel.add(panel); } @@ -261,11 +258,11 @@ public class HiscorePanel extends PluginPanel c.gridy++; JPanel totalPanel = new JPanel(); - totalPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); totalPanel.setLayout(new GridLayout(1, 2)); + totalPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); - totalPanel.add(makeSkillPanel(null)); //combat has no hiscore skill, refered to as null - totalPanel.add(makeSkillPanel(OVERALL)); + totalPanel.add(makeHiscorePanel(null)); //combat has no hiscore skill, referred to as null + totalPanel.add(makeHiscorePanel(OVERALL)); add(totalPanel, c); c.gridy++; @@ -276,14 +273,28 @@ public class HiscorePanel extends PluginPanel minigamePanel.setLayout(new GridLayout(2, 3)); minigamePanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); - minigamePanel.add(makeSkillPanel(CLUE_SCROLL_ALL)); - minigamePanel.add(makeSkillPanel(LEAGUE_POINTS)); - minigamePanel.add(makeSkillPanel(LAST_MAN_STANDING)); - minigamePanel.add(makeSkillPanel(BOUNTY_HUNTER_ROGUE)); - minigamePanel.add(makeSkillPanel(BOUNTY_HUNTER_HUNTER)); + minigamePanel.add(makeHiscorePanel(CLUE_SCROLL_ALL)); + minigamePanel.add(makeHiscorePanel(LEAGUE_POINTS)); + minigamePanel.add(makeHiscorePanel(LAST_MAN_STANDING)); + minigamePanel.add(makeHiscorePanel(BOUNTY_HUNTER_ROGUE)); + minigamePanel.add(makeHiscorePanel(BOUNTY_HUNTER_HUNTER)); add(minigamePanel, c); c.gridy++; + + JPanel bossPanel = new JPanel(); + bossPanel.setLayout(new GridLayout(0, 3)); + bossPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); + + // For each boss on the hi-scores, create a Label and add it to the UI + for (HiscoreSkill skill : BOSSES) + { + JPanel panel = makeHiscorePanel(skill); + bossPanel.add(panel); + } + + add(bossPanel, c); + c.gridy++; } @Override @@ -294,24 +305,29 @@ public class HiscorePanel extends PluginPanel } /* Builds a JPanel displaying an icon and level/number associated with it */ - private JPanel makeSkillPanel(HiscoreSkill skill) + private JPanel makeHiscorePanel(HiscoreSkill skill) { + HiscoreSkillType skillType = skill == null ? HiscoreSkillType.SKILL : skill.getType(); + JLabel label = new JLabel(); label.setFont(FontManager.getRunescapeSmallFont()); - label.setText("--"); + label.setText(pad("--", skillType)); - String skillName = (skill == null ? "combat" : skill.getName().toLowerCase()); - String directory = "/skill_icons"; - if (skillName.equals("combat") || skillName.equals("overall")) + String directory; + if (skill == null || skill == OVERALL) { - // Cannot use SpriteManager as HiscorePlugin loads before a Client is available - directory += "/"; + directory = "/skill_icons/"; + } + else if (skill.getType() == HiscoreSkillType.BOSS) + { + directory = "bosses/"; } else { - directory += "_small/"; + directory = "/skill_icons_small/"; } + String skillName = (skill == null ? "combat" : skill.name().toLowerCase()); String skillIcon = directory + skillName + ".png"; log.debug("Loading skill icon from {}", skillIcon); @@ -323,8 +339,8 @@ public class HiscorePanel extends PluginPanel JPanel skillPanel = new JPanel(); skillPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); skillPanel.setBorder(new EmptyBorder(2, 0, 2, 0)); - skillLabels.add(label); - skillPanel.add(skillLabels.get(skillLabels.size() - 1)); + skillLabels.put(skill, label); + skillPanel.add(label); return skillPanel; } @@ -359,9 +375,13 @@ public class HiscorePanel extends PluginPanel searchBar.setIcon(IconTextField.Icon.LOADING_DARKER); loading = true; - for (JLabel label : skillLabels) + for (Map.Entry entry : skillLabels.entrySet()) { - label.setText("--"); + HiscoreSkill skill = entry.getKey(); + JLabel label = entry.getValue(); + HiscoreSkillType skillType = skill == null ? HiscoreSkillType.SKILL : skill.getType(); + + label.setText(pad("--", skillType)); label.setToolTipText(null); } @@ -398,10 +418,10 @@ public class HiscorePanel extends PluginPanel searchBar.setEditable(true); loading = false; - int index = 0; - for (JLabel label : skillLabels) + for (Map.Entry entry : skillLabels.entrySet()) { - HiscoreSkill skill = find(index); + HiscoreSkill skill = entry.getKey(); + JLabel label = entry.getValue(); Skill s; if (skill == null) @@ -423,7 +443,7 @@ public class HiscorePanel extends PluginPanel else if ((s = result.getSkill(skill)) != null) { final long exp = s.getExperience(); - final boolean isSkill = SKILLS.contains(skill); + final boolean isSkill = skill.getType() == HiscoreSkillType.SKILL; int level = -1; if (config.virtualLevels() && isSkill && exp > -1L) { @@ -438,12 +458,11 @@ public class HiscorePanel extends PluginPanel if (level != -1) { - label.setText(Integer.toString(level)); + label.setText(pad(formatLevel(level), skill.getType())); } } label.setToolTipText(detailsHtml(result, skill)); - index++; } } @@ -457,37 +476,6 @@ public class HiscorePanel extends PluginPanel this.searchBar.removeKeyListener(l); } - /* - Returns a hiscore skill based on it's display order. - */ - private HiscoreSkill find(int index) - { - if (index < SKILLS.size()) - { - return SKILLS.get(index); - } - - switch (index - SKILLS.size()) - { - case 0: - return null; - case 1: - return OVERALL; - case 2: - return CLUE_SCROLL_ALL; - case 3: - return LEAGUE_POINTS; - case 4: - return LAST_MAN_STANDING; - case 5: - return BOUNTY_HUNTER_ROGUE; - case 6: - return BOUNTY_HUNTER_HUNTER; - } - - return null; - } - /* Builds a html string to display on tooltip (when hovering a skill). */ @@ -584,36 +572,50 @@ public class HiscorePanel extends PluginPanel } default: { - Skill requestedSkill = result.getSkill(skill); - final long experience = requestedSkill.getExperience(); - - String rank = (requestedSkill.getRank() == -1) ? "Unranked" : QuantityFormatter.formatNumber(requestedSkill.getRank()); - String exp = (experience == -1L) ? "Unranked" : QuantityFormatter.formatNumber(experience); - String remainingXp; - if (experience == -1L) + if (skill.getType() == HiscoreSkillType.BOSS) { - remainingXp = "Unranked"; + Skill requestedSkill = result.getSkill(skill); + String rank = "Unranked"; + String lvl = "0"; + if (requestedSkill != null) + { + rank = (requestedSkill.getRank() == -1) ? "Unranked" : QuantityFormatter.formatNumber(requestedSkill.getRank()); + lvl = (requestedSkill.getLevel() == -1 ? "0" : QuantityFormatter.formatNumber(requestedSkill.getLevel())); + } + content += "

Boss: " + skill.getName() + "

"; + content += "

Rank: " + rank + "

"; + content += "

KC: " + lvl + "

"; } else { - int currentLevel = Experience.getLevelForXp((int) experience); - remainingXp = (currentLevel + 1 <= Experience.MAX_VIRT_LEVEL) ? QuantityFormatter.formatNumber(Experience.getXpForLevel(currentLevel + 1) - experience) : "0"; + Skill requestedSkill = result.getSkill(skill); + final long experience = requestedSkill.getExperience(); + + String rank = (requestedSkill.getRank() == -1) ? "Unranked" : QuantityFormatter.formatNumber(requestedSkill.getRank()); + String exp = (experience == -1L) ? "Unranked" : QuantityFormatter.formatNumber(experience); + String remainingXp; + if (experience == -1L) + { + remainingXp = "Unranked"; + } + else + { + int currentLevel = Experience.getLevelForXp((int) experience); + remainingXp = (currentLevel + 1 <= Experience.MAX_VIRT_LEVEL) ? QuantityFormatter.formatNumber(Experience.getXpForLevel(currentLevel + 1) - experience) : "0"; + } + + content += "

Skill: " + skill.getName() + "

"; + content += "

Rank: " + rank + "

"; + content += "

Experience: " + exp + "

"; + content += "

Remaining XP: " + remainingXp + "

"; } - - content += "

Skill: " + skill.getName() + "

"; - content += "

Rank: " + rank + "

"; - content += "

Experience: " + exp + "

"; - content += "

Remaining XP: " + remainingXp + "

"; - break; } } } - /** - * Adds a html progress bar to the hover information - */ - if (SKILLS.contains(skill)) + // Add a html progress bar to the hover information + if (skill != null && skill.getType() == HiscoreSkillType.SKILL) { long experience = result.getSkill(skill).getExperience(); if (experience >= 0) @@ -668,4 +670,24 @@ public class HiscorePanel extends PluginPanel } return HiscoreEndpoint.NORMAL; } + + @VisibleForTesting + static String formatLevel(int level) + { + if (level < 10000) + { + return Integer.toString(level); + } + else + { + return (level / 1000) + "k"; + } + } + + private static String pad(String str, HiscoreSkillType type) + { + // Left pad label text to keep labels aligned + int pad = type == HiscoreSkillType.BOSS ? 4 : 2; + return StringUtils.leftPad(str, pad); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java index afe7054d43..2d4246a041 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java @@ -380,9 +380,13 @@ public class ImageUtil return ImageIO.read(c.getResourceAsStream(path)); } } + catch (IllegalArgumentException e) + { + throw new IllegalArgumentException(path, e); + } catch (IOException e) { - throw new RuntimeException(e); + throw new RuntimeException(path, e); } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/abyssal_sire.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/abyssal_sire.png new file mode 100644 index 0000000000000000000000000000000000000000..3e410775614442cc3208632038b0d062aa425fb9 GIT binary patch literal 958 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 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/callisto.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/callisto.png new file mode 100644 index 0000000000000000000000000000000000000000..6f307a26d5d6b5b0c829093ebc76dfeab22c4b8a GIT binary patch literal 1024 zcmV+b1poVqP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZmN}9%}vBz_s%|+tMO)a-V>Xt?tX|47Dv;JA@ z-$HB6i#(DSe4d*?2ytBqp(i{GQ|q23kr1K+bf)EKt;KT_2qBh$KPDw#T3w~xZj)vi zQV7=8*NNkJ6kgU^-^gQ51y3Aw^MOSr%xGWtvY--jf7rN}QzZ?e8-PHjqlu?RJq; zqP52JJOJ`M$8j9uIL7llwAQ3)$}k9~Z}RuIZqa?PLs1mW%(x5(0pW0n)|&UvtzavK zYulKniQnrnSF7R8&Z3k;N=Z=^(>riYlecPBu5CYH>CHDdeR`2rtIhJ#8S3?uY~0(# zP?BL3kt7NAdYwVPkCO74Ui3M@R+RpM48^zK{lx3@lKb}>JluPTW7|j} zDDs@x|6GgH uE*v?QQ~@pmTVwGp;1ghZ3jVYh{|x}o7^k!+^{BxB0000f+ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/cerberus.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/cerberus.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7ef937cdcfc5be249f1608d2b852d935084fcd GIT binary patch literal 745 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;Z%IT!RCwC7l}k?)K@^3*+dVbYGtCV1fB>R^vXDd#n2;DWCahc;VsIt#2k6eY zFmWZWToL^b`afjrN;GjvBu+FKMIOTd17VH}Xl>;+qfp6B-&EJVr|O<_t4tCnIXq5y z>D9}20UAi5GoW5j5~uFY;x9gq;>7-LG&Ac1K01Sfa&&Y! zs!Ln+Tt3B@@;BC(Hz==G2{S3GYqcostfaX{OSA;AC0I_Zk!>$>{(3*3XBSvms!?67 za=#;FJn(SNMKLo?$uut23$ar4fcikWQkw>f1@&h`xr876pKPc^aisv<>I-=MsKAHW zO{S(6r~npQR|DpMZ`StYIRxMV@H}lWmQ1rKs3bNhuZhk8RySd_4hi5#HqA<9Jqj&I zS~^mul3oC;3({FJTyoS6zG9S8(CVOnSFtOVbuyV$6q;{{gE$YDd=!{z093>jV(JHV zfdNpIbFMi)NVWW*US{_(Dpla`c>D^O~0=*p2 bY(ED8eE`&hj||qd00000NkvXXu0mjfu*5>B literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/chambers_of_xeric.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/chambers_of_xeric.png new file mode 100644 index 0000000000000000000000000000000000000000..a7240d11f04bd8a755107d8b9ef134d6fcf7c5d0 GIT binary patch literal 952 zcmV;p14sOcP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZibI`PWnDKrdb_r}_qH3y7p|G* zYG)?D?_Sn-A+S=P` z*u2@IX`B@l>n;IC0a@d6N%!Hy($m!`x@pSKiG*DG`WyLpXh@t@RRUNNu=67#_8Evs zD?qVS06zV@WW4&lol7+6x~QD5X3Z1re{(d zd841#`}-}kVWm{-azD)vr-(tc1@;IDVa^rNjj5}#LX#b+p}l+Us_k| z@cxMpWG<5t-7q9yD9Fv}Y5VBPGO_}wSmc#1nsR-+B~(6WL7?Yf{C`q*Z@#17{7)P1 a&jA1)<>Je)g5qER0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZQIhUv7}cE(O^TG3iMK-CTnG9+k4V<@I# zBqkOX#+|TosWEQ-vvLbDQ5P<#J4p;8NF))OV$ucB(#C&nS}091I-Ni7x@cdW5^BqW zl{fh|_q^}>?s@mzbHo_KgItOSy#6N!B9al2vm#V7-RkuKn5^(A-f(gfLiC| z2Z0HI`g9}VRAUettokM%;Jz~mPTbU*HXnTXk=eEH$smJ~<@m@wvK!n`1|rfA;JOZP zyz?erG)i_)j@m>Fpi4xCfG({yT5Ghe1L}$DY}6X!dEgX4XKp*O_$Df)G7q&hv#lpf z#B%`-gj|Qi$B*#-=O6Ok7a!Bqk_seFu4y15p8($hbab_|@6{LaeVP>4k*gqMip77FB^&y#y$FJFE78M$hQ~4xm~8Nwg&ItI~c4s zco)Do6^g|&^RqXZo0_IlC?HB9mcr5+r7bK`lq^jl>_Ie2Y2gl&XU@^EIl^xXCEV0X zC7l4!)fM#Yz<$!r4SfIY4HhRx@pkUQ@;r3NMl6N#mu83Sd0f3X%@mzePuHHy17qBjZ=O<%CE!r!feKV(#}T#?GB*_?sUn{#E4R zrdmRst(+d6CQ|;J@a)X$vR|$u6TI3IibF@9;r!4g>gzTUt%>l{^%=vT!Q{26pbbgTbB^7kr>tN{@1v&gP_GHaqSgCDKo&T= z25-n1!+Ndx_!{K?yLkOojc)|Vuf#Sm4~D9QPi}M$1o&qFG^5J^m1fqC00000NkvXX Hu0mjf(kR3Y literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/chaos_elemental.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/chaos_elemental.png new file mode 100644 index 0000000000000000000000000000000000000000..cc36114993d01af961150d0a5c0c28679e4a3755 GIT binary patch literal 910 zcmV;919AL`P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<6iGxuRCwC7l-o~SRTPK6HOve{hq*9iW&{k-qEIUeLQxY*7?XO5#M_H~Y-7^s zvwuO;|G>+O@kJkf!}!odLIJBu)0n2#(0Hc>Y@rNu=FB-~&Si$PeUM`e)Xq4uJ6R7q z`K|Tswbouslu|s%6XF4%rU4?N{$Wc^`!!P{5lI8u{WMA`X(5Dh=>B18tCWf;SBLdQ>42R%r9SOI(M9pzh1ysHGm^Zshj^P0};6fa3tH!`B!K8 z{Hjj6D*?dF@Gw(@BZNZjf&5%6B^m?x=#En|&*HqF_WvS=G?EdE;Lm6H>M!)*Ysi^!)9o4nVg#o(Suqibc&SJ>8fM!xxU%{?x$YzrgR_DBbi+9aUj6K3fu|>DaBLf|W>YaL4D=0Q zS~^D~4i~@MWMO5Fp42fcSEFp-2KY=Vb*3r6d+(gbt$DbvP1QC@B{Nu-j#40g4c)LY zsv7Y_oqV$y}k?Z{Qf@Nv&nahcknz1(=srt1~tzm6bjSXnZj?2Qu96fA08r= z?xyhEi=+~Nf78YNv#>vdYrvQY%)W4nNH|L3Py*Aj=*{(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-*GWV{RCwC7m9cIUQ4mGXynWca!U;A_WMLskA}#`2D~SvdG@&3;48o}>@)h9^ z!XNk(@(HOZLPMQ~G$}x7Ks1CVLZ$$*z7%9FN38MMCL@iuc$#yixihmSiK`69701K^ zW>z<|T{G*NnJ)5pWPzky3G4&yFLjK5%pw|?@^DR{U4Nr3P;HiJ@rWX$#fZv!L~^H0I-+BmX{iObib9km9q#4Q0!yv1Ustu!KUuc0w0{~^jc;_Mbi2I_+>uM fc>6dj9N_l=38UqZt1Yzf00000NkvXXu0mjf6w&|8 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/commander_zilyana.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/commander_zilyana.png new file mode 100644 index 0000000000000000000000000000000000000000..e207d7e79166acad1472ebd1ca753d4155cb9555 GIT binary patch literal 998 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZQ%lF{$}z)5bP!v+BskY*Asbxeu-T5T^_&!<${S z13_Voxr;H_WXx?aM=$0&$G|HuhP#l77j9n2=qe0pFB+k%RB>yRlByveCT-5i$;o+l zlZ+U*HgovGb93JF{C_+j@AC*LC6DqbJmS+dKnQV82qCMsPYB^}%27(WssZN!*=SAq zHX(irkgBT4kGDT3Uwgby2Hb0!hG?s#jskx$)+--tss61 z7zX(0g=gsv`q^}FKlwWea*=gR9zXr?fNBAU6(KnC;x-04LLenexeRmHZxRT!{O>N> z3=sBucqYQlUw4u(-+9*b!@v*bG<30j5Y!e178gcY{BOb66%QX{{AO$ zdxKPL8!17-BxUq+{!)S6{WC1WqoYS_(?K-0X%rw9dy+$k-ezGj zg=x*AnL3)Q1+cL#n_RkpqG~uCE)=7LstBZT&=DJC{_@0%HAn#bJ`+dPG};0_W^++= z!-j=jO%;J^|SI(k?1i1;Z$j zx|?Jo-A*77#^rM2UZb(GXNsw--4vajwD(ygrcFrYP=rEvcQ0+BFv;Wsz^}DduSMVk z*sCjT_ha>HJyF{O~z**OJU9%2*Xp9WAVNuOpimsEUfmZE#}j2!>%$E?d~P zTzM85Ob(DRsRjb@aZ416=usg>vQJ7EKctePH1(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ4}gsG^+m?b{@ zpz&?VqCOZCHC|%WWEqK1ChDRw8rhait8*s62puVtZm_mu2X;`}($aBhe?CZ;Mr&6w zJIQ(YCEs(-?|jcqlv3PG(YVP{Pyi8ei-`K0`U{Gnl*+4sA5j0I{u|lLjcOnw3gEfE zM>y2~7!#8|PX9E_w!#rDdpc3MI!PlfF^>b36XdTV@WZ#>T=2~<_yeNa1BJn zEFzy|cm`epc%o+?_S$M3j-8wt8fRr?m8TCLV7qx+#x7E528+O<%)?e?;lN%e&5aIT zdwYQC$q8cfVFq2pj8BZyz5js>v~=TBk%A~X_TCX3b}M~79YkXhUVnE0P1E@9xt5y4hv$qwYs_NC7iAiliJW&afhPea%KySQ(66QyPw$!LPP9cJQs z9eeI=Cm0N1x}}8RT$m@j_i_B2?*Z=2m%;l0pB_KK;O8Im)WJs?8VxXdKFHByU$SSf zlm2IWu-8@N^ZE$=k)Wlyfurvn#_hS7yHT>+R7Bcx`J!Z+r{8w#_dqMVvaAsREXv)sbmv=>WV17l<77@3+O z8jJmtsvHOA#XJY5AkFrds|K$Bd4^xge*8HAXt1VM=dIdh00000NkvXXu0mjf3J<|K literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/crazy_archaeologist.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/crazy_archaeologist.png new file mode 100644 index 0000000000000000000000000000000000000000..53d758bf8efc796a336498d1328965e271a3fca9 GIT binary patch literal 881 zcmV-%1CIQOP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;_en%SRCwB~mCbGwR}{y8cgADaO^6*kAx&LADiBCTRIp${rK->cYFBL+RhR7} z^bMeIK;MA8L|3!|foP>jR?`YdASwc zbM6Ns!e9bLzz1YR)__~x=bJ$BUtX^O)KZua%|S2KH9QbXDFOKUvolPU-p2D>LXjac0syo&SgWw6O%OB)qZng7+{_sH+yvGNYmIg~fKuuPa2=pje2Z4FiN9^hdb_x; zMcX{eoy2uBSb;?EwJnVMHb0E2;5xu`d7N{nkKnfwl$*n<0>);rB1j^58K{&?%oHa0 zbNM-#ou2+esuo@Q_$=%7I!Wx}I6`G=ic{~-GCO^gP8{MPoT$9VA4|&^BZQIeNxw)1 z*lcVNcM@jHC8j6GxpwJ8-amd4Z)}pk8iwN&5%sM$Ge;{dt^UU1v(27#ZqUma1~67g zwBe=iQy3fLov9LTHjh}tvHUjZgq`L(D%mB9`^)?*5&13^APhqs*FmgcMYug*C5a=% zXrd(Hr~CJKv{K_?Z53-eJ=ra#R54YHlv22k!cmGwv&GXFTh!|7eE!j8?pCY#L4f0A zY3UrTounr#04IUp4|wh0$-NzX>4P$14Cl|C=7R=W_Ub00000NkvXX Hu0mjf)JTjP literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/dagannoth_prime.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/dagannoth_prime.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5543b5e10d85211c421f8ffff2723cfc37408b GIT binary patch literal 697 zcmV;q0!ICbP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;KS@MERCwC7l}%3*Q51%sGo6-x&`!a$pb|RJA{7^6FzL=TCa!g(8~+Ua0~Y=c zqZ>CQiXREcLitEUBZ0Ppfl{18Xoq&lTo6cN>gc@Z(&#&sf*h(rPFGMiFLTE*%eB+mf}fcQ|H?4vB!AB%-I3%yGuA__=& zJRV|0F)|MyFrNRx)b)7BJx$$ zFadvny~92HK|i7X5XOK((*#I}NK`3R{@)5#0k(f`b9U}fcNMndp!$659~8L}31LKy zhOgE2unPqJ#Ox{~JKsoctZ=)y%b*cvZ7WA=GSyR)X8|VCx7c%qwcsGdOqLf*>v;Ws z`Xl{(UHQ_s(X9yX0;KPxsoGWY+Xa++q5I~>Cd(g|a4-6hS4x>(OQdNUyZK#`W(>!1 z7>*efas}#j2jF$9$>*J=hee;AhnP;IdKuh?d^s$j0o f+2%WWXnzL)mIn$vEZ??a00000NkvXXu0mjf_lz*} literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/dagannoth_rex.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/dagannoth_rex.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2bcbc3a0f19f0406e8b195fbad4b84c42da019 GIT binary patch literal 688 zcmV;h0#E&kP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;Hc3Q5RCwC7luJ)jQ4q&}=hEBvlh#`7lPZxE)P*E2h|w5VF4Pa;%1TC?V(@stML{(d*s=YyL7P&Tmx$AdlSb!41uUvtq zrlaeUa?!@~@YKMr*oftRPxUgLB*M+Qg(>{lDKn;q)) zCT-0?Q3OJOlt$MtGc3SMfR$Hk6!yxPOe(6$L@XNNLh2l}CsWZluvFIu9Q`#%xycxE#EF_o45gdjVVm zxHvOKt={14)^`l!;PSrzxXFvvHH?ExoRLx{hNehS6t*%uB;!F^trnqE9=@f2pzCdb zrC!Mg0w|UD3HZHaw(}t1XRh2eEl4Tv_8o$h@>m6AA6@@j>{0F2!9t(f76)0h-va>f WJ@sLQ6@)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;KS@MERCwC7l}&3CQ51%sJDF*kuO>7JO$}`ZWBjOyZi=`N3xX@5Zrti$Y5zfg zhzms!L@KqoXjDozQ7kn{^HH@4os=Y3iocEsh+;gswQgV?? z;eyw|1VRX12qDj4MF^qy^&3PYAw&o;&O4J*ieA3z0Kp4D0w5ZjWZ}_0>PCZiuh&PH zNC+W;gv+H6jZJd@;axuG%Y>)H1J^+95q#lf|Mb~oG`B`BUuJG9!eQ%hbOK-r;LiLU zwr%r1vyG-G*fj&o>N4(e(>9L~LcEkxJ{g8U2S_Am_))I1IPW6h>C$Z4w2pLkq7go> zegaq=wgz>8T6LdhvyIs@sqC7pzWK@CUWdAIFmjP~fLT3Gd}b2UN^#J>jN|xOf1AeV z_l-zR7;Ij;gs(Rh7u>B~rJNjJd}~ z&Y%tu2>J2&Jk*T_wr%4J_?V7Q5tulYDDk(`|C=BKko#W5wk)J0kDsS|jJ>Ks%;zN- z3Y^#)Lk~NTcbtP(n-5!gUTkLhw)>l4z)NPkMDluKB#D*)uH4X3rR1u|&+`ZK#{ppLYmSYzFF41Oct=X94=s_R2ug)rlCx7- z9gA2rNHJHT)9C`d>J@w-f@Y&dI2xi*sey!F)zc1M?lptXei-KhkbRK(m+x8h%3!(A f-Bt!^v_As?zd;F;#K1vc00000NkvXXu0mjfIIc2@ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/deranged_archaeologist.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/deranged_archaeologist.png new file mode 100644 index 0000000000000000000000000000000000000000..8dfae8c2fb8f4fb5433263f5046cc1a2d262615c GIT binary patch literal 1162 zcmV;51a(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=5J^NqRCwBqm0NFARTRg6`*zOUI~`hDrllRISVK_Y!RUh$eK5T8?2G*d@)6*Z zfS*8lGZ+bp27;niz(j@877%(FI@7sz=A5(7_F*m#1437_l9RpG`Ty76>jwK1H=@;n z!8w4X5&Jj5DWLQ^&~vW<9@bBQJaGMWeqsnP-_vSOmw}T2#p!WQy}iinOrC2$-s8dJ zCoe=YmQ8b{ILpFJ5kF_SdHZixpKJi2hx|&wZ@uqzV18;c&$~w#@e`V)@z~i4c&AiC zDnX;&r2M?bcrM53#YM8IG~jr&x zDN0jCjIWSR;TeO`3MmDhFhXfXv)$^$omNBG8^8q{#~eRe;g~ zmJ;h6T55dH;2DEb5+M{}6cRg&_8ptsy8uZ!a)D0))}B7&+2bb9w*ow^k@CM(DJ4ny zJ_+B$_dJx+Xr&PXtc`KbacFX~@BYOo!FAwDtKFf}sL`s&7_ITN0nsH9Lf{#L?|EpY z@U%iH1vs3GX|+0pd+wziECHALhnaMOg@s94Re^IcMjM=qdse}b;yCGqM`Rri5D37s zUD1TrVr~2q!TJ8d)I^>$ADkeQ@rVOUy9IF^<6JlTLM};ZI*(G_#40Iq&e3dlh-`?B z%NQeGAUFq{EKZGc_M`XN-3f`Bj>iw1IOj+ueBxd+Yb98iDd2ks-xzEhW8)Zvz&D1m zbP}Tka;S7P@HN2f^aOkD04KUvcGlv6b`YSILQ2WpRGwVg$2W#rE2O#Cp;B*g_+XBw zL7wOSu`Nz#q;BEa+NE;sJn;fLRssWloXDXF(Y%GEt)4(8BG zcEN#WtxCoO^wZgB)VX?VnXR1)VPyN`X7EH8hKb6RD%Wn`X8Hbob{h>Q@=3y|TavMJ z#Ifs*YG?-`N#CPVZ?L|x-H-eTaLPGX9c{Ee(N~eR{I#~ucej4x&dMrL6moB+Ouf|^ z)Vc#&od9cNzW@0ywZ>k5N31#Ls;?Y&Lw#|%SHfRjz4bbkdMb z#Q3(w>dGb$o@~A_ZU)7(k8QRDTzc==JfENan9WMSUOU3|_FQBw-`>2zKU>=XyUw}% z@XvA|1m^*c9X^DoHKpk+*_0uSB7!L7{-Z~IaNe{c|4*uKSe<=6@0?>)_am40L+~na c=N$hI0P8jDz1=R*ZvX%Q07*qoM6N<$g5QK9m;e9( literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/general_graardor.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/general_graardor.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8e4334fa01f36d553cfc3951aedfa63c9e50b9 GIT binary patch literal 890 zcmV-=1BLvFP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<07*naRCwC#l}m3MRTRg6cb*=P9eY~Gkf>?gmQo;)5-J1>N+K*IHoO){6$@yK zR6Yd~e1l4S09Nd~Kw^W0KmsHbB&P*Ro3=>`P5es7vFjPncxEmOVpO|z>4HcsIMS7_ z&eb{p^FNP!gp`uK6ooyO{{jBP078fhLI^qLd@O`m5<=wv2|(PhO?M65hYZq@QntoD zYGd?y0NvC$`PR#9ZMAvnDVt+c9-n@`i3me#jXU^VAHWqt+-0K z8JmpKBl7dCRF(-7xN+ron(iI?{b*TkK+D3iPWfdbX1}9^*5I= zrDXp2Jm)@mhw{<_XWx6B$$~SKfqNM2Mt&Z6f1o=&TLj?MQ?IdIclqVVuXy~iC3H%{+a9Z{Yg}8a4y9?d1{Z)u0MpR06^#jXKcN}Ya@$BnaPG{z+*pqw0e7bd zDS<+dt7}c3f9~l4!0~&EEQB}>EM_tmvg993v+r?#(*k ztq!Py`MD!}^3jJRNj&g%W{AOHU^Go-=7|zP6w~YacyU5nRXBPehdF(eZ}`{8@Kf3+<@Wt2e)AZ3~43l2TMN8^tM(^;K^K@MxjAfwtG2vQU@ z1IJU*gak#RDJE_+!gT}g>X+6izvF*vozJ_Tcj803_!%7j6xA Qi2wiq07*qoM6N<$f_JQq>;M1& literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/giant_mole.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/giant_mole.png new file mode 100644 index 0000000000000000000000000000000000000000..f814bbd2d5a19b3489669e04b3c62966bd1360a6 GIT binary patch literal 904 zcmV;319$w1P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<4oO5oRCwCNl|649RTPGwbMMTqcV_m}tfOFzgo#50M1%;DCQ?EH6hJ~jm5PRz z1n~#p7Z94HL!v^6#t4L>`8X-O6KyuLAqYh|(vhz2 z$NS!U&U?=hRpnlq;U3%lB@mI5BC;kTI>lcXk=h*@R5jOuWkB!7r(vin&Xk*<2TogS zs01Zu>t#Stl;JQ2gidFNo&JC{RYW9H%5$o^dJER1ibmjP0Tv&gqh1YA1=SQ3QdOcT zB1)8Yr%&s8mpD$wBO+4?L}VE_4e0HIljomW z;Oz^a=Mp$$;O}H%dE&qV)ryZ}1nZ2zW5ux!Q4)9`zEshbAR0#(WQ4}+XWBUC*ak?iEYlOe9wdw5a0=%!P=k6%exki;j!NGMMtPvD2 zMsOU1v1UZ1!YV+BuV#VCV;huBr#YK3__{s;#ffd$1Sq; z_jY!CMMUbV+MY^KD3owb5z>g=FuXbMx)uc-$1;c#jM;m9Q4Ebo7g-B`rPtpDXo<+v zs=AgNqIchTmDm;uYO~A~-0ag~jlr8KVysXKDwL~rtXrZ`C@{aj$P&+nSaf}V<%p_ zIli{tp&P~=KXwF-2PE+TLB!x8L*PORq4uuL*oSRi-C_m9e$AfcJcF zhEp$`z;O(nZl6D|Y;yGQL6Q{WBw_vXCYP>UW@EF(a2Vb8qs`dFs;bJEp9kpmLn>vD z!1vg=y2bHhi+uRW7l;@F&*!(_FY(9vRxWsMi1KWwyUTVj)tONM literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/grotesque_guardians.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/grotesque_guardians.png new file mode 100644 index 0000000000000000000000000000000000000000..98606aed1143fa45c92611a41e0fc78bcfbcc3ec GIT binary patch literal 884 zcmV-)1B?8LP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;`bk7VRCwC7l}l?|R}ja4BkSt=TGp%B@-y`VH`GqtVh7xX7q$sb7D*sog+QR~ zqR?gOCuqMxKSB!aqG`dKLKZ1~(&Ds&CJKpNyAYhvT8f1AvLs*m-aFmMMm4gfKz(31 zFz3wwe;)st5mn_hhmTVpFGV0C*F{9@_HJ82s@j$T9|C&B@-5?z0sFKGm;xFKhjes& z^r-)K+XN?p_Yd~#M;~0(@re;#Twc&fG;+9h9Dy8Fk%%b3{L(zGPb8VCLN9)YZOmO$7hrBj1 z%iQb)Uw!d4ix(FULLwq^{X_y0$pZv~7LMbvTi#`_vPXO%PB0YY-u*2`&&(oTfSqaw zQ`3{g2jWbgpFDtA5s}6JU>-b?i2ML7h``+ZTV&H&JkP_jEX*#GXf#TPzk^D-f@zvK zj>FLK5CJoQ<2WQ%6Kt$)94J$o-CzOW?9}U&OJzLu@cDfBI(&!-uIsW}+$9taVRo9- z>>9RhV|JR@woTt)Uweu6=i_w@!+^TN+aJ-AZw|5Y~NoqU8{{B9|d#ZZ7DM6hi3XB4O96in0NFR~j0Rm=# z=YMUooz68obWBzA$ErwG^Q!uwuI0CZ&+0Qzx6(L{L+q6p#nPc_mVi%yB~_J1@Ru#u z9|I~PdimPrmPPK^V%MVKXp?>pAu`mt5azXJeDZS{DlPXE;a0000< KMNUMnLSTXdIhWx8 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/hespori.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/hespori.png new file mode 100644 index 0000000000000000000000000000000000000000..dffc71404c749bd8dfbba01b1b1fbe53533e555f GIT binary patch literal 766 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;gh@m}RCwC7mCZ|3Q5c7xbI!eY#u@WE8v7V5KT>DZnYs7QJuOm+$WbRea8~Di--qAtJ?A|_ zYt2?J$ri5-0fZ3xuU)%QfLPBWA;doewASLk6$l~50jk4cdb+ykXl*4N3jL{SpklzX z4Lg)l9B6B!SeT}yAHSfnVYxbpV53cr~ z;AHO}s)7~)%Oqe~2mxMciNRzVPlP#jyu0!yd!-V&LWyADHvm9NNppM~RRKwA^b`4l zQx;&9JIv>c*wvEkM399E6R%|Am0U!vLo^yDU+|fl^($9Ua6Hmu@A#Q;|JijwbF4w#%?Wbf_<0s)g) zT@8j(C?%0nAOxg7WEp<(t#XUv^zkj)h;2P`bQ*flV zv=W}&j76UT?miqL`Fsi~G-w|Ln3loJbdJ==IUWp+lYEw1eV3b=MQ4Hg0M{;^(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;tw}^dRCwC7l)F!pQ5eR5r#A{M?e~>(E0i|aBB<3SNP-xZp@SP5FPp)|!MHFx z>0jXDu5oc9fx+lPLNvx`Oca7eQ=tUPz2(+Ixs~I>M@j{uHN43gzLV$V_nz}S?X_YH&)Hx3gDA*2wZKVN{z_CV|Ya=ndax1G1cvnUobL$MU; zt)1+115(Oh!GL==+-w?kxaN#Zq^qcF*&sZrWAN*5recY_p6o!AWo-@8S%j)&@K_?u ze27vuJI+)rfnu|0&GZxun2M&@-Yg>OSJ-SRr$MzdXx>I~STP#)==C~)j$L28`8-h< z@C-mLFXmFnOL-;O6gy|UeqMKf#GXtu9A9N(B*jL0=SV+9?w|=FUILxkch}=vRJ&AC z$u&mb#4+zIFyl=SpUv>OZ~RC<#9@=H87_n%a786By+)14K_XpF%4s0HFv{wTfzil3 zz_OH5$!n6euB4PSoN})iejq??>Ut@znSH; z35pEMEX^fxxz%i0R0t6)2rxehnT(!Nn}z6Dn%g%YaG}kH$pnuchOkp0*G`E+l*X lr7IM$3u(^*^yg~+3;?#GtGg9I^{oH^002ovPDHLkV1i;GZ%hCH literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/king_black_dragon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/king_black_dragon.png new file mode 100644 index 0000000000000000000000000000000000000000..3bc8a77466a84e7800e7751590ca3ecfd1a8be83 GIT binary patch literal 848 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 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/mimic.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/mimic.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2c0a4606d854ea10cc4e207f6b5e0828cfa6b3 GIT binary patch literal 1139 zcmV-(1dRKMP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<`AI}URCwC7m0M^WRUF2DXJ&SGb~DYUZ8lb#Cbh8%u_>liH1w(n7TO0}Y6Typ zBKROu5c=YizNpk2h_9lQ;*0c2)Q7fUE!GOHSbG<2Lqlx3Z8n$Po!z;eGslO`E^$q; zcscNgIm5^Q@}2KHM`*42KbO(^LkKY|gwQRq`yW@(S~mlj1@t2EQ46+X0nBUjF@{Oo&&h9OX=E&cnK_Z;|0f=Kf!*0Cx;zWqL5M|l_qOj zgc01o+~CzcS*FW%a5|r->Uqcn{7{o~9l&2$MRT0enX@nrjf`WYlEjH1jABd^lmf2? zT0<0rk_xFL0M$SfE9huzva!2Wra6G&K7;DqdCFKKC0M3~A406akLt<8C`QVdYNbRF zfL9HPr9sznr;+#Yf}UnyxaFj!EU)$!4=eQH0|-969nyvw$)8@e9CYu`ZF0 zzO}5}a34!5RfZqB!_ba{M3G6`s@>$wE8PC>5<^>Tip5ESu_+$gI6{B_AjMlhbK>|{ zi^>#$eDBkQVZheSz0@{D6biGY0n+&_-+cZn1KmBW-`h?lw2+?9 z`3u*W@sg&an`bcpn%Mu`6RcUc3&SwTxkXMNy@+FHP*M`97(WWw^Wr-0PI?&bBPc1E zxcxhBo6Dg?Z#Jn}bONh#hC*QjsgzBUbP`EP%BUyze2=nUrBGhObhXIME2l|h6@TIc zvAgweom{UTfNiIl8av6I-#jd%7pWCN6d+B(re}6BK0b<+3F(;{hy9wlX2IJSdj*`!i7ZP_`ag~`29RGtwyT9fDm(}1PRzGb;IIQ))*3KUkxB8jKa zbOBHcK+1%R*TX-lr+G`as_5UY`3h>KsPrG?|4WWP1_04*{!dOKgCPI_002ovPDHLk FV1oP05$FH_ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/obor.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/obor.png new file mode 100644 index 0000000000000000000000000000000000000000..8c9ea13036c8b75907c2220921238496f39655c6 GIT binary patch literal 648 zcmV;30(bq1P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;4oO5oRCwC7l}&3CQ51%sn{U&`q^TwZ#iVG(g`m=nJ68qKja^C?+F#(ux`Mwz z{KCCUL8J(Zt_vv$)e4HXme$xBlbB>`%uJF=W{wLTD1y!4qz4XMIOm?{-uoWTRU*P} znvY#JR{*6{LMbKN{DNzOi1c+}4v_8cW}k@Aukcl;U_2I;2RAOsp-j?&ECGpr0JW3I zN+|)DIDUkiSEe!b8efawxc_LLl|scy8xxVw|E%E#@bURAP(FI?2L4c#VyVpR-N!7v zT?Z(LNY0bU_Z~i>T3V-TwrMx(42Nv4PoHtZSub5Q1@LlVg{IM=^u5N~Mv2vp3YIP2 z+f+p609LI25F|rSopBj8e)KAh5&xp9C%gjAv7{+9rCdgWl@Uw7}?E-T=TG zXL0fTY4RU7scQ|&TRO2&kVs^YX8-`_CMRihd>Fkhwl9o7U~w=tj4d*lQSs{aBAQkM zCDb&HQ)44ULP6T5=^0P}sMhM_7neyz6`9cl$FgbSLt&E9pf`Ysh4Kfo`n)Vqd%8LeLe?*)D iMu3^W;xqjY@M{1l@ICGKv%xq300007 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/sarachnis.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/sarachnis.png new file mode 100644 index 0000000000000000000000000000000000000000..e74c398976d28b3ae566d7ead7fc69a8ff5d25c0 GIT binary patch literal 884 zcmV-)1B?8LP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;`bk7VRCwC7mCJ8iRS?F1<9n}D?AX`FeM+P_Dx#uPC9o?MAn2kiq%PPuE7svZ z>3;z1Snw!9Vu`|v6|9O71Q8)6@gsIp+qv(1&al9a+{CrhMUOO#BhAb=`sVS8s`4UV zffxMF1Rx?CBBCd3Q$(5zgH?5|0bc;Rz#cs-UKaI0L=@oOD_3}}S|PNSK!jg*TC}2w zJU0{9FI9E@WW0M;F5f=?GC`IjB3!Oi`S^O7APm_ZJmIIkeXQyO5#c0AVL|ol0EL2} zD1uU}R8eCfNlBzYX}QWf^%?~cfCuCLG|$@P&jD^OIb_x%C@*;~`O%2BlR*XhxbF(#%j^UgmMDH5ne6*#i-| z4}3TIF9W4UgRI@c2<&=G1Zl?J*58EV;(Qm0!gz{4hyLY)z z_xbVbZ>e0U(H%w{CJ}LxP3NtjqG&?TC#x%5t5tDo4U#xw=irb(h9f-BWy$gI9GB5S zmnFgE0D3`4oOoQJ#?)OF~9! z?D%j#^#=2j&jk3n)5lnggCHUVX$lIN+KJ0&sw!ivEjp6Z6s-c=kN0~#$#OPD`1IBd zDgwX7If*?6c=TM7c0yb>76{A6B7r(3SThu?`3#`7=S{Av{5Jq_AN%jm*Ve`W0000< KMNUMnLSTZ)eUt3~ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/scorpia.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/scorpia.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb63104545ee3a399ea58c66844379542d67442 GIT binary patch literal 706 zcmV;z0zLhSP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;NJ&INRCwC7l+8|4VGxF&Y0qEjX(=r#6x$x42qkKoAi5wVHEu95v6tY|wO8UL za0y<5EL`Zy#AxDAf&^muO-{>(R?N8Y9Mc}!N&vs)O-|;UGxN>N`;Mq8|MSH7&*#z! zM5Hbv8sOy_2UWc=fI6Vvi2BH7W*{QL&l1E3Rh27gk%;&JBZ&mJD+{4{>q=S#WB?Tr zEfoqHRH8ubjPC`4*TR0MTvrp06$W4L>pvur7a3qJuq&XsY*vl95#D_t7-vX=*HMOq zaFYqWIW?v3h!fhpb0_G2xnr9;<9S-h=QZUf6i~y6t5+(iWf}vi*$tx)LFxc0*JW;Y zmXUAs_OT!Evkc%+jkZh+1uY?|FFfq zYL#}o%}!&NTk?~Sm`r9IOf$}>FFR3I4%R`)?a_3arr*RX-Tz zb(OE14YFfX%+1UoB7^l3RuH~CmmR|^6me`D5kY}wvx(z4oE{yKpP%RRw+}pBTjt=X z#hbTVY;JE6HX>R9-PE&8Q}0$P>L!zF+hz}QVzHQJGZ}rbw4}41r`K{heewK><|ih! zwz4vC;5`Wz%4JQbQfe4+9Yj$;%hS`kT&@23E|rEZyPg?1jzjDCnA6i=02`_*A%L;a zud%m_Wm$}-(roWGxb|RkB^^A oXct*_+HXf)WrFo#LyhA10RGnGHXJ=`sQ>@~07*qoM6N<$g0;~&=l}o! literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/skotizo.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/skotizo.png new file mode 100644 index 0000000000000000000000000000000000000000..cd96bbcca01af36999b59bc2ef0ff99afd00678b GIT binary patch literal 994 zcmV<810DQ{P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ$0%e1zXB=Iv-AFdN^LVH3;Ry#C?;Kob$|_=Q-zj-@HdtO7S8? z@Pgx70Zr3-nx-jD)6{M7|0JMk+I^sSZmq7vuMDNs*a0X&-QCzwqxpIKPUTZ2gf{y2 z#Z^4w!l}PGfAxucmbuwkbY1-Gv=jL(iQ6Za|azVjx&-$fHTlZ6s8 zJ!43Eqd@O@U7?#g{$qpLnJV8uc)-L&j(eMLGh1C|_0@Hpykh&OU6vOYke-E-CTH64 zMuBeu5;MR{BG&IMU>GL9JbHxN^GMQ^X0t}BI{f_WZyX>0fs~S7+G1tBLZssB1(Z_z z07;T^=aYFlhbCrNqF5~O!`2qn=?cxo1{q5bgdxjIi$v}KD|!jrve3}47kFN#=(->o zqzsY>VQBP^4DN1h@NjpRC;R)fj*f^21A4xP6Hd|Pgp6g-XinZ}(G!4Tp-8zjNxO53 z)-Lh><{F)Dmmmm<;+P-|dAzqrtun<7ud%`#q`?%HZJ_J=rS_qX+Vu$h?BkDcvJR$c zaHb?#%ORI@ICy%9>v@D>$V|10Fbv`(!m)D%fsfnk(>gk0@8Do$xi+>;bB=>jia3tx z_d|wqNZ4Jj51D5c0b4xaCi+Qt2`76nm6G8o``E^DvPvG-j_?=-}=ErwE( z&1Mn0pmPw>?sRcom&4y%092-?F25@mll*_hxFo+d=0EQiT%|GCKU{we06B@KvWeyY QFaQ7m07*qoM6N<$f?p@fM*si- literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/the_corrupted_gauntlet.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/the_corrupted_gauntlet.png new file mode 100644 index 0000000000000000000000000000000000000000..9553dde2c1241fdcb4ae2e3e9729aa96e5cc16d1 GIT binary patch literal 823 zcmV-71IYY|P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;y-7qtRCwCFm0d`aVHC%I@5kPKyjyeA>2eNrW|D|$Mi*&f5kZh3ME6$Ebyv}S z*U@!X5!F=}S{6bOWZIJwe zfW;;bRRE|0ajmmEzdr}aU-B{Cg;M@+C``Zwum%uMqbR>aN|GeDRFSvJfebk8*4)t5 ztd}~?EHD5>0QNa`zAuM4ifQLEH4N~`R-Egx+|aG8Q=^!as=J1t zi_2J?5?tHIRBqpU zfF>mBy>|4JPAC~+Gnqsx6R@l9)Ydo!AVyDJ7Ek==iv@9;xD~rv;^OoAv$PULGpWq2 zMoF!$F|~727c1#>qkmJ=QkfTbw7qt%u5tmt1_0J*YYMrLZ&?5U002ovPDHLkV1h=S BYtjG! literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/the_gauntlet.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/the_gauntlet.png new file mode 100644 index 0000000000000000000000000000000000000000..e34fbe3d152e1835582375364946d8ff7a9de02c GIT binary patch literal 909 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 IM6N<$g2D-oqyPW_ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/vetion.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/vetion.png new file mode 100644 index 0000000000000000000000000000000000000000..383d30a11991846365ce100bed007026e1d29df3 GIT binary patch literal 728 zcmV;}0w?{6P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;UP(kjRCwC7mETK~VHC$d=h^1wez|FE%5?9xD9|!Ahy{x&UC1?&>e- zKgs`~=-Lv6>dKM`y+}}~L~<_2{4s6wbhCHpT65DnaNy;6&i8zI&pF@ch^q2G&G4VC zB?1w7CL&t#@uonk+LQw?0j=?gV{t7ID4>sTJ<@?#f0g7ooN2N&;{YDFi|yz-j=baF z^*}@>fENJ0p*XwCC4%k%Zrt|$WThvQb@9iIsfZ{*CYj+vVSwCLj;{SK-k*QN!qPIO zQu%N{rKLX*ks*M9za7(A6NNG8f#^A2x5Ou1atd!AKB)wu6)=@s@lX$blU{-H<>;5+br`&pLq9VYqkwE3zwEb?7> ztaC}MkVQI~Mx>f!<*z-kliJqiauVsj59L=}9!#>o7@~L0Vx}~ME6@gRhzH}$FU=F~ z2(y@9{G%6jOB6nnA>i*prHyZ2pQ8s#p-{x}%S|r2fhW+;LVkfhPam^Ovt(txn!KTs zffZXoE?4^z)f$Z6iQU$V{sB#QUeRmmeyyYIO(4-w$(5iZO0~aJiMYnPJJsPZ>hpRI zCr&i2WK|6TVPF_Y9=^M@I>hc8Jh}Rm?VVz^-m1FNl9E+*Q&s0{fjgxlIdbIYHt>qK z?$n&*si-~yTZ378A|dAXKQPR&eQcd}A3OjU8@s`ta|dG#qYwM|()$Txq^h42?}OS& zNm)^KI*i^NO{>f0w9iLQybpkhI^$UDiBm6}3R$R5@{vZE-va=iM-p~g0g`3_0000< KMNUMnLSTZL7*c!y literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/vorkath.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/bosses/vorkath.png new file mode 100644 index 0000000000000000000000000000000000000000..03bcc75ed4c073de3fa989e659208d3211c320fa GIT binary patch literal 1041 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 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/overall.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/overall.png new file mode 100644 index 0000000000000000000000000000000000000000..50e4458e8ebf0a7d52189cf1113ed9558bd59c46 GIT binary patch literal 802 zcmV+-1Ks?IP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0=G#-K~y+TeN;Vf z6G0Gtd!Kgh96NFF#ZD1L5hPUsaYvKRQ5?3UvGv#Pt3bq?&VaDtb7IJ30GdA8C>lE9XNY%vCJwQKMSjcB<8v zk{V-ofefUUUKyew0OuS54+^(&Xk;iBE0vW^$Jx4Q+m4)keQzy11UArXx*8eeR$JxoTbT0ELs*ORTW8`LU55YL`*?^1nz$VHO!JhYNpHNED?qg zf-sZ^8$O;M!sY&1o*1=&&vtF>d8QyUr=0>2KAavReyplJhTJc*&k5tWs)#1bgUAdq3s+^;onGh0_A%cX%rz6D?N92b&yOEps zkcfTsPru~!-0!3$%JV5P7D%KC;%uagsTy9H0&9O?4?#KO)FSfO66anKS-mt(ixG`g zIxaigdjJ_A2}t45HzY#5U?oM(=1POhPyZB1_roYeV5?B{!9JR%Ar3iGPkvA2bByVf gP$1?#3YuL14Zb;SDz!i2Z2$lO07*qoM6N<$g3vTwBLDyZ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons_small/bounty hunter - hunter.png b/runelite-client/src/main/resources/skill_icons_small/bounty_hunter_hunter.png similarity index 100% rename from runelite-client/src/main/resources/skill_icons_small/bounty hunter - hunter.png rename to runelite-client/src/main/resources/skill_icons_small/bounty_hunter_hunter.png diff --git a/runelite-client/src/main/resources/skill_icons_small/bounty hunter - rogue.png b/runelite-client/src/main/resources/skill_icons_small/bounty_hunter_rogue.png similarity index 100% rename from runelite-client/src/main/resources/skill_icons_small/bounty hunter - rogue.png rename to runelite-client/src/main/resources/skill_icons_small/bounty_hunter_rogue.png diff --git a/runelite-client/src/main/resources/skill_icons_small/clue scrolls (all).png b/runelite-client/src/main/resources/skill_icons_small/clue_scroll_all.png similarity index 100% rename from runelite-client/src/main/resources/skill_icons_small/clue scrolls (all).png rename to runelite-client/src/main/resources/skill_icons_small/clue_scroll_all.png diff --git a/runelite-client/src/main/resources/skill_icons_small/last man standing.png b/runelite-client/src/main/resources/skill_icons_small/last_man_standing.png similarity index 100% rename from runelite-client/src/main/resources/skill_icons_small/last man standing.png rename to runelite-client/src/main/resources/skill_icons_small/last_man_standing.png diff --git a/runelite-client/src/main/resources/skill_icons_small/league points.png b/runelite-client/src/main/resources/skill_icons_small/league_points.png similarity index 100% rename from runelite-client/src/main/resources/skill_icons_small/league points.png rename to runelite-client/src/main/resources/skill_icons_small/league_points.png diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/hiscore/HiscorePanelTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/hiscore/HiscorePanelTest.java index c814cbd6a7..3d5255f088 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/hiscore/HiscorePanelTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/hiscore/HiscorePanelTest.java @@ -24,6 +24,8 @@ */ package net.runelite.client.plugins.hiscore; +import static net.runelite.client.plugins.hiscore.HiscorePanel.formatLevel; +import static org.junit.Assert.assertEquals; import org.junit.Test; public class HiscorePanelTest @@ -35,4 +37,14 @@ public class HiscorePanelTest { }); } + + @Test + public void testFormatLevel() + { + assertEquals("398", formatLevel(398)); + assertEquals("5000", formatLevel(5000)); + assertEquals("7682", formatLevel(7682)); + assertEquals("12k", formatLevel(12398)); + assertEquals("219k", formatLevel(219824)); + } }