From da0f507ffbb9d57332a82fe25e6266fb4ecd3e13 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 3 Jan 2020 09:52:20 -0500 Subject: [PATCH] camera plugin: add Look South/East/West option to compass --- .../client/plugins/camera/CameraConfig.java | 11 ++++ .../client/plugins/camera/CameraPlugin.java | 39 +++++++++++++ .../src/main/scripts/ToplevelCompassOp.hash | 1 + .../src/main/scripts/ToplevelCompassOp.rs2asm | 55 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 runelite-client/src/main/scripts/ToplevelCompassOp.hash create mode 100644 runelite-client/src/main/scripts/ToplevelCompassOp.rs2asm diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraConfig.java index c7856d938b..32c2e3ba0d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraConfig.java @@ -147,4 +147,15 @@ public interface CameraConfig extends Config { return false; } + + @ConfigItem( + keyName = "compassLook", + name = "Compass options", + description = "Adds Look South, East, and West options to the compass", + position = 10 + ) + default boolean compassLook() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraPlugin.java index 68875487b4..c67157d8db 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/camera/CameraPlugin.java @@ -30,6 +30,7 @@ import com.google.common.primitives.Ints; import com.google.inject.Provides; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; +import java.util.Arrays; import javax.inject.Inject; import javax.swing.SwingUtilities; import net.runelite.api.Client; @@ -39,6 +40,7 @@ import net.runelite.api.ScriptID; import net.runelite.api.VarPlayer; import net.runelite.api.events.ClientTick; import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; @@ -60,6 +62,10 @@ import net.runelite.client.plugins.PluginDescriptor; public class CameraPlugin extends Plugin implements KeyListener, MouseListener { private static final int DEFAULT_ZOOM_INCREMENT = 25; + private static final String LOOK_NORTH = "Look North"; + private static final String LOOK_SOUTH = "Look South"; + private static final String LOOK_EAST = "Look East"; + private static final String LOOK_WEST = "Look West"; private boolean controlDown; // flags used to store the mousedown states @@ -111,6 +117,39 @@ public class CameraPlugin extends Plugin implements KeyListener, MouseListener controlDown = false; } + @Subscribe + public void onMenuEntryAdded(MenuEntryAdded menuEntryAdded) + { + if (menuEntryAdded.getType() == MenuAction.WIDGET_DEFAULT.getId() && menuEntryAdded.getOption().equals(LOOK_NORTH) && config.compassLook()) + { + MenuEntry[] menuEntries = client.getMenuEntries(); + int len = menuEntries.length; + MenuEntry north = menuEntries[len - 1]; + + menuEntries = Arrays.copyOf(menuEntries, len + 3); + + // The handling for these entries is done in ToplevelCompassOp.rs2asm + menuEntries[--len] = createCameraLookEntry(menuEntryAdded, 4, LOOK_WEST); + menuEntries[++len] = createCameraLookEntry(menuEntryAdded, 3, LOOK_EAST); + menuEntries[++len] = createCameraLookEntry(menuEntryAdded, 2, LOOK_SOUTH); + menuEntries[++len] = north; + + client.setMenuEntries(menuEntries); + } + } + + private MenuEntry createCameraLookEntry(MenuEntryAdded lookNorth, int identifier, String option) + { + MenuEntry m = new MenuEntry(); + m.setOption(option); + m.setTarget(lookNorth.getTarget()); + m.setIdentifier(identifier); + m.setType(MenuAction.WIDGET_DEFAULT.getId()); + m.setParam0(lookNorth.getActionParam0()); + m.setParam1(lookNorth.getActionParam1()); + return m; + } + @Subscribe public void onScriptCallbackEvent(ScriptCallbackEvent event) { diff --git a/runelite-client/src/main/scripts/ToplevelCompassOp.hash b/runelite-client/src/main/scripts/ToplevelCompassOp.hash new file mode 100644 index 0000000000..605080e357 --- /dev/null +++ b/runelite-client/src/main/scripts/ToplevelCompassOp.hash @@ -0,0 +1 @@ +6A53DA1D918405E3F314E4350A9CF4002988E5C45E06D37A00AA725003FAD064 \ No newline at end of file diff --git a/runelite-client/src/main/scripts/ToplevelCompassOp.rs2asm b/runelite-client/src/main/scripts/ToplevelCompassOp.rs2asm new file mode 100644 index 0000000000..6884cdf1f0 --- /dev/null +++ b/runelite-client/src/main/scripts/ToplevelCompassOp.rs2asm @@ -0,0 +1,55 @@ +.id 1050 +.int_stack_count 1 +.string_stack_count 0 +.int_var_count 2 ; +1 for saving target angle +.string_var_count 0 +; Remove check of op index +; iload 0 +; iconst 1 +; if_icmpne LABEL10 + get_varbit 542 + iconst 1 + if_icmpeq LABEL10 + get_varbit 4606 + iconst 0 + if_icmpne LABEL10 + jump LABEL11 +LABEL10: + return +LABEL11: + ; switch on op index + iload 0 + switch + 1: LOOK_NORTH + 2: LOOK_SOUTH + 3: LOOK_EAST + 4: LOOK_WEST + jump LABEL10 +LOOK_NORTH: + iconst 0 + istore 1 + jump LOOK +LOOK_SOUTH: + iconst 1024 + istore 1 + jump LOOK +LOOK_EAST: + iconst 1536 + istore 1 + jump LOOK +LOOK_WEST: + iconst 512 + istore 1 + jump LOOK +LOOK: + iconst 2266 + iconst 1 + iconst 0 + sound_synth + iconst 225 + iconst 5 + randominc + add + iload 1 ; load target angle + cam_forceangle + return