diff --git a/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java b/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java index ac2b43ca29..7bf2074901 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuOptionClicked.java @@ -36,4 +36,10 @@ public class MenuOptionClicked private MenuAction menuAction; private int id; private int widgetId; + private boolean consumed; + + public void consume() + { + this.consumed = true; + } } 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 eccf79c46e..9242384bf8 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 @@ -339,7 +339,7 @@ public class Hooks } } - public static void menuActionHook(int actionParam, int widgetId, int menuAction, int id, String menuOption, String menuTarget, int var6, int var7) + public static boolean menuActionHook(int actionParam, int widgetId, int menuAction, int id, String menuOption, String menuTarget, int var6, int var7) { /* Along the way, the RuneScape client may change a menuAction by incrementing it with 2000. * I have no idea why, but it does. Their code contains the same conditional statement. @@ -360,6 +360,8 @@ public class Hooks log.debug("Menu action clicked: {}", menuOptionClicked); eventBus.post(menuOptionClicked); + + return menuOptionClicked.isConsumed(); } public static void addChatMessage(int type, String name, String message, String sender) diff --git a/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java index 5f5e3205d0..0e5978b363 100644 --- a/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-mixins/src/main/java/net/runelite/client/callback/Hooks.java @@ -102,4 +102,9 @@ public class Hooks { throw new RuntimeException(); } + + public static boolean menuActionHook(int actionParam, int widgetId, int menuAction, int id, String menuOption, String menuTarget, int var6, int var7) + { + throw new RuntimeException(); + } } 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 9167f2f0a0..1f378df664 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -77,6 +77,7 @@ import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.callback.Hooks; import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSClanMemberManager; import net.runelite.rs.api.RSClient; @@ -786,4 +787,20 @@ public abstract class RSClientMixin implements RSClient client.setHintArrowX(point.getX()); client.setHintArrowY(point.getY()); } + + @Copy("menuAction") + static void rs$menuAction(int var0, int var1, int var2, int var3, String var4, String var5, int var6, int var7) + { + throw new RuntimeException(); + } + + @Replace("menuAction") + static void rl$menuAction(int var0, int var1, int var2, int var3, String var4, String var5, int var6, int var7) + { + if (Hooks.menuActionHook(var0, var1, var2, var3, var4, var5, var6, var7)) + { + return; + } + rs$menuAction(var0, var1, var2, var3, var4, var5, var6, var7); + } }