2008-04-10

Самосборный сервер WoW под Linux (и не только)

Запускать сервер будет ManGOS, собирать конечно же из SVN
Нам понадобится:

  1. gcc
  2. make
  3. automake
  4. autoconf
  5. libtool
  6. openssl
  7. libssl-dev
  8. mysql-server
  9. mysql-client
  10. libmysql++-dev
  11. zlib
  12. subversion
  13. unrar
  14. screen
не забываем установить и запомнить root-пароль к MySQL
Все это без проблем ставится из репозитория.

Для выковыривания ресурсов понадобится:
  • Клиент WoW текущей версии (посмотреть поддерживаемую можно на сайте сервера http://mangosproject.org )
  • Для распаковки DBC потребуется утилита WinMPQ http://wow.curse.com/downloads/details/4454/
  • Для распаковки карт утилита ad.exe (обязательно свежая!) https://mangos.svn.sourceforge.net/svnroot/mangos/trunk/contrib/map_extractor/ad.exe
  • Утилиты для выковыривания и сборки vmap (https://mangos.svn.sourceforge.net/svnroot/mangos/trunk/contrib/vmap_assembler/ )
Ну и последнее, что нам понадобится - это база NPC. Я предпочитаю UDB. (http://udbforums.org)
Теперь можно приступать.

= Сборка сервера =


все делаем под пользователем

пишем небольшой скриптик для получения свежих исходников ManGOS и ScriptDev2

обычно нужные исходники получаются так:
$ svn checkout https://mangos.svn.sourceforge.net/svnroot/mangos/trunk mangos
$ svn checkout https://scriptdev2.svn.sourceforge.net/svnroot/scriptdev2 mangos/src/bindings/ScriptDev2


Соб-сно сборка:

$ cd ~/mangos
$ patch -p0 <src/bindings/ScriptDev2/patches/MaNGOS-r5049-Scriptdev2.patch


(необходимо использовать самую старшую версию патча)

$ autoreconf --install --force
$ ./configure --prefix=/opt/mangos

Если что-то нехватает - доставляем, после успешного конфигурения
$ make
$ sudo mkdir -p /opt/mangos
Сделаем себя владельцем папки
$ sudo chown [user].[usergroup] /opt/mangos
установка
$ make install

ScriptDev2 - это мозги для боссов и охраны городов, без него боссы ведут себя как обычные статисты.

= Выковыривание ресурсов =


Сразу оговорюсь, у меня нет проблем с использованием Windows, но все упомянутые утилиты без проблем работают через wine

maps:
копируем ad.exe в папку с WoW, создаем папку maps (там же, в папке с клиентом) из запускаем ad.exe

dbc:
создаем папку dbc,
запускаем WinMPQ (для тех, кто запускает из-под wine, учтите что она использует GUI)
открываем файл WoW/Data/*lang*/locale-*lang*.MPQ (вместо * свой язык)
выделяем файлы начинающиеся с DBCFilesClient и сохраняем их (Extract) в созданную папку dbc
Если версия клиента заканчивается не на 0 (напр 2.3.3) -
достаем DBC из патчей: точно так же, но (обязательно!) соблюдая порядок обрабатываем файлы
patch-*lang*.MPQ [и patch-*lang*-2.MPQ], сохраняя DBC в ту же папку с заменой более старых. Повторюсь, очередность соблюдать обязательно, и обрабатывать патчи в порядке возрастания их номеров.


vmaps (необязательно):
запускаем makevmaps_SIMPLE.bat правильно отвечаем на все вопросы и долго ждём.

копируем на сервер все полученные ресурсы
WoW/maps в /opt/mangos/data/maps
dbc в /opt/mangos/data/dbc
WoW/vmap/vmaps в /opt/mangos/data/vmaps

= Подготовка базы данных =

прежде чем выполнять команды дочитайте абзац до конца!

Для первой установки все просто:
запускаем скрипты:
  • create_mysql.sql
  • characters.sql
  • mangos.sql
  • realmd.sql
из папки /opt/mangos/share/mangos/sql
$ cd /opt/mangos/share/mangos/sql
$ mysql -uroot -p < create_mysql.sql
$ mysql -uroot -p characters < characters.sql
$ mysql -uroot -p mangos <mangos.sql
$ mysql -uroot -p realmd < realmd.sql
из папки
/opt/mangos/share/scriptdev2/sql/
  • create_database.sql
  • mangos_additional_req.sql
  • mangos_full_scripts.sql
  • scriptdev2_structure.sql

$ mysql -uroot -p < create_database.sql
$ mysql -uroot -p < scriptdev2_structure.sql
$ mysql -uroot -p < mangos_additional_req.sql
$ mysql -uroot -p < mangos_full_scripts.sql


распаковываем базу NPC
$ unrar x UDB_0.9.2_Core_5242_SD2_259.rar
$ mysql -uroot -p mangos < udb_0.9.2_core_5242_sd2_259.sql
Версия может отличаться (и отличается уже на момент написания статьи). Если версия базы и сервера отличаются,
то для полного щастья (и безошибочного импорта базы)
нужно получить ВСЕ SQL-скрипты нужной ревизии! База ManGOS обновляется настолько часто и непредсказуемо, что гарантировать успех импорта более 60 мегабайт данных можно только при условии совпадения версий.
Способ получений нужной ревизии был уже описан выше, SQL скрипты хранятся в папке trunk/sql
Собно её-то мы и получим нужной версии:

для "чистоты эксперемента"
скопируем папку sql из исходников ManGOSа куда-нибудь
$ cp -R sql ~/sql
$ cd ~/sql
$ svn up -r НОМЕР_РЕВИЗИИ sql
точно также нужно поступить с SD2 скриптами (они храняться в папке src/bindings/ScriptDev2/sql ), действия такие же,
поэтому описывать не буду ;)


Теперь мы имеем SQL-скрипты нужной версии, выполняем действия описанные выше, теперь необходимо обновить базу
для совместимости с текущей версией сервера. В папке /opt/mangos/share/mangos/sql/updates/ и /opt/mangos/share/scriptdev2/sql/updates/ есть все необходимое для этого.
Поясню немного,
в папке updates файлы вида:
5445_mangos_spell_affect.sql
Его нужно (обязательно!) применять для обновления базы mangos до ревизии 5445 и выше. А конкретно - он исправляет (добавляет, удаляет) таблицу spell_affect
без наложения данного патча (скрипта) сервер ругнётся на несовместимость этой таблицы при запуске и вывалится.
Применять нужно все скрипты, номер которых больше установленной базы.
Если Вы получали (например) базу версии 5242, то необходимо установить все патчи номер которых больше 5242
применяются они стандартно:

$ mysql -uroot -p DB < PATCH.sql

где DB - база данных, которую правит патч, (mangos, characters, realmd или scriptdev2) повторюсь, название патча в последнее время состоит из
[ревизии в которой он появился]_[базы к которой нужно применить]_[таблицы которую он исправляет].sql
названия апдейтов к SD2 отличаются, но смысл у них тот же, и применять их также необходимо.


после наложения все патчей на базу можно приступать к конфигурации сервера

= Конфигурация ManGOS =

все конфигурационные файлы хранятся в папке /opt/mangos/etc/
собсно их 3
mangos.conf - основной конфиг
realmd.conf - конфиг реалмд (авторизационного сервера)
scriptdev2.conf - конфиг SD2, как несложно догадаться

в последних двух необходимо уточнить данных MySQL сервера, А
в mangos.conf
нужно включить vmaps
vmap.enableLOS = 1
vmap.enableHeight = 1

по желанию поменять порт, bind-ip, ну и конечно же рейты. Конфиг достаточно хорошо документирован и проблем возникнуть не должно,
Замечу, что желательно отключить WorldLog
WorldLogFile = ""
т.к. он у меня (и не только) за несколько часов разрастался до фантастических (в несколько Гб) размеров

последний шаг, обновление реамлиста:
$ mysql -u root -p realmd -e "UPDATE realmlist SET name='[Название реалма]', address='[IP или DNS адрес World-сервера]' WHERE id=1"

= Запуск =

теперь можно запускать:
$ cd /opt/mangos/bin/
$ ./mangos-realmd

и на другой консоли:
$ ./mangos-worldd

если все сделано правильно (особенно с базами) - то ошибок быть не должно.

worldd может иногда вываливаться, это его нормальное состояние, поэтому желательно
перезапускать его. Я перепробовал много разных вариантов (с выгриповыванием PIDa по крону в тч),
но остановился на простейшем бесконечном цикле:
worldd.sh:

#!/bin/bash
while [ true ]
do
./mangos-worldd
echo Attempting to restart...
sleep 10
done

по желанию можно доработать, чтобы проверялись флаги.
запускать желательно в screen-сесссии
$ screen -AmdS mangos worldd.sh
после можно соединиться командой
$ screen -x mangos
точно также можно поступить и с realmd, но он достаточно стабилен и на моей памяти ниразу не вываливался, без моего желания.

= Ссылки =
Официальный сайт разработчиков ManGOS
База NPC UDB
Форум разработчиков ScriptDev2



= P.S. =
Для полноценного сервера нехватает только веб-морды для регистрации и контроля игроков.
В качесте онной предлагаю использовать ManGOS MiniManager
Для его работы необходим apache2, libapache2-php5, php5-mysql, конфигурация минимальная, работоспособность проверенная.

Комментариев нет: