diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java index ef8454b712..e39a0bcba2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/VarInspector.java @@ -24,6 +24,8 @@ */ package net.runelite.client.plugins.devtools; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; import com.google.inject.Inject; import java.awt.BorderLayout; import java.awt.Dimension; @@ -48,13 +50,16 @@ import javax.swing.border.CompoundBorder; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.api.IndexDataBase; import net.runelite.api.VarClientInt; import net.runelite.api.VarClientStr; import net.runelite.api.VarPlayer; +import net.runelite.api.VarbitComposition; import net.runelite.api.Varbits; import net.runelite.api.events.VarClientIntChanged; import net.runelite.api.events.VarClientStrChanged; import net.runelite.api.events.VarbitChanged; +import net.runelite.client.callback.ClientThread; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.ui.ClientUI; @@ -84,9 +89,10 @@ class VarInspector extends JFrame } private final static int MAX_LOG_ENTRIES = 10_000; + private static final int VARBITS_ARCHIVE_ID = 14; private final Client client; - private final DevToolsPlugin plugin; + private final ClientThread clientThread; private final EventBus eventBus; private final JPanel tracker = new JPanel(); @@ -95,16 +101,16 @@ class VarInspector extends JFrame private int[] oldVarps = null; private int[] oldVarps2 = null; - private int numVarbits = 10000; + private Multimap varbits; private Map varcs = null; @Inject - VarInspector(Client client, EventBus eventBus, DevToolsPlugin plugin) + VarInspector(Client client, ClientThread clientThread, EventBus eventBus, DevToolsPlugin plugin) { - this.eventBus = eventBus; this.client = client; - this.plugin = plugin; + this.clientThread = clientThread; + this.eventBus = eventBus; setTitle("RuneLite Var Inspector"); setIconImage(ClientUI.ICON); @@ -213,63 +219,51 @@ class VarInspector extends JFrame } @Subscribe - public void onVarbitChanged(VarbitChanged ev) + public void onVarbitChanged(VarbitChanged varbitChanged) { + int index = varbitChanged.getIndex(); int[] varps = client.getVarps(); // Check varbits - for (int i = 0; i < numVarbits; i++) + for (int i : varbits.get(index)) { - try + int old = client.getVarbitValue(oldVarps, i); + int neew = client.getVarbitValue(varps, i); + if (old != neew) { - int old = client.getVarbitValue(oldVarps, i); - int neew = client.getVarbitValue(varps, i); - if (old != neew) - { - // Set the varbit so it doesn't show in the varp changes - // However, some varbits share common bits, so we only do it in oldVarps2 - // Example: 4101 collides with 4104-4129 - client.setVarbitValue(oldVarps2, i, neew); + // Set the varbit so it doesn't show in the varp changes + // However, some varbits share common bits, so we only do it in oldVarps2 + // Example: 4101 collides with 4104-4129 + client.setVarbitValue(oldVarps2, i, neew); - String name = String.format("%d", i); - for (Varbits varbit : Varbits.values()) + String name = Integer.toString(i); + for (Varbits varbit : Varbits.values()) + { + if (varbit.getId() == i) { - if (varbit.getId() == i) - { - name = String.format("%s(%d)", varbit.name(), i); - break; - } + name = String.format("%s(%d)", varbit.name(), i); + break; } - addVarLog(VarType.VARBIT, name, old, neew); } - } - catch (IndexOutOfBoundsException e) - { - // We don't know what the last varbit is, so we just hit the end, then set it for future iterations - log.debug("Hit OOB at varbit {}", i); - numVarbits = i; - break; + addVarLog(VarType.VARBIT, name, old, neew); } } // Check varps - for (int i = 0; i < varps.length; i++) + int old = oldVarps2[index]; + int neew = varps[index]; + if (old != neew) { - int old = oldVarps2[i]; - int neew = varps[i]; - if (old != neew) + String name = Integer.toString(index); + for (VarPlayer varp : VarPlayer.values()) { - String name = String.format("%d", i); - for (VarPlayer varp : VarPlayer.values()) + if (varp.getId() == index) { - if (varp.getId() == i) - { - name = String.format("%s(%d)", varp.name(), i); - break; - } + name = String.format("%s(%d)", varp.name(), index); + break; } - addVarLog(VarType.VARP, name, old, neew); } + addVarLog(VarType.VARP, name, old, neew); } System.arraycopy(client.getVarps(), 0, oldVarps, 0, oldVarps.length); @@ -349,6 +343,22 @@ class VarInspector extends JFrame System.arraycopy(client.getVarps(), 0, oldVarps, 0, oldVarps.length); System.arraycopy(client.getVarps(), 0, oldVarps2, 0, oldVarps2.length); varcs = new HashMap<>(client.getVarcMap()); + varbits = HashMultimap.create(); + + clientThread.invoke(() -> + { + // Build varp index -> varbit id map + IndexDataBase indexVarbits = client.getIndexConfig(); + final int[] varbitIds = indexVarbits.getFileIds(VARBITS_ARCHIVE_ID); + for (int id : varbitIds) + { + VarbitComposition varbit = client.getVarbit(id); + if (varbit != null) + { + varbits.put(varbit.getIndex(), id); + } + } + }); eventBus.register(this); setVisible(true); @@ -361,5 +371,7 @@ class VarInspector extends JFrame tracker.removeAll(); eventBus.unregister(this); setVisible(false); + varcs = null; + varbits = null; } }