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 388d7e7b1c..c2400a5828 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -570,6 +570,11 @@ public interface Client extends GameShell */ MenuEntry[] getMenuEntries(); + /** + * @return amount of menu entries the client has (same as client.getMenuEntries().size()) + */ + int getMenuOptionCount(); + /** * Sets the array of open menu entries. *

diff --git a/runelite-api/src/main/java/net/runelite/api/GraphicID.java b/runelite-api/src/main/java/net/runelite/api/GraphicID.java index 79ffd07145..5a6f7054bb 100644 --- a/runelite-api/src/main/java/net/runelite/api/GraphicID.java +++ b/runelite-api/src/main/java/net/runelite/api/GraphicID.java @@ -55,4 +55,5 @@ public class GraphicID public static final int OLM_HEAL = 1363; public static final int OLM_CRYSTAL = 1447; public static final int XERIC_TELEPORT = 1612; + public static final int HYDRA_LIGHTNING = 1666; } diff --git a/runelite-api/src/main/java/net/runelite/api/MenuEntry.java b/runelite-api/src/main/java/net/runelite/api/MenuEntry.java index 6d9cc751f4..cda2997a21 100644 --- a/runelite-api/src/main/java/net/runelite/api/MenuEntry.java +++ b/runelite-api/src/main/java/net/runelite/api/MenuEntry.java @@ -24,12 +24,16 @@ */ package net.runelite.api; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.RequiredArgsConstructor; /** * A menu entry in a right-click menu. */ @Data +@AllArgsConstructor +@RequiredArgsConstructor public class MenuEntry { /** diff --git a/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java b/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java index e6aa08b600..37f73ec792 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java +++ b/runelite-api/src/main/java/net/runelite/api/events/MenuEntryAdded.java @@ -26,6 +26,7 @@ package net.runelite.api.events; import lombok.AllArgsConstructor; import lombok.Data; +import net.runelite.api.MenuEntry; /** * An event when a new entry is added to a right-click menu. @@ -35,30 +36,42 @@ import lombok.Data; public class MenuEntryAdded { /** - * The option text added to the menu (ie. "Walk here", "Use"). + * The MenuEntry object that was actually added */ - private final String option; - /** - * The target of the action (ie. Item or Actor name). - *

- * If the option does not apply to any target, this field - * will be set to empty string. - */ - private final String target; - /** - * The action type that will be triggered. - */ - private final int type; - /** - * An identifier value for the target of the action - */ - private final int identifier; - /** - * An additional parameter for the action. - */ - private final int actionParam0; - /** - * A second additional parameter for the action. - */ - private final int actionParam1; + private final MenuEntry menuEntry; + + public String getOption() + { + return menuEntry.getOption(); + } + + public String getTarget() + { + return menuEntry.getTarget(); + } + + public int getType() + { + return menuEntry.getType(); + } + + public int getIdentifier() + { + return menuEntry.getIdentifier(); + } + + public int getActionParam0() + { + return menuEntry.getParam0(); + } + + public int getActionParam1() + { + return menuEntry.getParam1(); + } + + public boolean isForceLeftClick() + { + return menuEntry.isForceLeftClick(); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java b/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java index a221d1f36c..5a461908f0 100644 --- a/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java +++ b/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java @@ -173,22 +173,14 @@ public class MenuManager final MenuEntry newestEntry = menuEntries[menuEntries.length - 1]; - boolean isPrio = false; for (ComparableEntry p : priorityEntries) { if (p.matches(newestEntry)) { - isPrio = true; - break; + currentPriorityEntries.add(newestEntry); } } - // If the last entry was a priority entry, keep track of it - if (isPrio) - { - currentPriorityEntries.add(newestEntry); - } - // Make a copy of the menu entries, cause you can't remove from Arrays.asList() List copy = Lists.newArrayList(menuEntries); @@ -197,7 +189,29 @@ public class MenuManager { copy.retainAll(currentPriorityEntries); - copy.add(0, CANCEL()); + // This is because players existing changes walk-here target + // so without this we lose track of em + if (copy.size() != currentPriorityEntries.size()) + { + for (MenuEntry e : currentPriorityEntries) + { + if (copy.contains(e)) + { + continue; + } + + for (MenuEntry e2 : client.getMenuEntries()) + { + if (e.getType() == e2.getType()) + { + e.setTarget(e2.getTarget()); + copy.add(e); + } + } + } + } + + copy.add(CANCEL()); } // Find the current entry in the swaps map 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 8e48c50cad..5c68f25fdf 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -645,12 +645,15 @@ public abstract class RSClientMixin implements RSClient if (newCount == oldCount + 1) { MenuEntryAdded event = new MenuEntryAdded( - client.getMenuOptions()[newCount - 1], - client.getMenuTargets()[newCount - 1], - client.getMenuTypes()[newCount - 1], - client.getMenuIdentifiers()[newCount - 1], - client.getMenuActionParams0()[newCount - 1], - client.getMenuActionParams1()[newCount - 1] + new MenuEntry( + client.getMenuOptions()[oldCount], + client.getMenuTargets()[oldCount], + client.getMenuTypes()[oldCount], + client.getMenuIdentifiers()[oldCount], + client.getMenuActionParams0()[oldCount], + client.getMenuActionParams1()[oldCount], + client.getMenuForceLeftClick()[oldCount] + ) ); client.getCallbacks().post(event); 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 742b8c124a..d976b23b3c 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 @@ -298,6 +298,7 @@ public interface RSClient extends RSGameShell, Client boolean isCheckClick(); @Import("menuOptionsCount") + @Override int getMenuOptionCount(); @Import("menuOptionsCount")