Actions

Data Types

From RuneWiki

get Methods

public final int g1() {
    return this.data[this.pos++] & 0xFF;
}

public final byte g1b() {
    return this.data[this.pos++];
}

public final int g2() {
    this.pos += 2;
    return ((this.data[this.pos - 2] & 0xFF) << 8) + (this.data[this.pos - 1] & 0xFF);
}

public final int g2s() {
    this.pos += 2;
    int value = ((this.data[this.pos - 2] & 0xFF) << 8) + (this.data[this.pos - 1] & 0xFF);
    if (value > 32767) {
        value -= 65536;
    }
    return value;
}

public final int ig2() {
    this.pos += 2;
    return ((this.data[this.pos - 1] & 0xFF) << 8) + (this.data[this.pos - 2] & 0xFF);
}

public final int g3() {
    this.pos += 3;
    return ((this.data[this.pos - 3] & 0xFF) << 16) + ((this.data[this.pos - 2] & 0xFF) << 8) + (this.data[this.pos - 1] & 0xFF);
}

public final int g4() {
    this.pos += 4;
    return ((this.data[this.pos - 4] & 0xFF) << 24) + ((this.data[this.pos - 3] & 0xFF) << 16) + ((this.data[this.pos - 2] & 0xFF) << 8) + (this.data[this.pos - 1] & 0xFF);
}

public final int ig4() {
    this.pos += 4;
    return ((this.data[this.pos - 1] & 0xFF) << 24) + ((this.data[this.pos - 2] & 0xFF) << 16) + ((this.data[this.pos - 3] & 0xFF) << 8) + (this.data[this.pos - 4] & 0xFF);
}

public final long g5() {
    long high = (long) this.g1() & 0xFFFFFFFFL;
    long low = (long) this.g4() & 0xFFFFFFFFL;
    return (high << 32) + low;
}

public final long g8() {
    long high = (long) this.g4() & 0xFFFFFFFFL;
    long low = (long) this.g4() & 0xFFFFFFFFL;
    return  (high << 32) + low;
}

public final long ig8() {
    long low = (long) this.ig4() & 0xFFFFFFFFL;
    long high = (long) this.ig4() & 0xFFFFFFFFL;
    return (high << 32) + low;
}

public final String gjstr() {
    int start = this.pos;
    // in earlier revisions, e.g. 317, this will decode until != 10 terminates the string
    while (this.data[this.pos++] != 0) {}
    int length = this.pos - start - 1;
    return length == 0 ? "" : Cp1252Utils.decode(this.data, start, length);
}

public final String fastgjstr() {
    if (this.data[this.pos] == 0) {
        this.pos++;
        return null;
    } else {
        return this.gjstr();
    }
}

public final String gjstr2() {
    byte version = this.data[this.pos++];
    if (version != 0) {
        throw new IllegalStateException("Bad version number in gjstr2");
    }

    int start = this.pos;
    while (this.data[this.pos++] != 0) {}
    int length = this.pos - start - 1;
    return length == 0 ? "" : Cp1252.decode(this.data, start, length);
}

public final int gSmart1or2() {
    int value = this.data[this.pos] & 0xFF;
    return value < 128 ? this.g1() : this.g2() - 32768;
}

public final int gSmart1or2s() {
    int value = this.data[this.pos] & 0xFF;
    return value < 128 ? this.g1() - 64 : this.g2() - 49152;
}

public final int gSmart2or4null() {
    if (this.data[this.pos] < 0) {
        return this.g4() & Integer.MAX_VALUE;
    } else {
        int value = this.g2();
        return value == 32767 ? -1 : value;
    }
}

public final int gExtended1or2() {
    int value = 0;

    int remainder;
    for (remainder = this.gSmart1or2(); remainder == 32767; remainder = this.gSmart1or2()) {
        value += 32767;
    }

    return value + remainder;
}

public final int gVarInt() {
    byte value = this.data[this.pos++];

    int remainder = 0;
    while (value < 0) {
        remainder = (remainder | value & 0x7F) << 7;
        value = this.data[this.pos++];
    }

    return value | remainder;
}

