Update MediaWiki page '135 Protocol'

This commit is contained in:
S 2012-12-22 12:57:30 +00:00 committed by moparisthebest
parent 041d636ef3
commit 546d7e51af
1 changed files with 96 additions and 111 deletions

View File

@ -3,78 +3,86 @@ This page refers to the RSC #135 client revision. You can find a partially refac
== '''Packet structure''' == == '''Packet structure''' ==
TODO. <pre>byte tempbuf[];
if (in.available() >= 2) {
len = in.read();
if (len >= 160)
len = (len - 160) * 256 + in.read();
}
if (len > 0 && in.available() >= len) {
if (len >= 160) {
opcode = in.read() & 0xff;
len--;
tempbuf = new byte[len];
in.read(tempbuf, 0, len);
put(tempbuf);
} else {
byte lastbyte = (byte) in.read();
len--;
if (len > 0) {
opcode = in.read() & 0xff;
len--;
tempbuf = new byte[len];
in.read(tempbuf, 0, len);
put(tempbuf);
put(lastbyte);
} else {
opcode = (lastbyte & 0xff);
}
}
}
</pre>
RSC-135 uses big-endian byte order exclusively. RSC-135 uses big-endian byte order exclusively.
== '''Reference''' == == '''Reference''' ==
Player usernames can be encoded and decoded as a long with the following methods: Player usernames are encoded and decoded with the following methods:
<pre>
public static long encode_37(String s) { <pre>public static long encode_37(String s) {
String s1 = ""; String s1 = "";
for (int i = 0; i < s.length(); i++) { for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i); char c = s.charAt(i);
if (c >= 'a' && c <= 'z') if (c >= 'a' && c <= 'z')
s1 = s1 + c; s1 = s1 + c;
else if (c >= 'A' && c <= 'Z') else if (c >= 'A' && c <= 'Z')
s1 = s1 + (char) ((c + 97) - 65); s1 = s1 + (char) ((c + 97) - 65);
else if (c >= '0' && c <= '9') else if (c >= '0' && c <= '9')
s1 = s1 + c; s1 = s1 + c;
else else
s1 = s1 + ' '; s1 = s1 + ' ';
} }
s1 = s1.trim(); s1 = s1.trim();
if (s1.length() > 12) if (s1.length() > 12)
s1 = s1.substring(0, 12); s1 = s1.substring(0, 12);
long l = 0L; long l = 0L;
for (int j = 0; j < s1.length(); j++) { for (int j = 0; j < s1.length(); j++) {
char c1 = s1.charAt(j); char c1 = s1.charAt(j);
l *= 37L; l *= 37L;
if (c1 >= 'a' && c1 <= 'z') if (c1 >= 'a' && c1 <= 'z')
l += (1 + c1) - 97; l += (1 + c1) - 97;
else if (c1 >= '0' && c1 <= '9') else if (c1 >= '0' && c1 <= '9')
l += (27 + c1) - 48; l += (27 + c1) - 48;
} }
return l; return l;
} }
public static String decode_37(long l) { public static String decode_37(long l) {
String s = ""; String s = "";
while (l != 0L) { while (l != 0L) {
int i = (int) (l % 37L); int i = (int) (l % 37L);
l /= 37L; l /= 37L;
if (i == 0) { if (i == 0) {
s = " " + s; s = " " + s;
} else if (i < 27) { } else if (i < 27) {
if (l % 37L == 0L) if (l % 37L == 0L)
s = (char) ((i + 65) - 1) + s; s = (char) ((i + 65) - 1) + s;
else else
s = (char) ((i + 97) - 1) + s; s = (char) ((i + 97) - 1) + s;
} else { } else {
s = (char) ((i + 48) - 27) + s; s = (char) ((i + 48) - 27) + s;
} }
} }
return s; return s;
}
</pre>
Player usernames are encoded like so exclusively in the account recovery process:
<pre>
public static long encode47(String arg0) {
arg0 = arg0.trim();
arg0 = arg0.toLowerCase();
long l = 0L;
int i = 0;
for (int j = 0; j < arg0.length(); j++) {
char c = arg0.charAt(j);
if (c >= 'a' && c <= 'z' || c >= '0' && c <= '9') {
char c1 = c;
l = l * 47L * (l - (long) (c1 * 6) - (long) (i * 7));
l += (c1 - 32) + i * c1;
i++;
}
}
return l;
} }
</pre> </pre>
@ -171,29 +179,6 @@ public static long encode47(String arg0) {
| Registration attempts exceeded? | Registration attempts exceeded?
|} |}
== '''Password Recovery''' ==
Firstly, an integer is read from the stream.
Then, the previous password and the new password are formatted and stored locally.
The client begins a packet with opcode 8. The username is encoded and the long is written.
Next, the client session ID is written.
RSA line is put (old password + new password)
(Presumably) The username is written as RSA long 5 times encoded with a special method used exclusively in the account recovery process (documented above).
One byte is read and discarded.
The next byte is the recovery response. The possible values:
{| class="wikitable"
|-
! Response Code
! Meaning
|-
| 0 || Sorry, recovery failed! You may try again in one hour.
|-
| 1 || Your pass has been reset. You may now use the new pass to login.
|}
Literally any other value results in a recovery failure and the following error message:
"Recovery failed! Attempts exceeded?"
== '''Packets''' == == '''Packets''' ==
The packet opcodes are unchanged from previous revisions, presumably this was before the protocol was being regularly modified to deter the developers of bots such as [[AutoRune]]. The payload/structure is quite similar to most other RSC revisions. The packet opcodes are unchanged from previous revisions, presumably this was before the protocol was being regularly modified to deter the developers of bots such as [[AutoRune]]. The payload/structure is quite similar to most other RSC revisions.
@ -231,12 +216,12 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
* ? * ?
| ? | ?
|- |-
! Initialize Ignore List ! Ignore List
| 26 || | 26 ||
* ? * ?
| ? | ?
|- |-
! Privacy Settings ! Initialize Privacy Settings
| 27 || | 27 ||
* ? * ?
| ? | ?
@ -251,27 +236,27 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
* ? * ?
| ? | ?
|- |-
! Ground Items ! Ground Item Positions
| 254 || | 254 ||
* ? * ?
| ? | ?
|- |-
! Objects ! Object Positions
| 253 || | 253 ||
* ? * ?
| ? | ?
|- |-
! Inventory ! Whole Inventory
| 252 || | 252 ||
* ? * ?
| ? | ?
|- |-
! Players ! Players (Appearance)
| 250 || | 250 ||
* ? * ?
| ? | ?
|- |-
! Boundaries ! Boundary Positions
| 249 || | 249 ||
* ? * ?
| ? | ?
@ -281,12 +266,12 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
* ? * ?
| ? | ?
|- |-
! NPCs ! NPCs (Appearance)
| 247 || | 247 ||
* ? * ?
| ? | ?
|- |-
! Dialog ! Display Dialog
| 246 || | 246 ||
* ? * ?
| ? | ?
@ -296,12 +281,12 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
* ? * ?
| ? | ?
|- |-
! Init Map Region ! Initialize World
| 244 || | 244 ||
* ? * ?
| ? | ?
|- |-
! Skills ! All Skills
| 243 || | 243 ||
* ? * ?
| ? | ?
@ -316,12 +301,12 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
* ? * ?
| ? | ?
|- |-
! Environment ! Update Environment
| 240 || | 240 ||
* ? * ?
| ? | ?
|- |-
! Character Design ! Display Character Design
| 239 || | 239 ||
* ? * ?
| ? | ?
@ -361,17 +346,17 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
* ? * ?
| ? | ?
|- |-
! Game Settings ! Init Game Settings
| 228 || | 228 ||
* ? * ?
| ? | ?
|- |-
! Prayers ! Set Prayers
| 227 || | 227 ||
* ? * ?
| ? | ?
|- |-
! Quests ! Set Quests
| 226 || | 226 ||
* ? * ?
| ? | ?
@ -391,7 +376,7 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
* ? * ?
| ? | ?
|- |-
! XP Update ! Single XP Update
| 220 || | 220 ||
* ? * ?
| ? | ?
@ -406,7 +391,7 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
* ? * ?
| ? | ?
|- |-
! Skill Update ! Single Skill Update
| 211 || | 211 ||
* ? * ?
| ? | ?
@ -462,7 +447,7 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
|- |-
! Report Abuse ! Report Abuse
| 10 || | 10 ||
* Long - The long representation of the username of the user to report * Long - The long representation of the username to report
| Sends an abuse report to the server | Sends an abuse report to the server
|- |-
! Add Friend ! Add Friend
@ -472,18 +457,18 @@ The packet opcodes are unchanged from previous revisions, presumably this was be
|- |-
! Remove Friend ! Remove Friend
| 27 || | 27 ||
* Long - The long representation of the username of the user to report * Long - The long representation of the username to report
| Removes a user from your friends list | Removes a user from your friends list
|- |-
! Send Message ! Send Message
| 28 || | 28 ||
* Long - The long representation of the username of the user to send the message to * Long - The long representation of the username to send the message to
* Byte[] - A byte array containing the bytes of the message to send to the user * String - The message
| Sends a message to the specified user | Sends a message to the specified user
|- |-
! Ignore User ! Ignore User
| 29 || | 29 ||
* Long - The long representation of the username of the user to ignore * Long - The long representation of the username to ignore
| Adds a user to your ignore list | Adds a user to your ignore list
|- |-
! Walk to Tile ! Walk to Tile