var inspector: optimize var checking

This fixes the inspector incorrectly only checking the first ~2k varbits
due to there being some holes now in the varbit ids
This commit is contained in:
Adam
2020-06-29 10:27:51 -04:00
parent 62bbf35baf
commit 53c8593929

View File

@@ -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<Integer, Integer> varbits;
private Map<Integer, Object> 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;
}
}