From 2161ae1dc4660f8cb83f19713ba98f422941b014 Mon Sep 17 00:00:00 2001 From: Tyler Hardy Date: Thu, 19 Oct 2017 01:37:31 -0500 Subject: [PATCH 1/4] Import SpritePixels and draw method --- .../java/net/runelite/api/SpritePixels.java | 32 +++++++++++++++++++ .../net/runelite/rs/api/RSSpritePixels.java | 8 ++++- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 runelite-api/src/main/java/net/runelite/api/SpritePixels.java diff --git a/runelite-api/src/main/java/net/runelite/api/SpritePixels.java b/runelite-api/src/main/java/net/runelite/api/SpritePixels.java new file mode 100644 index 00000000000..ce822a0e6fc --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/SpritePixels.java @@ -0,0 +1,32 @@ +/* + * 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.api; + +public interface SpritePixels +{ + int DEFAULT_SHADOW_COLOR = 3153952; + + void drawAt(int x, int y); +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java index 46de44150eb..fc3db40be85 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java @@ -24,6 +24,12 @@ */ package net.runelite.rs.api; -public interface RSSpritePixels +import net.runelite.api.SpritePixels; +import net.runelite.mapping.Import; + +public interface RSSpritePixels extends SpritePixels { + @Import("drawAt") + @Override + void drawAt(int x, int y); } From f5df7af6189875975a177d6ac9afa5f0d9d399cd Mon Sep 17 00:00:00 2001 From: Tyler Hardy Date: Thu, 19 Oct 2017 01:37:38 -0500 Subject: [PATCH 2/4] Import createItemSprite to make SpritePixels from itemId --- runelite-api/src/main/java/net/runelite/api/Client.java | 2 ++ runescape-api/src/main/java/net/runelite/rs/api/RSClient.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 348c296fef3..d49b1d70fe9 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -82,6 +82,8 @@ public interface Client ItemComposition getItemDefinition(int id); + SpritePixels createItemSprite(int itemId, int quantity, int border, int shadowColor, int stackable, boolean noted); + int getBaseX(); int getBaseY(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index ba739f0c912..dc69eafa18b 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -230,6 +230,10 @@ public interface RSClient extends RSGameEngine, Client @Override RSItemComposition getItemDefinition(int itemId); + @Import("createSprite") + @Override + RSSpritePixels createItemSprite(int itemId, int quantity, int thickness, int borderColor, int stackable, boolean noted); + @Import("componentTable") @Override RSHashTable getComponentTable(); From 97f7bd0c48c36e66fbe202e1864fa602cb310596 Mon Sep 17 00:00:00 2001 From: Tyler Hardy Date: Thu, 19 Oct 2017 12:03:18 -0500 Subject: [PATCH 3/4] Add sprite drawing on actors --- .../src/main/java/net/runelite/api/Actor.java | 2 ++ .../java/net/runelite/api/Perspective.java | 28 +++++++++++++++++ .../java/net/runelite/api/SpritePixels.java | 4 +++ .../client/ui/overlay/OverlayUtil.java | 30 +++++++++++++++++++ .../net/runelite/mixins/RSActorMixin.java | 8 +++++ .../net/runelite/rs/api/RSSpritePixels.java | 8 +++++ 6 files changed, 80 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/Actor.java b/runelite-api/src/main/java/net/runelite/api/Actor.java index 1d6ba09f476..84dd389df7a 100644 --- a/runelite-api/src/main/java/net/runelite/api/Actor.java +++ b/runelite-api/src/main/java/net/runelite/api/Actor.java @@ -56,5 +56,7 @@ public interface Actor extends Renderable Point getCanvasImageLocation(Graphics2D graphics, BufferedImage image, int zOffset); + Point getCanvasSpriteLocation(Graphics2D graphics, SpritePixels sprite, int zOffset); + Point getMinimapLocation(); } diff --git a/runelite-api/src/main/java/net/runelite/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java index cf5f5de8f9b..47aa5f07b59 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -307,4 +307,32 @@ public static Point getCanvasImageLocation(Client client, Graphics2D graphics, P return new Point(xOffset, yOffset); } + /** + * Calculates sprite position and centers depending on sprite size. + * + * @param client + * @param graphics + * @param localLocation local location of the tile + * @param sprite SpritePixel for size measurement + * @param zOffset offset from ground plane + * @return a {@link Point} on screen corresponding to the given + * localLocation. + */ + public static Point getCanvasSpriteLocation(Client client, Graphics2D graphics, Point localLocation, SpritePixels sprite, int zOffset) + { + int plane = client.getPlane(); + + Point p = Perspective.worldToCanvas(client, localLocation.getX(), localLocation.getY(), plane, zOffset); + + if (p == null) + { + return null; + } + + int xOffset = p.getX() - sprite.getWidth() / 2; + int yOffset = p.getY() - sprite.getHeight() / 2; + + return new Point(xOffset, yOffset); + } + } diff --git a/runelite-api/src/main/java/net/runelite/api/SpritePixels.java b/runelite-api/src/main/java/net/runelite/api/SpritePixels.java index ce822a0e6fc..df4c31396a2 100644 --- a/runelite-api/src/main/java/net/runelite/api/SpritePixels.java +++ b/runelite-api/src/main/java/net/runelite/api/SpritePixels.java @@ -29,4 +29,8 @@ public interface SpritePixels int DEFAULT_SHADOW_COLOR = 3153952; void drawAt(int x, int y); + + int getWidth(); + + int getHeight(); } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java index f9ca92fa6e9..95c3d06c5e5 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java @@ -32,6 +32,7 @@ import net.runelite.api.Actor; import net.runelite.api.Point; +import net.runelite.api.SpritePixels; import net.runelite.api.TileObject; @@ -78,6 +79,14 @@ public static void renderImageLocation(Graphics2D graphics, Point imgLoc, Buffer graphics.drawImage(image, x, y, null); } + public static void renderSpriteLocation(Graphics2D graphics, Point imgLoc, SpritePixels sprite) + { + int x = imgLoc.getX(); + int y = imgLoc.getY(); + + sprite.drawAt(x, y); + } + public static void renderActorOverlay(Graphics2D graphics, Actor actor, String text, Color color) { Polygon poly = actor.getCanvasTilePoly(); @@ -120,6 +129,27 @@ public static void renderActorOverlayImage(Graphics2D graphics, Actor actor, Buf } } + public static void renderActorOverlaySprite(Graphics2D graphics, Actor actor, SpritePixels sprite, Color color) + { + Polygon poly = actor.getCanvasTilePoly(); + if (poly != null) + { + renderPolygon(graphics, poly, color); + } + + Point minimapLocation = actor.getMinimapLocation(); + if (minimapLocation != null) + { + renderMinimapLocation(graphics, minimapLocation, color); + } + + Point imageLocation = actor.getCanvasSpriteLocation(graphics, sprite, actor.getModelHeight()); + if (imageLocation != null) + { + renderSpriteLocation(graphics, imageLocation, sprite); + } + } + public static void renderTileOverlay(Graphics2D graphics, TileObject tileObject, String text, Color color) { Polygon poly = tileObject.getCanvasTilePoly(); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java index 60ce77b5a89..364bd14941c 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java @@ -32,6 +32,7 @@ import net.runelite.api.Perspective; import net.runelite.api.Player; import net.runelite.api.Point; +import net.runelite.api.SpritePixels; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; @@ -143,6 +144,13 @@ public Point getCanvasImageLocation(Graphics2D graphics, BufferedImage image, in return Perspective.getCanvasImageLocation(client, graphics, getLocalLocation(), image, zOffset); } + @Inject + @Override + public Point getCanvasSpriteLocation(Graphics2D graphics, SpritePixels sprite, int zOffset) + { + return Perspective.getCanvasSpriteLocation(client, graphics, getLocalLocation(), sprite, zOffset); + } + @Inject @Override public Point getMinimapLocation() diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java b/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java index fc3db40be85..f59d6a34f49 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSSpritePixels.java @@ -32,4 +32,12 @@ public interface RSSpritePixels extends SpritePixels @Import("drawAt") @Override void drawAt(int x, int y); + + @Import("height") + @Override + int getHeight(); + + @Import("width") + @Override + int getWidth(); } From 3afa41bd363dfb5d4f40e552e3afe77431bfd04a Mon Sep 17 00:00:00 2001 From: Tyler Hardy Date: Thu, 19 Oct 2017 12:19:45 -0500 Subject: [PATCH 4/4] Update FishingSpot to use sprites --- .../client/plugins/fishing/FishingSpot.java | 28 +++++++------- .../plugins/fishing/FishingSpotOverlay.java | 36 +++--------------- .../client/plugins/fishing/anglerfish.png | Bin 1272 -> 0 bytes .../runelite/client/plugins/fishing/barb.png | Bin 568 -> 0 bytes .../client/plugins/fishing/lobster.png | Bin 729 -> 0 bytes .../client/plugins/fishing/minnow.png | Bin 3528 -> 0 bytes .../client/plugins/fishing/monkfish.png | Bin 1118 -> 0 bytes .../client/plugins/fishing/salmon.png | Bin 685 -> 0 bytes .../runelite/client/plugins/fishing/shark.png | Bin 1288 -> 0 bytes .../client/plugins/fishing/shrimp.png | Bin 4083 -> 0 bytes 10 files changed, 21 insertions(+), 43 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/fishing/anglerfish.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/fishing/barb.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/fishing/lobster.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/fishing/minnow.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/fishing/monkfish.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/fishing/salmon.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/fishing/shark.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/fishing/shrimp.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java index 048df1847b2..6b9823c6181 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java @@ -24,6 +24,8 @@ */ package net.runelite.client.plugins.fishing; +import net.runelite.api.ItemID; + import java.util.HashMap; import java.util.Map; import static net.runelite.api.NpcID.FISHING_SPOT_1506; @@ -58,32 +60,32 @@ public enum FishingSpot { - SHRIMP("Shrimp, Anchovies", "shrimp", + SHRIMP("Shrimp, Anchovies", ItemID.RAW_SHRIMPS, FISHING_SPOT_1518, FISHING_SPOT_1525, FISHING_SPOT_1528, FISHING_SPOT_1530, FISHING_SPOT_1544, FISHING_SPOT_7155, FISHING_SPOT_7469 ), - LOBSTER("Lobster, Swordfish, Tuna", "lobster", + LOBSTER("Lobster, Swordfish, Tuna", ItemID.RAW_LOBSTER, FISHING_SPOT_1510, FISHING_SPOT_1519, FISHING_SPOT_1521, FISHING_SPOT_1522, FISHING_SPOT_7199, FISHING_SPOT_7470 ), - SHARK("Shark, Bass", "shark", + SHARK("Shark, Bass", ItemID.RAW_SHARK, FISHING_SPOT_1511, FISHING_SPOT_1520, FISHING_SPOT_7200 ), - MONKFISH("Monkfish", "monkfish", + MONKFISH("Monkfish", ItemID.RAW_MONKFISH, FISHING_SPOT_4316 ), - SALMON("Salmon, Trout", "salmon", + SALMON("Salmon, Trout", ItemID.RAW_SALMON, FISHING_SPOT_1506, FISHING_SPOT_1508, FISHING_SPOT_1515, FISHING_SPOT_1526, FISHING_SPOT_1527 ), - BARB_FISH("Sturgeon, Salmon, Trout", "barb", + BARB_FISH("Sturgeon, Salmon, Trout", ItemID.LEAPING_STURGEON, FISHING_SPOT_1542 ), - ANGLERFISH("Anglerfish", "anglerfish", + ANGLERFISH("Anglerfish", ItemID.RAW_ANGLERFISH, FISHING_SPOT_6825 ), - MINNOW("Minnow", "minnow", + MINNOW("Minnow", ItemID.MINNOW, FISHING_SPOT_7730, FISHING_SPOT_7731, FISHING_SPOT_7732, FISHING_SPOT_7733, FISHING_SPOT_7734 ); @@ -91,7 +93,7 @@ public enum FishingSpot private static final Map fishingSpots = new HashMap<>(); private final String name; - private final String image; + private final int itemSpriteId; private final int[] spots; static @@ -107,10 +109,10 @@ public enum FishingSpot } } - FishingSpot(String spot, String image, int... spots) + FishingSpot(String spot, int itemSpriteId, int... spots) { this.name = spot; - this.image = image; + this.itemSpriteId = itemSpriteId; this.spots = spots; } @@ -119,9 +121,9 @@ public String getName() return name; } - public String getImage() + public int getItemSpriteId() { - return image; + return itemSpriteId; } public int[] getIds() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java index 26f5c724df2..8f2cc6503ca 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java @@ -28,15 +28,12 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.List; -import javax.imageio.ImageIO; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.NPC; +import net.runelite.api.SpritePixels; import net.runelite.api.queries.NPCQuery; import net.runelite.client.RuneLite; import net.runelite.client.ui.overlay.Overlay; @@ -49,8 +46,6 @@ class FishingSpotOverlay extends Overlay { private static final Logger logger = LoggerFactory.getLogger(FishingSpotOverlay.class); - private final BufferedImage[] imgCache = new BufferedImage[FishingSpot.values().length]; - private final List ids = new ArrayList<>(); private final RuneLite runelite = RuneLite.getRunelite(); @@ -86,10 +81,10 @@ public Dimension render(Graphics2D graphics) Color color = npc.getId() == FishingSpot.FLYING_FISH ? Color.RED : Color.CYAN; if (config.showIcons()) { - BufferedImage fishImage = getFishImage(spot); - if (fishImage != null) + SpritePixels fishSprite = getFishSprite(spot); + if (fishSprite != null) { - OverlayUtil.renderActorOverlayImage(graphics, npc, fishImage, color.darker()); + OverlayUtil.renderActorOverlaySprite(graphics, npc, fishSprite, color.darker()); } } else @@ -102,28 +97,9 @@ public Dimension render(Graphics2D graphics) return null; } - private BufferedImage getFishImage(FishingSpot spot) + private SpritePixels getFishSprite(FishingSpot spot) { - int fishIdx = spot.ordinal(); - BufferedImage fishImage = null; - - if (imgCache[fishIdx] != null) - { - return imgCache[fishIdx]; - } - - try - { - InputStream in = FishingSpotOverlay.class.getResourceAsStream(spot.getImage() + ".png"); - fishImage = ImageIO.read(in); - imgCache[fishIdx] = fishImage; - } - catch (IOException e) - { - logger.warn("Error Loading fish icon", e); - } - - return fishImage; + return client.createItemSprite(spot.getItemSpriteId(), 5, 1, SpritePixels.DEFAULT_SHADOW_COLOR, 0, false); } public void updateConfig() diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/fishing/anglerfish.png b/runelite-client/src/main/resources/net/runelite/client/plugins/fishing/anglerfish.png deleted file mode 100644 index dfa4666ebf819c49c28014f2ea8574581cfceefc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 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 LNkvXXu0mjfiiAs1 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/fishing/minnow.png b/runelite-client/src/main/resources/net/runelite/client/plugins/fishing/minnow.png deleted file mode 100644 index 7829433de1a2a9c5b389e9d60624d80bc288bc52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3528 zcmbVOduY{F9RK`&yZ7#Tx2yA&BQT0A97L8wAxmX3-DYkM(aKHD&B26B8%lqqe?=nM zBuo}+EA8PzH+-S_AkA&mpqL0QDkD>pEpwFabzi@Ge|W!bt##5bFoCh5JAj7Kg%HCJ`Qb9g!{`Q^y zYNtR(y;-0Fy)U}(%wJAqlVmfc0tMrvgDZ0e2n0{5eHp0@o@11K7uvtKEvpNma4*84UfjAJKwWLExZ&UUgCmgBzoRK8A_Vx>QQ`25- z-MUjnR!Pu#(b{^(Zf-uQ@`8EN*tl1%nTz@(e1FwM2S?`>=OLy!`pbfvw7fM5@q`-+ zDTm~~bkrczQqhLrk*V9X0|)A{ZQDnVX-XqOqCXS|<|YTz?|z5Lkdpx!agcZ<229!N zY29~>x+}uN+8wNky9k(xG>0T(zB!LHvjDNN*X_15&58@phd7u7n(*k_2^j59ny2Mz z=W@UB+8k_}HYGJmWYEyC8@kGfNQbhx$BnZv${&OkkHIuOh+9!S|3bMs7c@iV0DH;8 zm9N%}sOj*O)tZ0S+Jj0-?}=A|#xH70&3`=Qa%~OvkbGhwgeL z(h=dBHRkoIZh?fPaeq%Ae!JL#tCxRQ^_DylL`DQi?I*|AO+bc^(K$z6YN+Upk;;Aq zSa5YI=1-eqJ4`f^dtUfqw-cR=Kn8-NW2z?_hKb%DFG2;2arlqvL-WMV#J$$$(tnMO zpJM6K$~)SNV;Lg%U>O(&uajgg@$5nBiFEF~OS+5Dk%yxUmEag$P9u|!d_pDa%CiuO zNwlIC!WQuE@ji!OB*h$M9Lzxr?G=J`jeqfZo#b@_3Aw*kuU_v^lvb6)7sJoU^=Zmk z2=gWL^+iBFq?Z~rq%SRk;W6P8*ZMP)LQK=d$*jqMB>@-9I6rseigS6o71_0`7U}8f z^7)h!T8R6-K;?A@8t$C@lrmg&bevVaj_;V56-l~Qo=|adGt?YceK0Ck$E~<}kGZWU z4-U5=9cFiklUT$5r-X^br%yGZv#Sdg6>lgC&72!;8P^)_wqA#q=S9nxh#_&N(oDjm6Vjp(H7^}T}|GUYD!2>$g5p) zkrmZll6QaAa!7BRuG=71c_T&;3->mIS`r T(e~#|;up;;$v^bss(1baq(mOV diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/fishing/monkfish.png b/runelite-client/src/main/resources/net/runelite/client/plugins/fishing/monkfish.png deleted file mode 100644 index 0b0f0faf284424e508623733e109711b1932ec13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 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