From 74ae39258e958f93e918df8ad49fdc469ad259a6 Mon Sep 17 00:00:00 2001 From: SomeoneWithAnInternetConnection <34518321+SomeoneWithAnInternetConnection@users.noreply.github.com> Date: Sun, 21 Jan 2018 11:01:13 -0500 Subject: [PATCH 1/2] Expose runescape click/boundingbox display mode --- .../main/java/net/runelite/api/Client.java | 40 ++++++++++++++++++- .../net/runelite/mixins/RSClientMixin.java | 21 ++++++++++ .../rs/api/RSBoundingBox3DDrawMode.java | 30 ++++++++++++++ .../java/net/runelite/rs/api/RSClient.java | 36 +++++++++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 runescape-api/src/main/java/net/runelite/rs/api/RSBoundingBox3DDrawMode.java 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 b2f418f65c..c96a8d360e 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -176,7 +176,6 @@ public interface Client extends GameEngine List getProjectiles(); - /** * Play a sound effect at the player's current location. * This is how UI, and player-generated (e.g. mining, woodcutting) sound effects are normally played @@ -195,6 +194,45 @@ public interface Client extends GameEngine */ void playSoundEffect(int id, int x, int y, int range); + boolean getDrawBoundingBoxes2D(); + + /** + * When {@code shouldDraw} is true, a 2D bounding box will be drawn for all on-screen objects + * + * @param shouldDraw whether or not to draw 2D bounding boxes + */ + void setDrawBoundingBoxes2D(boolean shouldDraw); + + boolean getDrawBoundingBoxes3D(); + + /** + * When {@code shouldDraw} is true, 3D bounding boxes will be drawn + * either for the object under the cursor, or every object on screen + * according to {@link #setBoundingBoxAlwaysOnMode(boolean) BoundingBoxAlwaysOnMode} + * + * @param shouldDraw whether or not to draw 3D bounding boxes + */ + void setDrawBoundingBoxes3D(boolean shouldDraw); + + boolean getdrawObjectGeometry2D(); + + /** + * When {@code shouldDraw} is true, the clickbox geometry for the object under the cursor will be displayed + * + * @param shouldDraw whether or not to draw the clickbox geometry + */ + void setdrawObjectGeometry2D(boolean shouldDraw); + + boolean getBoundingBoxAlwaysOnMode(); + + /** + * Changes how {@link #getDrawBoundingBoxes3D()} behaves when active. + * When {@code alwaysDrawBoxes} is true, 3D bounding boxes will be drawn. + * When false, a 3D bounding box will only be drawn for the object under the cursor + * + * @param alwaysDrawBoxes whether or not to draw every 3D bounding box, when 3D bounding boxes are enabled + */ + void setBoundingBoxAlwaysOnMode(boolean alwaysDrawBoxes); BufferProvider getBufferProvider(); 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 b29ea0fed8..bc0b642336 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -375,6 +375,27 @@ public abstract class RSClientMixin implements RSClient return new Point(getDestinationX(), getDestinationY()); } + @Inject + @Override + public boolean getBoundingBoxAlwaysOnMode() + { + return getboundingBox3DDrawMode() == getALWAYSDrawMode(); + } + + @Inject + @Override + public void setBoundingBoxAlwaysOnMode(boolean alwaysDrawBoxes) + { + if (alwaysDrawBoxes) + { + setboundingBox3DDrawMode(getALWAYSDrawMode()); + } + else + { + setboundingBox3DDrawMode(getON_MOUSEOVERDrawMode()); + } + } + @FieldHook("skillExperiences") @Inject public static void experiencedChanged(int idx) diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSBoundingBox3DDrawMode.java b/runescape-api/src/main/java/net/runelite/rs/api/RSBoundingBox3DDrawMode.java new file mode 100644 index 0000000000..c17bae9597 --- /dev/null +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSBoundingBox3DDrawMode.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018, SomeoneWithAnInternetConnection + * 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; + +public interface RSBoundingBox3DDrawMode +{ + +} 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 1ce5e8a8ea..bf3f5d04fa 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 @@ -373,6 +373,42 @@ public interface RSClient extends RSGameEngine, Client @Import("queuedSoundEffectCount") void setQueuedSoundEffectCount(int queuedSoundEffectCount); + @Import("drawBoundingBoxes2D") + @Override + boolean getDrawBoundingBoxes2D(); + + @Import("drawBoundingBoxes2D") + @Override + void setDrawBoundingBoxes2D(boolean shouldDraw); + + @Import("drawBoundingBoxes3D") + @Override + boolean getDrawBoundingBoxes3D(); + + @Import("drawBoundingBoxes3D") + @Override + void setDrawBoundingBoxes3D(boolean shouldDraw); + + @Import("drawObjectGeometry2D") + @Override + boolean getdrawObjectGeometry2D(); + + @Import("drawObjectGeometry2D") + @Override + void setdrawObjectGeometry2D(boolean shouldDraw); + + @Import("boundingBox3DDrawMode") + RSBoundingBox3DDrawMode getboundingBox3DDrawMode(); + + @Import("boundingBox3DDrawMode") + void setboundingBox3DDrawMode(RSBoundingBox3DDrawMode drawMode); + + @Import("ON_MOUSEOVER") + RSBoundingBox3DDrawMode getON_MOUSEOVERDrawMode(); + + @Import("ALWAYS") + RSBoundingBox3DDrawMode getALWAYSDrawMode(); + @Import("rasterProvider") @Override BufferProvider getBufferProvider(); From e9e01c18f481b1ec4b2416556920a121d8d1a640 Mon Sep 17 00:00:00 2001 From: SomeoneWithAnInternetConnection <34518321+SomeoneWithAnInternetConnection@users.noreply.github.com> Date: Sun, 21 Jan 2018 17:51:41 -0500 Subject: [PATCH 2/2] Add bounding/clickbox buttons to the devtools plugin The first button (yellow square) will toggle drawing of 2D bounding boxes The second button (RGB cubeframe) will toggle 3D bounding box drawing The third button (cursor over red square) will toggle clickbox geometry drawing The fourth button (cursor over cubeframe) switches between "draw all 3D bounding boxes" and "draw bounding box for object under cursor" modes of the 3D bounding box drawing. T --- .../plugins/devtools/DevToolsPanel.java | 71 ++++++++++++++++++ .../plugins/devtools/2D_bounding_box.png | Bin 0 -> 233 bytes .../plugins/devtools/2D_clickbox_geometry.png | Bin 0 -> 285 bytes .../plugins/devtools/3D_bounding_box.png | Bin 0 -> 430 bytes .../devtools/mouseover_3D_bounding_box.png | Bin 0 -> 312 bytes 5 files changed, 71 insertions(+) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/devtools/2D_bounding_box.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/devtools/2D_clickbox_geometry.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/devtools/3D_bounding_box.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/devtools/mouseover_3D_bounding_box.png 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 cd8d125da8..6b46ce2505 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 @@ -30,10 +30,13 @@ import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; +import java.io.IOException; import java.util.Collection; import java.util.concurrent.ExecutionException; import javax.annotation.Nullable; +import javax.imageio.ImageIO; import javax.inject.Inject; +import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; @@ -61,6 +64,7 @@ public class DevToolsPanel extends PluginPanel private JButton renderDecorBtn = new JButton(); private JButton renderInventoryBtn = new JButton(); private JButton renderProjectilesBtn = new JButton(); + private JPanel boundsDebugPanel = new JPanel(); private JLabel textLbl = new JLabel(); private JLabel textColorLbl = new JLabel(); @@ -167,6 +171,9 @@ public class DevToolsPanel extends PluginPanel }); container.add(renderProjectilesBtn); + boundsDebugPanel = createBoundsDebugMultiButton(); + container.add(boundsDebugPanel); + JButton settingsSnapshotBtn = new JButton("Get Settings"); settingsSnapshotBtn.addActionListener(settingsTracker::snapshot); container.add(settingsSnapshotBtn); @@ -178,6 +185,70 @@ public class DevToolsPanel extends PluginPanel return container; } + private JPanel createBoundsDebugMultiButton() + { + ImageIcon bBox2DIcon; + ImageIcon bBox3DIcon; + ImageIcon clickBoxIcon; + ImageIcon bBox3DMousoverIcon; + + try + { + bBox2DIcon = new ImageIcon(ImageIO.read(DevToolsPlugin.class.getResourceAsStream("2D_bounding_box.png"))); + bBox3DIcon = new ImageIcon(ImageIO.read(DevToolsPlugin.class.getResourceAsStream("3D_bounding_box.png"))); + clickBoxIcon = new ImageIcon(ImageIO.read(DevToolsPlugin.class.getResourceAsStream("2D_clickbox_geometry.png"))); + bBox3DMousoverIcon = new ImageIcon(ImageIO.read(DevToolsPlugin.class.getResourceAsStream("mouseover_3D_bounding_box.png"))); + } + catch (IOException ex) + { + log.warn("unable to load bounding box images", ex); + return new JPanel(); + } + + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new GridLayout(1, 4)); + JButton bBox2DButton = new JButton(bBox2DIcon); + bBox2DButton.addActionListener(e -> + { + client.setDrawBoundingBoxes2D(!client.getDrawBoundingBoxes2D()); + highlightButton(bBox2DButton); + }); + buttonPanel.add(bBox2DButton); + + JButton bBox3DButton = new JButton(bBox3DIcon); + bBox3DButton.addActionListener(e -> + { + client.setDrawBoundingBoxes3D(!client.getDrawBoundingBoxes3D()); + highlightButton(bBox3DButton); + }); + buttonPanel.add(bBox3DButton); + + JButton clickBoxButton = new JButton(clickBoxIcon); + clickBoxButton.addActionListener(e -> + { + client.setdrawObjectGeometry2D(!client.getdrawObjectGeometry2D()); + highlightButton(clickBoxButton); + }); + buttonPanel.add(clickBoxButton); + + JButton mouseoverModeButton = new JButton(client.getBoundingBoxAlwaysOnMode() ? bBox3DIcon : bBox3DMousoverIcon); + mouseoverModeButton.addActionListener(e -> + { + client.setBoundingBoxAlwaysOnMode(!client.getBoundingBoxAlwaysOnMode()); + if (client.getBoundingBoxAlwaysOnMode()) + { + mouseoverModeButton.setIcon(bBox3DIcon); + } + else + { + mouseoverModeButton.setIcon(bBox3DMousoverIcon); + } + }); + buttonPanel.add(mouseoverModeButton); + + return buttonPanel; + } + private JPanel createWidgetTreePanel() { JPanel container = new JPanel(); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/devtools/2D_bounding_box.png b/runelite-client/src/main/resources/net/runelite/client/plugins/devtools/2D_bounding_box.png new file mode 100644 index 0000000000000000000000000000000000000000..d4449a42d3efc4a20c5407c0aae09aa26e6f4222 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPdqo^p0=)J}F9DqWynIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P~6wk#WBR77|LvJo8#)`E4lpJE`E`z`oJ;z7yjxD! z#+8YROD1H9D=;U;GzhX8`0g-y9OPW6&?nW9!l2XjVJTxy7Mq=-Azwuv3qzo)4(FVX Qv;dHep00i_>zopr0I2apBLDyZ literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/devtools/2D_clickbox_geometry.png b/runelite-client/src/main/resources/net/runelite/client/plugins/devtools/2D_clickbox_geometry.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6a1930b60b9ddf121ebf8fb513941b01e936c7 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEUnfx)>bHL)Z$ zMWH;iBtya7(>EYRFO?lA-stJ#7-DgH>EzQwhZT63Rr&w_KYiPKj)4eAUTyM$*X=D| zSbixcS$q~}&~UCveZa18JGyJVjc3+o_J*AMtZkAv-!8E6d!y&C@Gz<)^mS!_#3(At&#PxW|1MBSHZvrm#5q4VH#M&W$Yo$~E=o-- zNlj5G&n(GMaQE~LNYP7WXJB9y@^o--2bs|C(LyE&4S1iw_5)e z2rppaeZ4DV+bjjmIkP&xe0^B5{z#0cT=}BCzo+ewd=q+i#%XVh=06M;pZ@#(VQlm} UI>nEN+XNJBp00i_>zopr06ej-9RL6T literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/devtools/mouseover_3D_bounding_box.png b/runelite-client/src/main/resources/net/runelite/client/plugins/devtools/mouseover_3D_bounding_box.png new file mode 100644 index 0000000000000000000000000000000000000000..6af91bffa8a6dd51c5f349157d13df29e0dd2f0e GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEYGO%h zib8p2Nrr;Er*A-tUMf3Ke2%A!V~EA+sgo`W9yZ``o?j!Ue7JH8-*nq6{nspO6csNn z7c^oznecX5leyxBottjA`5c`1x!&TVRD;9P6Rhj+iq_WD=w8~K^d(C=bE{ls()OES z#|-|xnDOAcilNZtx$PX2HR`TZH0G$UXEB;6_kPcsmD`dV=Bb_e@zU>>Z-?B?m6IYC y-EV!tWf-ycRMj<;^9FO~7|u>uR?v0B&LjTy`=|tVXR{L^4|uxzxvX