package net.scapeemulator.game.model.player;
import net.scapeemulator.cache.def.VarbitDefinition;
import net.scapeemulator.game.model.definition.VarbitDefinitions;
import net.scapeemulator.game.msg.impl.ConfigMessage;
import net.scapeemulator.game.msg.impl.VarbitMessage;
/**
* @author Hadyn Richard
*/
public final class StateSet {
private final Player player;
private final int[] stateValues = new int[2500];
public StateSet(Player player) {
this.player = player;
}
private void check(int id) {
if (id < 0 || id >= stateValues.length) {
throw new ArrayIndexOutOfBoundsException(id);
}
}
public void setState(int id, int value) {
check(id);
stateValues[id] = value;
player.send(new ConfigMessage(id, value));
}
public int getState(int id) {
check(id);
return stateValues[id];
}
public void setBitState(int id, boolean bool) {
setBitState(id, bool ? 1 : 0);
}
public void setBitState(int id, int value) {
VarbitDefinition definition = VarbitDefinitions.forId(id);
int lowBit = definition.getLowBit();
int highBit = definition.getHighBit();
int mask = (1 << highBit - lowBit + 1) - 1;
stateValues[definition.getState()] = (value & mask) << definition.getLowBit() | getState(definition.getState()) & ~(mask << definition.getLowBit());
player.send(new VarbitMessage(id, value));
}
public boolean isBitStateActive(int id) {
return isBitStateActive(id, 0x1);
}
public boolean isBitStateActive(int id, int flag) {
return (getBitState(id) & flag) != 0;
}
public int getBitState(int id) {
VarbitDefinition definition = VarbitDefinitions.forId(id);
int lowBit = definition.getLowBit();
int highBit = definition.getHighBit();
int mask = (1 << highBit - lowBit + 1) - 1;
return getState(definition.getState()) >> definition.getLowBit() & mask;
}
}