Компиляция и настройка сервера mangos для клиента 3.3.5a из git репозиториев

On: 12 июля 2011 г.

По теме компиляции и администрирования сервера mangos для ОС GNU/Linux в интернете куча обрывков информации и старых статей на форумах по тематики World of Warcraft. Но на дворе июнь месяц 2011 года и эта информация местами устарела. Вот почему я собственно решил после успешной установки сервера mangos на Archlinux описать весь процесс установки плюс как всегда разбавить инструкцию описаниями и разъяснениями.
Если вы читая эти строки еще не знаете что такое mangos тогда прошу ознакомиться с http://ru.wikipedia.org/wiki/MaNGOS. Основные интернет ресурсы которые вам пригодятся:

http://getmangos.com/ Сайт фундации проекта
http://ru-mangos.ru/ Русское сообщество MaNGOS
http://ytdb.ru/ Команда разрабатывающая и исправляющая базу данных для сервера mangos
http://wowjp.net/ портал игры World of Warcraft (богат на информацию о решении проблем и имеет ссылки на готовые релизы баз данных и много чего интересного и полезного)

Остальные ресурсы думаю при установки и посещать не надо, а в дальнейшем вы сами их найдете.

Состав сервера:

Сам сервер это mangos. Базы данных (их скелеты). Базы заселения это базы игрового мира с багфиксами. Карты игрового мира. Сценарии специфического поведения персонажей которыми управляет сервер.
Если mangos, скелет баз данных и сценарии поведения (ScriptDev2) вы скачаете сразу автоматически из репозиториев то остальное необходимо будет доставать из посторонних источников. Прямые ссылки на базы заселение YTDB и обновления к ним можно найти здесь, а в действительности их выкладывают на ytdb.ru (но увы что бы пройти регистрацию на сайте необходимо ответить на небольшой тест, который я провалил). Карты же извлекаются из клиента игры с помощью экстрактора карт. Он присутствует в репозитории с мангосом но собирать его из исходников под Windows я не захотел потому и нашел выход искать его скомпилированный отдельно и мне повезло его найти очень просто.
Да и к всему этому бардаку предлагается патчи, дополнения и так далее. Эта статья не о них а о сборке и запуске мангоса на линуксе.

Насколько я понял на момент написания этой статьи основной репозиторий проекта mangos расположен на github-е (git://github.com/mangos/mangos.git). Как по мне это удачный выбор). Наверное самое простое в этой всей затее это получение клона репозиториев. Создаем любую удобную папку и в ней прописываем:

$ git clone git://github.com/mangos/mangos.git

либо папку можно не создавать а указать при получении клона (пусть это будет каталог mangos)

$ git clone git://github.com/mangos/mangos.git mangos

Переходим в него

$ cd mangos

Далее необходимо создать каталог для сценариев управления персонажами (NPC). Напомню что я выбрал сценарии ScriptDev2:

$ mkdir src/bindings/ScriptDev2

Получаем их из репозитория

$ git clone git://github.com/scriptdev2/scriptdev2.git src/bindings/ScriptDev2

Накатываем патч сценариев на сам мангос

$ git apply src/bindings/ScriptDev2/patches/MaNGOS-*-ScriptDev2.patch

Здесь я указал звездочку потому мы же точно не знаем какая версия скачалась. Но дело в том что лучше проверить какие патчи лежат в каталоге src/bindings/ScriptDev2/patches/. А звездочку можно использовать если вы уверенны что там лежит всего один патч.
И так дамы и господа исходники у нас в руках и можно приступать к таинствам компилирования))).
А перед этим поговорим об инструментах для сборки mangos-сервера. На многих сайтах указаны цепочки зависимостей. Например:

  • GCC >= 4.0 ( gcc / g++ / cpp / fort77 / g77 / gpp)
  • CMake >= 2.8
  • glibc & glibc-dev(glibc headers) [ libc6 ]
  • make
  • mysql-client 4.1 или 5.x
  • libtool
  • OpenSSL (libssl-dev)
  • zlib/libz
  • libmysqlclient-dev

