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 b90548aa72..f06b87ada5 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 @@ -232,6 +232,14 @@ public class DevToolsPanel extends PluginPanel }); container.add(oculusOrbBtn); + final JButton interactingBtn = new JButton("Interacting"); + interactingBtn.addActionListener(e -> + { + highlightButton(interactingBtn); + plugin.toggleInteracting(); + }); + container.add(interactingBtn); + 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 4b50dd7181..8675e88a7c 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 @@ -104,6 +104,7 @@ public class DevToolsPlugin extends Plugin private boolean toggleCamera; private boolean toggleWorldMapLocation; private boolean toggleTileLocation; + private boolean toggleInteracting; Widget currentWidget; int itemIndex = -1; @@ -358,6 +359,11 @@ public class DevToolsPlugin extends Plugin toggleTileLocation = !toggleTileLocation; } + void toggleInteracting() + { + toggleInteracting = !toggleInteracting; + } + boolean isTogglePlayers() { return togglePlayers; @@ -447,4 +453,9 @@ public class DevToolsPlugin extends Plugin { return toggleTileLocation; } + + boolean isToggleInteracting() + { + return toggleInteracting; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java index c1363a9e8e..1d70a4521b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/SceneOverlay.java @@ -29,8 +29,10 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; +import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.util.List; +import java.util.stream.Stream; import javax.inject.Inject; import net.runelite.api.Actor; import net.runelite.api.Client; @@ -53,6 +55,7 @@ public class SceneOverlay extends Overlay private static final Color LOCAL_VALID_MOVEMENT_COLOR = new Color(141, 220, 26); private static final Color VALID_MOVEMENT_COLOR = new Color(73, 122, 18); private static final Color LINE_OF_SIGHT_COLOR = new Color(204, 42, 219); + private static final Color INTERACTING_COLOR = Color.CYAN; private static final int LOCAL_TILE_SIZE = Perspective.LOCAL_TILE_SIZE; private static final int CHUNK_SIZE = 8; @@ -60,6 +63,14 @@ public class SceneOverlay extends Overlay private static final int CULL_CHUNK_BORDERS_RANGE = 16; private static final int STROKE_WIDTH = 4; private static final int CULL_LINE_OF_SIGHT_RANGE = 10; + private static final int INTERACTING_SHIFT = -16; + + private static final Polygon ARROW_HEAD = new Polygon( + new int[]{0, -3, 3}, + new int[]{0, -5, -5}, + 3 + ); + private final Client client; private final DevToolsPlugin plugin; @@ -96,6 +107,11 @@ public class SceneOverlay extends Overlay renderValidMovement(graphics); } + if (plugin.isToggleInteracting()) + { + renderInteracting(graphics); + } + return null; } @@ -346,4 +362,49 @@ public class SceneOverlay extends Overlay } } + private void renderInteracting(Graphics2D graphics) + { + Stream.concat( + client.getPlayers().stream(), + client.getNpcs().stream() + ).forEach(fa -> + { + Actor ta = fa.getInteracting(); + if (ta == null) + { + return; + } + + LocalPoint fl = fa.getLocalLocation(); + Point fs = Perspective.worldToCanvas(client, fl.getX(), fl.getY(), client.getPlane(), fa.getLogicalHeight() / 2); + if (fs == null) + { + return; + } + int fsx = fs.getX(); + int fsy = fs.getY() - INTERACTING_SHIFT; + + LocalPoint tl = ta.getLocalLocation(); + Point ts = Perspective.worldToCanvas(client, tl.getX(), tl.getY(), client.getPlane(), ta.getLogicalHeight() / 2); + if (ts == null) + { + return; + } + int tsx = ts.getX(); + int tsy = ts.getY() - INTERACTING_SHIFT; + + graphics.setColor(INTERACTING_COLOR); + graphics.drawLine(fsx, fsy, tsx, tsy); + + AffineTransform t = new AffineTransform(); + t.translate(tsx, tsy); + t.rotate(tsx - fsx, tsy - fsy); + t.rotate(Math.PI / -2); + AffineTransform ot = graphics.getTransform(); + graphics.setTransform(t); + graphics.fill(ARROW_HEAD); + graphics.setTransform(ot); + + }); + } }