Yea that's what I ended up going for. Here's the updated code:
Code:
package com.rs.game.player.scripts;
import com.common.cache.reader.loaders.ConfigDefinitions;
import com.common.json.JsonFileLoader;
import com.rs.json.VarpsDb;
import com.rs.net.game.out.game.GlobalConfigPacket;
import com.rs.net.game.out.game.GlobalStringPacket;
import com.rs.net.game.out.game.VarpPacket;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Created by clem585 on 2021-02-14.
*/
public class VarpManager extends PlayerScript {
private transient Map<Integer, Integer> varps;
private Map<Integer, Integer> persistentVarps;
private transient Map<Integer, Integer> globalInts;
private transient Map<Integer, String> globalStrings;
private Set<Integer> dirtyVarps;
private Set<Integer> dirtyGlobalInts;
private Set<Integer> dirtyGlobalStrings;
public VarpManager() {
varps = new HashMap<>();
persistentVarps = new HashMap<>();
globalInts = new HashMap<>();
globalStrings = new HashMap<>();
dirtyVarps = new HashSet<>();
dirtyGlobalInts = new HashSet<>();
dirtyGlobalStrings = new HashSet<>();
}
@Override
public void init() {
for (int id : JsonFileLoader.get(VarpsDb.class).fetchLoginVarps()) {
if (getVarp(id) != 0) {
player.getEncoder().write(new VarpPacket(id, getVarp(id)));
}
}
}
@Override
public void tick() {
for (int varp : dirtyVarps) {
player.getEncoder().write(new VarpPacket(varp, getVarp(varp)));
}
dirtyVarps.clear();
for (int globalInt : dirtyGlobalInts) {
player.getEncoder().write(new GlobalConfigPacket(globalInt, getGlobalInt(globalInt)));
}
dirtyGlobalInts.clear();
for (int globalString : dirtyGlobalStrings) {
player.getEncoder().write(new GlobalStringPacket(globalString, getGlobalString(globalString)));
}
dirtyGlobalStrings.clear();
}
public int getVarp(int id) {
Map<Integer, Integer> configs = JsonFileLoader.get(VarpsDb.class).isPersistent(id) ? persistentVarps : varps;
return configs.getOrDefault(id, 0);
}
public int getVarb(int id) {
ConfigDefinitions configDefinitions = ConfigDefinitions.getConfigDefinitions(id);
Map<Integer, Integer> configs = JsonFileLoader.get(VarpsDb.class).isPersistent(configDefinitions.getConfigId())
? persistentVarps : varps;
return (configs.getOrDefault(configDefinitions.getConfigId(), 0) & getMask(id))
>> configDefinitions.getStartBit();
}
public int getGlobalInt(int id) {
return globalInts.getOrDefault(id, 0);
}
public String getGlobalString(int id) {
return globalStrings.getOrDefault(id, "");
}
public void setVarp(int id, int value) {
Map<Integer, Integer> configs = JsonFileLoader.get(VarpsDb.class).isPersistent(id) ? persistentVarps : varps;
configs.put(id, value);
dirtyVarps.add(id);
}
public void setVarb(int id, int value) {
ConfigDefinitions configDefinitions = ConfigDefinitions.getConfigDefinitions(id);
int max = (int) Math.pow(2, configDefinitions.getEndBit() - configDefinitions.getStartBit());
if (value >= max) {
throw new RuntimeException(String.format("Attempted to overflow varbit, max: %d, value: %d", max, value));
}
value <<= configDefinitions.getStartBit();
Map<Integer, Integer> configs = JsonFileLoader.get(VarpsDb.class).isPersistent(configDefinitions.getConfigId())
? persistentVarps : varps;
configs.put(configDefinitions.getConfigId(), varps.getOrDefault(configDefinitions.getConfigId(), 0)
& ~getMask(id) | value);
dirtyVarps.add(configDefinitions.getConfigId());
}
public void setGlobalInt(int id, int value) {
globalInts.put(id, value);
dirtyGlobalInts.add(id);
}
public void setGlobalString(int id, String value) {
globalStrings.put(id, value);
dirtyGlobalStrings.add(id);
}
private int getMask(int id) {
ConfigDefinitions configDefinitions = ConfigDefinitions.getConfigDefinitions(id);
int mask = 0;
for (int i = configDefinitions.getStartBit(); i <= configDefinitions.getEndBit(); ++i) {
mask |= (int)Math.pow(2, i);
}
return mask;
}
}