Der dedizierte Quake3 Server
Prolog
Nachdem id Software den Quelltext ihres Ego-Shooter Quake III Arena im August 2005 (Meldung Golem.de 20.08.2005) freigegeben hat und den größten Teil davon unter die GPL (Wikipedia Link Thema GPL) gesetzt hat, haben sich mittlerweile einige Projekte daran gemacht, den Quellcode weiterhin zu pflegen und gar zu verbessern. Eines dieser Projekte findet sich unter ioquake3 (kurz ioq3) (ioq3 Projektseite), das hier einige neuen Features eingebaut hat und weiterhin den Quellcode verbessert. Einige zusätzlichen Features sind das Implementieren von openAL, was den Sound verbessert, die Implementierung von IPV6, Unterstützung von 64bit Betriebssystemen, Anaglyph stereo rendering für 3D Brillen, verbesserte QVM (Quake Virtual Machine) tools und im Spiel integriertes VOIP. Weitere Neuerungen findet Ihr im Bereich Improvements auf der ioq3 Projektseite.
Der Quellcode des Projekts war ursprünglich auf dem SVN icullus Server hinterlegt, auf dem sich viele Linux Projekte aus dem Spielesektor befinden. Ende 2012 hat man diesen dann auf git umgestellt. Der Quellcode liefert neben dem dedicated Server auch den Windows Client. So kann auf Windows selbst der Quelltext kompiliert werden, oder über einen Crosscompiler (mingw) auf Linux.
Bei der Freigabe des Quellcodes sei folgendes angemerkt: Sämtliche Hooks zum Punkbuster Dienst wurden entfernt, da Punkbuster closed Source ist. D.h. ioquake arbeitet nicht mit dem Punkbuster. Dennoch ist es soweit kompatibel zu den Servern, die online sind und kein Punkbuster verlangen. Ebenso lässt der dedicated ioquake3 Server herkömmliche Quake III Klienten zu. Desweiteren handelt es sich bei den übersetzten Dateien dann um die rein ausführbaren Files. Es wird deshalb das Originalspiel benötigt um zum einen einen CD Key einzugeben und zum anderen die auf der CD befindlichen pak Files zu kopieren. Die pak Datei beinhaltet nicht freigegebenes Material wie die Maps, Sounds, Models, Texturen und so weiter. Erst zusammen mit einer Original CD kann dann ioquake3 gespielt werden.
Auf der CD werdet Ihr die pak0.pk3 als einziges pak File finden. Mittlerweile sind bei dem rund 10 Jahre alten Spiel einige Patches erschienen, die diverse Updates über neu pak Files mitbringen. Damit wir auch alle aktuelle Versionen haben, könnt Ihr die neuen zhusätzlichen pak Files unter folgender URL herunterladen: Updated pak Files. Dazu müsst Ihr die EULA akzeptieren. In dem gepackten Archiv befinden sich dann die pak1.pk3 bis pak8.pk3 die in das baseq3 Verzeichnis der ioquake3 Installation kopiert werden.
Fertige ioquake3 Pakete für Windows, Linux und Mac können hier heruntergeladen werden: ioq3 - get it Link-Text
Zudem halten einige Linuxdistributionen relativ aktuelle Versionen über entsprechende Repositories bereit, die über den jeweiligen Paketmanager der Distribution installiert werden können. Hier müsst Ihr entsprechend nachforschen, welches Repository bei Eurer bevorzugten Distribution verwendet werden muss.
Im Folgenden findet Ihr nun Texte, die sich um einige technische Dinge rund um das ioq3 Projekt drehen und weniger Tipps zum Spiel selbst. Da es hier um weiterführende Themen geht wie das Erstellen eines Servers oder das Kompilieren des Quellcodes auf Linux sei hier angemerkt, dass die Texte für Interessenten mit mittleren bis einwenig besseren Linuxkenntnissen verfasst sind. Ich versuche natürlich alles so detailiert wie möglich zu beschreiben, kann aber leider nicht überall auf die Basics eingehen. Wir werden jetzt einen reinen dedizierten Server auf der Raspberry Pi installieren und betreiben. Von daher solltet Ihr halbwegs fit auf Debian (oder debianähnlichen Systemen wie Ubuntu) sein und wissen, wie man Pakete an der Konsole erstellt und sich auf der Konsole bewegt. Zudem ist es von Vorteil, grundlegendes über Networking unter Linux zu kennen, damit auch ein Connect von außen auf den dedicated Server funktioniert. Wir werden auch den ioquake3 Quellcode verwenden. Dieser läuft auf Raspbian. Wer allerdings Quake3 auch auf dem xserver (Client) spielen möchte, der muss die modifizierten Quellen derzeit nutzen, da diese auf den 3D Grafikchip der Pi optimiert wurden. Dazu gibt es folgendes Tutorial: https://www.raspbian.org/RaspbianQuake3
Fragen hierzu beantworte ich aber immer gerne auf meinem Forum unter http://www.gargi.org
Jetzt wünsche ich Euch viel Vergnügen beim Basteln und Spielen mit dem Quellcode!
Vorbereitung
Wir müssen zuerst einige Pakete installieren, bevor wir loslegen können.
sudo apt-get install git gcc build-essential libsdl1.2-dev devscripts screen
Wir müssen dann ein Arbeitsverzeichnis anlegen. Ich mache das mal unter home:
mkdir /home/work
Nun legen wir noch einen zusätzlichen Nutzer an, dessen home-Verzeichnis wir auch als Serververzeichnis verwenden werden.
adduser gameserver
libsdl2 kompilieren
Die neuen Quellen benötigen libsdl2 zum Kompilieren. Diese werden allerdings nicht als fertige Pakete unter Raspbian angeboten. Deshalb müssen wir die uns selbst bauen. Wechselt in Euer Arbeitsverzeichnis:
cd /home/work
Holt Euch die Quellen unter libsdl Downloads
wget https://www.libsdl.org/release/SDL2-2.0.3.tar.gz
Danach müsst Ihr das Paket umbenennen:
mv SDL2-2.0.3.tar.gz SDL2_2.0.3.tar.gz
Danach wird das Paket entpackt:
tar -xvf libsdl2_2.0.3.tar.gz
Wechselt danach in das neue Verzeichnis
cd SDL2-2.0.3
Startet den Compile:
debuild -uc -us
Es gibt nun eine Menge Fehler wegen nicht installierten Paketen / Abhängigkeiten. Installiert die fehlenden Pakete wie angezeigt nach. z.B.:
apt-get dh-autoreconf libpulse-dev libxcursor-dev libxi-dev libxinerama-dev libxrandr-dev libxss-dev libxt-dev libxxf86vm-dev
Danach nochmal den Compile sterten. Er sollte nun durchlaufen:
debuild -uc -us
Die fertigen Pakete liegen dann in Eurem Arbeitsverzeichnis. Installiert diese dann:
cd /home/work
dpkg -i libsdl2_2.0.3_armhf.deb
dpkg -i libsdl2-dev_2.0.3_armhf.deb
Den Quake 3 Server bauen und konfigurieren
Wir sind immer noch in unserem Arbeitsverzeichnis /home/work. Dort holen wir uns nun die aktuellen Quellen:
git clone git://github.com/ioquake/ioq3.git quake3
Danach wechseln wir in das Quellverzeichnis:
cd quake3
Der Compile wird wie folgt gestartet:
make -j5 copyfiles
Der Parameter -j5 lastet dann alle 4 Kerne des Raspberry Pi2 aus. Dafür geht der Compile recht schnell von Statten (um die 10 Minuten).
Die Installationsdateien landen somit erstmal alle automatisch in /usr/local/games/quake3
Wir legen nun noch einen Link auf unsere Serverbinärdatei:
ln -s /usr/local/games/quake3/ioq3ded.armvzl /bin/q3ded
Wir wollen nun das Spiel nicht als root ausführen, deswegen haben wir uns einen eigenen User mit einem eigenen Homeverzeichnis dafür angelegt: gameserver
Loggt Euch nun als Euer neuen User gameserver ein und legt in Eurem Homeverzeichnis folgende Verzeichnisse an:
mkdir .q3a
mkdir .q3a/baseq3
Ihr solltet nun Q3A bereits auf Euren Rechner normal installiert und mindestens auf die Version 1.32 gepatcht haben. Kopiert nun von Eurem Desktop Rechner alle *.pk3 Dateien aus dem /baseq3 Verzeichnis auf Euren Server. Hierfür loggt Euch am besten via ftp auf den User gameserver ein und transferiert die pk3s dort hin.
Zum Schluss müsst Ihr noch in Eurem /baseq3 Verzeichnis Eures Servers (im Homeverzeichnis des Users gameserver) eine Konfigurationsdatei anlegen. Diese nennen wir mal server.cfg . Ein gutes Sample findet Ihr unter folgender URL: Quake3 Dedicated Server unter Linux
Ändert entsprechend noch die Bereiche wie Servername, E-Mail etc. ab. Das Sample ist sehr gut dokumentiert wobei dieses fast selbsterklärend ist. Wenn Ihr die Datei angelegt habt können wir eigentlich schon den Server als normaler User starten.
Da Ihr dies sicherlich aus der Konsole heraus tut, startet zu erst screen:
screen
Danach kann der Server gestartet werden:
q3ded +set dedicated 2 +com_hunkMegs 64 +exec server.cfg
Wenn Ihr die Konsole schließt, dann könnt Ihr beim nächsten Einloggen wieder mit einem
screen -R
den laufenden Server wieder aufrufen.
Hinweise:
a) Die Konfigurationsdatei sollten mindesten 4 Buchstaben haben (1234.cfg). Bei nur drei startete der Server bei mir nicht richtig
b) Folgende Ports müssen auf einem internen Server freigegeben sein:
- UDP IN: 27960
- UDP OUT: 27950 und 27960
- Router auf internen Server: UDP IN 27960 -> IP interner Server
Startscript und ein init Script schreiben
Wie wollen nun, dass Quake 3 automatisch gestartet wird, wenn der Server bootet. Dazu legen wir uns erstmal ein Startscript an:
nano /usr/local/bin/q3serverstart
Das füllen wir mit folgendem Inhalt:
#!/bin/sh
pkill -u gameserver
su gameserver -c 'screen -d -m q3ded +set dedicated 2 +com_hunkMegs 64 +exec server.cfg'
Macht das Skript ausführbar:
chmod +x /usr/local/bin/q3serverstart
Testet das Script, indem Ihr es startet:
q3serverstart
Ein htop sollte Auskunft geben, ob der Server läuft.
Danach bauen wir uns das init Script:
nano /etc/init.d/q3ded
Dieses füllt wie folgt:
#!/bin/sh
### BEGIN INIT INFO
# Provides: dedicated q3server start
# Required-Start: $remote_fs $syslog $network $firewall
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: q3serverstart initscript
# Description: Custom quake3start, placed in /etc/init.d.
# script written by Gargi 2015 http://www.gargi.org
### END INIT INFO
#needed modules
case "$1" in
start)
pkill -u gameserver
/usr/local/bin/q3serverstart
echo "Starting Quake3 server ... ready to frag"
;;
stop)
pkill -u quaker
echo "Quake3 Server stopped. "
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage $0 {start|stop|restart}"
;;
esac
Auch das Skript braucht den x-Flag, damit es startet:
chmod +x /etc/init.d/q3ded
Ihr könnt nun mit einem
/etc/init.d/q3ded start
den Server starten, oder wie folgt stoppen:
/etc/init.d/q3ded stop
Damit das Skript auch beim Starten der Maschine hochgefahren wird, gebt noch folgenden Befehl ein:
cd /etc/init.d
update-rc.d q3ded defaults
Damit ist der Quake 3 Server ein ganz normaler Dienst auf Eurem Server.
Buildscript für den Quake 3 Server
Damit Ihr nicht jedes Mal selbst nachsehen müsst, ob eine neue Version zum Kompilieren vorliegt, habe ich mir ein kleines Skript gebaut, dass folgendes macht:
- Einmal am Tag prüfen, ob eine neue Version vorhanden
- Falls ja, neue Quellen herunterladen und kompilieren
- Alte Dateien mit den neuen ersetzen und ioQuake 3 Server neu starten
- Neue Dateien als tar.gz Paket zusammenpacken und in ein eigenes Verzeichnis kopieren
- Mail versenden mit einen Hinweis über eine neue ioQuake 3 Version
Legt eine neue Datei an:
nano /usr/local/bin/q3check
Hier nun der Inhalt, den Ihr einkopiert und die Variablen im Kopf entsprechend bitte anpasst:
#!/bin/bash
#script written by Gargi 2015 http://www.gargi.org
quakeuser=gameserver // Der User, der den Quakeserver startet.
work_dir=/home/work // Euer Arbeitsverzeichnis
files=/home/gameserver/files // Das Verzeichnis, in dem das tar.gz Paket kopiert wird
fileuser=gameserver // User, der auf das Paket zugreifen darf
server_cfg=server.cfg // Name Eurer Q3 Serverkonfiguration
mailadresse=meine@mail.adresse // Eure E-mail Adresse
madeat=$(date +%Y_%m_%d)
#before doing anything check server availability
ping -c 1 github.com
if [ $? != 0 ]; then
echo "Server down, stopping now!"
exit 1
else
#prepare version.txt
rm $work_dir/version_alt.txt
mv $work_dir/version.txt $work_dir/version_alt.txt
#get latest files
cd $work_dir
rm -R quake3
git clone git://github.com/ioquake/ioq3.git quake3
#write new version.txt
cd $work_dir/quake3
git show | grep -m 1 commit | cut -b 8-14 > $work_dir/version.txt
#check if something is to be done
ver_neu=$(cat $work_dir/version.txt)
ver_alt=$(cat $work_dir/version_alt.txt)
if [ $ver_neu = $ver_alt ]; then
rm $work_dir/aktuell.txt
rm $work_dir/unveraendert.txt
echo "Version $ver_neu unverändert" > $work_dir/unveraendert.txt
exit 1
else
rm $work_dir/aktuell.txt
rm $work_dir/unveraendert.txt
echo "Version $ver_neu neu, beginne compile" > $work_dir/aktuell.txt
#build new linux version
pkill -u $quakeuser
rm -R /usr/local/games/quake3
make -j5 copyfiles
#built date reminder
rm $work_dir/built.txt
date +%d.%m.%Y > $work_dir/built.txt
#server start
su $quakeuser -c 'screen -d -m q3ded +set dedicated 2 +com_hunkMegs 64 +exec $server_cfg'
#upload installpackage
cd /usr/local/games
tar cf ioq3_git-$ver_neu.$madeat.tar .
gzip ioq3_git-$ver_neu.$madeat.tar
cp ioq3_git-$ver_neu.$madeat.tar.gz /$files/
chown $fileuser:$fileuser /$files/ioq3_git-*.tar.gz
rm /usr/local/games/*.gz
#call the boss
rm /var/log/quakeready.log
echo "Sir, your Quake is ready! New version is git-$ver_neu . Server is up and running!" > /var/log/quakeready.log
mail -s "Your Quake is ready!" $mailadresse < /var/log/quakeready.log
fi
fi
Nach dem Speichern machen wir die Datei noch ausführbar:
chmod +x /usr/local/bin/q3check
Jetzt legt noch in der crontab fest, wann das Skript starten soll:
crontab -e
Am Schluss fügt folgendes ein:
# Check for new Quakefiles at 6 o clock morning
1 6 * * * /usr/local/bin/q3check > /dev/null
Speichert die Änderung.
Happy Quaking!
Links
ioquake3 Projekt Seite
Pro-Linux - Quake 3 Arena Server
Simple DirectMedia Layer (SDL)
Debian Linux
Pierre "Gargi" Kretschmer