cuddle.fish about disclaimers

Launching a 2009 RuneScape Server

Deploying a 2009 RuneScape server for nostalgia, but not before ranting about the original game’s downfall. [2023-07-09]

If you somehow occupy the slim intersection of people who:

… then consider this post dedicated to you (and also maybe we should be friends 🤣).

RuneScape 2013

This is an actual screenshot I took of my RuneScape character circa 2010, when I was 13.

Backstory

RuneScape was an online medieval fantasy game where players took control of a character to train skills, complete quests, and acquire coins and items.

The game’s open world, at its peak, was concurrently populated by hundreds of thousands of players. RuneScape was by far the game I spent the most time with out of all the games of my youth.

Why I Loved This Game

Compared to similar MMORPG titles, RuneScape’s most unique aspect was its freedom. You were not told to do anything after being dropped into the world. Your own desire drove the game.

Training any one of the twenty-four skills to its maximum level was an incredibly lengthy undertaking typically taking hundreds of hours each. This meant the common genre concept of an “endgame” did not generally exist for most players.

There was no expectation to reach the maximum level to experience the “real game”. You could level skills in any particular path you chose. RuneScape’s real game was the act of striving to improve oneself.

Why 2009?

player count graph

This data shows peak player population count by month since 2013. It’s only available as far back as February 2013 when the game was already mostly dead. I remember that the player population was consistently around 200k in the years prior to this data. (source)

I was glued to RuneScape from 2008-2013. To me, early-2010 was the game’s peak. The state of the game started to go downhill fast after this point the game’s developer introduced a number of controversial game alterations. Allow me to go off now about some of them.

  1. A complete overhaul of the combat system was introduced to change the core fighting mechanics of the game to resemble other similar games like World of Warcraft. In general it was such a drastic change that nobody could recognize it as the same anymore. Its initial release was a blunder so no new players found it interesting either. If any one update really killed the game, it was this one.
  2. Absurd in-your-face microtransactions taking the form of an in-game popup of a Goblin that would squeal whenever you logged in. It broke a golden rule of gaming microtransactions by offering game benefits that were not purely cosmetic, i.e. you could effectively purchase experience points too.
  3. Updates were introduced to make earning experience easier, diminishing the sense of accomplishment of players who had previously trained the hard way. For me, the introduction of the Runespan turned the Runecrafting skill from one of the hardest to train to one the easiest.
  4. A new minigame was implemented as a “skill” for the sake of having a new skill. It had little impact on anything else outside of the minigame itself. It could not be trained alone, meaning group finding had to be done on specific servers where people could be found. A lot of players recognized this was a nonsense skill.
  5. A huge graphical overhaul lost the spirit of the original game. The game had been modified so heavily by this point that this overhaul was the nail in the coffin for players like me to never come back to a now unrecognizable game. In particular, I felt the increased render distance made the game world feel cluttered and much smaller.

The game rapidly lost players and most, including myself, were gone by 2013. The direction of the game was clearly being led by people that did not understand themselves what made the game popular in the first place.

I discovered more recently that the game’s original creators sold their stake in the company by 2010 to an investment firm. Like with many other things, private equity influence likely had everything to do with ruining it.

The new version was so disliked that it never recovered its player count, leading the developer to release a separate 2007-archived “Old School” server which rolled-back all of the changes I mentioned. It has ironically overtaken the actual game in popularity. I couldn’t get into this version either because I did not want to start from zero again and the 2007 roll-back target was a bit too outdated for my taste.

how this came to be

How This Came to Be

Fast forward one decade.

Out of nowhere, I discovered discussion about the 2009scape project. 2009scape is a group of people apparently just like me who agree that the 2009-ish era was the peak of the game, and are working on restoring it to full-functionality.

The maintainers host a public server but state in the README that they will not provide support to others wanting to host one themselves, presumably and understandably because their primary goal right now is restoration.

There’s documentation describing how to start a development server locally but nothing on hosting a public one. The instructions are clearly geared toward developer contributors but this should be close enough. Let’s try it!

Server Setup

I started at the README which provides some basic information.

However, I didn’t see anything about server system requirements such as memory, disk space, or what ports need to be opened. I also couldn’t tell how to connect to a server after it’s launched. We’ll have to figure those out as we go.