public final long gVarLong(int bytes) {
    int read = bytes - 1;
    if (read < 0 || read > 7) {
        throw new IllegalArgumentException();
    }

    int bits = read * 8;
    long result = 0L;
    while (bits >= 0) {
        result |= ((long) this.data[this.pos++] & 0xFFL) << bits;
        bits -= 8;
    }

    return result;
}

put Methods

//todo

public final void pdata(int offset, int length, byte[] dest) {
    for (int i = offset; i < length + offset; i++) {
        dest[i] = this.data[this.pos++];
    }
}

alt Methods

These buffer methods are used to obfuscate the network protocol - there up to 3 alt types, but their obfuscation process can strip out unused methods so there is a chance not all of them are in a specific revision.

You won't find these used in the cache.

get

public final int g1_alt1() {
    return this.data[this.pos++] - 128 & 0xFF;
}

public final int g1_alt2() {
    return -this.data[this.pos++] & 0xFF;
}

public final int g1_alt3() {
    return 128 - this.data[this.pos++] & 0xFF;
}

public final byte g1b_alt1() {
    return (byte) (this.data[this.pos++] - 128);
}

public final byte g1b_alt2() {
    return (byte) -this.data[this.pos++];
}

public final byte g1b_alt3() {
    return (byte) (128 - this.data[this.pos++]);
}

public final int g2_alt2() {
    this.pos += 2;
    return ((this.data[this.pos - 2] & 0xFF) << 8) + (this.data[this.pos - 1] - 128 & 0xFF);
}

public final int g2_alt3() {
    this.pos += 2;
    return ((this.data[this.pos - 1] & 0xFF) << 8) + (this.data[this.pos - 2] - 128 & 0xFF);
}

public final int g3_alt1() {
    this.pos += 3;
    return ((this.data[this.pos - 3] & 0xFF) << 16) + ((this.data[this.pos - 1] & 0xFF) << 8) + (this.data[this.pos - 2] & 0xFF);
}

public final int g4_alt1() {
    this.pos += 4;
    return ((this.data[this.pos - 1] & 0xFF) << 24) + ((this.data[this.pos - 2] & 0xFF) << 16) + ((this.data[this.pos - 3] & 0xFF) << 8) + (this.data[this.pos - 4] & 0xFF);
}

public final int g4_alt2() {
    this.pos += 4;
    return ((this.data[this.pos - 2] & 0xFF) << 24) + ((this.data[this.pos - 1] & 0xFF) << 16) + ((this.data[this.pos - 4] & 0xFF) << 8) + (this.data[this.pos - 3] & 0xFF);
}

public final int g4_alt3() {
    this.pos += 4;
    return ((this.data[this.pos - 3] & 0xFF) << 24) + ((this.data[this.pos - 4] & 0xFF) << 16) + ((this.data[this.pos - 1] & 0xFF) << 8) + (this.data[this.pos - 2] & 0xFF);
}

put

public final void p1_alt1(int value) {
    this.data[this.pos++] = (byte) (value + 128);
}

public final void p1_alt2(int value) {
    this.data[this.pos++] = (byte) -value;
}

public final void p1_alt3(int value) {
    this.data[this.pos++] = (byte) (128 - value);
}

public final void p2_alt1(int value) {
    this.data[this.pos++] = (byte) value;
    this.data[this.pos++] = (byte) (value >> 8);
}

public final void p2_alt2(int value) {
    this.data[this.pos++] = (byte) (value >> 8);
    this.data[this.pos++] = (byte) (value + 128);
}

public final void p2_alt3(int value) {
    this.data[this.pos++] = (byte) (value + 128);
    this.data[this.pos++] = (byte) (value >> 8);
}

public final void p4_alt1(int value) {
    this.data[this.pos++] = (byte) value;
    this.data[this.pos++] = (byte) (value >> 8);
    this.data[this.pos++] = (byte) (value >> 16);
    this.data[this.pos++] = (byte) (value >> 24);
}

public final void p4_alt2(int value) {
    this.data[this.pos++] = (byte) (value >> 8);
    this.data[this.pos++] = (byte) value;
    this.data[this.pos++] = (byte) (value >> 24);
    this.data[this.pos++] = (byte) (value >> 16);
}

