From 86e5658fd87e49f0032793ff7bf31b354d9b987f Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Tue, 3 Sep 2019 22:42:23 +0200 Subject: [PATCH] NPC indicators plugin: Generate less garbage objects, fix highlight (#1531) --- .../runelite/api/events/MenuEntryAdded.java | 13 ++++++- .../npchighlight/NpcIndicatorsPlugin.java | 38 ++++++++++--------- .../net/runelite/mixins/RSClientMixin.java | 33 ++++++++++++---- 3 files changed, 57 insertions(+), 27 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 d72162bba0..00238f8b10 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,15 +24,15 @@ */ package net.runelite.api.events; -import lombok.AllArgsConstructor; import lombok.Data; +import lombok.RequiredArgsConstructor; import net.runelite.api.MenuEntry; /** * An event when a new entry is added to a right-click menu. */ @Data -@AllArgsConstructor +@RequiredArgsConstructor public class MenuEntryAdded implements Event { /** @@ -40,6 +40,15 @@ public class MenuEntryAdded implements Event */ private final MenuEntry menuEntry; + /** + * If this is set to true client mixin will update + * the menu entry with the modified values. + * + * Checks if count is the same, but doesn't check if there's + * been multiple changes + */ + private boolean wasModified; + public String getOption() { return menuEntry.getOption(); 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 256ba1afed..7d909378d4 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 @@ -31,7 +31,6 @@ import com.google.inject.Provides; import java.awt.Color; import java.time.Instant; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -51,7 +50,6 @@ import net.runelite.api.GraphicID; import net.runelite.api.GraphicsObject; import net.runelite.api.MenuOpcode; import static net.runelite.api.MenuOpcode.MENU_ACTION_DEPRIORITIZE_OFFSET; -import net.runelite.api.MenuEntry; import net.runelite.api.NPC; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ConfigChanged; @@ -72,6 +70,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.api.util.Text; +import net.runelite.client.util.ColorUtil; import net.runelite.client.util.WildcardMatcher; @PluginDescriptor( @@ -89,8 +88,13 @@ public class NpcIndicatorsPlugin extends Plugin private static final String TAG = "Tag"; private static final String UNTAG = "Un-tag"; - private static final Set NPC_MENU_ACTIONS = ImmutableSet.of(MenuOpcode.NPC_FIRST_OPTION, MenuOpcode.NPC_SECOND_OPTION, - MenuOpcode.NPC_THIRD_OPTION, MenuOpcode.NPC_FOURTH_OPTION, MenuOpcode.NPC_FIFTH_OPTION); + private static final Set NPC_MENU_ACTIONS = ImmutableSet.of( + MenuOpcode.NPC_FIRST_OPTION, + MenuOpcode.NPC_SECOND_OPTION, + MenuOpcode.NPC_THIRD_OPTION, + MenuOpcode.NPC_FOURTH_OPTION, + MenuOpcode.NPC_FIFTH_OPTION + ); @Inject private Client client; @@ -294,8 +298,6 @@ public class NpcIndicatorsPlugin extends Plugin private void onMenuEntryAdded(MenuEntryAdded event) { - MenuEntry[] menuEntries = client.getMenuEntries(); - String target = event.getTarget(); int type = event.getType(); if (type >= MENU_ACTION_DEPRIORITIZE_OFFSET) @@ -307,22 +309,22 @@ public class NpcIndicatorsPlugin extends Plugin NPC_MENU_ACTIONS.contains(MenuOpcode.of(type)) && highlightedNpcs.stream().anyMatch(npc -> npc.getIndex() == event.getIdentifier())) { - final MenuEntry menuEntry = menuEntries[menuEntries.length - 1]; - menuEntry.setTarget(target); - client.setMenuEntries(menuEntries); + final String target = ColorUtil.prependColorTag(Text.removeTags(event.getMenuEntry().getTarget()), this.getHighlightColor); + event.getMenuEntry().setTarget(target); + event.setWasModified(true); } else if (hotKeyPressed && type == MenuOpcode.EXAMINE_NPC.getId()) { // Add tag option - menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1); - final MenuEntry tagEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); - tagEntry.setOption(highlightedNpcs.stream().anyMatch(npc -> npc.getIndex() == event.getIdentifier()) ? UNTAG : TAG); - tagEntry.setTarget(event.getTarget()); - tagEntry.setParam0(event.getActionParam0()); - tagEntry.setParam1(event.getActionParam1()); - tagEntry.setIdentifier(event.getIdentifier()); - tagEntry.setOpcode(MenuOpcode.RUNELITE.getId()); - client.setMenuEntries(menuEntries); + client.insertMenuItem( + highlightedNpcs.stream().anyMatch(npc -> npc.getIndex() == event.getIdentifier()) ? UNTAG : TAG, + event.getTarget(), + MenuOpcode.RUNELITE.getId(), + event.getIdentifier(), + event.getActionParam0(), + event.getActionParam1(), + false + ); } } 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 9b3b736d34..08a548ef32 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -717,21 +717,40 @@ public abstract class RSClientMixin implements RSClient oldMenuEntryCount = newCount; + final String[] options = client.getMenuOptions(); + final String[] targets = client.getMenuTargets(); + final int[] identifiers = client.getMenuIdentifiers(); + final int[] opcodes = client.getMenuOpcodes(); + final int[] arguments1 = client.getMenuArguments1(); + final int[] arguments2 = client.getMenuArguments2(); + final boolean[] forceLeftClick = client.getMenuForceLeftClick(); + if (newCount == oldCount + 1) { MenuEntryAdded event = new MenuEntryAdded( new MenuEntry( - client.getMenuOptions()[oldCount], - client.getMenuTargets()[oldCount], - client.getMenuIdentifiers()[oldCount], - client.getMenuOpcodes()[oldCount], - client.getMenuArguments1()[oldCount], - client.getMenuArguments2()[oldCount], - client.getMenuForceLeftClick()[oldCount] + options[oldCount], + targets[oldCount], + identifiers[oldCount], + opcodes[oldCount], + arguments1[oldCount], + arguments2[oldCount], + forceLeftClick[oldCount] ) ); client.getCallbacks().post(MenuEntryAdded.class, event); + + if (event.isWasModified() && client.getMenuOptionCount() == newCount) + { + options[oldCount] = event.getOption(); + targets[oldCount] = event.getTarget(); + identifiers[oldCount] = event.getIdentifier(); + opcodes[oldCount] = event.getType(); + arguments1[oldCount] = event.getActionParam0(); + arguments2[oldCount] = event.getActionParam1(); + forceLeftClick[oldCount] = event.isForceLeftClick(); + } } }