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 224412bd53..8c1dde452b 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -234,6 +234,8 @@ public interface Client extends GameEngine List getProjectiles(); + List getGraphicsObjects(); + /** * Play a sound effect at the player's current location. This is how UI, * and player-generated (e.g. mining, woodcutting) sound effects are diff --git a/runelite-api/src/main/java/net/runelite/api/GraphicsObject.java b/runelite-api/src/main/java/net/runelite/api/GraphicsObject.java new file mode 100644 index 0000000000..4d26807811 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/GraphicsObject.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018, Woox + * 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; + +import net.runelite.api.coords.LocalPoint; + +public interface GraphicsObject extends Renderable +{ + int getId(); + + LocalPoint getLocation(); + + int getStartCycle(); + + int getLevel(); + + int getHeight(); +} diff --git a/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java b/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java new file mode 100644 index 0000000000..db5c4b4b5e --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/GraphicsObjectCreated.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, Woox + * 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.events; + +import lombok.Value; +import net.runelite.api.GraphicsObject; + +@Value +public class GraphicsObjectCreated +{ + private final GraphicsObject graphicsObject; +} diff --git a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index cef91c0cd6..9ca13d7315 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -39,6 +39,7 @@ import java.awt.image.BufferedImage; import net.runelite.api.Actor; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; +import net.runelite.api.GraphicsObject; import net.runelite.api.Hitsplat; import net.runelite.api.ItemComposition; import net.runelite.api.KeyFocusListener; @@ -56,6 +57,7 @@ import net.runelite.api.events.ActorDeath; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.FocusChanged; import net.runelite.api.events.GameTick; +import net.runelite.api.events.GraphicsObjectCreated; import net.runelite.api.events.HitsplatApplied; import net.runelite.api.events.MenuOpened; import net.runelite.api.events.MenuOptionClicked; @@ -488,4 +490,10 @@ public class Hooks event.setHitsplat(hitsplat); eventBus.post(event); } + + public static void onGraphicsObjectCreated(GraphicsObject go, int var1, int var2, int var3, int var4, int var5, int var6, int var7) + { + GraphicsObjectCreated event = new GraphicsObjectCreated(go); + eventBus.post(event); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java index e21485d937..1a0b697a68 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java @@ -39,6 +39,7 @@ import net.runelite.api.Actor; import net.runelite.api.Client; import net.runelite.api.DecorativeObject; import net.runelite.api.GameObject; +import net.runelite.api.GraphicsObject; import net.runelite.api.GroundObject; import net.runelite.api.Item; import net.runelite.api.ItemLayer; @@ -47,6 +48,7 @@ import net.runelite.api.NPCComposition; import net.runelite.api.Node; import net.runelite.api.Perspective; import net.runelite.api.Player; +import net.runelite.api.Point; import net.runelite.api.Projectile; import net.runelite.api.Region; import net.runelite.api.Tile; @@ -124,6 +126,11 @@ public class DevToolsOverlay extends Overlay renderProjectiles(graphics); } + if (plugin.isToggleGraphicsObjects()) + { + renderGraphicsObjects(graphics); + } + renderWidgets(graphics); return null; @@ -385,6 +392,30 @@ public class DevToolsOverlay extends Overlay } } + private void renderGraphicsObjects(Graphics2D graphics) + { + List graphicsObjects = client.getGraphicsObjects(); + + for (GraphicsObject graphicsObject : graphicsObjects) + { + LocalPoint lp = graphicsObject.getLocation(); + Polygon poly = Perspective.getCanvasTilePoly(client, lp); + + if (poly != null) + { + OverlayUtil.renderPolygon(graphics, poly, Color.MAGENTA); + } + + String infoString = "(ID: " + graphicsObject.getId() + ")"; + Point textLocation = Perspective.getCanvasTextLocation( + client, graphics, lp, infoString, 0); + if (textLocation != null) + { + OverlayUtil.renderTextLocation(graphics, textLocation, infoString, Color.WHITE); + } + } + } + public void renderWidgets(Graphics2D graphics) { Widget widget = plugin.currentWidget; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java index 3fefd6d3b5..e5f7c12705 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java @@ -196,6 +196,14 @@ public class DevToolsPanel extends PluginPanel }); container.add(lineOfSightBtn); + final JButton graphicsObjectsBtn = new JButton("Graphics objects"); + graphicsObjectsBtn.addActionListener(e -> + { + highlightButton(graphicsObjectsBtn); + plugin.toggleGraphicsObjects(); + }); + container.add(graphicsObjectsBtn); + return container; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java index 4e9ac7e6c4..cebeccac04 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java @@ -94,6 +94,7 @@ public class DevToolsPlugin extends Plugin private boolean toggleMapSquares; private boolean toggleValidMovement; private boolean toggleLineOfSight; + private boolean toggleGraphicsObjects; Widget currentWidget; int itemIndex = -1; @@ -301,6 +302,11 @@ public class DevToolsPlugin extends Plugin toggleLineOfSight = !toggleLineOfSight; } + void toggleGraphicsObjects() + { + toggleGraphicsObjects = !toggleGraphicsObjects; + } + boolean isTogglePlayers() { return togglePlayers; @@ -370,4 +376,9 @@ public class DevToolsPlugin extends Plugin { return toggleLineOfSight; } + + boolean isToggleGraphicsObjects() + { + return toggleGraphicsObjects; + } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/GraphicsObjectMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/GraphicsObjectMixin.java new file mode 100644 index 0000000000..0819c6301e --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/GraphicsObjectMixin.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018, Woox + * 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.mixins; + +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSGraphicsObject; + +@Mixin(RSGraphicsObject.class) +public abstract class GraphicsObjectMixin implements RSGraphicsObject +{ + @Override + @Inject + public LocalPoint getLocation() + { + return new LocalPoint(this.getX(), this.getY()); + } +} diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 9f224efc95..b2bf89a1e6 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -32,6 +32,7 @@ import net.runelite.api.ChatMessageType; import net.runelite.api.ClanMember; import net.runelite.api.GameState; import net.runelite.api.GrandExchangeOffer; +import net.runelite.api.GraphicsObject; import net.runelite.api.HintArrowType; import net.runelite.api.IndexedSprite; import net.runelite.api.InventoryID; @@ -480,6 +481,22 @@ public abstract class RSClientMixin implements RSClient return projectiles; } + @Inject + @Override + public List getGraphicsObjects() + { + List graphicsObjects = new ArrayList(); + RSDeque graphicsObjectDeque = this.getGraphicsObjectDeque(); + Node head = graphicsObjectDeque.getHead(); + + for (Node node = head.getNext(); node != head; node = node.getNext()) + { + graphicsObjects.add((GraphicsObject)node); + } + + return graphicsObjects; + } + @Inject @Override public void setModIcons(IndexedSprite[] modIcons) 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 e442995b9f..a9254053bf 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 @@ -195,6 +195,9 @@ public interface RSClient extends RSGameEngine, Client @Import("projectiles") RSDeque getProjectilesDeque(); + @Import("graphicsObjectDeque") + RSDeque getGraphicsObjectDeque(); + @Import("username") @Override String getUsername(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java b/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java new file mode 100644 index 0000000000..2edde942f1 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSGraphicsObject.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018, Woox + * 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.rs.api; + +import net.runelite.api.GraphicsObject; +import net.runelite.mapping.Import; + +public interface RSGraphicsObject extends GraphicsObject, RSRenderable +{ + @Import("id") + @Override + int getId(); + + @Import("x") + int getX(); + + @Import("y") + int getY(); + + @Import("startCycle") + @Override + int getStartCycle(); + + @Import("level") + @Override + int getLevel(); + + @Import("height") + @Override + int getHeight(); +}