[[Category RSC]] This page refers to the RSC #135 client revision. == '''Packet structure''' == ? == '''Login''' == ? == '''Reference''' == Player usernames are encoded and decoded as a long with the following methods:
public static long encode_37(String s) { String s1 = ""; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c >= 'a' && c <= 'z') s1 = s1 + c; else if (c >= 'A' && c <= 'Z') s1 = s1 + (char) ((c + 97) - 65); else if (c >= '0' && c <= '9') s1 = s1 + c; else s1 = s1 + ' '; } s1 = s1.trim(); if (s1.length() > 12) s1 = s1.substring(0, 12); long l = 0L; for (int j = 0; j < s1.length(); j++) { char c1 = s1.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; } public static String decode_37(long l) { String s = ""; while (l != 0L) { int i = (int) (l % 37L); l /= 37L; if (i == 0) { s = " " + s; } else if (i < 27) { if (l % 37L == 0L) s = (char) ((i + 65) - 1) + s; else s = (char) ((i + 97) - 1) + s; } else { s = (char) ((i + 48) - 27) + s; } } return s; }== '''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. 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:'''
=== '''Outgoing Data''' ===
(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)))) ;; Opcode: 251 (defn drop-item [stream id] (doto stream (.begin-packet 251) (.put-int16 id) (.end-packet))){| class="wikitable" |+ Outgoing Packets |- ! Name ! Opcode ! Payload ! Description |- ! Disconnect | 1 || * None | Sends the disconnect packet |- ! Newplayer (Registration) | 2 || * Short - The client revision number (135) * 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 |- ! Drop Item | 251 || * Short - The ID of the item to drop | Drops the specified item on the ground |}