[[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>

In the 135 client, messages that are to be drawn on the login screen are stored in an array. This makes it a bit tedious to understand what messages are being drawn. Here is the message table:

<pre>
static {
		messageTable = new String[50];
		messageTable[0] = "You must enter both a username";
		messageTable[1] = "and a password - Please try again";
		messageTable[2] = "Connection lost! Please wait...";
		messageTable[3] = "Attempting to re-establish";
		messageTable[4] = "That username is already in use.";
		messageTable[5] = "Wait 60 seconds then retry";
		messageTable[6] = "Please wait...";
		messageTable[7] = "Connecting to server";
		messageTable[8] = "Sorry! The server is currently full.";
		messageTable[9] = "Please try again later";
		messageTable[10] = "Invalid username or password.";
		messageTable[11] = "Try again, or create a new account";
		messageTable[12] = "Sorry! Unable to connect to server.";
		messageTable[13] = "Check your internet settings";
		messageTable[14] = "Username already taken.";
		messageTable[15] = "Please choose another username";
		messageTable[16] = "The client has been updated.";
		messageTable[17] = "Please reload this page";
		messageTable[18] = "You may only use 1 character at once.";
		messageTable[19] = "Your ip-address is already in use";
		messageTable[20] = "Login attempts exceeded!";
		messageTable[21] = "Please try again in 5 minutes";
		messageTable[22] = "Account has been temporarily disabled";
		messageTable[23] = "for cheating or abuse";
		messageTable[24] = "Account has been permanently disabled";
		messageTable[25] = "for cheating or abuse";
		messageTable[26] = "You need a members account";
		messageTable[27] = "to login to this server";
		messageTable[28] = "Please login to a members server";
		messageTable[29] = "to access member-only features";
	}
</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: 1
(defn disconnect [stream]
  (doto stream
    (.begin-packet1)
    (.flush)))

;; 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
|-
! Disconnect
| 1 ||
* None
| Sends the disconnect packet.
|-
! 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
|}