Cmangos mit Ubuntu Server(Linux)

Version 2 – Update: 20.11.2020 – ACHTUNG: bei allen Ubuntu Versionen gibt es momentan Probleme mit dem make.

Ubuntu 20.04 – Fehler – Kann momentan nicht kompiliert werden
Ubuntu 18.04 – Fehler werden hier im Tutorial behoben
DigitalOcean Ubuntu 18.04 – Funktioniert mit diesem Tutorial

Heute starte ich mal wieder was, wo mein Herz für brennen tut. Server Zeugs mit Videospielen und dazu noch mit World of Warcraft Classic. The Burning Crusade Privat Server und Wrath of the Lich King Privat Server werde ich auch noch auf der Seite behandeln. Hierbei geht es nicht darum einen eigenen privaten Server für tausende an Spieler aufzubauen, sondern aus all den Komponenten zu lernen.

Alles was ich hier beschreibe fällt unter Lernen aka Education. Allerdings möchte ich alles dokumentieren und auch für weitere Nerds aufbereiten.

Dies ist eine Abwandlung des auf dem cmangos Git zu findenden Dokument.

In diesem Artikel nehmen wir die Open Source Software C-mangos(Continued – Massive Network Game Object Server Suite) die dazu da ist einen World of Warcraft Server zu emulieren, allerdings auch für eigene Projekte mit Unity oder Unreal genutzt werden kann. In diesem Fall nutze ich den Server für Classic und das ohne Repack. Ich werde also Step by Step alles aufsetzen, von github clonen und compilieren. Das Ganze werde ich auf einem Ubuntu 18.04 Server aufsetzen, da es einfacherer ist, diesen in einer VM laufen zu lassen.

Achtung: Ubuntu 20.04 installiert beim apt install mysql-server die neuere MySQL8 mit einer neueren API, die mit der cMangos Version nicht kompatibel ist.

Vorbereitungen

Ich nutze hierzu Virtualbox 6.1 und eine neue Version von Ubuntu Server 18.04.05.

Nachdem ich den Server installiert habe(Wenn nötig kann ich diese Schritte auch noch dokumentieren) habe ich mich eingeloggt und werde erst mal das System updaten. Dies tue ich noch im VirtualBox Fenster, danach logge ich mich mit putty ein.

(Wärend ein paar make problemen habe ich update und upgrade erst mal weggelassen.)
Hierzu nutze ich:
sudo apt update

Dann:
sudo apt upgrade
Das kann eine Weile dauern.

Achtung: Wer sich nicht mit Linux System auskennt, sollte sich erst damit befassen. Fast alle Befehle sollten mit dem Mangos Nutzer oder einem sudo ausgeführt werden. Wer erst alles mit dem sudo erstellt sollte später mit einem chown den User mangos den Ordnern und Dateien als Besitzer hinzufügen. Dies ist auch einfacher wenn man zB.: WinSCP nutzt um Dateien auf den Server zu transferieren(hochladen).

Alles weitere werde ich mit Putty und OpenSSH(OpenSSH sollte man bei der Installation bereits ausgewählt haben) angehen. Link zu putty folgt.

Mit dem Befehl ifconfig hole ich mir die IP Adresse, das geht nur wenn man in den VirtualBox Config auch die Netzwerkbrücke eingestellt hat. Diese IP Adresse(192.168.xxx.xxx) nutzen wir um uns mit Putty auf den Server zu Verbinden. (Wenn er dies nicht finden sollte, einfach mit sudo apt install net-tools das benötigte Paket installieren)

Nun wird es Zeit die nötige Software zu installieren:

sudo apt-get install build-essential gcc g++ automake git-core autoconf make patch libmysql++-dev libtool libssl-dev grep binutils zlibc libc6 libbz2-dev cmake subversion libboost-all-dev

Mit dem oben aufgeführten Befehl installieren wir die ganze Software die wir brauchen um den cMangos Server zu compilieren und zu installieren. Danach erstellen wir einen neuen Nutzer mit dem Usernamen Mangos.

Mit der neuen Ubuntu Version 20.04 wird bei einem apt install mysql-server die MySQL8 Version installiert. Deswegen installieren wir die MySQL 5.7 separat, da Cmangos mit MySQL8 nicht kompiliert werden kann.

NUR FÜR UBUNTU 20.04: Bitte diese Anleitung nehmen: https://computingforgeeks.com/how-to-install-mysql-on-ubuntu-focal/

Für alle die nun die Ubuntu 18.04 installiert haben:

sudo apt install mariadb-server oder mysql-server(mysql kann zu Problemen führen)

Nur bei MySQL: Kontrolliere die Version mit: mysql –version – Es sollte die 5.7.32 sein

