86 lines
3.5 KiB
Markdown
86 lines
3.5 KiB
Markdown
== 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 (however, the 194 client only uses big-endian order),
|
|
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 \[\[Server Winterlove\|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: {\| border=2 ! Official name ! Datatype name ! Jagex
|
|
name ! Encoding \|- \| Byte \| byte \| 1,1b \|- \| \[\[Word\|WORD\]\] \|
|
|
short \| 2,2b \|- \| \[\[DWord\|DWORD\]\] \| int,int32 \| 4,4b \|- \|
|
|
\[\[QWord\|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 ==
|
|
|
|
{\| border=2 ! 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\] \< 128) ? value\[0\] - 64 \|
|
|
((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 / medium \| 3 \| (value\[0\]
|
|
\<\< 24) + (value\[1\] \<\< 16) + value\[2\] \| putbyte(value \>\>
|
|
24);putbyte(value \>\> 16);putbyte(value); \|- \| \[\[RS
|
|
String\|RS\_String\]\] \| jstr \| Old engine: read until newline
|
|
delimiter ("\n") <br />New engine: read until null byte (value 0). \|
|
|
Old engine: write and finish with newline delimiter ("\n") <br />New
|
|
engine: write and finish with null byte (value 0). \|}
|
|
|
|
Additionally, RuneScape also uses two endian orders for integers that
|
|
are different from a big- or low endian order. Both byte orders are
|
|
called middle-endian.
|
|
|
|
Their orders could be described as following:
|
|
|
|
Middle-endian big int: C3 D4 A1 B2
|
|
|
|
Middle-endian small int: B2 A1 D4 C3
|
|
|
|
Where A1 is the smallest byte (LSB), and D4 the biggest byte (MSB).
|
|
|
|
== Bit Access ==
|
|
|
|
=== Initiating Bit Access ===
|
|
|
|
Whenever data is to be sent to the server or to the client using bits;
|
|
the stream needs to be prepared by setting the bit position. The bit
|
|
position can be calculated by multiplying the current buffer position by
|
|
8. This is because each byte is comprised of 8 bits.
|
|
|
|
Example: int bitPos = bufferPos \* 8;
|