The RuneScape client from December 2010 (build 634), patched to play on Void servers. It comes with a launcher that connects to any Void server, OpenGL on every desktop platform, and a set of optional quality-of-life extras. It also runs in a web browser.
- Quick start
- Features
- Options: connecting, gameplay, graphics, developer
- Platforms
- Building from source
- For developers
- Credits
-
Install Java 21 to 25 (Temurin, or Liberica for a 32-bit Windows Java).
-
Download
runetek5-634-<version>.jarfrom the releases page. -
Double-click it, or start it from a terminal:
java -jar runetek5-634-<version>.jar
It connects to 2011Scape (play.2011.rs). For your own server, add
--address localhost; the Void repository says how to run one.
- Any Void server: choose the host, port and keys from the launcher.
- OpenGL on Linux, Windows and macOS, through LWJGL.
- Smooth and sharp: up to 144 fps, a window scaled to your screen, and MSAA or SMAA.
- Extras: tile markers, experience drops, NPC and ground item labels, shift-drop, a longer render distance and a wider zoom.
- Developer tools: ids on right-click menus, coordinates on screen, a better console.
- In a browser: the same game on WebGL 2 (below).
By default the launcher turns on 144 fps, twice the render distance, the wider zoom, the better console, shift-drop and a scale that suits the screen. The other extras are off until you turn them on; most can also be toggled in game with the command shown.
java -jar runetek5-634-<version>.jar --tile-markers --xp-drops --npc-labels| Option | What it does |
|---|---|
--address <host> |
The server to connect to. The default is play.2011.rs; localhost is a server on this computer. |
--port <port> |
The server's port, if it isn't Void's 43594. |
--keys <file> |
Read the server's keys from its game.properties (Void keeps it in game/src/main/resources). |
--login-modulus <hex>, --js5-modulus <hex> |
Give the server's keys in hex instead. |
--require-keys |
Refuse to connect to a remote server that uses the standard Void keys, instead of warning. |
--server <void|jagex> |
The server's protocol. void (the default) suits a Void server; jagex restores the 2010 client's login through the lobby and its original packet sizes and scripts. |
--packets <file> |
Override server packet sizes, one <opcode>=<size> per line (-1 and -2 for a size byte or short). |
--world <id> |
The world. The default is 1. |
--lang <english|german> |
The language. The default is English. |
Warning
The client has the keys of a standard Void server built in, and those keys are public, private
halves included. Anyone who can see the traffic to a server that keeps them can read players'
passwords and change the game files the client downloads. A public server should generate its own
keys, and players should pass them with --keys. The launcher warns when it connects to a remote
server with the standard keys (not for localhost).
Developer console commands that read or write local files (setoutput, runscript, heapdump, …)
are off unless the client is started with --dev-commands.
| Option | What it does | In game |
|---|---|---|
--tile-markers |
Right-click a tile and choose Mark tile to outline it; markers stay until unmarked. | ::tilemarkers |
--xp-drops |
A "+N Skill" drop rises and fades near the minimap when you gain experience. | ::xpdrops |
--npc-labels |
NPC names, with their combat level, above their heads. | ::npclabels |
--ground-items |
The names (and counts) of the items on each tile, above it. | ::grounditems |
--no-shift-drop |
Turn off dropping an item with Shift and a left click. | ::shiftdrop |
--no-zoom |
Keep the mouse wheel to the original zoom range. | |
--render-distance <x> |
Draw the world x times further away. The default is 2; 1 is the original distance. |
| Option | What it does | In game |
|---|---|---|
--fps <n> |
Draw up to n frames a second (default 144). The game keeps its speed; the camera, players, NPCs and animations move smoothly between game cycles. | |
--scale <x> |
Draw the game x times larger. By default it follows the screen: 1.5 from 1080p, 2 at 4K, otherwise 1, measured as the desktop sizes it, so a display your system already enlarges isn't scaled twice. --scale 1 keeps the original size. Works in every mode except native OpenGL, which keeps the game at its own size. |
|
--msaa <n> |
OpenGL: anti-alias the 3D view with n samples (0, 2, 4 or 8) in a framebuffer of its own, so the interface stays sharp. Cut-out textures such as leaves get alpha-to-coverage (--no-a2c turns that off). |
::msaa n |
--smaa |
OpenGL: smooth the 3D view's edges with SMAA 1x, with or without MSAA. | ::smaa |
--render-scale <x> |
OpenGL: draw the 3D view 1.5 or 2 times larger and shrink it (supersampling). | ::renderscale x |
| Option | What it does |
|---|---|
--debug |
Show ids and tile coordinates on right-click menus, and your coordinates under ::displayfps. |
--no-console |
Turn off the console's command history, word editing and tab completion. |
--dev |
--debug with the wider zoom and the better console. |
--dev-commands |
Allow the console commands that read or write local files. |
The game has four graphics modes, chosen in its graphics options.
| Platform | Java | OpenGL | Native OpenGL | DirectX |
|---|---|---|---|---|
| Linux (x64) | ✓ | ✓ | ✓ | |
| Linux (arm64) | ✓ | ✓ | ||
| Windows (64-bit Java) | ✓ | ✓ | ✓ | |
| Windows (32-bit Java) | ✓ | ✓ | ✓ | ✓ |
| macOS (Intel) | ✓ | ✓ | ✓ | |
| macOS (Apple Silicon) | ✓ | ✓ |
DirectX needs a 32-bit Java (Liberica publishes one for Java 21). Native OpenGL and DirectX use the game's own 2010 libraries, which exist only for x86 and x86_64.
git clone https://github.com/2011Scape/634-client.git
cd 634-client
./gradlew run # the launcher, connecting to play.2011.rs
./gradlew run --args="--address localhost" # options go in --args
./gradlew release # the release jar and browser zip, in build/release
./gradlew installDist # a folder with start scripts, in build/installOn Windows, use gradlew.bat instead of ./gradlew. A folder from installDist starts with
bin/runetek5-634 (bin\runetek5-634.bat on Windows); copy the whole folder to share it.
In an IDE
Open the folder as a Gradle project with a Java 21 SDK. Then either run the Gradle task
application → run, or make an Application run configuration with main class RuneTek5, the
runetek5-634.main classpath, the options as program arguments, and these VM options:
--add-opens java.base/java.lang=ALL-UNNAMED --enable-native-access=ALL-UNNAMED -Xmx256m
The client is Kotlin, as a Kotlin Multiplatform project with a JVM and a browser target. It is a straight conversion of the deobfuscated Java, which keeps the original's structure, names and annotations. Code added to the 2010 client is marked with a comment that starts "Not part of the original client".
| Source set | What's in it |
|---|---|
src/commonMain/kotlin |
The game, on shims of the Java APIs it uses. |
src/jvmMain/kotlin |
The desktop side: the native classes, OpenGL on LWJGL, and the launcher RuneTek5. |
src/jsMain/kotlin |
The browser side: WebGL 2, WebSockets and an IndexedDB cache. |
Guides, in docs/:
| Guide | Covers |
|---|---|
| FEATURES.md | Adding a feature: where it hooks in, how it draws, how to try it. Start here. |
| PACKAGES.md | Where the code is, and the native bindings that must not change. |
| RENDERING.md | The graphics modes, the LWJGL binding, and how a frame is drawn. |
| CLIENT.md | The main loop, map building, scene and sound. |
| NETWORK.md | Server and client packets. |
| ENTITIES.md | Players, NPCs and update masks. |
| CONFIG.md | Items, NPCs, locations and the other config types. |
| CACHE.md | The disk cache and JS5. |
| CS2.md | Interfaces and client scripts. |
Trying and checking a change
./gradlew runClientstarts the client itself against a Void server on this computer, with-Pclient.*switches such as-Pclient.debug=true../gradlew checkis what CI runs, with no server needed. It loads and verifies every class from the release jar, and fails on a method over HotSpot's 8000-byte JIT limit unlessconfig/huge-methods.txtlists it../gradlew buildalso builds the browser target, which fails if common code uses a JVM API.- The in-client smoke test (
-Pclient.test=smoke, seeSmokeTest) logs in, checks the frame and the extras, and printsSMOKE PASSorSMOKE FAIL. It needs a Void server with asmoketestaccount. - Dependencies are verified against
gradle/verification-metadata.xml. After changing one, run./gradlew --write-verification-metadata sha256 build releaseand review the diff.
The same game runs in a browser through a WebSocket relay. A release includes the browser bundle as a zip beside the jar.
Building, serving and testing it
- Run a Void server on this computer, as for the desktop smoke test.
- Start the relay, from WebSockets to the server's TCP port:
node tools/relay.mjs(no dependencies; arguments[listenPort=8081] [serverHost=localhost] [serverPort=43594]), orwebsockify 8081 localhost:43594. The client connects tows://localhost:8081/proxy, or towindow.CONFIG.urlwhen the page sets it. The relay listens on 127.0.0.1 only (HOST=0.0.0.0for other machines) and takes WebSockets only from pages served by this computer;ORIGINS=https://example.orgallows a hosted page's origin as well. - Build with
./gradlew jsBrowserDevelopmentWebpack, serve withnode tools/serve.mjs(no dependencies; arguments[port=8080] [bundleDir] [referenceDir=~/634-smoke-ref/browser] [shotDir=build/smoke-browser]), and openhttp://localhost:8080/. It never lets the browser cache, so a rebuilt bundle is picked up on the next reload, and it listens on 127.0.0.1 only (HOST=0.0.0.0to serve other machines)../gradlew buildmakes the minified bundle inbuild/dist/js/productionExecutable, and./gradlew releasezips it beside the jar. - The first visit downloads the cache into IndexedDB; later visits load it from there. The client
starts as the launcher does, but always at render distance 1, on the graphics mode the game's
settings name. The tutorial hides the chat box, so commands go through the developer console
(the
`key):tk1switches to OpenGL on WebGL 2,tk2to the software renderer's browser version, andtele 3222 3218takes an admin player to Lumbridge (so does ctrl-clicking the minimap). Switches go in the address (?client.msaa=4) or a hosted page'swindow.CONFIG. A hosted page ignores the development switches in its address (client.test*,client.devCommands).window.__logholds the last 500 console lines. Leaving the page closes the client's connections, so the server logs the player out at once. - For the smoke test, open
http://localhost:8080/?client.test=smoke&client.test.toolkit=1. It logs in assmoketest, runs the desktop test's checks without the launcher's defaults, compares its frames with~/634-smoke-ref/browser(served at/smoke-ref/), uploads them tobuild/smoke-browser, and reports SMOKE PASS or FAIL on the console, inwindow.__log, in#smoke-resultand in the page title. It and the desktop smoke test both log in assmoketest, so run one at a time.
- Void and GregHib/void-client, for the server, and for the client patches and extras this client builds on.
- OpenRS2, for the deobfuscator and the archive of the original client.
- RuneWiki, for deobfuscating build 634.
- StrongHold/runescape-667, LostCityRS/RS910, Pazaz/RT4-Client and Pazaz/RT5-Client, for the names given to the code.
- FabricMC Matcher, for matching the code between builds.
- LWJGL and lwjgl3-awt, for OpenGL on the desktop.
- SMAA by Jorge Jimenez, Jose I. Echevarria, Belen Masia, Fernando
Navarro and Diego Gutierrez, for the SMAA shader and lookup textures (MIT licence, in
src/jvmMain/resources/smaa/).
This project is not affiliated with or endorsed by Jagex Ltd. RuneScape is a trademark of Jagex Ltd.