Launching

Since my home servers are not available to me, I opted to use AWS once again to set up the server.

I started by ballparking it using a t3.medium AWS EC2 instance since we have no known system requirements. A t3.medium provides 2 vCPUs and 4GB memory. I also added a 15GB storage volume. I’m hoping this would be sufficient without having to pay for more powerful instances. I’m using a default Ubuntu 22 image.

With the server launched, I did the usual system package upgrade, plus installation of the tools and dependencies I know are needed.

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install git git-lfs openjdk-11-jdk

Compiling

Next, I’ll git clone the project to bring the code aboard the server. The project ships with a start script, so I’ll just run that now and see what happens.

$ git clone https://gitlab.com/2009scape/2009scape
$ cd 2009scape/
$ ./run

🦣 By the way, I learned here if you have git-lfs installed when you run git clone, it will pull LFS objects at clone time. Alternatively, if you try to clone without git-lfs installed, you have to manually do the git lfs pull after.

Executing ./run launched a compilation process. I let it hum silently for 18 minutes, before it exited with an out-of-memory error.

[INFO] BUILD FAILURE                                                                       
[INFO] ------------------------------------------------------------------------            
[INFO] Total time:  17:45 min                                                              
[INFO] Finished at: 2023-07-08T02:35:27Z                                                   
[INFO] ------------------------------------------------------------------------            
[ERROR] Failed to execute goal org.jetbrains.kotlin:kotlin-maven-plugin:1.8.20:compile (compile) on project server: Compilation failure                                               
[ERROR] java.lang.OutOfMemoryError: Java heap space

I relaunch on a more powerful instance type, t3.xlarge in response. This increase will double my CPU count to 4 and quadruple my memory to 16GB. After restarting everything again, the compile finished in about five minutes.

