From 6c6d87cc11a1541c7af45d17058bc628a63b1a4b Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 13 Feb 2017 19:31:11 -0500 Subject: [PATCH] client: add hiscore plugin --- runelite-client/pom.xml | 5 + .../java/net/runelite/client/RuneLite.java | 6 +- .../client/plugins/PluginManager.java | 2 + .../client/plugins/hiscore/Hiscore.java | 57 +++++ .../client/plugins/hiscore/HiscorePanel.java | 202 ++++++++++++++++++ .../java/net/runelite/client/ui/ClientUI.java | 63 +++++- .../runelite/client/ui/NavigationPanel.java | 42 ++++ .../net/runelite/client/ui/PluginPanel.java | 8 + .../client/ui/overlay/OverlayRenderer.java | 5 + .../client/plugins/hiscore/hiscore.gif | Bin 0 -> 970 bytes .../main/resources/skill_icons/agility.png | Bin 0 -> 155 bytes .../src/main/resources/skill_icons/attack.png | Bin 0 -> 195 bytes .../resources/skill_icons/construction.png | Bin 0 -> 423 bytes .../main/resources/skill_icons/cooking.png | Bin 0 -> 213 bytes .../main/resources/skill_icons/crafting.png | Bin 0 -> 222 bytes .../main/resources/skill_icons/defence.png | Bin 0 -> 146 bytes .../main/resources/skill_icons/farming.png | Bin 0 -> 330 bytes .../main/resources/skill_icons/firemaking.png | Bin 0 -> 266 bytes .../main/resources/skill_icons/fishing.png | Bin 0 -> 270 bytes .../main/resources/skill_icons/fletching.png | Bin 0 -> 216 bytes .../main/resources/skill_icons/herblore.png | Bin 0 -> 211 bytes .../main/resources/skill_icons/hitpoints.png | Bin 0 -> 194 bytes .../src/main/resources/skill_icons/hunter.png | Bin 0 -> 257 bytes .../src/main/resources/skill_icons/magic.png | Bin 0 -> 245 bytes .../src/main/resources/skill_icons/mining.png | Bin 0 -> 216 bytes .../main/resources/skill_icons/overall.png | Bin 0 -> 291 bytes .../src/main/resources/skill_icons/prayer.png | Bin 0 -> 211 bytes .../src/main/resources/skill_icons/ranged.png | Bin 0 -> 280 bytes .../main/resources/skill_icons/runecraft.png | Bin 0 -> 276 bytes .../src/main/resources/skill_icons/slayer.png | Bin 0 -> 316 bytes .../main/resources/skill_icons/smithing.png | Bin 0 -> 226 bytes .../main/resources/skill_icons/strength.png | Bin 0 -> 184 bytes .../main/resources/skill_icons/thieving.png | Bin 0 -> 130 bytes .../resources/skill_icons/woodcutting.png | Bin 0 -> 226 bytes 34 files changed, 380 insertions(+), 10 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/hiscore/Hiscore.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/NavigationPanel.java create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hiscore.gif create mode 100644 runelite-client/src/main/resources/skill_icons/agility.png create mode 100644 runelite-client/src/main/resources/skill_icons/attack.png create mode 100644 runelite-client/src/main/resources/skill_icons/construction.png create mode 100644 runelite-client/src/main/resources/skill_icons/cooking.png create mode 100644 runelite-client/src/main/resources/skill_icons/crafting.png create mode 100644 runelite-client/src/main/resources/skill_icons/defence.png create mode 100644 runelite-client/src/main/resources/skill_icons/farming.png create mode 100644 runelite-client/src/main/resources/skill_icons/firemaking.png create mode 100644 runelite-client/src/main/resources/skill_icons/fishing.png create mode 100644 runelite-client/src/main/resources/skill_icons/fletching.png create mode 100644 runelite-client/src/main/resources/skill_icons/herblore.png create mode 100644 runelite-client/src/main/resources/skill_icons/hitpoints.png create mode 100644 runelite-client/src/main/resources/skill_icons/hunter.png create mode 100644 runelite-client/src/main/resources/skill_icons/magic.png create mode 100644 runelite-client/src/main/resources/skill_icons/mining.png create mode 100644 runelite-client/src/main/resources/skill_icons/overall.png create mode 100644 runelite-client/src/main/resources/skill_icons/prayer.png create mode 100644 runelite-client/src/main/resources/skill_icons/ranged.png create mode 100644 runelite-client/src/main/resources/skill_icons/runecraft.png create mode 100644 runelite-client/src/main/resources/skill_icons/slayer.png create mode 100644 runelite-client/src/main/resources/skill_icons/smithing.png create mode 100644 runelite-client/src/main/resources/skill_icons/strength.png create mode 100644 runelite-client/src/main/resources/skill_icons/thieving.png create mode 100644 runelite-client/src/main/resources/skill_icons/woodcutting.png diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index b6b20c68a5..3abc42f6bf 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -78,6 +78,11 @@ 133.2-SNAPSHOT runtime + + net.runelite + http-api + ${project.version} + junit diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 72a084c471..9023c178a1 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -67,7 +67,6 @@ public class RuneLite public void start() throws Exception { gui = new ClientUI(); - gui.setVisible(true); pluginManager = new PluginManager(this); pluginManager.loadAll(); @@ -95,6 +94,11 @@ public class RuneLite return runelite; } + public ClientUI getGui() + { + return gui; + } + public PluginManager getPluginManager() { return pluginManager; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index c3e8cd981b..819c195240 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -31,6 +31,7 @@ import java.util.List; import net.runelite.client.RuneLite; import net.runelite.client.plugins.boosts.Boosts; import net.runelite.client.plugins.fpsinfo.FPS; +import net.runelite.client.plugins.hiscore.Hiscore; import net.runelite.client.plugins.opponentinfo.OpponentInfo; public class PluginManager @@ -48,6 +49,7 @@ public class PluginManager load(new Boosts()); load(new OpponentInfo()); load(new FPS()); + load(new Hiscore()); } private void load(Plugin plugin) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/Hiscore.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/Hiscore.java new file mode 100644 index 0000000000..a789131e78 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/Hiscore.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2017, Adam + * 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.hiscore; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import net.runelite.client.RuneLite; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.ClientUI; +import net.runelite.client.ui.overlay.Overlay; + +public class Hiscore extends Plugin implements ActionListener +{ + private final HiscorePanel hiscorePanel = new HiscorePanel(); + private final ClientUI ui = RuneLite.getRunelite().getGui(); + + public Hiscore() + { + ui.getNavigationPanel().getHiscores().addActionListener(this); + } + + @Override + public Overlay getOverlay() + { + return null; + } + + @Override + public void actionPerformed(ActionEvent e) + { + ui.setPluginPanel(hiscorePanel); + ui.expand(); + } + +} 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 new file mode 100644 index 0000000000..0119d2d807 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2017, Adam + * 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.hiscore; + +import com.google.common.base.Strings; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.io.IOException; +import java.net.URISyntaxException; +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import net.runelite.api.Skill; +import net.runelite.client.ui.PluginPanel; +import net.runelite.http.api.hiscore.HiscoreClient; +import net.runelite.http.api.hiscore.HiscoreResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HiscorePanel extends PluginPanel +{ + private static final Logger logger = LoggerFactory.getLogger(HiscorePanel.class); + + private JTextField input; + private JButton lookupButton; + + private final JLabel attackLabel = new JLabel("--"); + private final JLabel defenceLabel = new JLabel("--"); + private final JLabel strengthLabel = new JLabel("--"); + private final JLabel hitpointsLabel = new JLabel("--"); + private final JLabel rangedLabel = new JLabel("--"); + private final JLabel prayerLabel = new JLabel("--"); + private final JLabel magicLabel = new JLabel("--"); + private final JLabel cookingLabel = new JLabel("--"); + private final JLabel woodcuttingLabel = new JLabel("--"); + private final JLabel fletchingLabel = new JLabel("--"); + private final JLabel fishingLabel = new JLabel("--"); + private final JLabel firemakingLabel = new JLabel("--"); + private final JLabel craftingLabel = new JLabel("--"); + private final JLabel smithingLabel = new JLabel("--"); + private final JLabel miningLabel = new JLabel("--"); + private final JLabel herbloreLabel = new JLabel("--"); + private final JLabel agilityLabel = new JLabel("--"); + private final JLabel thievingLabel = new JLabel("--"); + private final JLabel slayerLabel = new JLabel("--"); + private final JLabel farmingLabel = new JLabel("--"); + private final JLabel runecraftLabel = new JLabel("--"); + private final JLabel hunterLabel = new JLabel("--"); + private final JLabel constructionLabel = new JLabel("--"); + + private GridLayout stats; + + private final HiscoreClient client = new HiscoreClient(); + + public HiscorePanel() + { + setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + setSize(PANEL_WIDTH, PANEL_HEIGHT); + setVisible(true); + + input = new JTextField(); + input.setColumns(16); + add(input); + + lookupButton = new JButton("Lookup"); + add(lookupButton); + + lookupButton.addActionListener((ActionEvent e) -> + { + lookup(); + }); + + JPanel statsPanel = new JPanel(); + stats = new GridLayout(8, 3); + statsPanel.setLayout(stats); + + try + { + statsPanel.add(makeSkillPanel(Skill.ATTACK, attackLabel)); + statsPanel.add(makeSkillPanel(Skill.DEFENCE, defenceLabel)); + statsPanel.add(makeSkillPanel(Skill.STRENGTH, strengthLabel)); + statsPanel.add(makeSkillPanel(Skill.HITPOINTS, hitpointsLabel)); + statsPanel.add(makeSkillPanel(Skill.RANGED, rangedLabel)); + statsPanel.add(makeSkillPanel(Skill.PRAYER, prayerLabel)); + statsPanel.add(makeSkillPanel(Skill.MAGIC, magicLabel)); + statsPanel.add(makeSkillPanel(Skill.COOKING, cookingLabel)); + statsPanel.add(makeSkillPanel(Skill.WOODCUTTING, woodcuttingLabel)); + statsPanel.add(makeSkillPanel(Skill.FLETCHING, fletchingLabel)); + statsPanel.add(makeSkillPanel(Skill.FISHING, fishingLabel)); + statsPanel.add(makeSkillPanel(Skill.FIREMAKING, firemakingLabel)); + statsPanel.add(makeSkillPanel(Skill.CRAFTING, craftingLabel)); + statsPanel.add(makeSkillPanel(Skill.SMITHING, smithingLabel)); + statsPanel.add(makeSkillPanel(Skill.MINING, miningLabel)); + statsPanel.add(makeSkillPanel(Skill.HERBLORE, herbloreLabel)); + statsPanel.add(makeSkillPanel(Skill.AGILITY, agilityLabel)); + statsPanel.add(makeSkillPanel(Skill.THIEVING, thievingLabel)); + statsPanel.add(makeSkillPanel(Skill.SLAYER, slayerLabel)); + statsPanel.add(makeSkillPanel(Skill.FARMING, farmingLabel)); + statsPanel.add(makeSkillPanel(Skill.RUNECRAFT, runecraftLabel)); + statsPanel.add(makeSkillPanel(Skill.HUNTER, hunterLabel)); + statsPanel.add(makeSkillPanel(Skill.CONSTRUCTION, constructionLabel)); + } + catch (IOException ex) + { + logger.warn(null, ex); + } + + add(statsPanel); + } + + private JPanel makeSkillPanel(Skill skill, JLabel levelLabel) throws IOException + { + JPanel iconLevel = new JPanel(); + + String skillIcon = "/skill_icons/" + skill.getName().toLowerCase() + ".png"; + logger.debug("Loading skill icon from {}", skillIcon); + + JLabel icon = new JLabel(new ImageIcon(ImageIO.read(HiscorePanel.class.getResourceAsStream(skillIcon)))); + iconLevel.add(icon); + + iconLevel.add(levelLabel); + + return iconLevel; + } + + private void lookup() + { + String lookup = input.getText(); + + if (Strings.isNullOrEmpty(lookup)) + { + return; + } + + HiscoreResult result; + try + { + result = client.lookup(lookup); + } + catch (IOException | URISyntaxException ex) + { + logger.warn(null, ex); + return; + } + + setLabel(attackLabel, result.getAttack()); + setLabel(defenceLabel, result.getDefence()); + setLabel(strengthLabel, result.getStrength()); + setLabel(hitpointsLabel, result.getHitpoints()); + setLabel(rangedLabel, result.getRanged()); + setLabel(prayerLabel, result.getPrayer()); + setLabel(magicLabel, result.getMagic()); + setLabel(cookingLabel, result.getCooking()); + setLabel(woodcuttingLabel, result.getWoodcutting()); + setLabel(fletchingLabel, result.getFletching()); + setLabel(fishingLabel, result.getFishing()); + setLabel(firemakingLabel, result.getFiremaking()); + setLabel(craftingLabel, result.getCrafting()); + setLabel(smithingLabel, result.getSmithing()); + setLabel(miningLabel, result.getMining()); + setLabel(herbloreLabel, result.getHerblore()); + setLabel(agilityLabel, result.getAgility()); + setLabel(thievingLabel, result.getThieving()); + setLabel(slayerLabel, result.getSlayer()); + setLabel(farmingLabel, result.getFarming()); + setLabel(runecraftLabel, result.getRunecraft()); + setLabel(hunterLabel, result.getHunter()); + setLabel(constructionLabel, result.getConstruction()); + } + + private void setLabel(JLabel label, net.runelite.http.api.hiscore.Skill skill) + { + label.setText("" + skill.getLevel()); + } +} 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 60340b2f50..46b5ea69e9 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 @@ -22,23 +22,25 @@ * (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.ui; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; +import java.awt.FlowLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.JPanel; import javax.swing.JPopupMenu; -import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public final class ClientUI extends JFrame { + private JPanel container; private ClientPanel panel; + private NavigationPanel navigationPanel; + private PluginPanel pluginPanel; + private boolean expanded; public ClientUI() throws Exception { @@ -46,10 +48,10 @@ public final class ClientUI extends JFrame pack(); setTitle("RuneLite"); setLocationRelativeTo(getOwner()); - setMinimumSize(getSize()); setResizable(true); + setVisible(true); } - + private void init() throws Exception { setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); @@ -62,7 +64,7 @@ public final class ClientUI extends JFrame checkExit(); } }); - + JPopupMenu.setDefaultLightWeightPopupEnabled(false); try { @@ -72,17 +74,60 @@ public final class ClientUI extends JFrame { } + container = new JPanel(); + container.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); + panel = new ClientPanel(); - add(panel); + container.add(panel); + + navigationPanel = new NavigationPanel(); + container.add(navigationPanel); + + add(container); + } + + public void expand() + { + if (!expanded) + { + container.add(pluginPanel, null, 1); + + container.revalidate(); + + this.setSize(this.getWidth() + PluginPanel.PANEL_WIDTH, this.getHeight()); + expanded = true; + } + else + { + container.remove(1); + container.revalidate(); + this.setSize(this.getWidth() - PluginPanel.PANEL_WIDTH, this.getHeight()); + expanded = false; + } } private void checkExit() { int result = JOptionPane.showConfirmDialog(this, "Are you sure you want to exit?", "Exit", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - + if (result == JOptionPane.OK_OPTION) { System.exit(0); } } + + public NavigationPanel getNavigationPanel() + { + return navigationPanel; + } + + public PluginPanel getPluginPanel() + { + return pluginPanel; + } + + public void setPluginPanel(PluginPanel pluginPanel) + { + this.pluginPanel = pluginPanel; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/NavigationPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/NavigationPanel.java new file mode 100644 index 0000000000..5d5c4b1537 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/NavigationPanel.java @@ -0,0 +1,42 @@ +package net.runelite.client.ui; + +import java.awt.Dimension; +import java.io.IOException; +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JPanel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class NavigationPanel extends JPanel +{ + private static final Logger logger = LoggerFactory.getLogger(NavigationPanel.class); + + private static final int PANEL_WIDTH = 20, PANEL_HEIGHT = 503; + + private final JButton hiscores = new JButton(); + + public NavigationPanel() + { + setSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + + try + { + hiscores.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("/net/runelite/client/plugins/hiscore/hiscore.gif")))); + } + catch (IOException ex) + { + logger.warn(null, ex); + } + + add(hiscores); + } + + public JButton getHiscores() + { + return hiscores; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java new file mode 100644 index 0000000000..1ba57ea8e3 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java @@ -0,0 +1,8 @@ +package net.runelite.client.ui; + +import javax.swing.JPanel; + +public class PluginPanel extends JPanel +{ + public static final int PANEL_WIDTH = 225, PANEL_HEIGHT = 503; +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index ed6a24284e..906c13ec4c 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -41,6 +41,11 @@ public class OverlayRenderer { Overlay overlay = plugin.getOverlay(); + if (overlay == null) + { + continue; + } + switch (overlay.getPosition()) { case TOP_RIGHT: diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hiscore.gif b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hiscore.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f9b2eae4f84c937424d978734da3f28b74839f7 GIT binary patch literal 970 zcmZ?wbhEHb6lM@$XlG!sP?4CF%{)1Wab_XotU|^)#f)=GnC6!<&M#$}U&geclyPA> z$C65>B~?sItC*GnQ8m-@YUUL+%qwe|R@AaAt&?2eCbXfMX=5AP_D-hlT}->WnRaxu z?dfIO+XqC>}Kt;MpeSm)kVo?9_g@OZUk(+Yftczojc7mg+rM-)nOW}r3<$}fzdAEX^gaG5mzDy!HJcSPv8UmJU%6lYiJnYo8IwF|q zK?2j^0~-<F!XM-L27!){G{kPxM zw|1G+BS&+7Q&lF}!@WEGye{&u=xLpn>FVdQ&MBb@ E0REmd*#H0l literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/attack.png b/runelite-client/src/main/resources/skill_icons/attack.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bd5c96cff555dc20089d4fc2feb7749e9b28ce GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIU7jwEAr-fh6BckL{ORw?OmNIB z<(0X7Kq!PeBY|@nYsj{gD@}piZBtkm8U`*Fd$9e$S-1H?+!wmjIF>D974TlQ$?|`G z2@(DP$oK;%oX2j9l#C}srE2?P&L)*mW{w&AV9LA~(fk%ZV sIKB`IxGQvJL%XEM)imC-w>@|mZ2JSM|2xi30J@67)78&qol`;+03~Nc^8f$< literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/construction.png b/runelite-client/src/main/resources/skill_icons/construction.png new file mode 100644 index 0000000000000000000000000000000000000000..6635404aaf7b96bd41deca51079c58533bf5c3d6 GIT binary patch literal 423 zcmV;Y0a*TtP)P000>X1^@s6#OZ}&0004QNkl|ykeE;rODldP7Nm-SrAwg2n;-;(Xn;h6DKBi8%sw{ zl=ObS$Je(R40;*HHr4Ae_T#y-@6#*$Fgv+1atZo{WQf0gZ-3yPQv) z7?@V|1Tq1@4C=v51l|)sNORR@SBM8-a}k^y-45CVf`FQZst)q+7D9~u`Tcf3JU=-M zGlbw;U92`dD}Z>w=VonRUsfUb?aj=I_X?&WNZYCPQo!4CVV@R{0ifyx;M9KI&BF}g zEGPg1AcmwDm?%qvx&R8w^nD9~Xc4TT2v8L^MAHDURFM^wh7=w$T7&?xeJZ|N*w*V+ zq}IhCSf{`uyL6Ldh=N#os%=)80JW+O)YeX*4vAjJ@$7J;4W~qa;MLDuBfO%irtYY;4gEnfwoqS0Aget>=DMWi>@N{s5~2fdGYz R)~5gf002ovPDHLkV1nw=w%q^# literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/cooking.png b/runelite-client/src/main/resources/skill_icons/cooking.png new file mode 100644 index 0000000000000000000000000000000000000000..368b7a66a9ee4340ee72bedc9c5ea984bff13628 GIT binary patch literal 213 zcmV;`04o29P)yjOV zd;kC<0T@IA01yi)@jpWPfB;C{L7_J(-_C8$J^~pZUK4N22DZEokpS;J4Q`VBChN=1 z2`FCII|w4h>uzzDX(X=C0KHNB;;t=h5r@~dRlMCvoxC1^dp8MDg80)@zfig(Jd+!1 YFQw#AJ(6FLsQ>@~07*qoM6N<$f<8o68UO$Q literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/defence.png b/runelite-client/src/main/resources/skill_icons/defence.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0735f56f9817bac9ecdcaab755e5395afc919b GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^f rhC(*MM25O%4+Dlofq6kZ%nS@2zonMMzIkZ~w1mOa)z4*}Q$iB}81yOO literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/farming.png b/runelite-client/src/main/resources/skill_icons/farming.png new file mode 100644 index 0000000000000000000000000000000000000000..219372b9fa8a75eaeb1abd1ecc7685ae59030b1b GIT binary patch literal 330 zcmV-Q0k!^#P)P000*V1^@s6{^R5m0003INkl9U5Jj7x(v2Yf05^i52;B(9mEgwb(zOWU|F%rZb(%DfPE*0c-89Xd%$-S-EE7Mf za%+^Q3HE$kwJzt=SGQw128e^Zve=h9twfM&0o>!8^(qBo1Kc&~3Go$C88(ss6p(bd zS6cLbo9D46XeLAUssRCDSyWEVr!yaf0o?-f>S2j5IOK&;8&dGDue<;n!#7Z|m}r|w z>_EUSw4w=O2rcCEerchdv0nh_+8wA3Th9ezez3D|l-n0QU)Z&ETl#CnE4N;jUSsUI51lbM0|C z(O!@qCyd~DqDJZ(Vwx4|HPS1ESRs8H{)_J5wL!WvJ%3x64!=qR+5P=`E2sAIs2Xf92dWrgto|3=2%E6L>VQU&o9760F1_N#_T-33Zmjy(9TNh@WBn&_U zd7#qwdhg0oBs@}EmGpCxRGKpB3jQ1ub%fkZz z`I7`1Sk}6wZtN{7u)weHnLsyO;-Y1T&Yt z{rk1<0T1vXEjR_zaHMj$nRzD@+^-6%Tq>zD)KTM6QhY`$&GOS5O}!}n(YYS3FZ6i! UH*#a**#H0l07*qoM6N<$g4Hr{XaE2J literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/fletching.png b/runelite-client/src/main/resources/skill_icons/fletching.png new file mode 100644 index 0000000000000000000000000000000000000000..034120bcfbd7749044ed0b81850596e00faa6b4c GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAI^F3W0Ln>~)y=KeTpuocxU}t{r zf#MvQy%Se=SC#V^1&DBHuAQuMmqY*Q@}o1>F^W6o9=KV0!G%dcuuy}^?pdbF1c^45 z1q&>K*e}eMl`?9$Endye?D&kQsQWM*KCf~h@1L_bH$X;G4};rUr1`0E)xl6vHLys#Gkc#v+rN-c3s(^ Q1#~Kdr>mdKI;Vst02ZH92mk;8 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/herblore.png b/runelite-client/src/main/resources/skill_icons/herblore.png new file mode 100644 index 0000000000000000000000000000000000000000..41c31dbec7f5eaebd3aa7bf6812bcfbd87873fa0 GIT binary patch literal 211 zcmV;^04)EBP)P000pP1^@s6D7ps@0001*Nklr87IB=G?%zra7S!HrbXep zuL zSf)8i5b}kf7B~#Q1WWf%-;~E1 z1gkjKVPx-h-S={7M|%FlfTsnZ6nl_D>WRQo5+n_Mzn%}Aamo0y$?oww2!drM9ymMZ zxk_t8{}zq6E{L{Bk=@%`lKceB?@0BtNvV_Rhbb(FXSw(d|L|Pa-)x)m00000NkvXX Hu0mjfB`9xt literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/magic.png b/runelite-client/src/main/resources/skill_icons/magic.png new file mode 100644 index 0000000000000000000000000000000000000000..63379d9255a10c90564e830cb369d09a5be022b9 GIT binary patch literal 245 zcmVP000*V1^@s6{^R5m0002INkleG9YE&^s^-OB?UK(8Ce<9KzIgDE00000NkvXXu0mjfV?SWg literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/mining.png b/runelite-client/src/main/resources/skill_icons/mining.png new file mode 100644 index 0000000000000000000000000000000000000000..5ebe806f509ad0b167b2c8d5f0b79534405cba15 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6=6kw0hE&|zI@OV{L4k+mrua|B z^Z!mv{wFIe+|1-19X0#QiJY6;CR{R@@Y_-}{zToJyE(2dg?y7;Cu}d>xmlT^%A7|ldK9D2D!b$J5|Uz2xrLQC`7 zt>S#HTZ0RFVdQ&MBb@07>Unp#T5? literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/overall.png b/runelite-client/src/main/resources/skill_icons/overall.png new file mode 100644 index 0000000000000000000000000000000000000000..4b2dd265a4970c6dd20f2310d2a01face8528074 GIT binary patch literal 291 zcmV+;0o?wHP)8)*1)|sakAQ)o06ohsUc_xqFow-Hs=VUEoX-s`UZWqi${3Dvr}KO!i4|g zoxeMdLm`AA1>>CV`yKY7JARO^`j)~78P{KRfB?TNX8`r^AcyH`!*#IhO`G8u1C$Ri8>d}T+s#_qekUCxh+^Ym*Zw_@>sW;2 p%-exutS;_YuFU*t4f&mfcmb@^ed{f`g=hc(002ovPDHLkV1m;;ef$6b literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/prayer.png b/runelite-client/src/main/resources/skill_icons/prayer.png new file mode 100644 index 0000000000000000000000000000000000000000..85c46181009d9c9458a2e90d0ba3ad90006a478c GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6W_h|ehE&{oJJpb{L4n8hglW zKlc=RcOZPn0teQ2Ro)M*?{KeDF`UvY?!{0Xz!V(R6j0QqprOObzI~x>W5cJADa`7A z^YQ}ulAPaW?TX<0BP8YhLyW^l$+bd9;QtPhhjAbL7d?BqpZQ7k*%g~)8Giv?$>8bg K=d#Wzp$Py?S52w_ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/ranged.png b/runelite-client/src/main/resources/skill_icons/ranged.png new file mode 100644 index 0000000000000000000000000000000000000000..574daf70c0b8ac3a8dbb1fcaf8c514333cfca25c GIT binary patch literal 280 zcmV+z0q6dSP)y6+l*eP000>X1^@s6#OZ}&0002nNkl3d{FXg!U@c)+3m?JD$%))uF$wbYq->`FlbKT`b)KG{I z``va{hk+08*XAb$DY(-hg{#3Jc#H)N27&8SM0h9obUe&rF%5&SG{7yF>UufPLIb{& z4DjbU6+$o?pm75p!B`9|(*AP71>nd1R>YCRrEt0?SidV=#<##&hJi1lz?JKZV_==^ zZ#Xl^S1iA!rwPvu literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/skill_icons/smithing.png b/runelite-client/src/main/resources/skill_icons/smithing.png new file mode 100644 index 0000000000000000000000000000000000000000..ce71117d24fca3e075f823fa2f8c70af5835e642 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*m7Xq+Ar-flPIeS(P~dQVDkHln z)IIZZNpDzbxwN*?z6Hz9{c-i+pW0vCwF!PbZz`Jz&7$Jh^k1 z!+F`2!le`auC20Xo$$7$c%p^EQGRC)RyW(IWse2l-L6U(dUiBi@3TmPlZn!ZbPxB*8;fAS>xhXULBuP7b;&?yX_u6{1-oD!M4W29Lwfh+1V8FHHDo~^HrwQOBUt&6DrAz7(;oL dj~hK=V31pWmGMs41}w1Bu-@F9uDCI&gO0yG-{D694N^>P~q#JMFg(S=S8jauv>aBo224k55xrB zFcP9=N0k6mNVt%VDoqnZw8%8OVk&QYw11+)b+Kv%9kQT#988-D3J3H>YY#yP#zb>~ zQ0FdbkCAuvofw%IrlsxV%wgC%xkD9$d%|qUM^FPK1~sNsil`FuLuyRN$kwBOsG(M+ chaX3@1ERrpK(>Z8cK`qY07*qoM6N<$g6m0G%m4rY literal 0 HcmV?d00001