Multiplayer Quake III Arena on Linux (client and server)

I made a sort-of-joke the other day about using Quake III Arena as a form of metaverse for decoded.legal meetings.

After all, you can move about, group together with people, talk (admittedly to the whole group, AFAIK) via text chat, and frag people who talk too much or go off topic.

In other words, ideal for most corporate meetings.

And that led me to thinking about actually setting up a multiplayer Quake III environment.

So I did, mainly thanks to the superb ioquake3 Free software Quake engine.

Buying Quake III Arena

While ioquake3 is Free software, some of the files to actually play Quake III are not.

I bought an old CD containing Quake III Arena from eBay, and copied the files from there.

£9 delivered, and it also has Quake III Team Arena on it.

(I understand that one can find the relevant files online, but my understanding is that they are not licensed suitably for that.)

Installing ioquake3 (client)

I installed ioquake3 on an old laptop running Debian, from GNOME’s software GUI, via flatpak.

I started it, so that it would create the directory structure.

I put the game files in ~/.var/app/org.ioquake3.ioquake3/data/baseq3/.

I “registered” it with “aaaaaaaaaaaaaaa”.

And that’s it.

Installing ioquake3 (server)

For the server, I mostly followed these instructions.

I’m using a Raspberry Pi 4, and, with two multiplayers, it has been absolutely fine. I suspect it could cope with a lot more.

I created a new user:

sudo useradd -m -g users -s /bin/bash -d /home/quake3 quake3

and set its password:

sudo passwd quake3

Then I installed the server:

sudo apt install ioquake3-server -y

I switched to my new user

su - quake3

I put the games files (and config files) in /home/quake3/.q3a/baseq3. (I think I could also have used /usr/lib/ioquake3/baseq3.)

I created the config files from the Github example, as a starting point.

I created a simple bash script to run the server (to avoid me having to remember the command):

sudo tee /home/quake3/start_quake_server.sh <<EOF
#!/bin/bash
/usr/lib/ioquake3/ioq3ded +exec server.cfg +exec levels.cfg +exec bots.cfg
EOF

And made it executable:

chmod +x /home/quake3/start_quake_server.sh

I opened the relevant port:

sudo ufw allow in from any to any port 27960 comment 'allow in to quake3'
sudo ufw reload

(Note that this allows in from “any”; in practice, you might want to limit it to a particular VLAN, or even particular machines.)

I ran screen, and then ran the bash script (/home/quake3/start_quake_server.sh).

And I had a running Quake III server.

Connecting to the server

For now, I’ve just specified the server by IP address. I’ve yet to experiment with whether it will cope with a domain name.

I’ve only used IPv4 so far; I might try IPv6 one day, but I am not optimistic.

I’ve also not experimented with enabling automatic download by clients of maps stored on the server.

Tinkering with the game types and levels

I’ve had a bit of a play around with some of the different settings.

CTF (Capture The Flag) requires CTF-specific maps, with a flag in them.

Some of the settings haven’t worked quite the way that I’d thought they would, in terms of frag limits and so on. I’m probably getting something wrong.

Playing with a friend

It works! We’ve done voice via Signal, and then just run around playing Quake III like it is the late 1990s/early 2000s.

Great fun.

Playing Quake III in the browser

I’ve also set up Quake III running in the browser with JavaScript and WebAssembly.

It works (to my surprise) hosted on a Raspberry Pi.

But I haven’t yet managed to get it working for multiplayer mode. I tried switching the supplier .pk3 file with the one from the CD (renaming it in line with the supplied file) and, while it shows that it is loading, it hasn’t worked.

Perhaps I’ll spend some more time on this some point.