[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  05:46 min
[INFO] Finished at: 2023-07-08T03:01:42Z
[INFO] ------------------------------------------------------------------------
...
[03:02:53]: [Server] Starting networking...
[03:02:53]: [Server] 2009scape flags GameSettings [name=2009scape, debug=true, devMode=true, gui=false, worldId=1]
[03:02:53]: [Server] 2009scape started in 70998 milliseconds.

I note the completed process increased the size of the project directory.

ubuntu@ip-172-31-31-27:~$ du -h -d 0 2009scape/
901M	2009scape/

Scale Down

The t3.xlarge server type I relaunched to finish compiling on is prohibitively expensive to run to experience some nostalgia ($121/month), so the next thing I did was check what server resources it was consuming post-compilation to see what actual utilization looks like.

ubuntu@ip-172-31-31-27:~$ top
top - 03:08:38 up 18 min,  2 users,  load average: 0.36, 0.78, 0.75
Tasks: 121 total,   1 running, 120 sleeping,   0 stopped,   0 zombie
%Cpu(s):  6.4 us,  0.0 sy,  0.0 ni, 92.5 id,  0.0 wa,  0.0 hi,  0.0 si,  1.1 st
MiB Mem :  15803.1 total,  12668.3 free,   2206.9 used,    927.8 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  13305.1 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND             
   1084 ubuntu    20   0 7882988   2.0g  28628 S  29.9  12.8   2:16.25 java

Above, top displays enough information to inform a decision:

  1. The %CPU (based on one CPU) and %MEM being used by the Java process at this moment.
  2. There is one running task. 92.5 id indicates the processor is spending almost all of its time idling.
  3. We have 13305.1 MiB (about 13 gigabytes) of available memory.

These findings show that I can safely scale back down the server’s resources by at least half. I finish server setup by relaunching it on a t3.medium.

Launcher Configuration

Back on my Windows desktop, I found by chance (because I was fascinated by the project’s throwback site UI) the 2009scape Game Guide, which contained player-oriented instructions that seemed relevant.

A fascinating recreation of the 2009 RuneScape homepage.

The remaining problem is to figure out how to make it connect to my server.

The launcher asked me to point it to the location of the installed JDK 11 java.exe, plus a directory to install the game.

Saradomin launcher

Java executable locationC:\Program Files\Eclipse Adoptium\jdk-11.0.18.10-hotspot\bin\java.exe
2009scape installation directoryC:\Users\kenel\2009scape (default set)

The last thing the launcher needed was a server profile which was default set to Stable server, which I can only assume was the maintainers’ hosted public server. The guide says “make sure you don’t change the server profile”, so I departed from the instructions at this point.

Custom Server Profile

config.json

While snooping around in the default 2009scape installation location (C:\Users\kenel\2009scape), I found a config.json file that appears to contain exactly what I’m looking for.

{
  "ip_management": "localhost",
  "ip_address": "localhost",
  "world": 1,
  "server_port": 43594,
  "wl_port": 43595,
  "js5_port": 43595,
  "ui_scale": 1
}

I expect to be able to connect to whatever we set here, so I switched the profile in the launcher to Local server, then populated the config.json IP address of my server.

{
  "ip_management": "3.144.213.60",
  "ip_address": "3.144.213.60",
  "world": 1,
  "server_port": 43594,
  "wl_port": 43595,
  "js5_port": 43595,
  "ui_scale": 1
}

⚙ This order is significant. You must select “Local server” first, then update the config.json, then save. If you do this out of order, the launcher will overwrite your config in the background back to its default values.

Firewall

port range

As you might have noticed, the config.json also had ports 43594 and 43595 listed by default, so I set them as an ingress range in the server’s Security Group (the firewall for an AWS instance).

Let’s try launching.

first startup

It’s starting up! But there’s one small problem. You can’t tell from the screenshot above, but the window’s UI is tiny on my monitor. I closed the game again and made one more adjustment to the ui_scale option, doubling the value to 2.

{
  "ip_management": "3.144.213.60",
  "ip_address": "3.144.213.60",
  "world": 1,
  "server_port": 43594,
  "wl_port": 43595,
  "js5_port": 43595,
  "ui_scale": 2
}

Logging In

logging in

It works! My new character spawned on “Tutorial Island”, the game’s starting zone, though I discovered 2009scape added some custom options to allow me to skip the tutorial and jump straight into the game world.

The game world is populated by some “Player NPCs” which dress, act, and chat like players to make it not feel so empty. Alright. I’m off to complete Rune Mysteries.

Last Notes

It’s a shame what happened to real RuneScape, but there is some consolation seeing that these old versions were not completely lost to time.

As it would turn out, 2009scape is just one of many projects in a surprisingly large RuneScape preservation community. For example, I passively discovered this discussion about the RS-Archive project, who are trying to save every game version as far back as 2001!

In a way, the community of players from decades past are still active today, just as tech-oriented adults working to preserve a piece of game history.

last screenshot

Shared above is the last screenshot I ever took of my RuneScape character before quitting in 2013. Notably, pinned on the taskbar is WinAmp, a media player which I would eventually use in the first iteration of Cadence in 2017. You can also see CodeBlocks, an IDE I used when first learning to code.

Completed Guide

Here’s everything learned distilled to a short tutorial. If you’re setting up the server and want to invite your friends to log on, have them follow the “Launcher Configuration” instructions below.

Server Preparation

  1. Prepare an Ubuntu Linux server with 16 GB memory, and at least 1.4 GB additional disk storage free. The system may be scaled down to 4 GB memory after the game server is compiled.
  2. Additionally, open the server’s ingress to range 43594-43595 over TCP.
  3. Install dependencies and compile the project.
$ sudo apt update
$ sudo apt install git git-lfs openjdk-11-jdk
$ git clone https://gitlab.com/2009scape/2009scape
$ cd 2009scape/
$ ./run

Launcher Configuration

  1. Install JDK 11 and the Saradomin Launcher.
  2. Run the launcher and set configuration locations. Yours may vary.
    1. Java executable location — Set to the java.exe path of where your JDK 11 was installed to. Mine was C:\Program Files\Eclipse Adoptium\jdk-11.0.18.10-hotspot\bin\java.exe
    2. 2009scape installation directory — The default value will be C:\Users\<USER>\2009scape. Mine is C:\Users\kenel\2009scape
    3. Server profile — Be sure to select “Local config” first before continuing.
  3. Edit the config.json file in your 2009scape installation directory.
    1. Change the value of ip_management and ip_address to the public IP address or DNS name of your server.
    2. Optionally, adjust the ui_scale. You can come back to this later to your preference as necessary.
    3. Save your changes.
  4. Click Play.