При желании (экономит время компиляции):
  • ACE >= 5.6.3
  • TBB
ACE
для Debian:
ace-netsvcs

для Archlinux:
из AUR

TBB
для Debian:
libtbb-dev

для Archlinux:
ставил без него

Если честно то они у меня и так стояли в системе потому у меня не было возможности проверить их влияние на сбору.

В действительности ничего сложно только вот этот пункт всегда описан мутновато. В интернете почти везде остались упоминания о старых примерах с использованием autoreconf и configure вот они с толку то и сбивают. Самое главное это офф вики http://getmangos.com/wiki/Compile_MaNGOS_On_Linux. Но и тут есть свое но. О нем позже.
Создаем где либо (лучше в папке куда вы качали репозиторий мангоса у меня это mangos) любую папку. Например build:

$ mkdir build

Переходим в нее

$ cd build
И так настало время запустить cmake для компиляции. И вот тут появляется подводный камень. Везде поголовно указана такая строка

$ cmake ../ -DPREFIX=/opt/mangos -DPCH=1 -DACE_USE_EXTERNAL=1 -DDEBUG=0 -DTBB_USE_EXTERNAL=0


Так вот сейчас мы не рассматриваем опции. Обратите внимание на то что каталог с исходниками указывается каталогом выше (двоеточие это ссылка на родительский каталог текущей папки). И это не главное главное то что она идет перед опциями. Но как только вы запустите такую команду cmake заругается:

СMake Error at CMakeLists.txt:33 (message):
This project requires an out of source build. Remove the file
'CMakeCache.txt' found in this directory before continuing, create a
separate build directory and run 'cmake <srcs> [options]' from there.


И здесь тоже нет решения проблемы. Но если разобраться то каталог с исходниками должен указываться после опций:

$ cmake -DPREFIX=/usr/local/mangos -DPCH=1 -DACE_USE_EXTERNAL=1 -DDEBUG=0 -DTBB_USE_EXTERNAL=0 ../

DPREFIX - каталог где будут храниться исходники на сервере. Можете выбрать любой. На этой стадии это просто конфигурации, а не физический перенос файлов.
DACE_USE_EXTERNAL - если указан 1 то ACE будет использоваться из системы (должен быть установленным) либо 0 использовать ACE, который идет вместе с исходниками мангоса. Если указана 1 то вроде как бы говорят что компиляция должна быть быстрее, но если вы нехочите возиться с сборкой еще и ACE то выбирайте как и я 0

DTBB_USE_EXTERNAL
- да та же ботва как и с DACE_USE_EXTERNAL.
Как только начнется процесс компиляции можете расслабиться у меня это заняло окало часа (это было ночью и время я не засекал потому может и меньше но ожидание вроде как длилось долго). В случае возникновения ошибок попробуйте поискать ответ в интернете. Можете спросить у меня. Но я увы не такой и специалист в mangos-е, потому чем смогу тем помогу.

Для Debian squeeze на архитектуре amd64 мне пришлось выполнять:

$ cmake -DPREFIX=/usr/local/mangos -DPCH=1 -DACE_USE_EXTERNAL=1 -DDEBUG=0 -DTBB_USE_EXTERNAL=1 ../
После завершения конфигурации с помощью cmake необходимо выполнить сборку с помощью make:
Для тех кто в танке это делается так:

$ make
Собственно mangos мы собрали но он лежит в папке сборки. Если вы анархист и вам начхать на чистоту файловой системы то можете лупить:

$ make install
Но если вам не безразличен порядок тогда предлагаю вам собрать пакет для вашего дистрибутива. Как это делается описывать для каждого дистрибутива я не буду.

Для Archlinux я переписал старый PKGBUILD файл:

pkgname=mangos
pkgver=12340
pkgrel=1
pkgdesc=""
arch=('i686' 'x86_64')
url="http://getmangos.com"
license=('GPL')
depends=('mysql' 'openssl' 'libmysqlclient' 'ace')
makedepends=('git')
options=('libtool')
source=()
md5sums=()
#generate with 'makepkg -g'

_gitroot="git://github.com/mangos/mangos.git"
_gitname="mangos"

_ScriptDev2root="git://github.com/scriptdev2/scriptdev2.git"
_ScriptDev2name="src/bindings/ScriptDev2"

_ScriptDev2patch="src/bindings/ScriptDev2/patches/MaNGOS-*-ScriptDev2.patch"

build() {
  cd "$srcdir"
  msg "Connecting to GIT server...."

  if [ -d "$_gitname" ] ; then
    cd "$_gitname" && git pull origin
    msg "The local files are updated."
  else
    git clone "$_gitroot"
  fi

  msg "GIT checkout done or server timeout"
  msg "Starting build process ..."

  rm -rf "$srcdir/$_gitname-build"
  cd "$srcdir/$_gitname"
 
  if [ -d "$_ScriptDev2name" ] ; then
    cd "$_ScriptDev2name" && git pull origin
    msg "The local files are updated."
    cd "$srcdir"
    cd "$_gitname"
  else
    mkdir "$_ScriptDev2name"
    git clone "$_ScriptDev2root" "$_ScriptDev2name"
  fi
 
  git apply $_ScriptDev2patch || return 1
  mkdir "$srcdir/$_gitname/build"
  cd "$srcdir/$_gitname/build"

  #
  # BUILD HERE
  #
  cmake -DPREFIX=/usr/local/mangos -DPCH=0 -DACE_USE_EXTERNAL=1 -DDEBUG=0 -DTBB_USE_EXTERNAL=0 ../ || return 1
 
  make || return 1
  make DESTDIR="$pkgdir/" install
}


Для Debian-а пакет можно собрать так:
Заходим в каталог с собранными файлами (у меня это build в каталоге с клоном репозиториев мангоса) и выполняем:

# make DESTDIR="$любой свободный каталог/" install

Необходимо создать каталог для расположения исходников в фиктивном коне например это каталог с именем mangos (не запутайтесь это не тот каталог который вы использовали раньше. Это пустой каталог)

Потом заходим в него и создаем каталог DEBIAN


# mkdir DEBIAN

И заполняем управляющий файл пакета (без него вы несможете собрать пакет)

# nano DEBIAN/control


С приблезительно таким содержанием:


Package: mangos
Version: 12340-1
Section: misc
Architecture: amd64
Depends: mysql-server, openssl, libmysqlclient-dev, ace-netsvcs, libtbb-dev
Description: Mangos server



Я не указывал сборщика пакета потому при установке и сборке мне сообщают что это не правильно но пакет собиреться всеравно.

После правки управляющего файла можно собирать пакет.

Поднимемся в каталог в котором храниться папка mangos (с бинарниками в фиктивном корнем) и набираем:

# dpkg-deb -b mangos

Полученный пакет конечно же ставим.

Настройка сервера
Теперь первая битва позади и выстрелы орудий не слышны. В нашей системе теперь находиться свежи-установленный mangos. А собственно где он находиться. У меня в /usr/local/mangos (потому все действия внутри этого каталога я буду проводить от имени суперпользователя) у вас не знаю =). В общем вспоминаем какую директорию указывали при сборке с помощью cmake.

Переходим в каталог в который установлен мангос и создаем дополнительные папки в которые поместим извлеченные из клиента карты:

