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 ac4510b29d..014c00f2a9 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -176,6 +176,15 @@ public class Client return client.getBaseY(); } + public Widget[][] getWidgets() + { + return Arrays.stream(client.getWidgets()) + .map(parent -> parent != null ? Arrays.stream(parent) + .map(child -> child != null ? new Widget(this, child) : null) + .toArray(Widget[]::new) : null + ).toArray(Widget[][]::new); + } + public Widget getWidget(int groupId, int childId) { net.runelite.rs.api.Widget[][] widgets = client.getWidgets(); @@ -204,6 +213,11 @@ public class Client return client.getWidgetPositionsY(); } + public boolean[] getValidInterfaces() + { + return client.getValidInterfaces(); + } + public String[] getPlayerOptions() { return client.getPlayerOptions(); diff --git a/runelite-api/src/main/java/net/runelite/api/Region.java b/runelite-api/src/main/java/net/runelite/api/Region.java index ffb3cd8306..e5d71a75ae 100644 --- a/runelite-api/src/main/java/net/runelite/api/Region.java +++ b/runelite-api/src/main/java/net/runelite/api/Region.java @@ -43,9 +43,8 @@ public class Region .map(tile1 -> Arrays.stream(tile1) .map(tile2 -> Arrays.stream(tile2) .map(tile3 -> new Tile(client, tile3)) - .toArray(i -> new Tile[i]) - ) - .toArray(i -> new Tile[i][]) - ).toArray(i -> new Tile[i][][]); + .toArray(Tile[]::new) + ).toArray(Tile[][]::new) + ).toArray(Tile[][][]::new); } } diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java index ee345822a9..929c804da4 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/Widget.java @@ -45,6 +45,16 @@ public class Widget this.widget = widget; } + public int getId() + { + return widget.getId(); + } + + public int getType() + { + return widget.getType(); + } + public Widget getParent() { net.runelite.rs.api.Widget parent = widget.getParent(); @@ -67,22 +77,45 @@ public class Widget return widget.getRelativeY(); } + public String getText() + { + return widget.getText(); + } + + public boolean isHidden() + { + return widget.isHidden(); + } + public Point getCanvasLocation() { int x = 0; int y = 0; + Widget cur; - int boundsIndex = widget.getBoundsIndex(); - if (boundsIndex != -1) + for (cur = this; cur.getParent() != null; cur = cur.getParent()) { - int[] widgetBoundsWidth = client.getWidgetPositionsX(); - int[] widgetBoundsHeight = client.getWidgetPositionsY(); - - x += widgetBoundsWidth[boundsIndex]; - y += widgetBoundsHeight[boundsIndex]; + x += cur.getRelativeX(); + y += cur.getRelativeY(); } - for (Widget cur = this; cur != null; cur = cur.getParent()) + // cur is now the root + int[] widgetBoundsWidth = client.getWidgetPositionsX(); + int[] widgetBoundsHeight = client.getWidgetPositionsY(); + + int boundsIndex = cur.widget.getBoundsIndex(); + if (boundsIndex != -1) + { + x += widgetBoundsWidth[boundsIndex]; + y += widgetBoundsHeight[boundsIndex]; + + if (cur.getType() > 0) + { + x += cur.getRelativeX(); + y += cur.getRelativeY(); + } + } + else { x += cur.getRelativeX(); y += cur.getRelativeY(); @@ -101,6 +134,12 @@ public class Widget return widget.getHeight(); } + public Rectangle getBounds() + { + Point canvasLocation = getCanvasLocation(); + return new Rectangle(canvasLocation.getX(), canvasLocation.getY(), getWidth(), getHeight()); + } + public Collection getWidgetItems() { int[] itemIds = widget.getItemIds(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevTools.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevTools.java index 0c2bcd8124..6a2b7315b3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevTools.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevTools.java @@ -56,6 +56,7 @@ public class DevTools extends Plugin private boolean toggleWalls; private boolean toggleDecor; private boolean toggleInventory; + private boolean toggleWidgets; private Font font; @@ -145,6 +146,11 @@ public class DevTools extends Plugin toggleInventory = !toggleInventory; } + public void toggleWidgets() + { + toggleWidgets = !toggleWidgets; + } + public boolean isTogglePlayers() { return togglePlayers; @@ -184,4 +190,9 @@ public class DevTools extends Plugin { return toggleInventory; } + + public boolean isToggleWidgets() + { + return toggleWidgets; + } } 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 a6e2a34dc6..92bddb5144 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 @@ -107,6 +107,11 @@ public class DevToolsOverlay extends Overlay renderInventory(graphics); } + if (tools.isToggleWidgets()) + { + renderWidgets(graphics); + } + return null; } @@ -389,4 +394,45 @@ public class DevToolsOverlay extends Overlay } } + private void renderWidgets(Graphics2D graphics) + { + Widget[][] widgets = client.getWidgets(); + boolean[] validInterfaces = client.getValidInterfaces(); + + int idx = -1; + + for (Widget[] children : widgets) + { + ++idx; + + if (!validInterfaces[idx]) + { + continue; + } + + if (children == null) + { + continue; + } + + for (Widget child : children) + { + if (child == null) + { + continue; + } + + if (child.getText() == null) + { + continue; + } + + Rectangle rectangle = child.getBounds(); + //graphics.draw(rectangle); + + graphics.drawString(child.getText(), (int) rectangle.getX(), (int) rectangle.getY()); + } + } + } + } 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 8bb9ab129c..2fc3e47c40 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 @@ -41,6 +41,7 @@ public class DevToolsPanel extends PluginPanel private JButton renderWallsBtn = new JButton(); private JButton renderDecorBtn = new JButton(); private JButton renderInventoryBtn = new JButton(); + private JButton renderWidgetsBtn = new JButton(); public DevToolsPanel(DevTools tools) { @@ -50,64 +51,80 @@ public class DevToolsPanel extends PluginPanel setVisible(true); JPanel container = new JPanel(); - container.setLayout(new GridLayout(4, 2, 3, 3)); + container.setLayout(new GridLayout(5, 2, 3, 3)); add(container); renderPlayersBtn = new JButton("Players"); - renderPlayersBtn.addActionListener(e -> { + renderPlayersBtn.addActionListener(e -> + { highlightButton(renderPlayersBtn); tools.togglePlayers(); }); container.add(renderPlayersBtn); renderNpcsBtn = new JButton("NPCs"); - renderNpcsBtn.addActionListener(e -> { + renderNpcsBtn.addActionListener(e -> + { highlightButton(renderNpcsBtn); tools.toggleNpcs(); }); container.add(renderNpcsBtn); renderGroundItemsBtn = new JButton("Ground Items"); - renderGroundItemsBtn.addActionListener(e -> { + renderGroundItemsBtn.addActionListener(e -> + { highlightButton(renderGroundItemsBtn); tools.toggleGroundItems(); }); container.add(renderGroundItemsBtn); renderGroundObjectsBtn = new JButton("Ground Objects"); - renderGroundObjectsBtn.addActionListener(e -> { + renderGroundObjectsBtn.addActionListener(e -> + { highlightButton(renderGroundObjectsBtn); tools.toggleGroundObjects(); }); container.add(renderGroundObjectsBtn); renderGameObjectsBtn = new JButton("Game Objects"); - renderGameObjectsBtn.addActionListener(e -> { + renderGameObjectsBtn.addActionListener(e -> + { highlightButton(renderGameObjectsBtn); tools.toggleGameObjects(); }); container.add(renderGameObjectsBtn); renderWallsBtn = new JButton("Walls"); - renderWallsBtn.addActionListener(e -> { + renderWallsBtn.addActionListener(e -> + { highlightButton(renderWallsBtn); tools.toggleWalls(); }); container.add(renderWallsBtn); renderDecorBtn = new JButton("Decorations"); - renderDecorBtn.addActionListener(e -> { + renderDecorBtn.addActionListener(e -> + { highlightButton(renderDecorBtn); tools.toggleDecor(); }); container.add(renderDecorBtn); renderInventoryBtn = new JButton("Inventory"); - renderInventoryBtn.addActionListener(e -> { + renderInventoryBtn.addActionListener(e -> + { highlightButton(renderInventoryBtn); tools.toggleInventory(); }); container.add(renderInventoryBtn); + + renderWidgetsBtn = new JButton("Widgets"); + renderWidgetsBtn.addActionListener(e -> + { + highlightButton(renderWidgetsBtn); + tools.toggleWidgets(); + }); + container.add(renderWidgetsBtn); } private void highlightButton(JButton button)