From b9da0435d2d6069ef2de65683f06b4d9bd7324da Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 19 May 2022 13:23:35 -0400 Subject: [PATCH 1/9] gpu: initialize scene uploader scene id with nanotime Multiple gpu plugins initializing the scene id to the current time can cause conflicts. This makes that less likely. --- .../java/net/runelite/client/plugins/gpu/SceneUploader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java index dd2e015eb1..f893f48e27 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/SceneUploader.java @@ -50,7 +50,7 @@ class SceneUploader @Inject private Client client; - int sceneId = (int) (System.currentTimeMillis() / 1000L); + int sceneId = (int) System.nanoTime(); private int offset; private int uvoffset; From cbf00f6c412d679c28e543469d0612d28b1c2886 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 19 May 2022 09:52:35 -0400 Subject: [PATCH 2/9] api: add setForcedPosition widget method --- .../src/main/java/net/runelite/api/widgets/Widget.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 b46ea4e4ec..afa6579099 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 @@ -182,6 +182,14 @@ public interface Widget @Deprecated void setRelativeY(int y); + /** + * Set a forced position for the widget. This position overrides the relative x/y for the + * widget, even if the widget is revalidated. To clear the forced position pass -1 for x/y. + * @param x x pos relative to the parent + * @param y y pos relative to the parent + */ + void setForcedPosition(int x, int y); + /** * Gets the text displayed on this widget. * From 004d321c1562beede690a7bb10315fd6f753fc01 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 19 May 2022 09:52:43 -0400 Subject: [PATCH 3/9] widget overlay: use setForcedPosition The inventory can be moved pre-interface tick by the tli subchange listener, as well as post-our client tick event from script events running. This makes it difficult to correctly and generically move the interface, since it would have to be moved pre-interface tick and also pre-frame. Currently the code moves the interface pre-frame, which looks okay, but since it is ticking the interface when it is a different position, clicks on it do not work correctly. We do not have events for pre-interface tick, so use forced position to reliably set the position --- .../java/net/runelite/client/ui/overlay/WidgetOverlay.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java index 5806234f65..382ea1046a 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -136,8 +136,7 @@ public class WidgetOverlay extends Overlay if (getPreferredLocation() != null || getPreferredPosition() != null) { // The widget relative pos is relative to the parent - widget.setRelativeX(bounds.x - parent.x); - widget.setRelativeY(bounds.y - parent.y); + widget.setForcedPosition(bounds.x - parent.x, bounds.y - parent.y); } else { @@ -145,6 +144,7 @@ public class WidgetOverlay extends Overlay { revalidate = false; log.debug("Revalidating {}", widgetInfo); + widget.setForcedPosition(-1, -1); // Revalidate the widget to reposition it back to its normal location after an overlay reset widget.revalidate(); } From bea1c6cb83a98499eaf29d1d2a8ece8355e98bc2 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 19 May 2022 17:53:18 -0400 Subject: [PATCH 4/9] overlay: prevent moving non-movable overlays --- .../java/net/runelite/client/ui/overlay/OverlayRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index 81fad24a4f..fb737e4ca7 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -341,7 +341,7 @@ public class OverlayRenderer extends MouseAdapter if (!bounds.isEmpty()) { - if (inOverlayManagingMode) + if (inOverlayManagingMode && overlay.isMovable()) { Color boundsColor; if (inOverlayResizingMode && currentManagedOverlay == overlay) @@ -391,7 +391,7 @@ public class OverlayRenderer extends MouseAdapter // See if we've clicked on an overlay currentManagedOverlay = lastHoveredOverlay; - if (currentManagedOverlay == null) + if (currentManagedOverlay == null || !currentManagedOverlay.isMovable()) { return mouseEvent; } From 9ceabc5e47a7528a1e8d2ab2230d083d0db77255 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 19 May 2022 21:40:57 -0400 Subject: [PATCH 5/9] prayer: don't return dimension for dynamic overlays The returned dimension is only used for layoutable or movable overlays --- .../net/runelite/client/plugins/prayer/PrayerBarOverlay.java | 4 ++-- .../net/runelite/client/plugins/prayer/PrayerDoseOverlay.java | 3 +-- .../runelite/client/plugins/prayer/PrayerFlickOverlay.java | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java index 5d84ac22f3..99c6363ed9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerBarOverlay.java @@ -116,7 +116,7 @@ class PrayerBarOverlay extends Overlay graphics.fillRect(barX + xOffset, barY + HD_PRAYER_BAR_PADDING, 1, barHeight - HD_PRAYER_BAR_PADDING * 2); } - return new Dimension(barWidth, barHeight); + return null; } // Draw bar @@ -145,7 +145,7 @@ class PrayerBarOverlay extends Overlay graphics.fillRect(barX + xOffset, barY, 1, barHeight); } - return new Dimension(barWidth, barHeight); + return null; } void onTick() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java index 7dc097a295..a43bb28f59 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerDoseOverlay.java @@ -151,8 +151,7 @@ class PrayerDoseOverlay extends Overlay graphics.setColor(ColorUtil.colorLerp(START_COLOR, END_COLOR, Math.sin(t))); graphics.setStroke(new BasicStroke(2)); graphics.drawOval(orbInnerX, orbInnerY, orbInnerSize, orbInnerSize); - - return new Dimension((int) bounds.getWidth(), (int) bounds.getHeight()); + return null; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java index 8853590724..30ab416527 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/prayer/PrayerFlickOverlay.java @@ -91,7 +91,6 @@ class PrayerFlickOverlay extends Overlay graphics.setColor(Color.cyan); graphics.fillRect(orbInnerX + xOffset, orbInnerY + yOffset, 1, indicatorHeight); - - return new Dimension((int) bounds.getWidth(), (int) bounds.getHeight()); + return null; } } From 94fc38f05bc54de8b4712a5247f94abb190690fd Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 23 May 2022 15:43:33 -0400 Subject: [PATCH 6/9] api: pass menu entry to menu add event and forward accessors --- .../runelite/api/events/MenuEntryAdded.java | 60 +++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) 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 0771e8189c..245a30b1fc 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 @@ -24,41 +24,81 @@ */ package net.runelite.api.events; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import lombok.ToString; +import net.runelite.api.MenuEntry; /** * An event when a new entry is added to a right-click menu. */ -@Data -@AllArgsConstructor +@RequiredArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@ToString(onlyExplicitlyIncluded = true) public class MenuEntryAdded { + private final MenuEntry menuEntry; + /** * The option text added to the menu. (ie. "Walk here", "Use") */ - private final String option; + @EqualsAndHashCode.Include + @ToString.Include + public String getOption() + { + return menuEntry.getOption(); + } + /** * 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; + @EqualsAndHashCode.Include + @ToString.Include + public String getTarget() + { + return menuEntry.getTarget(); + } + /** * The action type that will be triggered. */ - private final int type; + @EqualsAndHashCode.Include + @ToString.Include + public int getType() + { + return menuEntry.getType().getId(); + } + /** * An identifier value for the target of the action */ - private final int identifier; + @EqualsAndHashCode.Include + @ToString.Include + public int getIdentifier() + { + return menuEntry.getIdentifier(); + } + /** * An additional parameter for the action. */ - private final int actionParam0; + @EqualsAndHashCode.Include + @ToString.Include + public int getActionParam0() + { + return menuEntry.getParam0(); + } + /** * A second additional parameter for the action. */ - private final int actionParam1; + @EqualsAndHashCode.Include + @ToString.Include + public int getActionParam1() + { + return menuEntry.getParam1(); + } } From c64fc72f9e5dd7dd6c20bf1ee40e718ac36bb42f Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 23 May 2022 15:58:48 -0400 Subject: [PATCH 7/9] events: add tostring/equalsandhashcode to menuoption clicked --- .../api/events/MenuOptionClicked.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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 b2d1defa8b..aa8ba74de6 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 @@ -24,8 +24,11 @@ */ package net.runelite.api.events; +import javax.annotation.Nullable; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.ToString; import net.runelite.api.MenuAction; import net.runelite.api.MenuEntry; import net.runelite.api.widgets.Widget; @@ -42,12 +45,15 @@ import net.runelite.api.widgets.Widget; * it seems that this event still triggers with the "Cancel" action. */ @RequiredArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@ToString(onlyExplicitlyIncluded = true) public class MenuOptionClicked { /** * The clicked menu entry */ private final MenuEntry menuEntry; + /** * Whether or not the event has been consumed by a subscriber. */ @@ -57,6 +63,8 @@ public class MenuOptionClicked /** * Action parameter 0. Its value depends on the menuAction. */ + @EqualsAndHashCode.Include + @ToString.Include public int getParam0() { return menuEntry.getParam0(); @@ -65,6 +73,8 @@ public class MenuOptionClicked /** * Action parameter 1. Its value depends on the menuAction. */ + @EqualsAndHashCode.Include + @ToString.Include public int getParam1() { return menuEntry.getParam1(); @@ -73,6 +83,8 @@ public class MenuOptionClicked /** * The option text added to the menu. */ + @EqualsAndHashCode.Include + @ToString.Include public String getMenuOption() { return menuEntry.getOption(); @@ -81,6 +93,8 @@ public class MenuOptionClicked /** * The target of the action. */ + @EqualsAndHashCode.Include + @ToString.Include public String getMenuTarget() { return menuEntry.getTarget(); @@ -89,6 +103,8 @@ public class MenuOptionClicked /** * The action performed. */ + @EqualsAndHashCode.Include + @ToString.Include public MenuAction getMenuAction() { return menuEntry.getType(); @@ -97,6 +113,8 @@ public class MenuOptionClicked /** * The ID of the object, actor, or item that the interaction targets. */ + @EqualsAndHashCode.Include + @ToString.Include public int getId() { return menuEntry.getIdentifier(); @@ -136,6 +154,7 @@ public class MenuOptionClicked * with an associated widget. Such as eg, CC_OP. * @return */ + @Nullable public Widget getWidget() { return menuEntry.getWidget(); From 7a1d958ee0a8f43874cdac7173aecc1691ba0009 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 23 May 2022 17:15:22 -0400 Subject: [PATCH 8/9] api: add npc accessor to menuentry --- .../main/java/net/runelite/api/MenuEntry.java | 7 ++ .../runelite/api/events/MenuEntryAdded.java | 2 + .../api/events/MenuOptionClicked.java | 1 + .../thieving/CrowdsourcingThieving.java | 5 +- .../plugins/devtools/DevToolsPlugin.java | 3 +- .../InteractHighlightOverlay.java | 3 +- .../InteractHighlightPlugin.java | 8 +-- .../MenuEntrySwapperPlugin.java | 6 +- .../npchighlight/NpcIndicatorsPlugin.java | 66 ++++++++----------- .../opponentinfo/OpponentInfoPlugin.java | 3 +- .../randomevents/RandomEventPlugin.java | 2 +- .../client/plugins/wiki/WikiPlugin.java | 3 +- .../client/menus/MenuManagerTest.java | 9 +-- .../runelite/client/menus/TestMenuEntry.java | 12 +++- .../MenuEntrySwapperPluginTest.java | 11 ++-- .../npchighlight/NpcIndicatorsPluginTest.java | 19 +++--- 16 files changed, 78 insertions(+), 82 deletions(-) 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 bd33855448..0aa1af312a 100644 --- a/runelite-api/src/main/java/net/runelite/api/MenuEntry.java +++ b/runelite-api/src/main/java/net/runelite/api/MenuEntry.java @@ -122,4 +122,11 @@ public interface MenuEntry */ @Nullable Widget getWidget(); + + /** + * Get the {@link NPC} this menu entry is targeting, if any. + * @return + */ + @Nullable + NPC getNpc(); } 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 245a30b1fc..b6640f86f6 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 @@ -25,6 +25,7 @@ package net.runelite.api.events; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; import net.runelite.api.MenuEntry; @@ -37,6 +38,7 @@ import net.runelite.api.MenuEntry; @ToString(onlyExplicitlyIncluded = true) public class MenuEntryAdded { + @Getter private final MenuEntry menuEntry; /** 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 aa8ba74de6..7ea6b63992 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 @@ -52,6 +52,7 @@ public class MenuOptionClicked /** * The clicked menu entry */ + @Getter private final MenuEntry menuEntry; /** diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/thieving/CrowdsourcingThieving.java b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/thieving/CrowdsourcingThieving.java index 4a58c97a66..669f63716b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/thieving/CrowdsourcingThieving.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/crowdsourcing/thieving/CrowdsourcingThieving.java @@ -118,9 +118,8 @@ public class CrowdsourcingThieving { if (event.getMenuOption().equals("Pickpocket") || event.getMenuOption().equals("Knock-Out")) { - NPC[] cachedNPCs = client.getCachedNPCs(); - NPC npc = cachedNPCs[event.getId()]; - lastPickpocketTarget = npc.getId(); + NPC npc = event.getMenuEntry().getNpc(); + lastPickpocketTarget = npc != null ? npc.getId() : -1; } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java index 52151e61ea..e3407d7f69 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java @@ -472,7 +472,8 @@ public class DevToolsPlugin extends Plugin if (action == MenuAction.EXAMINE_NPC) { - NPC npc = client.getCachedNPCs()[identifier]; + NPC npc = entry.getNpc(); + assert npc != null; info += npc.getId(); } else diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightOverlay.java index aa38a95ab6..01326990f6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightOverlay.java @@ -114,8 +114,7 @@ class InteractHighlightOverlay extends Overlay case NPC_FIFTH_OPTION: case EXAMINE_NPC: { - int id = entry.getIdentifier(); - NPC npc = plugin.findNpc(id); + NPC npc = entry.getNpc(); if (npc != null && config.npcShowHover() && (npc != plugin.getInteractedTarget() || !config.npcShowInteract())) { Color highlightColor = menuAction == MenuAction.NPC_SECOND_OPTION diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightPlugin.java index fc9a71a480..3ab3dec06f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/interacthighlight/InteractHighlightPlugin.java @@ -167,9 +167,8 @@ public class InteractHighlightPlugin extends Plugin case NPC_FOURTH_OPTION: case NPC_FIFTH_OPTION: { - int id = menuOptionClicked.getId(); interactedObject = null; - interactedNpc = findNpc(id); + interactedNpc = menuOptionClicked.getMenuEntry().getNpc(); attacked = menuOptionClicked.getMenuAction() == MenuAction.NPC_SECOND_OPTION || menuOptionClicked.getMenuAction() == MenuAction.WIDGET_TARGET_ON_NPC && WidgetInfo.TO_GROUP(client.getSelectedWidget().getId()) == WidgetID.SPELLBOOK_GROUP_ID; clickTick = client.getTickCount(); @@ -242,11 +241,6 @@ public class InteractHighlightPlugin extends Plugin return null; } - NPC findNpc(int id) - { - return client.getCachedNPCs()[id]; - } - @Nullable Actor getInteractedTarget() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 75e0e34294..78bb701a23 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -717,7 +717,8 @@ public class MenuEntrySwapperPlugin extends Plugin if (type == MenuAction.EXAMINE_NPC) { - final NPC npc = client.getCachedNPCs()[id]; + final NPC npc = entry.getNpc(); + assert npc != null; final NPCComposition composition = npc.getTransformedComposition(); final String[] actions = composition.getActions(); @@ -967,7 +968,8 @@ public class MenuEntrySwapperPlugin extends Plugin if (NPC_MENU_TYPES.contains(menuAction)) { - final NPC npc = client.getCachedNPCs()[eventId]; + final NPC npc = menuEntry.getNpc(); + assert npc != null; final NPCComposition composition = npc.getTransformedComposition(); Integer customOption = getNpcSwapConfig(composition.getId()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java index 55b7c5d436..2fefccf511 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.npchighlight; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; import java.awt.Color; import java.time.Instant; @@ -48,7 +47,6 @@ import net.runelite.api.GraphicID; import net.runelite.api.GraphicsObject; import net.runelite.api.KeyCode; import net.runelite.api.MenuAction; -import static net.runelite.api.MenuAction.MENU_ACTION_DEPRIORITIZE_OFFSET; import net.runelite.api.MenuEntry; import net.runelite.api.NPC; import net.runelite.api.coords.WorldPoint; @@ -89,10 +87,6 @@ public class NpcIndicatorsPlugin extends Plugin private static final String TAG_ALL = "Tag-All"; private static final String UNTAG_ALL = "Un-tag-All"; - private static final Set NPC_MENU_ACTIONS = ImmutableSet.of(MenuAction.NPC_FIRST_OPTION, MenuAction.NPC_SECOND_OPTION, - MenuAction.NPC_THIRD_OPTION, MenuAction.NPC_FOURTH_OPTION, MenuAction.NPC_FIFTH_OPTION, MenuAction.WIDGET_TARGET_ON_NPC, - MenuAction.ITEM_USE_ON_NPC); - @Inject private Client client; @@ -239,46 +233,19 @@ public class NpcIndicatorsPlugin extends Plugin @Subscribe public void onMenuEntryAdded(MenuEntryAdded event) { - int type = event.getType(); + final MenuEntry menuEntry = event.getMenuEntry(); + final MenuAction menuAction = menuEntry.getType(); + final NPC npc = menuEntry.getNpc(); - if (type >= MENU_ACTION_DEPRIORITIZE_OFFSET) + if (npc == null) { - type -= MENU_ACTION_DEPRIORITIZE_OFFSET; + return; } - final MenuAction menuAction = MenuAction.of(type); - - if (NPC_MENU_ACTIONS.contains(menuAction)) - { - NPC npc = client.getCachedNPCs()[event.getIdentifier()]; - - Color color = null; - if (npc.isDead()) - { - color = config.deadNpcMenuColor(); - } - - if (color == null && highlightedNpcs.containsKey(npc) && config.highlightMenuNames() && (!npc.isDead() || !config.ignoreDeadNpcs())) - { - color = config.highlightColor(); - } - - if (color != null) - { - MenuEntry[] menuEntries = client.getMenuEntries(); - final MenuEntry menuEntry = menuEntries[menuEntries.length - 1]; - final String target = ColorUtil.prependColorTag(Text.removeTags(event.getTarget()), color); - menuEntry.setTarget(target); - } - } - else if (menuAction == MenuAction.EXAMINE_NPC && client.isKeyPressed(KeyCode.KC_SHIFT)) + if (menuAction == MenuAction.EXAMINE_NPC && client.isKeyPressed(KeyCode.KC_SHIFT)) { // Add tag and tag-all options - final int id = event.getIdentifier(); - final NPC[] cachedNPCs = client.getCachedNPCs(); - final NPC npc = cachedNPCs[id]; - - if (npc == null || npc.getName() == null) + if (npc.getName() == null) { return; } @@ -306,6 +273,25 @@ public class NpcIndicatorsPlugin extends Plugin .setType(MenuAction.RUNELITE) .onClick(this::tag); } + else + { + Color color = null; + if (npc.isDead()) + { + color = config.deadNpcMenuColor(); + } + + if (color == null && highlightedNpcs.containsKey(npc) && config.highlightMenuNames() && (!npc.isDead() || !config.ignoreDeadNpcs())) + { + color = config.highlightColor(); + } + + if (color != null) + { + final String target = ColorUtil.prependColorTag(Text.removeTags(event.getTarget()), color); + menuEntry.setTarget(target); + } + } } private void tag(MenuEntry entry) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java index 17c2bf39b7..0e0891e9d8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java @@ -159,8 +159,7 @@ public class OpponentInfoPlugin extends Plugin return; } - int npcIndex = menuEntryAdded.getIdentifier(); - NPC npc = client.getCachedNPCs()[npcIndex]; + NPC npc = menuEntryAdded.getMenuEntry().getNpc(); if (npc == null) { return; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java index 2dad55c9bf..1e246efe67 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/randomevents/RandomEventPlugin.java @@ -160,7 +160,7 @@ public class RandomEventPlugin extends Plugin && event.getType() <= MenuAction.NPC_FIFTH_OPTION.getId() && EVENT_OPTIONS.contains(event.getOption())) { - NPC npc = client.getCachedNPCs()[event.getIdentifier()]; + NPC npc = event.getMenuEntry().getNpc(); if (npc != null && EVENT_NPCS.contains(npc.getId()) && npc != currentRandomEvent && config.removeMenuOptions()) { client.setMenuEntries(Arrays.copyOf(client.getMenuEntries(), client.getMenuEntries().length - 1)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java index 79f9932de3..39f7f27b32 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wiki/WikiPlugin.java @@ -279,7 +279,8 @@ public class WikiPlugin extends Plugin case WIDGET_TARGET_ON_NPC: { type = "npc"; - NPC npc = client.getCachedNPCs()[ev.getId()]; + NPC npc = ev.getMenuEntry().getNpc(); + assert npc != null; NPCComposition nc = npc.getTransformedComposition(); id = nc.getId(); name = nc.getName(); diff --git a/runelite-client/src/test/java/net/runelite/client/menus/MenuManagerTest.java b/runelite-client/src/test/java/net/runelite/client/menus/MenuManagerTest.java index cd33ded89b..a89ee37a9d 100644 --- a/runelite-client/src/test/java/net/runelite/client/menus/MenuManagerTest.java +++ b/runelite-client/src/test/java/net/runelite/client/menus/MenuManagerTest.java @@ -33,7 +33,6 @@ import java.util.List; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.MenuAction; -import static net.runelite.api.MenuAction.CC_OP; import static net.runelite.api.MenuAction.RUNELITE; import net.runelite.api.MenuEntry; import net.runelite.api.events.MenuEntryAdded; @@ -99,13 +98,7 @@ public class MenuManagerTest menuManager.addManagedCustomMenu(new WidgetMenuOption(second.getOption(), second.getTarget(), MINIMAP_WORLDMAP_OPTIONS), null); menuManager.addManagedCustomMenu(new WidgetMenuOption(third.getOption(), third.getTarget(), MINIMAP_WORLDMAP_OPTIONS), null); - menuManager.onMenuEntryAdded(new MenuEntryAdded( - CANCEL.getOption(), - CANCEL.getTarget(), - CC_OP.getId(), - CANCEL.getIdentifier(), - CANCEL.getParam0(), - CANCEL.getParam1())); + menuManager.onMenuEntryAdded(new MenuEntryAdded(createMenuEntry("Cancel", "", MenuAction.CC_OP, MINIMAP_WORLDMAP_OPTIONS.getPackedId()))); verify(client, times(3)).createMenuEntry(anyInt()); diff --git a/runelite-client/src/test/java/net/runelite/client/menus/TestMenuEntry.java b/runelite-client/src/test/java/net/runelite/client/menus/TestMenuEntry.java index 688de43236..64164bc1df 100644 --- a/runelite-client/src/test/java/net/runelite/client/menus/TestMenuEntry.java +++ b/runelite-client/src/test/java/net/runelite/client/menus/TestMenuEntry.java @@ -25,12 +25,13 @@ package net.runelite.client.menus; import java.util.function.Consumer; +import javax.annotation.Nullable; import lombok.EqualsAndHashCode; import lombok.Setter; import net.runelite.api.MenuAction; import net.runelite.api.MenuEntry; +import net.runelite.api.NPC; import net.runelite.api.widgets.Widget; -import org.jetbrains.annotations.Nullable; @EqualsAndHashCode public class TestMenuEntry implements MenuEntry @@ -48,6 +49,8 @@ public class TestMenuEntry implements MenuEntry private int itemId = -1; @Setter private Widget widget; + @Setter + private NPC npc; @Override public String getOption() @@ -197,4 +200,11 @@ public class TestMenuEntry implements MenuEntry { return widget; } + + @Nullable + @Override + public NPC getNpc() + { + return npc; + } } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java index b715902e47..f8db7e8206 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java @@ -86,6 +86,7 @@ public class MenuEntrySwapperPluginTest @Inject MenuEntrySwapperPlugin menuEntrySwapperPlugin; + private NPC npc; private MenuEntry[] entries; @Before @@ -96,10 +97,9 @@ public class MenuEntrySwapperPluginTest when(client.getGameState()).thenReturn(GameState.LOGGED_IN); when(client.getObjectDefinition(anyInt())).thenReturn(mock(ObjectComposition.class)); - NPC npc = mock(NPC.class); + npc = mock(NPC.class); NPCComposition composition = mock(NPCComposition.class); when(npc.getTransformedComposition()).thenReturn(composition); - when(client.getCachedNPCs()).thenReturn(new NPC[] { npc }); when(client.getMenuEntries()).thenAnswer((Answer) invocationOnMock -> { @@ -117,18 +117,19 @@ public class MenuEntrySwapperPluginTest menuEntrySwapperPlugin.setupSwaps(); } - private static MenuEntry menu(String option, String target, MenuAction menuAction) + private MenuEntry menu(String option, String target, MenuAction menuAction) { return menu(option, target, menuAction, 0); } - private static MenuEntry menu(String option, String target, MenuAction menuAction, int identifier) + private MenuEntry menu(String option, String target, MenuAction menuAction, int identifier) { - MenuEntry menuEntry = new TestMenuEntry(); + TestMenuEntry menuEntry = new TestMenuEntry(); menuEntry.setOption(option); menuEntry.setTarget(target); menuEntry.setType(menuAction); menuEntry.setIdentifier(identifier); + menuEntry.setNpc(npc); return menuEntry; } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java index 90d306a1cd..39e9d8faa5 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java @@ -34,7 +34,6 @@ import java.util.concurrent.ScheduledExecutorService; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.MenuAction; -import net.runelite.api.MenuEntry; import net.runelite.api.NPC; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.NpcChanged; @@ -107,11 +106,12 @@ public class NpcIndicatorsPluginTest when(npc.isDead()).thenReturn(true); npcIndicatorsPlugin.onNpcSpawned(new NpcSpawned(npc)); - when(client.getCachedNPCs()).thenReturn(new NPC[]{npc}); // id 0 + TestMenuEntry entry = new TestMenuEntry(); + entry.setTarget("Goblin"); + entry.setIdentifier(MenuAction.NPC_FIRST_OPTION.getId()); + entry.setNpc(npc); - MenuEntry entry = new TestMenuEntry(); - when(client.getMenuEntries()).thenReturn(new MenuEntry[]{entry}); - MenuEntryAdded menuEntryAdded = new MenuEntryAdded("", "Goblin", MenuAction.NPC_FIRST_OPTION.getId(), 0, -1, -1); + MenuEntryAdded menuEntryAdded = new MenuEntryAdded(entry); npcIndicatorsPlugin.onMenuEntryAdded(menuEntryAdded); assertEquals("Goblin", entry.getTarget()); // red @@ -130,11 +130,12 @@ public class NpcIndicatorsPluginTest when(npc.getName()).thenReturn("Goblin"); npcIndicatorsPlugin.onNpcSpawned(new NpcSpawned(npc)); - when(client.getCachedNPCs()).thenReturn(new NPC[]{npc}); // id 0 + TestMenuEntry entry = new TestMenuEntry(); + entry.setTarget("Goblin"); + entry.setIdentifier(MenuAction.NPC_FIRST_OPTION.getId()); + entry.setNpc(npc); - MenuEntry entry = new TestMenuEntry(); - when(client.getMenuEntries()).thenReturn(new MenuEntry[]{entry}); - MenuEntryAdded menuEntryAdded = new MenuEntryAdded("", "Goblin", MenuAction.NPC_FIRST_OPTION.getId(), 0, -1, -1); + MenuEntryAdded menuEntryAdded = new MenuEntryAdded(entry); npcIndicatorsPlugin.onMenuEntryAdded(menuEntryAdded); assertEquals("Goblin", entry.getTarget()); // blue From 5367d225bfde4164ce9fc8e32a38ffecbe859b6e Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 23 May 2022 17:42:14 -0400 Subject: [PATCH 9/9] api: add player accessor to menuentry --- .../main/java/net/runelite/api/MenuEntry.java | 14 +++++++++++++ .../client/plugins/hiscore/HiscorePlugin.java | 4 +--- .../MenuEntrySwapperPlugin.java | 1 - .../runelite/client/menus/TestMenuEntry.java | 20 +++++++++++++++++-- .../MenuEntrySwapperPluginTest.java | 2 +- .../npchighlight/NpcIndicatorsPluginTest.java | 4 ++-- 6 files changed, 36 insertions(+), 9 deletions(-) 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 0aa1af312a..648b9fa8ab 100644 --- a/runelite-api/src/main/java/net/runelite/api/MenuEntry.java +++ b/runelite-api/src/main/java/net/runelite/api/MenuEntry.java @@ -129,4 +129,18 @@ public interface MenuEntry */ @Nullable NPC getNpc(); + + /** + * Get the {@link Player} this menu entry is targeting, if any. + * @return + */ + @Nullable + Player getPlayer(); + + /** + * Get the {@link Actor} this menu entry is targeting, if any. + * @return + */ + @Nullable + Actor getActor(); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java index 693412bcb3..70952d3f37 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java @@ -185,9 +185,7 @@ public class HiscorePlugin extends Plugin { if (event.getMenuAction() == MenuAction.RUNELITE_PLAYER && event.getMenuOption().equals(LOOKUP)) { - // The player id is included in the event, so we can use that to get the player name, - // which avoids having to parse out the combat level and any icons preceding the name. - Player player = client.getCachedPlayers()[event.getId()]; + Player player = event.getMenuEntry().getPlayer(); if (player == null) { return; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 78bb701a23..d61486f27e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -713,7 +713,6 @@ public class MenuEntrySwapperPlugin extends Plugin { final MenuEntry entry = entries[idx]; final MenuAction type = entry.getType(); - final int id = entry.getIdentifier(); if (type == MenuAction.EXAMINE_NPC) { diff --git a/runelite-client/src/test/java/net/runelite/client/menus/TestMenuEntry.java b/runelite-client/src/test/java/net/runelite/client/menus/TestMenuEntry.java index 64164bc1df..fad74edb6c 100644 --- a/runelite-client/src/test/java/net/runelite/client/menus/TestMenuEntry.java +++ b/runelite-client/src/test/java/net/runelite/client/menus/TestMenuEntry.java @@ -28,9 +28,11 @@ import java.util.function.Consumer; import javax.annotation.Nullable; import lombok.EqualsAndHashCode; import lombok.Setter; +import net.runelite.api.Actor; import net.runelite.api.MenuAction; import net.runelite.api.MenuEntry; import net.runelite.api.NPC; +import net.runelite.api.Player; import net.runelite.api.widgets.Widget; @EqualsAndHashCode @@ -50,7 +52,7 @@ public class TestMenuEntry implements MenuEntry @Setter private Widget widget; @Setter - private NPC npc; + private Actor actor; @Override public String getOption() @@ -205,6 +207,20 @@ public class TestMenuEntry implements MenuEntry @Override public NPC getNpc() { - return npc; + return actor instanceof NPC ? (NPC) actor : null; + } + + @Nullable + @Override + public Player getPlayer() + { + return actor instanceof Player ? (Player) actor : null; + } + + @Nullable + @Override + public Actor getActor() + { + return actor; } } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java index f8db7e8206..acbf5aea8b 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPluginTest.java @@ -129,7 +129,7 @@ public class MenuEntrySwapperPluginTest menuEntry.setTarget(target); menuEntry.setType(menuAction); menuEntry.setIdentifier(identifier); - menuEntry.setNpc(npc); + menuEntry.setActor(npc); return menuEntry; } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java index 39e9d8faa5..b26acf2381 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPluginTest.java @@ -109,7 +109,7 @@ public class NpcIndicatorsPluginTest TestMenuEntry entry = new TestMenuEntry(); entry.setTarget("Goblin"); entry.setIdentifier(MenuAction.NPC_FIRST_OPTION.getId()); - entry.setNpc(npc); + entry.setActor(npc); MenuEntryAdded menuEntryAdded = new MenuEntryAdded(entry); npcIndicatorsPlugin.onMenuEntryAdded(menuEntryAdded); @@ -133,7 +133,7 @@ public class NpcIndicatorsPluginTest TestMenuEntry entry = new TestMenuEntry(); entry.setTarget("Goblin"); entry.setIdentifier(MenuAction.NPC_FIRST_OPTION.getId()); - entry.setNpc(npc); + entry.setActor(npc); MenuEntryAdded menuEntryAdded = new MenuEntryAdded(entry); npcIndicatorsPlugin.onMenuEntryAdded(menuEntryAdded);