From 10a494a2b72e53a8812cb58f016b3eb02db5f58d Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 17 Oct 2017 10:38:41 -0400 Subject: [PATCH] Use npc indices to iterate local npcs --- .../main/java/net/runelite/api/Client.java | 5 ++-- .../net/runelite/api/queries/NPCQuery.java | 5 +--- .../plugins/devtools/DevToolsOverlay.java | 25 ++++++++----------- .../net/runelite/mixins/RSActorMixin.java | 4 ++- .../net/runelite/mixins/RSClientMixin.java | 14 +++++++++-- .../java/net/runelite/rs/api/RSClient.java | 7 +++++- 6 files changed, 34 insertions(+), 26 deletions(-) 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 4fc0104c66..83be8b3818 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -25,6 +25,7 @@ package net.runelite.api; import java.awt.Canvas; +import java.util.List; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; @@ -35,9 +36,7 @@ public interface Client Player[] getCachedPlayers(); - NPC getNpc(int idx); - - NPC[] getCachedNPCs(); + List getNpcs(); int getBoostedSkillLevel(Skill skill); diff --git a/runelite-api/src/main/java/net/runelite/api/queries/NPCQuery.java b/runelite-api/src/main/java/net/runelite/api/queries/NPCQuery.java index 108c0a6ac3..4a10b63b2f 100644 --- a/runelite-api/src/main/java/net/runelite/api/queries/NPCQuery.java +++ b/runelite-api/src/main/java/net/runelite/api/queries/NPCQuery.java @@ -27,16 +27,13 @@ package net.runelite.api.queries; import net.runelite.api.Client; import net.runelite.api.NPC; -import java.util.Arrays; -import java.util.Objects; public class NPCQuery extends ActorQuery { @Override public NPC[] result(Client client) { - return Arrays.stream(client.getCachedNPCs()) - .filter(Objects::nonNull) + return client.getNpcs().stream() .filter(predicate) .toArray(NPC[]::new); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java index 9beed39399..cd6f8a338a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsOverlay.java @@ -34,6 +34,7 @@ import java.awt.Polygon; import java.awt.Rectangle; import java.awt.geom.Rectangle2D; +import java.util.List; import net.runelite.api.Client; import net.runelite.api.DecorativeObject; import net.runelite.api.GameObject; @@ -148,23 +149,17 @@ public class DevToolsOverlay extends Overlay private void renderNpcs(Graphics2D graphics) { - NPC[] npcs = client.getCachedNPCs(); - if (npcs != null && (npcs.length - 1) > 0) + List npcs = client.getNpcs(); + for (NPC npc : npcs) { - for (NPC npc : npcs) + String text = npc.getName() + " (ID: " + npc.getId() + ") (A: " + npc.getAnimation() + ") (G: " + npc.getGraphic() + ")"; + if (npc.getCombatLevel() > 1) { - if (npc != null) - { - String text = npc.getName() + " (ID: " + npc.getId() + ") (A: " + npc.getAnimation() + ") (G: " + npc.getGraphic() + ")"; - if (npc.getCombatLevel() > 1) - { - OverlayUtil.renderActorOverlay(graphics, npc, text, YELLOW); - } - else - { - OverlayUtil.renderActorOverlay(graphics, npc, text, ORANGE); - } - } + OverlayUtil.renderActorOverlay(graphics, npc, text, YELLOW); + } + else + { + OverlayUtil.renderActorOverlay(graphics, npc, text, ORANGE); } } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java index 82e5e29b5b..76e623ff5e 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java @@ -28,6 +28,7 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.image.BufferedImage; import net.runelite.api.Actor; +import net.runelite.api.NPC; import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.mixins.Inject; @@ -59,7 +60,8 @@ public abstract class RSActorMixin implements RSActor if (i < 0x8000) { - return client.getNpc(i); + NPC[] npcs = client.getCachedNPCs(); + return npcs[i]; } i -= 0x8000; 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 4f83b7287a..24c0fa00f8 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -52,9 +52,19 @@ public abstract class RSClientMixin implements RSClient @Inject @Override - public NPC getNpc(int idx) + public List getNpcs() { - return getCachedNPCs()[idx]; + int validNpcIndexes = getNpcIndexesCount(); + int[] npcIndexes = getNpcIndices(); + NPC[] cachedNpcs = getCachedNPCs(); + List npcs = new ArrayList(validNpcIndexes); + + for (int i = 0; i < validNpcIndexes; ++i) + { + npcs.add(cachedNpcs[npcIndexes[i]]); + } + + return npcs; } @Inject 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 03d57c125c..5116ea7e96 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 @@ -117,8 +117,13 @@ public interface RSClient extends RSGameEngine, Client @Override RSPlayer getLocalPlayer(); + @Import("npcIndexesCount") + int getNpcIndexesCount(); + + @Import("npcIndices") + int[] getNpcIndices(); + @Import("cachedNPCs") - @Override RSNPC[] getCachedNPCs(); @Import("collisionMaps")