From 09a8c01c45ce71e0aa0f077190f3f0acfc7d6537 Mon Sep 17 00:00:00 2001 From: Seth Date: Mon, 29 Jan 2018 20:04:49 -0600 Subject: [PATCH] Add Poh plugin --- .../client/plugins/poh/BurnerOverlay.java | 99 +++++++ .../client/plugins/poh/PohConfig.java | 247 ++++++++++++++++++ .../runelite/client/plugins/poh/PohIcons.java | 116 ++++++++ .../client/plugins/poh/PohOverlay.java | 193 ++++++++++++++ .../client/plugins/poh/PohPlugin.java | 127 +++++++++ .../net/runelite/client/plugins/poh/altar.png | Bin 0 -> 180 bytes .../runelite/client/plugins/poh/annakarl.png | Bin 0 -> 14748 bytes .../runelite/client/plugins/poh/ardougne.png | Bin 0 -> 15237 bytes .../runelite/client/plugins/poh/camelot.png | Bin 0 -> 15243 bytes .../client/plugins/poh/exitportal.png | Bin 0 -> 214 bytes .../runelite/client/plugins/poh/falador.png | Bin 0 -> 15235 bytes .../client/plugins/poh/fishingguild.png | Bin 0 -> 15676 bytes .../net/runelite/client/plugins/poh/glory.png | Bin 0 -> 14744 bytes .../runelite/client/plugins/poh/kharyll.png | Bin 0 -> 15213 bytes .../runelite/client/plugins/poh/kourend.png | Bin 0 -> 15239 bytes .../runelite/client/plugins/poh/lumbridge.png | Bin 0 -> 15231 bytes .../runelite/client/plugins/poh/lunarisle.png | Bin 0 -> 15612 bytes .../net/runelite/client/plugins/poh/marim.png | Bin 0 -> 15225 bytes .../net/runelite/client/plugins/poh/pool.png | Bin 0 -> 15110 bytes .../runelite/client/plugins/poh/repair.png | Bin 0 -> 171 bytes .../client/plugins/poh/senntisten.png | Bin 0 -> 15214 bytes .../runelite/client/plugins/poh/varrock.png | Bin 0 -> 15236 bytes .../client/plugins/poh/waterbirth.png | Bin 0 -> 15183 bytes .../runelite/client/plugins/poh/yanille.png | Bin 0 -> 18114 bytes 24 files changed, 782 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/poh/PohConfig.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/altar.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/annakarl.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/ardougne.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/camelot.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/exitportal.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/falador.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/fishingguild.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/glory.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/kharyll.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/kourend.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/lumbridge.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/lunarisle.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/marim.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/pool.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/repair.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/senntisten.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/varrock.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/waterbirth.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/poh/yanille.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java new file mode 100644 index 0000000000..be1ad2344a --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/BurnerOverlay.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018, Seth + * 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.poh; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import static net.runelite.client.plugins.poh.PohPlugin.BURNER_LIT; +import static net.runelite.client.plugins.poh.PohPlugin.BURNER_UNLIT; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.TextComponent; + +public class BurnerOverlay extends Overlay +{ + private final Client client; + private final PohConfig config; + private final PohPlugin plugin; + private final TextComponent textComponent = new TextComponent(); + + @Inject + public BurnerOverlay(Client client, PohConfig config, PohPlugin plugin) + { + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_SCENE); + this.client = client; + this.config = config; + this.plugin = plugin; + } + + @Override + public Dimension render(Graphics2D graphics, java.awt.Point parent) + { + if (!config.enabled() || !config.showBurner()) + { + return null; + } + + for (GameObject object : plugin.getPohObjects()) + { + if (BURNER_UNLIT.contains(object.getId())) + { + drawBurner(graphics, "Unlit", object, Color.RED, parent); + } + else if (BURNER_LIT.contains(object.getId())) + { + drawBurner(graphics, "Lit", object, Color.GREEN, parent); + } + } + return null; + } + + private void drawBurner(Graphics2D graphics, String text, GameObject gameObject, Color color, java.awt.Point parent) + { + Point canvasText = Perspective.getCanvasTextLocation(client, graphics, gameObject.getLocalLocation(), text, 200); + + if (canvasText == null) + { + return; + } + + textComponent.setText(text); + textComponent.setPosition(new java.awt.Point(canvasText.getX(), canvasText.getY())); + textComponent.setColor(color); + textComponent.render(graphics, parent); + + //render tile + OverlayUtil.renderPolygon(graphics, gameObject.getCanvasTilePoly(), color); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohConfig.java new file mode 100644 index 0000000000..f630c81b44 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohConfig.java @@ -0,0 +1,247 @@ +/* + * Copyright (c) 2018, Seth + * 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.poh; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup( + keyName = "poh", + name = "Poh", + description = "Configuration for the POH plugin" +) +public interface PohConfig extends Config +{ + @ConfigItem( + keyName = "enabled", + name = "Enabled", + description = "Configures whether or not the POH plugin is displayed" + ) + default boolean enabled() + { + return true; + } + + @ConfigItem( + keyName = "showVarrock", + name = "Show Varrock portal", + description = "Configures whether or not the Varrock portal is displayed" + ) + default boolean showVarrock() + { + return true; + } + + @ConfigItem( + keyName = "showFalador", + name = "Show Falador portal", + description = "Configures whether or not the Camelot portal is displayed" + ) + default boolean showFalador() + { + return true; + } + + @ConfigItem( + keyName = "showLumbridge", + name = "Show Lumbridge portal", + description = "Configures whether or not the Lumbridge portal is displayed" + ) + default boolean showLumbridge() + { + return true; + } + + @ConfigItem( + keyName = "showCamelot", + name = "Show Camelot portal", + description = "Configures whether or not the Camelot portal is displayed" + ) + default boolean showCamelot() + { + return true; + } + + @ConfigItem( + keyName = "showArdougne", + name = "Show Ardougne portal", + description = "Configures whether or not the Ardougne portal is displayed" + ) + default boolean showArdougne() + { + return true; + } + + @ConfigItem( + keyName = "showYanille", + name = "Show Yanille portal", + description = "Configures whether or not the Yanille portal is displayed" + ) + default boolean showYanille() + { + return true; + } + + @ConfigItem( + keyName = "showLunarIsle", + name = "Show Lunar isle portal", + description = "Configures whether or not the Lunar isle portal is displayed" + ) + default boolean showLunarIsle() + { + return true; + } + + @ConfigItem( + keyName = "showWaterBirth", + name = "Show Waterbirth portal", + description = "Configures whether or not the Waterbirth portal is displayed" + ) + default boolean showWaterBirth() + { + return true; + } + + @ConfigItem( + keyName = "showFishingGuild", + name = "Show Fishing guild portal", + description = "Configures whether or not the Fishing guild portal is displayed" + ) + default boolean showFishingGuild() + { + return true; + } + + @ConfigItem( + keyName = "showSenntisten", + name = "Show Senntisten portal", + description = "Configures whether or not the Senntisten portal is displayed" + ) + default boolean showSenntisten() + { + return true; + } + + @ConfigItem( + keyName = "showKharyll", + name = "Show Kharyll portal", + description = "Configures whether or not the Kharyll portal is displayed" + ) + default boolean showKharyll() + { + return true; + } + + @ConfigItem( + keyName = "showAnnakarl", + name = "Show Annakarl portal", + description = "Configures whether or not the Annakarl portal is displayed" + ) + default boolean showAnnakarl() + { + return true; + } + + @ConfigItem( + keyName = "showKourend", + name = "Show Kourend portal", + description = "Configures whether or not the Kourend portal is displayed" + ) + default boolean showKourend() + { + return true; + } + + @ConfigItem( + keyName = "showMarim", + name = "Show Marim portal", + description = "Configures whether or not the Marim portal is displayed" + ) + default boolean showMarim() + { + return true; + } + + @ConfigItem( + keyName = "showAltar", + name = "Show Altar", + description = "Configures whether or not the altar is displayed" + ) + default boolean showAltar() + { + return true; + } + + @ConfigItem( + keyName = "showGlory", + name = "Show Glory mount", + description = "Configures whether or not the mounted glory is displayed" + ) + default boolean showGlory() + { + return true; + } + + @ConfigItem( + keyName = "showPools", + name = "Show Pools", + description = "Configures whether or not the pools are displayed" + ) + default boolean showPools() + { + return true; + } + + @ConfigItem( + keyName = "showRepairStand", + name = "Show Repair stand", + description = "Configures whether or not the repair stand is displayed" + ) + default boolean showRepairStand() + { + return true; + } + + @ConfigItem( + keyName = "showExitPortal", + name = "Show Exit portal", + description = "Configures whether or not the exit portal is displayed" + ) + default boolean showExitPortal() + { + return true; + } + + @ConfigItem( + keyName = "showBurner", + name = "Show Unlit/Lit burner", + description = "Configures whether or not unlit/lit burners are displayed" + ) + default boolean showBurner() + { + return true; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java new file mode 100644 index 0000000000..0ef8d59c3e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2018, Seth + * 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.poh; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import javax.imageio.ImageIO; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import static net.runelite.api.ObjectID.*; + +@Slf4j +public enum PohIcons +{ + EXITPORTAL("exitportal", PORTAL_4525), + VARROCK("varrock", VARROCK_PORTAL, VARROCK_PORTAL_13622, VARROCK_PORTAL_13629), + FALADOR("falador", FALADOR_PORTAL, FALADOR_PORTAL_13624, FALADOR_PORTAL_13631), + LUMBRIDGE("lumbridge", LUMBRIDGE_PORTAL, LUMBRIDGE_PORTAL_13623, LUMBRIDGE_PORTAL_13630), + ARDOUGNE("ardougne", ARDOUGNE_PORTAL, ARDOUGNE_PORTAL_13626, ARDOUGNE_PORTAL_13633), + YANILLE("yanille", YANILLE_PORTAL, YANILLE_PORTAL_13627, YANILLE_PORTAL_13634), + CAMELOT("camelot", CAMELOT_PORTAL, CAMELOT_PORTAL_13625, CAMELOT_PORTAL_13632), + LUNARISLE("lunarisle", LUNAR_ISLE_PORTAL, LUNAR_ISLE_PORTAL_29347, LUNAR_ISLE_PORTAL_29355), + WATERBIRTH("waterbirth", WATERBIRTH_ISLAND_PORTAL, WATERBIRTH_ISLAND_PORTAL_29350, WATERBIRTH_ISLAND_PORTAL_29358), + FISHINGGUILD("fishingguild", FISHING_GUILD_PORTAL, FISHING_GUILD_PORTAL_29351, FISHING_GUILD_PORTAL_29359), + SENNTISTEN("senntisten", SENNTISTEN_PORTAL, SENNTISTEN_PORTAL_29348, SENNTISTEN_PORTAL_29356), + KHARYLL("kharyll", KHARYRLL_PORTAL, KHARYRLL_PORTAL_29346, KHARYRLL_PORTAL_29354), + ANNAKARL("annakarl", ANNAKARL_PORTAL, ANNAKARL_PORTAL_29349, ANNAKARL_PORTAL_29357), + KOUREND("kourend", KOUREND_PORTAL, KOUREND_PORTAL_29353, KOUREND_PORTAL_29361), + MARIM("marim", MARIM_PORTAL, MARIM_PORTAL_29352, MARIM_PORTAL_29360), + ALTAR("altar", + ALTAR_13179, ALTAR_13180, ALTAR_13181, ALTAR_13182, ALTAR_13183, ALTAR_13184, ALTAR_13185, ALTAR_13186, + ALTAR_13187, ALTAR_13188, ALTAR_13189, ALTAR_13190, ALTAR_13191, ALTAR_13192, ALTAR_13193, ALTAR_13194, + ALTAR_13194, ALTAR_13196, ALTAR_13197, ALTAR_13198, ALTAR_13199 + ), + POOLS("pool", POOL_OF_RESTORATION, POOL_OF_REVITALISATION, POOL_OF_REJUVENATION, FANCY_REJUVENATION_POOL, ORNATE_REJUVENATION_POOL), + GLORY("glory", AMULET_OF_GLORY), + REPAIR("repair", ARMOUR_REPAIR_STAND); + + private static final Map minimapIcons = new HashMap<>(); + + @Getter + private final String imageResource; + @Getter + private final int[] Ids; + + private BufferedImage image; + + static + { + PohIcons[] icons = values(); + + for (PohIcons icon : icons) + { + for (Integer spotId : icon.getIds()) + { + minimapIcons.put(spotId, icon); + } + } + } + + PohIcons(String imageResource, int... ids) + { + this.imageResource = imageResource; + this.Ids = ids; + } + + public static PohIcons getIcon(int id) + { + return minimapIcons.get(id); + } + + public BufferedImage getImage() + { + if (image != null) + { + return image; + } + + InputStream in = PohIcons.class.getResourceAsStream(getImageResource() + ".png"); + try + { + image = ImageIO.read(in); + } + catch (IOException ex) + { + log.warn("unable to load image", ex); + } + + return image; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java new file mode 100644 index 0000000000..728b5dc6a4 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohOverlay.java @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2018, Seth + * 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.poh; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.util.ArrayList; +import java.util.List; +import javax.inject.Inject; +import lombok.Getter; +import net.runelite.api.Client; +import net.runelite.api.GameObject; +import net.runelite.api.Perspective; +import net.runelite.api.Point; +import static net.runelite.client.plugins.poh.PohIcons.ALTAR; +import static net.runelite.client.plugins.poh.PohIcons.ANNAKARL; +import static net.runelite.client.plugins.poh.PohIcons.ARDOUGNE; +import static net.runelite.client.plugins.poh.PohIcons.CAMELOT; +import static net.runelite.client.plugins.poh.PohIcons.EXITPORTAL; +import static net.runelite.client.plugins.poh.PohIcons.FALADOR; +import static net.runelite.client.plugins.poh.PohIcons.FISHINGGUILD; +import static net.runelite.client.plugins.poh.PohIcons.GLORY; +import static net.runelite.client.plugins.poh.PohIcons.KHARYLL; +import static net.runelite.client.plugins.poh.PohIcons.KOUREND; +import static net.runelite.client.plugins.poh.PohIcons.LUMBRIDGE; +import static net.runelite.client.plugins.poh.PohIcons.LUNARISLE; +import static net.runelite.client.plugins.poh.PohIcons.MARIM; +import static net.runelite.client.plugins.poh.PohIcons.POOLS; +import static net.runelite.client.plugins.poh.PohIcons.REPAIR; +import static net.runelite.client.plugins.poh.PohIcons.SENNTISTEN; +import static net.runelite.client.plugins.poh.PohIcons.VARROCK; +import static net.runelite.client.plugins.poh.PohIcons.WATERBIRTH; +import static net.runelite.client.plugins.poh.PohIcons.YANILLE; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; + +public class PohOverlay extends Overlay +{ + private static final int MAX_DISTANCE = 2350; + + @Getter + private final List iconList = new ArrayList<>(); + + private final Client client; + private final PohConfig config; + private final PohPlugin plugin; + + @Inject + public PohOverlay(Client client, PohConfig config, PohPlugin plugin) + { + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_WIDGETS); + this.client = client; + this.config = config; + this.plugin = plugin; + } + + @Override + public Dimension render(Graphics2D graphics, java.awt.Point parent) + { + if (!config.enabled()) + { + return null; + } + + Point localLocation = client.getLocalPlayer().getLocalLocation(); + + for (GameObject object : plugin.getPohObjects()) + { + Point location = object.getLocalLocation(); + if (localLocation.distanceTo(location) <= MAX_DISTANCE) + { + PohIcons icon = PohIcons.getIcon(object.getId()); + + if (icon != null && iconList.contains(icon)) + { + net.runelite.api.Point minimapLoc = Perspective.getMiniMapImageLocation(client, object.getLocalLocation(), icon.getImage()); + + if (minimapLoc != null) + { + graphics.drawImage(icon.getImage(), minimapLoc.getX(), minimapLoc.getY(), null); + } + } + } + } + + return null; + } + + public void updateConfig() + { + iconList.clear(); + if (config.showLumbridge()) + { + iconList.add(LUMBRIDGE); + } + if (config.showFalador()) + { + iconList.add(FALADOR); + } + if (config.showVarrock()) + { + iconList.add(VARROCK); + } + if (config.showCamelot()) + { + iconList.add(CAMELOT); + } + if (config.showArdougne()) + { + iconList.add(ARDOUGNE); + } + if (config.showYanille()) + { + iconList.add(YANILLE); + } + if (config.showLunarIsle()) + { + iconList.add(LUNARISLE); + } + if (config.showWaterBirth()) + { + iconList.add(WATERBIRTH); + } + if (config.showFishingGuild()) + { + iconList.add(FISHINGGUILD); + } + if (config.showSenntisten()) + { + iconList.add(SENNTISTEN); + } + if (config.showKharyll()) + { + iconList.add(KHARYLL); + } + if (config.showAnnakarl()) + { + iconList.add(ANNAKARL); + } + if (config.showKourend()) + { + iconList.add(KOUREND); + } + if (config.showMarim()) + { + iconList.add(MARIM); + } + if (config.showAltar()) + { + iconList.add(ALTAR); + } + if (config.showGlory()) + { + iconList.add(GLORY); + } + if (config.showRepairStand()) + { + iconList.add(REPAIR); + } + if (config.showPools()) + { + iconList.add(POOLS); + } + if (config.showExitPortal()) + { + iconList.add(EXITPORTAL); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java new file mode 100644 index 0000000000..890c26e7c3 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohPlugin.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2018, Seth + * 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.poh; + +import com.google.common.collect.Sets; +import com.google.common.eventbus.Subscribe; +import com.google.inject.Binder; +import com.google.inject.Provides; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import javax.inject.Inject; +import lombok.AccessLevel; +import lombok.Getter; +import net.runelite.api.GameObject; +import net.runelite.api.GameState; +import static net.runelite.api.ObjectID.INCENSE_BURNER; +import static net.runelite.api.ObjectID.INCENSE_BURNER_13209; +import static net.runelite.api.ObjectID.INCENSE_BURNER_13210; +import static net.runelite.api.ObjectID.INCENSE_BURNER_13211; +import static net.runelite.api.ObjectID.INCENSE_BURNER_13212; +import static net.runelite.api.ObjectID.INCENSE_BURNER_13213; +import net.runelite.api.events.ConfigChanged; +import net.runelite.api.events.GameObjectDespawned; +import net.runelite.api.events.GameObjectSpawned; +import net.runelite.api.events.GameStateChanged; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.ui.overlay.Overlay; + +@PluginDescriptor( + name = "Poh plugin" +) +public class PohPlugin extends Plugin +{ + static final Set BURNER_UNLIT = Sets.newHashSet(INCENSE_BURNER, INCENSE_BURNER_13210, INCENSE_BURNER_13212); + static final Set BURNER_LIT = Sets.newHashSet(INCENSE_BURNER_13209, INCENSE_BURNER_13211, INCENSE_BURNER_13213); + + @Getter(AccessLevel.PACKAGE) + private final Set pohObjects = new HashSet<>(); + + @Inject + private PohOverlay overlay; + + @Inject + private BurnerOverlay burnerOverlay; + + @Override + public void configure(Binder binder) + { + binder.bind(PohOverlay.class); + } + + @Provides + PohConfig getConfig(ConfigManager configManager) + { + return configManager.getConfig(PohConfig.class); + } + + @Override + public Collection getOverlays() + { + return Arrays.asList(overlay, burnerOverlay); + } + + @Override + protected void startUp() throws Exception + { + overlay.updateConfig(); + } + + @Subscribe + public void updateConfig(ConfigChanged event) + { + overlay.updateConfig(); + } + + @Subscribe + public void onGameObjectSpawned(GameObjectSpawned event) + { + GameObject gameObject = event.getGameObject(); + if (BURNER_LIT.contains(gameObject.getId()) || BURNER_UNLIT.contains(gameObject.getId()) || PohIcons.getIcon(gameObject.getId()) != null) + { + pohObjects.add(gameObject); + } + } + + @Subscribe + public void onGameObjectDespawned(GameObjectDespawned event) + { + GameObject gameObject = event.getGameObject(); + pohObjects.remove(gameObject); + } + + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + if (event.getGameState() == GameState.LOADING) + { + pohObjects.clear(); + } + } +} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/poh/altar.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/altar.png new file mode 100644 index 0000000000000000000000000000000000000000..fa583ed3e7af238d4caea52a3832b1f067f43b80 GIT binary patch literal 180 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 PqHJ@+>gdPMZrSxO-x#1$ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/poh/camelot.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/camelot.png new file mode 100644 index 0000000000000000000000000000000000000000..9b54f1747bd05011008f689c9ffd6c9a72b78409 GIT binary patch literal 15243 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 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/poh/kharyll.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/kharyll.png new file mode 100644 index 0000000000000000000000000000000000000000..516dee88487e622f0a9240d27c86eaec88303418 GIT binary patch literal 15213 zcmeI3U5pb|6o3a&0$sreTrfnm6p0{CXQu76ow4l#Ti7kwW!WFuB{4Fcx!oPN?Tnq- zZFkWK_<%-KVpdSp4F-+bM2(5W#GeFtSbyNfXhMVsR3s37jQC;#Jm8(_-|XG)%_d-c zxs$Y=bI(2J-22^gPUmG_YHw?q?^@!bC~AJ9HQoV#@3B5}=fLmBPQI}b{>;-`dku%UCd^3hFFYxY`-GBw}u&y z+n!<$L_KS*fbO1TySrJ-12^vt(lQ$ixkG}N<3pi9=ux+i<#>kmGk%u#`NaS$27K=F z<%zlAT_mrh#g6!fayTeOJ^iMsiwsjJ6ubq$SIhS?oFE7c>tlRA8qT1N;hZTI>722= zZYpY+?HP{r45=eWCwqs$IcWQvl`a9)cXP9yRqmBr)tsUgj8zc^HL0C<%^QeICWyg&4AU$}`-Co*6**4yaWoqg zS=QmCG!yZW)D$&6T*rq$Eb^?=hhrw{1J;isnbM5BIOjV2D6*K=@>$7@sadHHFnX>p z!qf&GGpku8HftFz50?dE{s>cV*kNU7nwZELrj(OGA|8VSUR6~@PGUoB5Cmyohzrm_ z3Iyn|6iU-vfKR758SuQ%XG2UTo#s2F%uBM;60ewmVxVcxLiwMUheM4y8+Z16cJJ^;8P5 z+R~~W%d)ZSSd?U|x5Z?uJb)5mCXLpXRkbXesZ)=0W(Z3D9p=-=DD;CIuDnXF>{-)0 zF|@Q4P9m&gm{F2lJzRvDGFFRRn%`qpV`k8vAM&yA zVmRx&Z0b~_roDJmry4b_S$5}CGX{H*y-;M>VP*Y;mfCwKeAolAAkX{x2!jrz7VT;g zWP0K%?8AoDPq>N=s;Fz&JDs6JQ8p|cmE*C@uEEkMeCUJEn@shAb4qzuyV&i#sqN@? zdPRJZAP5k=NO0l#AX4T@FKy5=YwboE(8c(B)IT=5G}!l0Ktm{ z7oHEICAbhEc#+`3^Fg!(7Xkz?5?pvbh?d|&fZ#=f3(p795?lxnyhw22`5;d3!^R6%AL&Dnk zlr1h{-^H`TXU&xE$dgt0$6Z{V&6 z*wm{F+x>p@M}x|Ir96B3qL=*>d7l(-Qe1`Mc>Yz)iZQ+{*Kj4H~)Eg*}&&5 z&y9cc%F&)mN_rj?|qwlV4 s={i1f^`VyTBYQu5`R`vp{&E3zV&d&hWBqqth8U>C`nLEd>$dOy7m8t%YXATM literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/poh/kourend.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/kourend.png new file mode 100644 index 0000000000000000000000000000000000000000..f261e59ebe9cc6da6ea6a8d9ffb6601db953549a GIT binary patch literal 15239 zcmeI3Yitx%6vr=$drvI@U``|)>O{Zuj8DyM^!@OUZ?~bJJJaD_4S>7q zjL$5vb=x8Ud>56j9=#{}xFD%Xn<%R>Xv-zjXf^=;6}hx1t%JHH2K$v%!20*6pII%6 z9I&o-MY(9Y84f7nkqlfl(%vPFtdo4Qbw#k&pA%4kB-BMqE}2MaLM~v<#}&}IG0a*m z`6>FkfVI&`Xz7V|Sen%gw76_;M&jHai^pfo3!S0XVmf36tOL597Faf$&DydKo0{ood7sb6a(32kXV45r8&2tBj!9`t z3qeY8LQs=3N?KRcl*NcE#?(PQV6_^F%180OlIe1ylvZSiD6%;*&GI&mt>z?4WuNq5 zCXv51Sz=)VCSgj~kRM;wFFl~@sy3ibld>#Nn;5N0G+NGG^?H-Zs;M=-We6cCBCYDF zbq%K>+X*#wFeAa1A#^KCtKGe>#4C$4DUzW~d+ji%Oyg!K1-E=D6jsQO?p0{cKv7pS zU8EnK$P{c!q9-y6+V{kSX^wF(GD_x+iJa)Qi;P`#a*X71 zqUfT}$%t-`%*VYBuh$(frKl2SN~*A;p=upARWYjN{LZ!tJ~Mf=BqWsl4wV)&8Z`PZ zU@bLZc}pwrScXr&j|EXO_O_s8v<-dgw#Xn{4@kb4q)bcd^@f zQn{ns85N5~lVCu|CdEbOgQ*l3283)d5Ug3l(^xkF`y`cH>$piK1>vWI_Bn^rzqvp8`7h3(rX-VBfL z+JEL;%iiyfEPEt&hkc22B;D72W$wk(_W3mrKJ{(W#v7kEbPv9McF5Yddu-9@_=Q-* zS4Z2n{%UPGR3ES3@WMMgkDdD7xp4F46U#SU`lkDbz}#zdUi%;mz~u#P$A3CE1f$*W z^KSm`n~U7mPmV2Fzkb)^EqlO*Ya0*Le0@E7YP@c9bK{=}2e%#m`Ret9k^N`)HLO{) zqV;M$2)|f&a^KF~Z_J+9^yPhjUDky7u?{_oKW5!YFHV(G0{Cb4;*4&8Ev}c Sde(SVHqz1_`mm|*xqkr{R;3;Q literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/poh/lumbridge.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/lumbridge.png new file mode 100644 index 0000000000000000000000000000000000000000..111fe1a802866289b5f0feef3d857c876dcda78b GIT binary patch literal 15231 zcmeI3Yitx%6vqb@#FB58CQ&IX`|L|HxreP!hI!@r9`S;U1 zNx-xMT}!7V(AW=eWkIF8H)>1@hYiP*rD%;}KiYjXveMx{pUCQfSjs`-a0fKNp`e>G;d4D_03LGc!9L;(J zmbC=Q&qQKGG+BuaREXi?1-IK8!!i?%0qaK=4RK0QtaB}KWJ!o=sf1_*m4w&>n55bh zV9JA*nWbGNG-z=x1uqK(odKrOu*EC4(}b|98=@+Ka3}}|9Eu_fF&FUo+%69-yPZxt z23%2EWc`qy>~*<-ljk{~I|nfmvARzP9nz$5C9P?gen9MKxM3LpAw9f_HH0N@+VP`BA+F>)R8maoz^uPo zd$9mZEv?kCOrKmG3!-H9wxDE|2ap5IxY6=ul{^b>%EaZI8iIU$i~Hm`GQB{>l~+Dg zZr0>MbS-9N#1yFOfjeX>m7k9~-VF^OV9fu5xbhz?gf8}9+cHe8s;+Gr#&xLwZyCzF zSn3tk9v}yq;s!1bOl{@z>p8x%iq$%?5(DO+lK`t2?kF)=JzRj9Fjmf-pWk6tV?3Rk z@8wx|Fr4{aaJ9;)YbV~-Dx zC|MBi2q~}+>t;XUiaw}N(Xn$fM~hH!%rBMYu`E}E`BC`L2cI{Y(gWv&@+@_+>v>YX zqw5(JiA9niK=3BPh3A8)1Q!AXZxUR1K8Q+iAwcjZ!G-68s00@R1aA^tcs__qa3MhO zCc%a0gQx@-0t9aoTzEc+N^l`S@Fu~9=YyyO7Xk!t5?pvbh)QrFK=3BPh3A8)1Q!AX zZxUR1K8Q+iAwcjZ!G-68s00@R1aA^tcs__qa3MhOCc%a0gQx@-0t9aoTzEc+N^l`S z@Fu~9=YyyO7Xk!t5?pvbh)QrFK=3BPh3A8)1Q!AXZxUR1K8Q+iAwcjZ!G-68s00@R z1aD$-Rh3`i1S))QGXr1Hyxe{|3}5cFNlmR0iW{+O?TmHQ4ja*0&zm{D=C)#WnlVbHR*Ev)%*L_d7=u8pHt>s-HnbfivY?hM>S z-FISDOV>$H{rvfji$3TZy%hiL*qPXlpFW9S7~ZpE?({1cKYMquni~3kox1azu8rm^ Ovf;+&&`5pvQ~v^L(xdhO literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/poh/lunarisle.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/lunarisle.png new file mode 100644 index 0000000000000000000000000000000000000000..1845b6a17ffabb7138d41791ab5fb6d382962b60 GIT binary patch literal 15612 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 U@7)|c@d~E*A1QtC__33J1I{8|SO5S3 literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/poh/repair.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/repair.png new file mode 100644 index 0000000000000000000000000000000000000000..58d75529c4079d3ef59326dd11013b6e696c36f3 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^{2B>Ar-flPQJ){K!L;MZOWP> zZas%G%(fVs6@>?77hUAPH+RuCw&NE!pDGmJRUMSrq?ogbQK&h$qG{DF*C$cOd$vgU z%wSw-!1l6q)69))KYupb&~jWasm}A5RLJwOec}3#HwLR%7Vw%-weA?#!?= zWw#9~V0cg@lm?Af!-Lg;h++&eAtc%aD=$77LySga3^kDu4LtY}6}_{c)7$M$6EMEq zNp^S6{oixW%$528 zu14omM@_u3f}+H$TB6tPjc<_@Bjb}*BME%@j0tB`RCrU~l$9Z1dy-&4(<9zr&VSdC!a~{mXwcp3vnfQ?hG?t zPhpBZ6!A7Y2|c~>PEU)G1)iWUL@R7a@Cc%h3kpI&*y!O|F37Nc#?R8cUkb2NfcKOR zZ?qnsg|li(>WXbHrGr+)J80Xc#4x#B&X@E1jO+lziK57`Jj3%eoIzV7x-I8v-C9!& zQjQY?mXg&>TQhWz6IV_e!*;~$brMyM(tTyjN+R7Vv4a$uylgU@k7a5(sY=Di9L}Z- zm!>KVNP`T}Z43HwHT}#%!#1ozW1f^1dEUfuP2%xN?wZ$|$<$13*{ypZf)di2o>pSS z1WXsOjNz;TTKB+PSySuoZ7o$@oLP|^W!`HCd2JpyM=81$N};$yVR)}nOBTqskxdvz zI$Er<&N4zzOG}}uJnMF7x@zRChrtiwTyMI8Nd@nhi-T z>k3kwiNuH-s+Jn55hDIOralm6 zs)MeXm8z0jjI@!3mj$B!FjH&T~hSyw=NED8sFnx;x@P)Pxh6lsxFc$$*~ z0-cn3k#6GDCP5XGtjr4qi1E1FeNO0@p$t3S0z(%!7S&K-`08Z=nQIb4qDr%YWQyiE z&_pK{QK02uQf^{JRR{{naw1o-If=GqHMsA|Y1bU*UR0P&WC6#q$snEL`2ekgK#CTH zWPld^LWmQSJPWs*a*7&Z=A>%VELg20t}2GLT-e#V!S30kWg)Ev#BK9*#~+1sLu(;h$#GqXmkmsRmBxoLBkb72UI@m=oo=g18L9oJsPP=#6Z z2eFKlos+Ymc>q?(LOQ<~b+#KCKFm1(1!?U+SO`nrb92kEu&%nfWtg=?{eR0)tzuv!i?|8#3(ja{fV!+j}>B*aOi}Fz6448FU!+=+yEc z-5b;3K5RMr30L+(g_@3i^EtYNl4EhHT#sdi9xRT+hd%hc$y6RV=d@>K7rT`w)jPVC zQIS|A2?7Lf5?pvbh)QrFK=3BPh3A8)1Q!AXZxUR1K8Q+iAwcjZ!G-68s00@R1aA^t zcs__qa3MhOCc%a0gQx@-0t9aoTzEc+N^l`S@Fu~9=YyyO7Xk!t5?pvbh)QrFK=3BP zh3A8)1Q!AXZxUR1K8Q+iAwcjZ!G-68s00@R1aA^tcs__qa3MhOCc%a0gQx@-0t9ao zTzEc+N^l`S@Fu~9=YyyO7Xk!t5?pvbh)QrFK=3BPh3A8)1Q!AXZxUR1K8Q+iAwcjZ z7FT`s6;7bT_cn9z14!)0^SkzuIHXiTu~cx|?@>$}U;;&i?6!^~WCQkavzf6+OxEH`CYi%9)w|F#GoTdww6fd~(V-v5jK;J95<2 zyU!-R|LmdA2aPXHHU4<+vao#oxrs^dVs@GtyO&UAsN>v< n0{n?W?*-Rb(b*9zK|hCq0`>ot<1Eg?d;61 z2?_>-kw8M$#3-UsqA`m=A|gTzim!+-zG#eoFfma0mg2FLuRW0oZO} z={Zvd%Ln1DEU0()w%S))oH3CcWx{I*1$6>9M=7}#w?b)!qVQhD786LeZuaVWCSKZQ zofU+1OG|NA(Tmoonxf~ed!j7rQd{p@G?0*N5QqCQ%y2v-M0z<+A*AFcX%Q zGy~E;9~T6Hv=rux5R*x_`?$~vUCuex0z;P?i=xXgeC@J$P6`5FP+~a0%rQIU^11M2;%xLYhs-9&xb^LNp4nZlt%YEV;`2nEe%BvKrIBVh{mfmOQ zB@;CD!yPi2$}dG7>xPDpvd(`&M*R;K!jcBBZW$(5RadtRV>;CTw+yviEDuOpKTzUq zWdm0RCbx2>^&DGSm1-SdiBadzNrY7lca&7D9@wVFjny)j=BJ!$%;bvmLjngsEbsi5 zUEMP3x)$&1mQmN5=W0#0<3c$bGVJnl{y|Iay$3$*fp{$r9zN0(4`EG?Dmv8-5wrBV3M2cI|D>I3Jv@~n2TYk5+;qiY!ziA9ni zK=3BPh3A8)1Q!AXZxUR1K8Q+iAwcjZ!G-68s00@R1aA^tcs__qa3MhOCc%a0gQx@- z0t9aoTzEc+N^l`S@Fu~9=YyyO7Xk!t5?pvbh)QrFK=3BPh3A8)1Q!AXZxUR1K8Q+i zAwcjZ!G-68s00@R1aA^tcs__qa3MhOCc%a0gQx@-0t9aoTzEc+N^l`S@Fu~9=YyyO z7Xk!t5?pvbh)QrFK=3BPh3A8)1Q!AXZxUR1K8Q+iAwcjZ!G-68s00@R1aD$-HP&9? z1R8vAGY?W9QaP4IaIH z+EjkCy}30%H+BE(*9CL4Zk~E_x^n8wk;Coas}tIZm+z)m9GDTG z75;MWCtaWaw6tsG(Vee&GwQw_i~CJb FY%-HT2pN-DBwC`4B47=)pu@}nqe&(t0|d^o z+FISd(jsbieQCv0x7K$pW!uu)ty`;$ifip^*R3yItFCXTt5UHDdnbW#3BlX$>BpOM zl6koI|9|eC-+k_7zRb(%)1Mp^F*1T6h(XpgO9r?Ok-rc12fq`Jt(Xcf1KnxaUV?Zy zQvUWKR;`I9h~#lXmR+*jo}yXNsb)AapI7^wZlERz<3yjEVdwLbBA+i5TqfnU`p=aL zfio#*>ui+Goyr#pX%!wmvtoJ{TQQ$CaLS412&0b%37ovdD11(b%S-!AN`GD&#BwvK zRQM&*e3LRo9#CPor7KcJ53kUvlT<8~q*v$-YK=~>Pt^ZTp`|oBl1d;GD3vyWPNe8W zt)k`;lN)eWsxMgX_71}D^r&xs6|g9sWBJ~B&8*_S`|>JyyY&5 z@u^(iv4JF=c`Uq_^$2cB5M2s6FOx5pNG7FH9w_+fxG$$WIFQTR!46O)eT ziDQEvcZtX0pBl%Kyn}c0F3Aggny@~1ktm7YBC(etgWbIj4A#VE3yvLjzD{S@p}o@N zQh=ZXX;`N>tK7|#8N634@v!{lQgAC{!`;0k6m%_4w@h+RuXE>pLN7MCCt&lJLSTiA z;9lue56?)VCrcC^=0KIDcOq1zruwT&F@Cn-;>0pnxdd20cA)Io5%?TS<8iP!32Lngi?~j**z3l?B#9c{r9X z5Is&tG7C1m(F3N%n-h#=xMs-ZuQb}~@=A=0<*gPoXiy6R zN9$NBL7$MssC3|0#px3{m4V|p70*&UpQxo6onGsQXtTlg9;q!NTO#k4j?~;QObyw4 zq@Ljsz)8nAAdNixUphpXG(Cn&6TF~4%b~gj)$2dYGWp`}t(_eX!G9*X8IPBjcbrMt zx#fa~Sn!OJJ^r0bGpu}?nOS*5@SKtC*4j0#ptHj!{J#qr$Pd|jAET^@cinG81ycD{ zy(jUC1yUK~;Zq7hP5hj_9?06=7Mk8j%BR0W=)Mqv*6!=mS+PCW(elWCr`tKhcn8$R(e= zfny;PJS6buB%LlnXCyK*kss5)mxGxL_K{ z7~?`Bf&~~COamEXTu4N)0ONvbAY+URi3k>8Trdq}jBz0m!2*m6rh$wxE+isYfN{Yz zkTJ%EL<9>kE|>-~#<-A(U;)Mj(?G@;7ZMRHz_?%<$Qa{7B7y}N7fb^gV_Zl?umIzN zX&_^a3yBC8U|cW_WQ=hk5y1kC3#NgL?~5y<>(xKr1>W~7126W~nJXUyF9j;tvKrMUz_|A8Q)#AS2#P9ccC8?2U;EZ+%7b#B@}21I|guzkqw z=zE6^^bGf;7)y=Q@#Kucmzg=smrdB2GPK|EZFP08+7G>1G$yJfbMR~977t%-jo-Va zX8DKNId$dHEWO`3SV%t+u_e(t@4Vsd!YK8`jjvuff3E!PAJ3gDCl-$&cJzOVNd4fE zmW7Ru-I}o(nny|xPg4($8n(l@P&H&(#tqY`AO74tzc#PEs;%bxoHNSk4-Y2q9Fd+! zJu~Zq`af^|)V?Y8>k{jzW$N3Nm+$=X@vXT-hpmg-{rn)G^T4Tp5N|-Y%>O|Jbc-6_)rZqDrWS2L*|M`a3OeMQ=2R1Z3yJ_;pi+v{zk7gsQZyfyn z$+ZXm+i#lv9ursnMc;$RkDon#eRTGhAS=-Dx4b}CZePqhJ+thkgG1C;wY<|J8 z$@S^_SDHTBeWj}5lMO>Ej~^Jbf8~QyOTU}y`S?$fN%h0_K5=MI*7iN3>qzsc`dc}! zrdus_{NEA}t%^HUd%orA$3{;1a@En_o?Wu_u1FkvUe^>EwR4~R%Bywqbj!9$b6@x$ Dj>Y>N literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/poh/yanille.png b/runelite-client/src/main/resources/net/runelite/client/plugins/poh/yanille.png new file mode 100644 index 0000000000000000000000000000000000000000..30b9b27632ad16304243a78726239e7e83847ccb GIT binary patch literal 18114 zcmeI3c|4TcAIBe8H~Ugql61!sk}<}bX^ds8*%=`%#u#I=3^OBJiDYXbDQl!fc8MZe z*+L0X%C54dE^d}6;Wub`>UMwg`~6|6JQ>=>R9>C=L zl!FzhGD)tI-x|Km^Hw`?KU2_2rYdU8E+f_;K0wnyO8W+&smBzQk|1dXq^$!SnsAPT zfH@R!kUBo{6bMS0PYhrJ>@SG&Go{41NcXr~u_Te$OET2!Kn zxer0#-e12g=IA)MG~AlwsR;nDsDW)uvaq5pLA%!nxi4MaKC#Z_AV-?_+-c`R9?d&I z+E};EwC4&N-7DuxySj#lhC27uY1?BT*&JIU)Eug^S#7+nN~;_i_|{9qEuz!5*F*pEmvcGms{PF=M$DSwOYC&m~EX_BkLxt zXmg3Ktjlb5Tn)xNb$mMs?7bW1FkGpBw_!QNcv^2k|S>n)#k8-sPL*i_c}XhX2u zv#?YaZq1qwE zA>kp>DSP%5M@_Hm^H#5=Egv1;BQ(rAtTenHpP-;+eJ#ndFY^j!gL3pf?Yt|+mNzZJ zGdC%DC#f}u2pAfr=Uu({bc>6i%N+6M8*15xzKh#T4&N^syEML!B(P}V@?O9xob#{vRJ1b!;Le}og@N7aR38Qg6&~7nu zy&(yM`X$q7DdWWt7m6jQ9~>4 zQM4(toW9_!!7`ZOHGhd}$~G#U5kDPxs-JIi$Lk%!HUl4wmAkl7CHLw zDpm5wGg59;>XzFr1aoUO?2+0prB8@%`8{RSs>`Y`gFQpQL>)1kFPH6_E_|h2$LGFB z#zaEuy@Nri#-xmXzsk{1TaUpOF^le>GG_HTZPyoZO04hUY}t%_pzK9LiohCr-dms# z)M}#Bu@|xNuTI94wjr-|=$+N$IYX@9KPWNiUhiIiO>(`YsHBm}Ta$?-OOw(YJ8tYY z-fi5_{J8mQ^YcXIWOeuph0)~EWC>;$xrnOf`n2^$aKW%NTU-?a`7m+Wa0Y0#>$~R)LE|sul(C*Q<964YsNEsZceC7 z5GTTWFF#hgyd%|4k@BRr5&hC)xJ`rO@QDreIoC~aCM%jOXHvC@G$wVTjA$}*^Ixx>hA z)iR|rje0p}yT={2DYk}gMqAb7Wb#!!-0ls09-j_>o${JvFhDQ?)_B0v?@CL}OlXEc zmfS{JM4YB^gz2see`)c`WD1i}q z^8+g-{Y_kh4^}@qQGJKW^&N*b`*7&7cfBvh5184)>;~>&KZT_Tqxd6F<@5Cj#`7QV zlurKC4+9repDn2Ov+0kQPF}H|% zc(2Er$=amDxdXpoxKK2wksp~oHXpa(ejv}(-D|voxt)2DMV!0%Md`B+k#=>AW%To% z@ASDF{Gctryf(mNHgptnTzc8%e%Cm9Q|Lb0*S>zEU! zKjRdkJpi!lFcD)*wKXwD;7IOrSSOMrUe4FulXfEt07wmAPb|(APlY(*2}BQdvB~oL zVi2N}x|of!iM)v?8t+0h@F(M~{7o@9e^;EElb8mI9qEgpC2+@6u@GN(HxCNJS6ys1 zFM<}Y6vMI{6;+6;njBnNRaHq<7NQ^zSBA+e z!W8A93W^9Nd4!SzxN>e~7ejZe;FVuq~zLw-`9vwUdM<#kwi6jrmN?xoZ$(yP!CbrVhx6hYx zxqE(V$b<5Q9gQN)7wZXw%gMujWpcuO^LTob-B!EigoEMT@a}jIDuw2Q|I+9A_2&PZ z{f8#MRsUndv^g;``L+3Lf8E`G*))Z!dxVDI3(_B&{pzG({5;chj1p5-LX^@(H%>`!#q6* zNZ9v6kn-EALZC@*Br>gAwBaLRzbgKvi}svqzV?`kqFCx{LkxA%DsVLw6{vz79GnKE z1Lav=u?RyC3Ki>t!yD?LXa#aaq7y<9?}$@WamGQN@GA09MQ0^P=q?onMW~~KqJk10 z?x^OZNbBX_?0-wGL&ABl?7A&Mcs6>h}Uv&|Drrr=k0uDaOQt^4gT{C3u@cvepU1Qxe)Dxz>J z8w>A*g#A$Zy<6X$Uu?wxbpqG&gY5s@hK~#0HIg0>cD{lc!!0d4pEt?YZtYkJ$2 zId$`1)ho!aeqivG%NH-W{%5Zp9WS{4XYY5bwFi;9a$c-<^`~NxYvl}IJ7BD6w;OmA zZE!yq{j4@8`r_Seb%?axOIcZyaOE$apDTW8wEHI`sN#!pZK6Oo1*`M8R!Y0&pxy1j zzTNKpIK|(#!T&k;$1*SnaX5gZW2rOXW0@I)yGjP#G1QsxGfoaf<8Mx>o0t*

(fdvd)U>bB|1}?gYzyby?Fb%pf0~cLHU;zUcmR95m>URq*hWo2VyV`pdQ;Nalowg?LgZ{508L_}oUwrzj>@ds^~ zqN1W=Vq)Ur;t~=P+qZ9*l$4Z`l9HB|-mzncjEv0AojYY^WuZ{0oSYmC2BW=10f)mC z6ciK{6_u2fl$DiLR8&+|Rd?;$MSIH-fk5ouy&H){s;jG`P$&%z4NXl=EiEl=ZEZ9f zt)ru(tE;Q0r>C#4Z(v|xXlS@+&mJQqBV%J@6B83tQ&TfDGjnru3kwTNOG_&&D+~r> zZEd}G?_L`l8(UjjJ3G65`}Wz}+wb4M|GQ{e#ful?;^N}t;}a4R z5)%`Xl9G~>lP_Jml#-H?nwom~^5wL&v@2JxT)ler+O=!fuU}73Prq^FMn*_^=3knKu-MUp+SXfk4bo=)0J9q9B7Z;b5l-#|0x3sjh ztgNiOyu6~KqO!8`-o1PG@87Sgs;aK8uBoZ1t*x!At9$U^L4AFFLqkJjW8=ez4<9{x z)YR1U`0?ZB=H`}`me$tRCr_TVwY9akw?BRQ^x3m#9UUFdpFe-`;zeg?XIEEOcXxMB zPfu@eZ(my>FJr7nc3Od4*@zbYI3kwUM zKYw0aTwGdOT3-FMVU7>c_6-x&($osj9O-nXeK}~TqlNM9Hg44tsFi0$SI3O^E>|_@ zloce$@k6S^gEX