public final void p4_alt3(int value) {
    this.data[this.pos++] = (byte) (value >> 16);
    this.data[this.pos++] = (byte) (value >> 24);
    this.data[this.pos++] = (byte) value;
    this.data[this.pos++] = (byte) (value >> 8);
}

Utility Methods

public static final int[] crctable = new int[256];

static {
    for (int b = 0; b < 256; b++) {
        int remainder = b;

        for (int bit = 0; bit < 8; bit++) {
            if ((remainder & 0x1) == 1) {
                remainder = remainder >>> 1 ^ 0xEDB88320;
            } else {
                remainder >>>= 0x1;
            }
        }

        crctable[b] = remainder;
    }
}

public static int getcrc(byte[] src, int offset, int length) {
    int checksum = -1;
    for (int i = offset; i < length; i++) {
        checksum = checksum >>> 8 ^ crctable[(checksum ^ src[i]) & 0xFF];
    }
    return ~checksum;
}

public static int getcrc(byte[] src, int length) {
    return getcrc(src, 0, length);
}

public final int addcrc(int offset) {
    int checksum = getcrc(this.pos, offset, this.data);
    this.p4(checksum);
    return checksum;
}

public final void rsaenc(BigInteger modulus, BigInteger exponent) {
    int length = this.pos;
    this.pos = 0;

    byte[] temp = new byte[length];
    this.pdata(0, length, temp);
    BigInteger bigRaw = new BigInteger(temp);
    BigInteger bigEnc = bigRaw.modPow(exponent, modulus);
    byte[] rawEnc = bigEnc.toByteArray();

    this.pos = 0;
    this.p2(rawEnc.length);
    this.pdata(rawEnc.length, rawEnc, 0);
}

public final void tinyenc(int[] key, int offset, int length) {
    int start = this.pos;
    this.pos = offset;

    int blocks = (length - offset) / 8;
    for (int i = 0; i < blocks; i++) {
        int v0 = this.g4();
        int v1 = this.g4();
        int sum = 0;

        int numRounds = 32;
        while (numRounds-- > 0) {
            v0 += v1 + (v1 << 4 ^ v1 >>> 5) ^ sum + key[sum & 0x3];
            sum += 0x9E3779B9;
            v1 += (v0 >>> 5 ^ v0 << 4) + v0 ^ sum + key[sum >>> 11 & 0xE8C00003];
        }

        this.pos -= 8;
        this.p4(v0);
        this.p4(v1);
    }

    this.pos = start;
}

public final void tinydec(int[] key) {
    int blocks = this.pos / 8;
    this.pos = 0;

    for (int i = 0; i < blocks; i++) {
        int v0 = this.g4();
        int v1 = this.g4();
        int sum = 0xC6EF3720;

        int num_rounds = 32;
        while (num_rounds-- > 0) {
            v1 -= (v0 >>> 5 ^ v0 << 4) + v0 ^ sum + key[sum >>> 11 & 0x3];
            sum -= 0x9E3779B9;
            v0 -= sum + key[sum & 0x3] ^ v1 + (v1 << 4 ^ v1 >>> 5);
        }

        this.pos -= 8;
        this.p4(v0);
        this.p4(v1);
    }
}

public final void tinydec(int[] key, int offset, int length) {
    int start = this.pos;
    this.pos = offset;

    int blocks = (length - offset) / 8;
    for (int i = 0; i < blocks; i++) {
        int v0 = this.g4();
        int v1 = this.g4();
        int sum = 0xC6EF3720;

        int num_rounds = 32;
        while (num_rounds-- > 0) {
            v1 -= (v0 << 4 ^ v0 >>> 5) + v0 ^ key[sum >>> 11 & 0x3] + sum;
            sum -= 0x9E3779B9;
            v0 -= v1 + (v1 >>> 5 ^ v1 << 4) ^ sum + key[sum & 0x3];
        }

        this.pos -= 8;
        this.p4(v0);
        this.p4(v1);
    }

    this.pos = start;
}