Data Types
Contents
Introduction
RuneScape uses a number of standard and non-standard data types.
Byte Order
Data types that are two bytes or larger can be stored and ordered in a variety of different ways. Generally people either use big endian or little endian.
Big Endian
In big endian order, the most significant byte (MSB) is stored first and the least significant byte (LSB) is stored last.
Little Endian
In little endian order, the least significant byte (LSB) is stored first and the most significant byte (MSB) is stored last.
Byte order in RuneScape
RuneScape uses both little- and big- endian byte orders throughout the protocol, presumably to make reverse-engineering of the protocol harder. Some confusion has arisen over the byte order as the data types are named incorrectly in Winterlove's server where little endian data types are incorrectly named as big endian types.
Standard data types
These datatypes can also be read/written by a DataWriter/DataReader implementation (DataStreams and Buffers)
Naming conventions:
Official name | Datatype name | Jagex name | Encoding |
---|---|---|---|
Byte | byte | 1,1b | |
WORD | short | 2,2b | |
DWORD | int,int32 | 4,4b | |
QWORD | long,int64 | 8,8b | |
C style string | string,String,char *,char[] | str,strbyte | text bytes then '\n' or 10 |
Java style string | string,String,char *,char[] | strraw | WORD length then text bytes |
Note that Jagex used to use a new line character as string terminator, in more recent versions they use the null character \0 or 0 to support multi-line strings.
Non Standard Data Types
Winterlove's name | Jagex name | Read transformation | Write transformation |
---|---|---|---|
Special A | Unknown | value - 128 | value + 128 |
Special C | Unknown | 0 - value | 0 - value |
Special S | Unknown | 128 - value | 128 - value |
SpaceSaverA | smarts | (value[0] < 128) ? (((value[0] - 128)<<8)+value[1]) : value[0] | if(value < 128) putword(value+32768) else putbyte(value); |
SpaceSaverB | smart | ((value[0]<<8)+value[1]) - 49152 | if(i < 64 && i >= -64) putbyte(i + 64) else if(i < 16384 && i >= -16384) putword(i + 49152); |
tribyte / RGBColour / 3Byte / int3 | 3 | (value[0] << 24) + (value[1] << 16) + value[2] | putbyte(value >> 24);putbyte(value >> 16);putbyte(value); |
Additionally, RuneScape also uses two additional integers (named int 1 and int 2) with different byte orders that are not big endian or little endian.