mirror of
https://github.com/moparisthebest/rswiki-book
synced 2024-11-11 03:45:02 -05:00
293 lines
6.9 KiB
Plaintext
293 lines
6.9 KiB
Plaintext
[[Category RSC]]
|
|
This page refers to the RSC #135 client revision.
|
|
|
|
|
|
== '''Packet structure''' ==
|
|
?
|
|
|
|
== '''Login''' ==
|
|
(The login protocol documentation is currently a work in progress. Below you will find a partially refactored version of the login method found in the 135 client.)
|
|
<pre>
|
|
try {
|
|
username = user;
|
|
user = jagex.Util.formatString(user, 20);
|
|
password = pass;
|
|
pass = jagex.Util.formatString(pass, 20);
|
|
if (user.trim().length() == 0) {
|
|
drawMessage(messageTable[0], messageTable[1]);
|
|
return;
|
|
}
|
|
if (reconnecting)
|
|
d(messageTable[2], messageTable[3]);
|
|
else
|
|
drawMessage(messageTable[6], messageTable[7]);
|
|
if (appletStarted())
|
|
stream = new SocketStream(host, this, port);
|
|
else
|
|
stream = new SocketStream(host, null, port);
|
|
stream.oe = xc;
|
|
int ssk = stream.readInt32();
|
|
serverSessionID = ssk;
|
|
System.out.println("Session id: " + ssk);
|
|
if (reconnecting)
|
|
stream.beginFrame(19);
|
|
else
|
|
stream.beginFrame(0);
|
|
stream.putInt16(wc);
|
|
stream.putInt64(jagex.Util.longForName(user));
|
|
stream.putLineRSA(pass, ssk, pd, qd);
|
|
stream.putInt32(getSessionID());
|
|
stream.flush();
|
|
stream.read();
|
|
int response = stream.read();
|
|
System.out.println("Login response: " + response);
|
|
if (response == 0) {
|
|
ed = 0;
|
|
e_();
|
|
return;
|
|
}
|
|
if (response == 1) {
|
|
ed = 0;
|
|
a();
|
|
return;
|
|
}
|
|
if (reconnecting) {
|
|
user = "";
|
|
pass = "";
|
|
f();
|
|
return;
|
|
}
|
|
if (response == 3) {
|
|
drawMessage(messageTable[10], messageTable[11]);
|
|
return;
|
|
}
|
|
if (response == 4) {
|
|
drawMessage(messageTable[4], messageTable[5]);
|
|
return;
|
|
}
|
|
if (response == 5) {
|
|
drawMessage(messageTable[16], messageTable[17]);
|
|
return;
|
|
}
|
|
if (response == 6) {
|
|
drawMessage(messageTable[18], messageTable[19]);
|
|
return;
|
|
}
|
|
if (response == 7) {
|
|
drawMessage(messageTable[20], messageTable[21]);
|
|
return;
|
|
}
|
|
if (response == 11) {
|
|
drawMessage(messageTable[22], messageTable[23]);
|
|
return;
|
|
}
|
|
if (response == 12) {
|
|
drawMessage(messageTable[24], messageTable[25]);
|
|
return;
|
|
}
|
|
if (response == 13) {
|
|
drawMessage(messageTable[14], messageTable[15]);
|
|
return;
|
|
}
|
|
if (response == 14) {
|
|
drawMessage(messageTable[8], messageTable[9]);
|
|
sd = 1500;
|
|
return;
|
|
}
|
|
if (response == 15) {
|
|
drawMessage(messageTable[26], messageTable[27]);
|
|
return;
|
|
}
|
|
if (response == 16) {
|
|
drawMessage(messageTable[28], messageTable[29]);
|
|
return;
|
|
} else {
|
|
drawMessage(messageTable[12], messageTable[13]);
|
|
return;
|
|
}
|
|
} catch (Exception exception) {
|
|
System.out.println(String.valueOf(exception));
|
|
}
|
|
if (ed > 0) {
|
|
try {
|
|
Thread.sleep(5000L);
|
|
} catch (Exception _ex) {
|
|
}
|
|
ed--;
|
|
login(username, password, reconnecting);
|
|
}
|
|
if (reconnecting) {
|
|
username = "";
|
|
password = "";
|
|
f();
|
|
} else {
|
|
drawMessage(messageTable[12], messageTable[13]);
|
|
}</pre>
|
|
|
|
== '''Reference''' ==
|
|
A lot of times, Util.longForName is referenced in the packets following:
|
|
<pre>
|
|
public static long longForName(String arg0) {
|
|
String s = "";
|
|
for (int i = 0; i < arg0.length(); i++) {
|
|
char c = arg0.charAt(i);
|
|
if (c >= 'a' && c <= 'z')
|
|
s = s + c;
|
|
else if (c >= 'A' && c <= 'Z')
|
|
s = s + (char) ((c + 97) - 65);
|
|
else if (c >= '0' && c <= '9')
|
|
s = s + c;
|
|
else
|
|
s = s + ' ';
|
|
}
|
|
|
|
s = s.trim();
|
|
if (s.length() > 12)
|
|
s = s.substring(0, 12);
|
|
long l = 0L;
|
|
for (int j = 0; j < s.length(); j++) {
|
|
char c1 = s.charAt(j);
|
|
l *= 37L;
|
|
if (c1 >= 'a' && c1 <= 'z')
|
|
l += (1 + c1) - 97;
|
|
else if (c1 >= '0' && c1 <= '9')
|
|
l += (27 + c1) - 48;
|
|
}
|
|
|
|
return l;
|
|
}
|
|
</pre>
|
|
|
|
== '''Packets''' ==
|
|
Some 135 packets are documented ahead. First you will find the packets' body, then you will find a table (for easier reading)
|
|
|
|
=== '''Incoming Data''' ===
|
|
'''TODO:'''
|
|
<pre>
|
|
</pre>
|
|
|
|
=== '''Outgoing Data''' ===
|
|
<pre>
|
|
(ns rsc.rsc135.packets
|
|
(:require [jagex.Util])
|
|
(:use [jagex.client.SocketStream]))
|
|
|
|
;; Opcode: 2
|
|
(defn newplayer [stream]
|
|
(doto stream
|
|
(.begin-packet 2)
|
|
(.put-int16 ???)
|
|
(.put-int64 (Util/long-for-name username))
|
|
(.put-int16 referrerid)
|
|
(.putline-rsa password server-session-id key-a key-b) ; keys for RSA?
|
|
(.flush)
|
|
(.read) ; newplayer response
|
|
(.end-packet)))
|
|
|
|
;; Opcode: 6
|
|
(defn logout [stream]
|
|
(doto stream
|
|
(.begin-packet 6)
|
|
(.end-packet)))
|
|
|
|
;; Opcode: 7
|
|
(defn send-command [stream command] ; sends command to server e.g ::home, command arg is (.substring command 2)
|
|
(doto stream
|
|
(.begin-packet 7)
|
|
(.putline command)
|
|
(.end-packet)))
|
|
|
|
;; Opcode: 10
|
|
(defn report-abuse [stream username]
|
|
(let [name (.substring username 12)
|
|
l5 (Util/long-for-name name)]
|
|
(doto stream
|
|
(.begin-packet 10)
|
|
(.put-int64 l5)
|
|
(.end-packet))))
|
|
|
|
;; Opcode: 26
|
|
(defn add-friend [stream name] ; name is string represenation of username
|
|
(doto stream
|
|
(.begin-packet 26)
|
|
(.put-int64 (Util/long-for-name name)
|
|
(.end-packet)))
|
|
|
|
;; Opcode: 27
|
|
(defn remove-friend [stream name] ; name is long represenation of username (i.e Util/long-for-name username)
|
|
(doto stream
|
|
(.begin-packet 27)
|
|
(.put-int64 name)
|
|
(.end-packet)))
|
|
|
|
;; Opcode: 28
|
|
;; name is long representation of username, message is byte representation of message (.getBytes message), length is length of message (maximum length is 200)
|
|
(defn send-message [stream name message length]
|
|
(doto stream
|
|
(.begin-packet 28)
|
|
(.put-int64 username)
|
|
(.read-bytes message 0 length)
|
|
(.end-packet)))
|
|
|
|
;; Opcode: 29
|
|
(defn add-ignore [stream username] ; username is string representation of username
|
|
(let [name (Util/long-for-name username)]
|
|
(doto stream
|
|
(.begin-packet 29)
|
|
(.put-int64 name)
|
|
(.end-packet))))
|
|
</pre>
|
|
|
|
{| class="wikitable"
|
|
|+ Outgoing Packets
|
|
|-
|
|
! Name
|
|
! Opcode
|
|
! Payload
|
|
! Description
|
|
|-
|
|
! Newplayer (Registration)
|
|
| 2 ||
|
|
* Short - Unknown
|
|
* Long - Long represenation of username
|
|
* Short - Referrer ID
|
|
** Integer.parseInt(getParameter("referrerid"));
|
|
* Line-RSA - Password, server session ID, bigintegers
|
|
| Registers a new user (probably not used in private servers)
|
|
|-
|
|
! Logout
|
|
| 6 ||
|
|
* None
|
|
| Sends the logout packet to the server
|
|
|-
|
|
! Execute Command
|
|
| 7 ||
|
|
* String - The command
|
|
| Sends a command to the server to be executed
|
|
|-
|
|
! Report Abuse
|
|
| 10 ||
|
|
* Long - The long representation of the username of the user to report
|
|
| Sends an abuse report to the server
|
|
|-
|
|
! Add Friend
|
|
| 26 ||
|
|
* Long - long represenation of username
|
|
| Adds a user to your friends list
|
|
|-
|
|
! Remove Friend
|
|
| 27 ||
|
|
* Long - The long representation of the username of the user to report
|
|
| Removes a user from your friends list
|
|
|-
|
|
! Send Message
|
|
| 28 ||
|
|
* Long - The long representation of the username of the user to send the message to
|
|
* Byte[] - A byte array containing the bytes of the message to send to the user
|
|
| Sends a message to the specified user
|
|
|-
|
|
! Ignore User
|
|
| 29 ||
|
|
* Long - The long representation of the username of the user to ignore
|
|
| Adds a user to your ignore list
|
|
|} |