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 7299e57573..2b7d3aa844 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -634,20 +634,10 @@ public interface Client extends GameEngine int[] getVarps(); /** - * Gets an array of all integer client variables. - * - * @return local variables + * Gets an array of all client variables. */ @VisibleForDevtools - int[] getIntVarcs(); - - /** - * Gets an array of all string client variables. - * - * @return local variables - */ - @VisibleForDevtools - String[] getStrVarcs(); + Map getVarcMap(); /** * Gets the value corresponding to the passed player variable. 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 dc6a6f6461..ef8454b712 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 @@ -32,6 +32,8 @@ import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import javax.swing.BorderFactory; import javax.swing.JButton; @@ -95,8 +97,7 @@ class VarInspector extends JFrame private int[] oldVarps2 = null; private int numVarbits = 10000; - private int[] oldIntVarcs = null; - private String[] oldStrVarcs = null; + private Map varcs = null; @Inject VarInspector(Client client, EventBus eventBus, DevToolsPlugin plugin) @@ -279,9 +280,9 @@ class VarInspector extends JFrame public void onVarClientIntChanged(VarClientIntChanged e) { int idx = e.getIndex(); - int neew = client.getIntVarcs()[idx]; - int old = oldIntVarcs[idx]; - oldIntVarcs[idx] = neew; + int neew = (Integer) client.getVarcMap().getOrDefault(idx, 0); + int old = (Integer) varcs.getOrDefault(idx, 0); + varcs.put(idx, neew); if (old != neew) { @@ -302,9 +303,9 @@ class VarInspector extends JFrame public void onVarClientStrChanged(VarClientStrChanged e) { int idx = e.getIndex(); - String neew = client.getStrVarcs()[idx]; - String old = oldStrVarcs[idx]; - oldStrVarcs[idx] = neew; + String neew = (String) client.getVarcMap().getOrDefault(idx, ""); + String old = (String) varcs.getOrDefault(idx, ""); + varcs.put(idx, neew); if (!Objects.equals(old, neew)) { @@ -343,14 +344,11 @@ class VarInspector extends JFrame { oldVarps = new int[client.getVarps().length]; oldVarps2 = new int[client.getVarps().length]; - oldIntVarcs = new int[client.getIntVarcs().length]; - oldStrVarcs = new String[client.getStrVarcs().length]; } System.arraycopy(client.getVarps(), 0, oldVarps, 0, oldVarps.length); System.arraycopy(client.getVarps(), 0, oldVarps2, 0, oldVarps2.length); - System.arraycopy(client.getIntVarcs(), 0, oldIntVarcs, 0, oldIntVarcs.length); - System.arraycopy(client.getStrVarcs(), 0, oldStrVarcs, 0, oldStrVarcs.length); + varcs = new HashMap<>(client.getVarcMap()); eventBus.register(this); setVisible(true); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java index c30a1388ae..2c9a0d4e1e 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSVarcsMixin.java @@ -2,8 +2,8 @@ package net.runelite.mixins; import net.runelite.api.events.VarClientIntChanged; import net.runelite.api.events.VarClientStrChanged; -import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; import net.runelite.rs.api.RSClient; @@ -15,17 +15,17 @@ public abstract class RSVarcsMixin implements RSVarcs @Shadow("clientInstance") private static RSClient client; - @FieldHook("varCInts") + @MethodHook(value = "putVarc", end = true) @Inject - public void onVarCIntChanged(int idx) + public void onVarCIntChanged(int id, int value) { - client.getCallbacks().post(new VarClientIntChanged(idx)); + client.getCallbacks().post(new VarClientIntChanged(id)); } - @FieldHook("varCStrings") + @MethodHook(value = "putVarcStringNew", end = true) @Inject - public void onVarCStrChanged(int idx) + public void onVarCStrChanged(int id, String value) { - client.getCallbacks().post(new VarClientStrChanged(idx)); + client.getCallbacks().post(new VarClientStrChanged(id)); } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java index 23488c694e..a473dad4a9 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/VarbitMixin.java @@ -26,6 +26,7 @@ package net.runelite.mixins; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import java.util.Map; import net.runelite.api.VarClientInt; import net.runelite.api.VarClientStr; import net.runelite.api.Varbits; @@ -118,43 +119,40 @@ public abstract class VarbitMixin implements RSClient @Override public int getVar(VarClientInt varClientInt) { - return getIntVarcs()[varClientInt.getIndex()]; + Map varcmap = getVarcMap(); + Object object = varcmap.get(varClientInt.getIndex()); + return object instanceof Integer ? (Integer) object : 0; } @Inject @Override public String getVar(VarClientStr varClientStr) { - return getStrVarcs()[varClientStr.getIndex()]; + Map varcmap = getVarcMap(); + Object var2 = varcmap.get(varClientStr.getIndex()); + return var2 instanceof String ? (String) var2 : ""; } @Inject @Override public void setVar(VarClientStr varClientStr, String value) { - String[] vars = getStrVarcs(); - vars[varClientStr.getIndex()] = value; + Map varcmap = getVarcMap(); + varcmap.put(varClientStr.getIndex(), value); } @Inject @Override public void setVar(VarClientInt varClientInt, int value) { - int[] vars = getIntVarcs(); - vars[varClientInt.getIndex()] = value; + Map varcmap = getVarcMap(); + varcmap.put(varClientInt.getIndex(), value); } @Inject @Override - public int[] getIntVarcs() + public Map getVarcMap() { - return getVarcs().getIntVarcs(); - } - - @Inject - @Override - public String[] getStrVarcs() - { - return getVarcs().getStrVarcs(); + return getVarcs().getVarcMap(); } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSVarcs.java b/runescape-api/src/main/java/net/runelite/rs/api/RSVarcs.java index 5f330cf167..527377ae7b 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSVarcs.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSVarcs.java @@ -24,13 +24,11 @@ */ package net.runelite.rs.api; +import java.util.Map; import net.runelite.mapping.Import; public interface RSVarcs { - @Import("varCInts") - int[] getIntVarcs(); - - @Import("varCStrings") - String[] getStrVarcs(); + @Import("varcMap") + Map getVarcMap(); }