# mkdir maps
# mkdir dbc
# mkdir vmaps
Как я уже говорил ранее экстрактор для карт я не собирал сам, а поискал в интернете вот ссылка по которой я скачал экстрактор. Поиск осуществлял по версии клиента.
Полученный архив распаковываем в каталог с игрой (там должно быть файлов шесть).
После запускаем bat-файл (пробуйте первый попавшийся если не понимаете что делаете, зачастую они различаются настройками экстракции и bat-файлов с другим предназначением я еще с экстрактором не встречал). В каталоге после выполнения появляется дополнительные папки по названию вы поймете какие папки куда копировать в папке сервера.

Следующим пунктом будет создание баз данных необходимых серверу. Эти базы данных находятся в папке с исходниками mangos-а. А если конкретнее они находятся в каталоге sql. Для начала работы с mysql вам необходимо знать пароль пользователя root внутри mysql, а это уже зависит от вашего дистрибутива как вы его задавали или как его поменять если вы его не помните.

Заходим в оболочку mysql:

$ mysql -u root -p

Тут mysql спросит у вас пароль. И после его подтверждения и если пароль верный то вы попадаете в оболочку mysql. Если войти под пользователем root у вас удалось это значит что пароль подходит выходим из оболочки mysql:

mysql>exit;

Теперь перейдем в каталог с исходниками сервера и начнем создавать базы:

$ mysql -u root -p'пароль' < mangos/sql/create_mysql.sql
$ mysql -u root -p'пароль' < src/bindings/ScriptDev2/sql/scriptdev2_create_database.sql
$ mysql -u root -p'пароль' scriptdev2 < src/bindings/ScriptDev2/sql/scriptdev2_create_structure_mysql.sql

и заполнять:

$ mysql -u root -p'пароль' mangos < mangos/sql/mangos.sql
$ mysql -u root -p'пароль' characters < mangos/sql/characters.sql
$ mysql -u root -p'пароль' realmd < mangos/sql/realmd.sql
$ mysql -u root -p'пароль' scriptdev2 < src/bindings/ScriptDev2/sql/scriptdev2_script_full.sql

Изменим реалмлист (настройки сервера):

$ mysql -u mangos -p'mangos'

mysql> USE realmd;
mysql> UPDATE `realmlist` SET `name` = 'название_сервера' , `address` = 'ip адрес сервера' WHERE `id` = '1';
mysql>exit;

