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 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.
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.
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 a number of controversial game changes were introduced. Allow me to go off now about some of them.
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 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. Private equity influence, business folks whose top priority was to maximize monetization, likely had everything to do with ruining the game.
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.
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!
I started at the README which provides some basic information.
git lfs
, Git’s “Large File Storage”, is in use too. So in addition to cloning the project, I’ll need to import potentially large amounts of other data to set up the game../run
.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.
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
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 rungit clone
, it will pull LFS objects at clone time. Alternatively, if you try to clone withoutgit-lfs
installed, you have to manually do thegit 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/
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:
%CPU
(based on one CPU) and %MEM
being used by the Java process at this moment.running
task. 92.5 id
indicates the processor is spending almost all of its time idling.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
.
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.
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.
Java executable location | C:\Program Files\Eclipse Adoptium\jdk-11.0.18.10-hotspot\bin\java.exe |
---|---|
2009scape installation directory | C:\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.
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.
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.
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
}
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.
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.
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.
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.
43594-43595
over TCP.$ sudo apt update
$ sudo apt install git git-lfs openjdk-11-jdk
$ git clone https://gitlab.com/2009scape/2009scape
$ cd 2009scape/
$ ./run
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
C:\Users\<USER>\2009scape
. Mine is C:\Users\kenel\2009scape
config.json
file in your 2009scape installation directory.
ip_management
and ip_address
to the public IP address or DNS name of your server.ui_scale
. You can come back to this later to your preference as necessary.