mirror of
https://github.com/moparisthebest/rswiki-book
synced 2024-11-04 16:35:08 -05:00
111 lines
3.0 KiB
Plaintext
111 lines
3.0 KiB
Plaintext
|
== 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 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
|
||
|
|
||
|
(A1 smallest D4 biggest byte)
|