ОСТОРОЖНО: имена полей (например name) обрамляются в вот в такие кавычки ` . В противном случае вы получите сообщение об ошибке.
Заметьте что действия я выполняю от имени пользователя mangos владельца базы данных (у меня он mangos с паролем mangos его создает сценарий create_mysql.sql). Это лишний раз проверит его существование и корректность пароля.
Теперь самое время заселить сервер. То есть скачать базу данных игрового мира и залить ее в подготовленные базы данных. Команд которые занимаются поддержкой таких баз полным полно (так люди говорят). В действительности выделяются YTDB и UDB. Как и было уже сказано используем базы заселения YTDB.
Тут дело обстоит так на их сайт http://ytdb.ru/ без прохождения теста фиг пройдешь да и тест мутноватый, а попробовать пройти его можно только один раз в неделю. Как я говорю не сильно то и хотелось. И тут выручил топик http://wowjp.net/forum/33-6950-4. Там я нашел полную последнюю базу заселения YTDB:
Ну скачать и залить ее в базу mangos мало. Структуры новой базы могут не отвечают структурам уже существующим в базах мангоса. Попробуем запустить mangos.
Заходим в указанный вами при компиляции каталог (куда был установлен мангос). Далее
в нем в каталог bin и в разных консолях запускаем:

# ./realmd

и

# ./mangosmd

Возможные ошибки:
mangomd говорить что не существует карт по адресу ./mangos/maps. В точности я ошибки не помню потому извините за краткие реплики о сущности ошибки. Так вот в настройках мангоса в каталоге etc каталога мангоса есть главный файл настроек мангоса . Так вот в нем необходимо указать абсолютный путь к папке мангоса:
Изменяем строку

на строку

Это решит проблему с ошибкой размещения карт и всего прочего.

Следующей ошибкой может быть сообщение типа

2011-01-23 01:52:28 SQL: SELECT required_11058_01_mangos_spell_proc_event FROM db_version LIMIT 1
2011-01-23 01:52:28 query ERROR: Unknown column 'required_11058_01_mangos_spell_proc_event' in 'field list'
2011-01-23 01:52:28 The table `db_version` in your [WORLD] database indicates that this database is out of date!
2011-01-23 01:52:28
2011-01-23 01:52:28 [A] You have: --> `10342_02_mangos_command.sql`
2011-01-23 01:52:28
2011-01-23 01:52:28 [B] You need: --> `11058_01_mangos_spell_proc_event.sql`
2011-01-23 01:52:28
2011-01-23 01:52:28 You must apply all updates after [A] to [B] to use mangos with this database.
2011-01-23 01:52:28 These updates are included in the sql/updates folder.
2011-01-23 01:52:28 Please read the included [README] in sql/updates for instructions on updating.


(Свой текст ошибки не сохранил это пример из интернета)
Так вот mangos ругается что наша новая база оказывается уже старая для него (мы то его ставили из офф репозитория где работа над идет постоянно). Потому как подсказывает нам мангос базу та надо обновить. Как это сделать в интернете "молчат". Как правильно это сделать нашел тут http://forum.zone-game.info/showthread.php?t=5707.

Вкратце:
Необходимо узнать версии баз данных mangos, characters и остальных. В этих базах данных есть таблицы в которых хранятся такие данные. Для базы mangos это таблица db_version, а например для базы characters это characters_db_version. Так вот необходимо узнать номер ревизии с которого надо начинать патчить определенную базу.

В оболочке mysql:

mysql> use mangos;
mysql> select * from db_version;

required_11567_01_mangos_spel


mysql> use characters;
mysql> select * from character_db_version;

required_11620_01_characters_character_equipmentsets

В таблицах о которых я говорил выше присутствует запись начинающаяся на required_ так вот следующие цифры которые идут после этого выражения и есть текущий номер ревизии. Теперь вы знаете что заливать в эту базу необходимо апдейты с номерами ревизий выше текущей и до конца папки sql/updates (это папка к каталоге с исходниками сервера и именно там лежат такие апдейты). Вроде так. Потом запускаем и тестим.

И вот что еще. Необходимо поставить версию реалма:
Делаеться это так
заходим в mysql и пишим значит

mysql> UPDATE `realmd`.`account` SET `expansion`='2'

Что на языке бедуинов означает что реалм мы делаем для "Гнева короля личей" (1 = "Огненый крестовый поход", 0 = обычный). Это влияет на то доступны ли дренеи и кровавые ельфы, доступен ли рыцарь смерти.
Если все запустило путем и вы видите приглашение мангоса (mangos>) Подключайтесь к серверу и тестируйте. На этом моя статья закончена. Сервер установлен, запущен и готов обслуживать клиентов. Если что пишите в комментарии.

Оригинал и более новую версию статьи Вы найдете здесь.

3 коммент. on "Компиляция и настройка сервера mangos для клиента 3.3.5a из git репозиториев"

Анонимный комментирует...

$ cmake ../ -DPREFIX=/opt/mangos -DPCH=1 -DACE_USE_EXTERNAL=1 -DDEBUG=0 -DTBB_USE_EXTERNAL=0
__________________________________

Дает ошибку:

Error at CMakeLists.txt...
...
Please download the ACE...

установил по apt-get install ace-netsvcs

...

Все та же ошибка =(

Анонимный комментирует...

еще нужны заголовка ace
sudo apt-get install libace-dev

Анонимный комментирует...

cmake -DPREFIX=/opt/mangos -DPCH=1 -DACE_USE_EXTERNAL=1 -DDEBUG=0 -DTBB_USE_EXTERNAL=1 ../

Fedora15 - vse ok. 4itajte vnimatel`nee