sudo useradd -m -d /home/mangos -c "MaNGOS" -U mangos

Um nun die Repo von Git zu clonen gehen wir in den Ordner home des neu angelegten Nutzers mangos.

cd /home/mangos

Nun ist es soweit, wir holen uns C-Mangos auf unser System. Dies tuen wir mit dem git clone Befehl:

sudo git clone git://github.com/cmangos/mangos-classic.git mangos

Gleich danach holen wir uns die Classic Datenbank mit:

sudo git clone git://github.com/cmangos/classic-db.git

CMangos Compilieren

Wir haben den Nutzer mangos erstellt und mit dem git Befehl die Software auf unser System runtergeladen. Nun sollten wir ein /home/mangos/mangos in unserem System vorfinden. sonst:

cd /home/mangos/mangos

ACHTUNG: 20.11.2020 – Es gibt einen Kompilerfehler bei UnitAI. Diesen kannst du lösen indem du zu diesem Folder gehst:

cd /home/mangos/mangos/src/game/AI/BasicAI

Wir müssen in einer Datei nur eine Kleinigkeit anpassen:

sudo nano UnitAI.h

Hier ergänzen wir

/*
 * This file is part of the CMaNGOS Project. See AUTHORS file for Copyright information
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef MANGOS_UNITAI_H
#define MANGOS_UNITAI_H

#include "Platform/Define.h"
#include "Dynamic/FactoryHolder.h"
#include "Globals/SharedDefines.h"
#include "Dynamic/FactoryHolder.h"
#include "Entities/ObjectGuid.h"
#include "AI/BaseAI/AIDefines.h"

Mit einem einfachen kleinen include: (Füge dies unter das letzte #include ein)

#include <functional>

Dann drücke bitte STRG + O und ENTER. Dann STRG + X.

Wir benötigen nun einen Ordener den wir build nennen. Den erstellen wir mit diesem Befehl:

sudo mkdir build

sudo mkdir run

Nun begeben wir uns in den build Ordner

sudo cd build

Kompiliert Cmake inklusive Extractors und Playerbot, und bereiten diese Optionen für den Compiler vor:

sudo cmake ../ -DCMAKE_INSTALL_PREFIX=\../run -DBUILD_EXTRACTORS=ON -DPCH=1 -DDEBUG=0 -DBUILD_PLAYERBOT=ON

Nun wird Compiliert:(Da wir einen standard Ubuntu mit 1 Core geladen haben in VirtualBox, ohne ein -j. )

sudo make

Wer mehrere Kerne eingestellt hat:

sudo make -j4

Beim make kann ein Fehler auftreten der besagt, dass eine Variable mit dem Namen my_bool nicht deklariert sei. Dies liegt an der installierten Mysql Version. MySQL8 scheint eine erweiterte API anzubieten die hier noch nicht unterstützt wird.

Solltest du diesen Fehler erhalten, dann führe bitte diese Befehle durch und versuche ers nochmal mit mariadb(Bei mir funktioniert es mit mariadb):

  1. sudo apt remove –purge mysql-server
  2. sudo apt purge mysql-server
  3. sudo apt autoremove
  4. sudo apt autoclean
  5. sudo apt remove dbconfig-mysql
  6. sudo apt-get dist-upgrade
  7. sudo apt-get install mariadb-server

Wenn alles ohne Fehler durchläuft, dann können wir weiter:

Nun kopieren wir die compilierten Dateien nach /home/mangos/mangos/run

sudo cp -r /home/mangos/mangos/build/* /home/mangos/mangos/run

Wir bleiben im Build Ordner und lassen das install laufen:

sudo make install

Schnell in den run/etc Ordner:

cd /home/mangos/mangos/run/etc

Damit wir die config files für den Login und WeltServer erstellen können:

cp mangosd.conf.dist mangosd.conf
cp realmd.conf.dist realmd.conf

Datenbank befüllen

Die Datenbank ist in den meisten Fällen schon bereits installiert sonst tut es ein:

sudo apt install mariadb-server oder mysql-server(kann zu problemen führen)

Wenn es kein Password gibt, dann kann man mit einem Befehl gleich in die Datenbank.

sudo mysql

Sollte er den Zugang nicht freigeben, dann kann man einfach den root User freischalten mit:

sudo passwd root

Password eingeben und bestätigen.

Nun mit dem Befehl

su

zum root wechseln und erneut mit mysql versuchen in die Datenbank zu kommen.

Wir erstellen uns auch dann gleich einen neuen Nutzer, der auch von ausserhalb zutritt hat:

CREATE USER 'mangos'@'%' IDENTIFIED BY 'mangos'; 
SET PASSWORD FOR 'mangos'%' = PASSWORD('mangos'); 
GRANT ALL PRIVILEGES ON *.* TO 'mangos'@'%' WITH GRANT OPTION; 
FLUSH PRIVILEGES; 
exit; 

Dann navigieren wir zu cd /etc/mysql/mariadb.conf.d und öffnen die config datei sudo nano 50-server.cnf

Suche nach:

bind-address = 127.0.0.1
und ersetze es durch
bind-address = 0.0.0.0

Wir restarten noch den service mariadb:

service mariadeb restart

Lade dir <a href="https://www.heidisql.com/download.php">Heidisql</a> runter um auf die Datenbank zuzugreifen.

Wir navigieren zu den sql Dateien die mit dem CMangos gekommen sind.

cd /home/mangos/mangos/sql

Ich nutze hierbei meinen ROOT NUTZER. Wenn Ihr einen anderen Nutzer benutzt dann müsst ihr den Befehl leicht umändern

mysql -u mangos -p ...

Wir erstellen die fehlenden Tables und einen neuen Datenbanknutzer(diesen nutze ich auch für externe Zugriffe auf die Datenbank. Wie man die Datenbank flushed für neue Privileges, erkläre ich an dieser Stelle nicht):

Navigiere nun zu:

cd /home/mangos

und führe diesen Befehl aus um die datenbank anzulegen
mysql -uroot < mangos/sql/create/db_create_mysql.sql

Wir laden die Basis in die Datenbank.

mysql -uroot classicmangos < mangos/sql/base/mangos.sql

Dann laden wir die DBCs in die Datenbank. Einfach mit cd in die Folder und dann mit dem bereits benutzten Befehl alle in die Datenbank reinladen.

for sql_file in $(ls mangos/sql/base/dbc/original_data/*.sql); do mysql -uroot --database=classicmangos < $sql_file ; done

und dann nochmal diese

for sql_file in $(ls mangos/sql/base/dbc/cmangos_fixes/*.sql); do mysql -uroot  --database=classicmangos < $sql_file ; done

Nun laden wir die Character in die Datenbank:

mysql -uroot classiccharacters < mangos/sql/base/characters.sql

Und dann kommt wieder ein Befehl der wahrscheinlich einen Fehler verursacht:

mysql -uroot classicrealmd < mangos/sql/base/realmd.sql

Solttest du hier einen Fehler bekommen: line 72 dann musst du in der Datei realmd.sql einen ganzen Block löschen.

Rein in die Datei kommst du mit:

nano mangos/sql/base/realmd.sql

Lösche diesen ganzen Block

Gib den Befehl nochmal ein um die sql in die Datenbank zu laden.

Nun lassen wir ein script laufen um die ganze Welt zum Leben zu erwecken… oder einfach nur um alle Daten in unserer Datenbank zu haben.

Wir gehen in den Ordner in dem wir unsere git clone Classic Datenbank abgelegt haben.

cd /home/mangos/classic-db

nano InstallFullDB.config
(wenn ihr nicht mit dem mangos User drin seid, nicht das sudo vergessen)

Sucht nach dieser Stelle:

## Define the path to your core's folder
##   If set the core updates located under sql/updates/mangos from this mangos-directory will be added automatically
-> CORE_PATH="" <-

Erweitert den CORE_PATH mit dem Ordner in dem das Cmangos liegt

CORE_PATH"/home/mangos/mangos"

Und lassen das Script laufen

./InstallFullDB.sh

Das extrahieren der maps, mmaps, vmaps usw werde ich in einem weiteren Artikel behandeln. Am einfachsten ist es, wenn ihr euch ein Repack mit den Dateien runterladed und diese DBC Daten einfach auf euren Server kopiert.

dbc, maps, vmaps und mmaps gehören in den mangos/run/bin Ordner

Um den Server starten zu können müssen wir erst noch die Konfiguration kopieren

Falls ihr es oben noch nicht gemacht habt und eine Fehlermeldung kommt:

cd /home/mangos/mangos/run/etc
sudo cp mangosd.conf.dist mangos.conf
sudo cp realmd.conf.dist realmd.conf

Du solltest nun Hidisql laufen haben und dich auf dem Mariadb eingeloggt haben. Navigiere zu classicrealmd und wähle realmlist aus. Nun musst du unter address die IP deines Servers angeben… also: 192.168.x.x

Mit ./mangosd und ./realmd startet ihr die beiden Server die ihr braucht. Entweder ihr nutzt 2 mal das Programm putty.exe auf eurem Rechner oder ihr nutzt das von Linux bereitgestellte Screen. Ich werde immer wieder diesen Artikel erweitern und erneuern. Vielleicht werde ich auch ein Video dazu bereitstellen.