Der dedizierte Quake3 Server

Aus Gargi.org
Zur Navigation springen Zur Suche springen

logo

Logo Phantasie

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.

orbi

Quake3 Gladiator aus dem Kugelschreiber

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


Launcher

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:

  1. Einmal am Tag prüfen, ob eine neue Version vorhanden
  2. Falls ja, neue Quellen herunterladen und kompilieren
  3. Alte Dateien mit den neuen ersetzen und ioQuake 3 Server neu starten
  4. Neue Dateien als tar.gz Paket zusammenpacken und in ein eigenes Verzeichnis kopieren
  5. 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