package net.scapeemulator.game.msg.decoder;
import java.io.IOException;
import net.scapeemulator.game.msg.MessageDecoder;
import net.scapeemulator.game.msg.impl.WalkMessage;
import net.scapeemulator.game.msg.impl.WalkMessage.Step;
import net.scapeemulator.game.net.game.DataTransformation;
import net.scapeemulator.game.net.game.DataType;
import net.scapeemulator.game.net.game.GameFrame;
import net.scapeemulator.game.net.game.GameFrameReader;
public final class WalkMessageDecoder extends MessageDecoder<WalkMessage> {
public WalkMessageDecoder(int opcode) {
super(opcode);
}
@Override
public WalkMessage decode(GameFrame frame) throws IOException {
GameFrameReader reader = new GameFrameReader(frame);
boolean anticheat = frame.getOpcode() == 39;
int stepCount = (reader.getLength() - (anticheat ? 19 : 5)) / 2 + 1;
boolean running = reader.getUnsigned(DataType.BYTE, DataTransformation.ADD) == 1;
int x = (int) reader.getUnsigned(DataType.SHORT);
int y = (int) reader.getUnsigned(DataType.SHORT, DataTransformation.ADD);
Step[] steps = new Step[stepCount];
steps[0] = new Step(x, y);
for (int i = 1; i < stepCount; i++) {
int stepX = x + (int) reader.getSigned(DataType.BYTE, DataTransformation.ADD);
int stepY = y + (int) reader.getSigned(DataType.BYTE, DataTransformation.SUBTRACT);
steps[i] = new Step(stepX, stepY);
}
return new WalkMessage(steps, running);
}
}