diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 28dd3ba7b8..e7687066b2 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -34,6 +34,16 @@ public enum Varbits POUCH_LARGE(605, 486, 9, 17), POUCH_GIANT(606, 486, 18, 29), + /** + * Runepouch + */ + RUNE_POUCH_RUNE1(29, 1139, 0, 5), + RUNE_POUCH_RUNE2(1622, 1139, 6, 11), + RUNE_POUCH_RUNE3(1623, 1139, 12, 17), + RUNE_POUCH_AMOUNT1(1624, 1139, 18, 31), + RUNE_POUCH_AMOUNT2(1625, 1140, 0, 13), + RUNE_POUCH_AMOUNT3(1626, 1140, 14, 27), + /** * Prayers */ 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 1f9c2a7b76..4b7e2b672a 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 @@ -56,6 +56,7 @@ import net.runelite.client.plugins.pestcontrol.PestControl; import net.runelite.client.plugins.chatcommands.ChatCommands; import net.runelite.client.plugins.rememberusername.RememberUsername; import net.runelite.client.plugins.runecraft.Runecraft; +import net.runelite.client.plugins.runepouch.Runepouch; import net.runelite.client.plugins.timers.Timers; import net.runelite.client.plugins.woodcutting.WoodcuttingPlugin; import net.runelite.client.plugins.xpglobes.XpGlobes; @@ -109,6 +110,7 @@ public class PluginManager plugins.add(new ChatCommands()); plugins.add(new ClueScrollPlugin()); plugins.add(new Timers()); + plugins.add(new Runepouch()); if (RuneLite.getOptions().has("developer-mode")) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RuneImageCache.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RuneImageCache.java new file mode 100644 index 0000000000..d36a66af4f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RuneImageCache.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2017, Tyler + * 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.runepouch; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import java.awt.image.BufferedImage; +import java.io.InputStream; +import java.util.concurrent.ExecutionException; +import javax.imageio.ImageIO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RuneImageCache +{ + private static final Logger logger = LoggerFactory.getLogger(RuneImageCache.class); + + // ids from the varbit + private static final String[] RUNE_NAMES = + { + "None", + "Air", //1 + "Water", //2 + "Earth", //3 + "Fire", //4 + "Mind", //5 + "Chaos", //6 + "Death", //7 + "Blood", //8 + "Cosmic", //9 + "Nature", //10 + "Law", //11 + "Body", //12 + "Soul", //13 + "Astral", //14 + "Mist", //15 + "Mud", //16 + "Dust", //17 + "Lava", //18 + "Steam", //19 + "Smoke" //20 + }; + + private final LoadingCache cache; + + public RuneImageCache() + { + cache = CacheBuilder.newBuilder() + .maximumSize(RUNE_NAMES.length) + .build( + new CacheLoader() + { + @Override + public BufferedImage load(Integer runeId) throws Exception + + { + InputStream in = RunepouchOverlay.class.getResourceAsStream(RUNE_NAMES[runeId] + ".png"); + return ImageIO.read(in); + } + } + ); + } + + public BufferedImage getImage(int runeId) + { + try + { + return cache.get(runeId); + } + catch (ExecutionException e) + { + logger.warn("unable to load rune image", e); + return null; + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/Runepouch.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/Runepouch.java new file mode 100644 index 0000000000..cf16213a53 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/Runepouch.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017, Tyler + * 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.runepouch; + +import net.runelite.client.plugins.Plugin; +import net.runelite.client.ui.overlay.Overlay; + +public class Runepouch extends Plugin +{ + private final RunepouchOverlay overlay = new RunepouchOverlay(this); + + @Override + public Overlay getOverlay() + { + return overlay; + } + + @Override + protected void startUp() throws Exception + { + } + + @Override + protected void shutDown() throws Exception + { + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java new file mode 100644 index 0000000000..b813c8bf6b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runepouch/RunepouchOverlay.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2017, Tyler + * 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.runepouch; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.font.TextAttribute; +import java.awt.image.BufferedImage; +import java.util.Map; +import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.ItemID; +import net.runelite.api.Point; +import net.runelite.api.Varbits; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.widgets.WidgetItem; +import net.runelite.client.RuneLite; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RunepouchOverlay extends Overlay +{ + private static final Logger logger = LoggerFactory.getLogger(RunepouchOverlay.class); + + private static final Varbits[] AMOUNT_VARBITS = + { + Varbits.RUNE_POUCH_AMOUNT1, Varbits.RUNE_POUCH_AMOUNT2, Varbits.RUNE_POUCH_AMOUNT3 + }; + private static final Varbits[] RUNE_VARBITS = + { + Varbits.RUNE_POUCH_RUNE1, Varbits.RUNE_POUCH_RUNE2, Varbits.RUNE_POUCH_RUNE3 + }; + + private final Client client = RuneLite.getClient(); + private final RuneImageCache runeImageCache = new RuneImageCache(); + + public RunepouchOverlay(Runepouch plugin) + { + super(OverlayPosition.DYNAMIC); + } + + @Override + public Dimension render(Graphics2D graphics) + { + if (client.getGameState() != GameState.LOGGED_IN + || client.getWidget(WidgetInfo.LOGIN_CLICK_TO_PLAY_SCREEN) != null) + { + return null; + } + + Widget inventoryWidget = client.getWidget(WidgetInfo.INVENTORY); + + if (inventoryWidget == null || inventoryWidget.isHidden()) + { + return null; + } + + Font font = graphics.getFont(); + if (font.getSize() != 10) + { + Map attributes = font.getAttributes(); + attributes.put(TextAttribute.SIZE, 10); + font = Font.getFont(attributes); + graphics.setFont(font); + } + + for (WidgetItem item : inventoryWidget.getWidgetItems()) + { + if (item.getId() != ItemID.RUNE_POUCH) + { + continue; + } + + Point location = item.getCanvasLocation(); + if (location == null) + { + continue; + } + + assert AMOUNT_VARBITS.length == RUNE_VARBITS.length; + + for (int i = 0; i < AMOUNT_VARBITS.length; i++) + { + Varbits amountVarbit = AMOUNT_VARBITS[i]; + Varbits runeVarbit = RUNE_VARBITS[i]; + + int amount = client.getSetting(amountVarbit); + if (amount <= 0) + { + continue; + } + + int runeId = client.getSetting(runeVarbit); + + BufferedImage runeImg = runeImageCache.getImage(runeId); + if (runeImg != null) + { + OverlayUtil.renderImageLocation(graphics, + new Point(location.getX(), location.getY() + 2 + (graphics.getFontMetrics().getHeight() - 2) * i), + runeImg); + } + + graphics.setColor(Color.black); + graphics.drawString("" + formatNumber(amount), location.getX() + 13, + location.getY() + (graphics.getFontMetrics().getHeight() - 2) * i + 11); + + graphics.setColor(Color.white); + graphics.drawString("" + formatNumber(amount), location.getX() + 12, + location.getY() + (graphics.getFontMetrics().getHeight() - 2) * i + 10); + } + } + return null; + } + + private static String formatNumber(int var0) + { + return var0 < 10000 ? String.valueOf(var0) : var0 / 1000 + "K"; + } +} diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Air.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Air.png new file mode 100644 index 0000000000..09946238e7 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Air.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Astral.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Astral.png new file mode 100644 index 0000000000..b2e2945b30 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Astral.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Blood.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Blood.png new file mode 100644 index 0000000000..f799f0e361 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Blood.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Body.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Body.png new file mode 100644 index 0000000000..5fd943315c Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Body.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Chaos.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Chaos.png new file mode 100644 index 0000000000..77ddd67828 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Chaos.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Cosmic.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Cosmic.png new file mode 100644 index 0000000000..d7d76d438b Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Cosmic.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Death.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Death.png new file mode 100644 index 0000000000..2469b703c1 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Death.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Dust.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Dust.png new file mode 100644 index 0000000000..043f0576d5 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Dust.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Earth.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Earth.png new file mode 100644 index 0000000000..88ad8cdb8a Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Earth.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Fire.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Fire.png new file mode 100644 index 0000000000..7bb6b0b32c Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Fire.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Lava.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Lava.png new file mode 100644 index 0000000000..ed70f66071 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Lava.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Law.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Law.png new file mode 100644 index 0000000000..ab2c2934b7 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Law.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mind.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mind.png new file mode 100644 index 0000000000..e8a8bfe384 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mind.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mist.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mist.png new file mode 100644 index 0000000000..1405197040 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mist.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mud.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mud.png new file mode 100644 index 0000000000..9b48a71327 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Mud.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Nature.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Nature.png new file mode 100644 index 0000000000..b82b06089a Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Nature.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Smoke.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Smoke.png new file mode 100644 index 0000000000..f1e9a09d06 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Smoke.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Soul.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Soul.png new file mode 100644 index 0000000000..8bc5e3811c Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Soul.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Steam.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Steam.png new file mode 100644 index 0000000000..cdc9118441 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Steam.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Water.png b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Water.png new file mode 100644 index 0000000000..e10a4b3533 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/runepouch/Water.png differ