Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #123, МАРТ 2009 г.

Наркотик для игроманов. Ставим под Linux популярные игровые сервера

Владимир «turbina» Ляшко (v.turbina@gmail.com)




Ролевая игра World of Warcraft и шутер Call of Duty завоевали миллионы поклонников во всем мире. Увы, чтобы поиграть, на большинстве серверов придется раскошелиться. Бесплатные сервера часто перегружены или попросту недоступны из другого региона. Так почему бы не поднять свой собственный игровой сервачок?

Разделяем и властвуем с мангос

Цель проекта MaNGOS (Massive Network Game Object Server, getmangos.com) – это создание альтернативной реализации сервера WoW. Сегодня доступны версии под Linux, FreeBSD и Windows. Лицензия не позволяет использовать мангос в коммерческих целях и устанавливать публичные серверы на его основе, но никто не запрещает настроить WoW сервер в домашней сети.

Существуют отдельные проекты по наполнению базы данных мангос и написанию скриптов для уникального поведения отдельных NPC. Код MaNGOS является открытым, и энтузиасты предлагают огромное количество патчей, устраняющих те или иные ошибки. Обилие наработок, порядок их установки и прочие тонкости могут сбить с толку любого. Поэтому статья написана в виде пошагового руководства.

Чтобы построить сервер только из свободно распространяемых компонентов, установку будем производить в Ubuntu 8.04 LTS (хотя многое из сказанного актуально и для других Linux-дистрибутивов). Первым делом инсталлируем пакеты, необходимые для получения git/SVN-архивов и сборки приложений. Так как для хранения игрового мира используется MySQL (по умолчанию) или PostgreSQL, ставим соответствующие пакеты. Кроме того, нужны заголовочные файлы OpenSSL и сервера БД.

$ sudo apt-get install libssl-dev mysql-server mysql-client libmysqlclient15-dev
$ sudo apt-get install autoconf automake1.9 libtool build-essential subversion patch zlibc libc6 git git-core zlibc

Создаем рабочий каталог:

$ mkdir source; cd source

Сейчас предстоит сделать первый выбор: ссылки проекта ведут, как минимум, на две версии сервера. На момент написания этих строк в SVN (и git) была версия 0.13, которая поддерживает новую версию клиента 3.0.3 (build 9183) и старого 2.4.3. Стабильный релиз MaNGOS 0.12 поддерживает только 2.4.3 версию клиента. Будем работать с 0.13, но в установке особой разницы нет.
Получаем исходный код:

$ svn co http://svn2.assembla.com/svn/mangos-svn-mirror

Или через git:

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

Теперь нужно скачать расширение ScriptDev2 (sf.net/projects/scriptdev2). Оно обеспечивает работу скриптов, предназначенных для создания игровых объектов, персонажей и квестов:

$ mkdir mangos/src/bindings/ScriptDev2

Название каталога должно быть именно ScriptDev2, никаких scriptdev2 или Scriptdev2! Получаем копию:

$ cd mangos/src/bindings/ScriptDev2
$ svn co https://scriptdev2.svn.sourceforge.net/svnroot/scriptdev2

Патчим:

$ git apply src/bindings/ScriptDev2/patches/MaNGOS-2008-12-22-ScriptDev2.patch

Или по старинке:

$ patch -p0 < src/bindings/ScriptDev2/patches/MaNGOS-r6765-ScriptDev2.patch

При получении файлов через git есть один каверзный момент. Если в каталоге src/bindings лежит файл .gitignore:

$ cat src/bindings/.gitignore
ScriptDev2

– то эту строку нужно закомментировать, иначе ScriptDev2 собираться не будет. Чтобы обновить все файлы для компиляции, вводим:

$ cd ~/source/mangos
$ autoreconf --install --force
$ aclocal
$ autoheader
$ autoconf
$ automake --add-missing
$ automake src/bindings/ScriptDev2/Makefile

Если попытаться сконфигурировать в текущем каталоге, получим ошибку, поэтому:

$ mkdir objdir; cd objdir
$ ./configure --enable-cli --enable-ra

Так мы подключили удаленное администрирование (--enable-ra) и командную консоль (--enable-cli). Чтобы не искать файлы по всем каталогам, можно использовать стандартные ключи '–-prefix', '--sysconfdir' и '--datadir'. Чтобы задействовать базу PostgreSQL, дополнительно укажи параметры "--with-mysql=no --with-postgresql=yes".
Сборка и установка стандартны:

$ make
$ sudo make install

Чистим:

$ make clean
$ cd ..
$ rm -r objdir

Создаем базы

Для создания баз и таблиц сервера используем заготовки, находящиеся в подкаталоге sql дистрибутива:

$ mysql -u root -p < sql/create_mysql.sql

В результате будет создана база mangos, администратором которой является пользователь mangos с паролем mangos:

$ cat sql/create_mysql.sql
…
GRANT USAGE ON *.* TO 'mangos'@'localhost' IDENTIFIED BY 'mangos' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;

В рабочей системе желательно изменить пароль и ограничить доступ к MySQL только с локального узла (в Ubuntu и других дистрибутивах так сделано по умолчанию). Заполняем таблицы, создаем дополнительные базы:

$ mysql -u mangos -p mangos < sql/mangos.sql
$ mysql -u mangos -p realmd < sql/realmd.sql
$ mysql -u mangos -p characters < sql/characters.sql

И подтягиваем базу ScriptDev2:

$ mysql -u mangos -p scriptdev2 < src/bindings/ScriptDev2/sql/scriptdev2_structure.sql

На этом сервер к работе, в принципе, готов. Но подключаться к нему еще ой как рано.

Где же мои орки?

Базы и таблицы созданы, но их еще нужно наполнить содержимым, то есть создать будущие поля сражений и заселить их монстрами. Здесь начинается самое интересное. Проектов, реализующих нужную нам функциональность, великое множество. Это UDB (UnifiedDb, www.udbforums.org), который можно назвать официальным, YTDB (ytdb.kanet.ru), Silvermoon (projectsilvermoon.net), Silver DataBase (SDB, opensvn.csie.org/SDB, sf.net/projects/sdbmangos), немецкий MaNGOS-DBs (sf.net/projects/gm-db), EDB и другие. Какой из них выбрать - единодушного мнения на этот счет нет и не будет. Посетить проекты рекомендую в любом случае, там найдешь полный список файлов, патчей, а также полуготовые сборки (100% работоспособности никто гарантировать не может, но все же это лучше, чем ничего).
Мне показались интересными первые два проекта. Более стабильным можно считать UDB (на нем и остановим свой выбор), а YTDB – более прогрессивным. Наверняка найдутся несогласные и будут по-своему правы.
Получаем SVN копию UDB:

$ svn co https://unifieddb.svn.sourceforge.net/svnroot
$ cd unifieddb

Нужный нам файл сжат архиватором RAR. В поставке Ubuntu его нет, поэтому:

$ sudo apt-get install unrar

Распаковываем архив и заполняем базу:

$ unrar e trunk/Full_DB/UDB_0.10.4_Core_6766_SD2_689.rar
$ mysql -u mangos -p mangos < UDB_0.10.4_Core_6766_SD2_689.sql

Теперь обновляем базу до ревизии сервера. На момент написания этих строк в подкаталоге Updates было 7 файлов, но, поверь, это еще не предел. В некоторых советах предлагают собрать их в один файл и поставить командой «cat trunk/Updates/0.10.4_additions/* > updates.sql». Но лучше так не делать и накатывать каждое отдельно, так как в апдейтах меняется структура БД, и «одновременная» установка может вызвать ошибку. К тому же, в updates может находиться обновление не только для базы mangos, но и для realmd, realmlist, characters. К какой из них относится конкретный файл, – подскажет имя. Так, файл обновления 5632_characters.sql соответствует 5632 версии базы characters.

Поэтому методично ставим обновления, ориентируясь на дату, которая может использоваться в наименовании файла, или релиз. Текущий релиз сервера узнать просто:

$ svn info ~/mangos/ | grep 'Revision:'
Revision: 205

При запуске сервера выдается чуть больше информации: «MaNGOS/0.13.0 (2008-12-30 02:00:26 Revision 6985 - 205)». В нашем случае используется база версии 6766 (определяем по имени UDB_0.10.4_Core_6766_SD2_689.sql). То есть, нужны все апдейты позднее 30.12.2008 и версии 205/6985. Старшие обновления ставим первыми. Если при установке появилась ошибка, ничего страшного, пропускаем этот файл.

Апгрейдим и таблицы для работы ScriptDev2. Здесь все просто:

$ mysql -u mangos -p mangos < src/bindings/ScriptDev2/sql/mangos_full_scripts.sql
$ unrar e tags/EAI/EAI_0.0.4_323.rar
$ mysql -u mangos -p scriptdev2 < EAI_0.0.4_323.sql

И, наконец, последний шаг: заносим в realmlist настройки нашего сервера (название и IP-адрес):

$ mysql -umangos -pmangos
mysql> use realmd;
Database changed
mysql> UPDATE `realmlist` SET `name` = 'My superpuper WoW server' , `address` = '192.168.1.158' WHERE `id` = '1';
Query OK, 1 row affected (0.01 sec)

Да, еще один необязательный, но весьма желательный с точки зрения безопасности шаг. Запрос:

mysql> SELECT * FROM `account` WHERE 1 LIMIT 1000;

– покажет наличие четырех учетных записей в таблице account базы realmd. Их лучше удалить и записать свою (например, admin/password):

mysql> DELETE FROM account;
mysql> INSERT INTO `account` (`username`,`sha_pass_hash`,`gmlevel`) VALUES ('admin',SHA1(CONCAT(UPPER(`admin`),':',UP PER(`password`))),'3');
mysql> quit;

Как вариант, для редактирования таблиц можно воспользоваться одним из интерфейсов к MySQL, вроде phpMyAdmin.

Правим конфиги

После установки у нас должно появиться три конфигурационных файла: mangosd.conf, realmd.conf и scriptdev2.conf. Все они находятся в /usr/local/etc (если не использовалась директива '--sysconfdir'). В scriptdev2.conf настраивается только уровень журналирования, поэтому интерес для нас представляют первые два файла.

$ sudo nano /usr/local/etc/realmd.conf

# Доступ к MySQL "hostname;port;username;password;database"
# можно настроить подключение через сокет, такой режим работы считается экспериментальным
LoginDatabaseInfo = "127.0.0.1;3306;mangos;mangos;realmd"
# Каталог и файл для журнала, а также PID-файл
LogFile = "Realmd.log"
LogsDir = "/var/log"
PidFile = "/var/run/realmd.pid"
# Порт и адрес, на котором будут приниматься соединения
RealmServerPort = 3724
BindIP = "0.0.0.0"

Настройки в mangosd.conf практически аналогичны:

$ sudo nano /usr/local/etc/mangosd.conf

LoginDatabaseInfo = "127.0.0.1;3306;mangos;mangos;realmd"
WorldDatabaseInfo = "127.0.0.1;3306;mangos;mangos;mangos"
CharacterDatabaseInfo = "127.0.0.1;3306;mangos;mangos;characters"
MaxPingTime = 30
WorldServerPort = 8085
BindIP = "0.0.0.0"

В каталоге mangos/contrib/extractor находится программа AD, применяемая для извлечения карт (две версии для Linux и Windows). Рекомендуется использовать виндовый вариант (AD.exe), – работает лучше. С одного из проектов поддержки (например, mangos.ru) скачиваем архив с dbc-файлами и распаковываем их в /usr/local/share/mangos/dbc:

$ cd /usr/local/share/mangos
$ mkdir dbc; cd dbc
$ sudo unrar e ~/dbc.rar

Копируем файлы с диска WOW в каталог с программой AD.exe, затем создаем подкаталог maps и запускаем распаковщик. По окончании процесса переносим заполненный каталог maps в /usr/local/share/mangos. Аналогично извлекаем vmaps, копируем в корень архива WoW каталог vmap_extract_assembler_bin (из дистрибутива MaNGOS) и запускаем находящийся внутри батник makevmaps_SIMPLE.bat. В итоге получим подкаталог vmaps, который копируем на сервер в ту же папку, где и maps.

Все готово к первому запуску мангоса:

$ sudo /usr/local/bin/mangos-realmd
$ sudo /usr/local/bin/mangos-worldd

В процессе запуска на консоль будут выведены диагностические сообщения, просмотри их на наличие ошибок. В будущем, для автоматизации запуска, можно написать скрипт (на указанных выше ресурсах есть готовые примеры). Да, и команды на боевом сервере нужно выполнять с повышенным приоритетом, добавив в начале "nice -n -20".

Для управления сервером, аккаунтами, базами и прочими компонентами есть довольно большое количество проектов – поиск на Sourceforge выдаст не один десяток ссылок. Например, терминал MaNGOS DB Terminal (sf.net/projects/mdbt), веб-интерфейсы MWFv3 (mangos-wf-v3.sf.net). Очень популярен редактор квестов, мобов, объектов, предметов и прочего – Quice (quice.indomit.ru). Сейчас активно развивается проект WotLK (MaNGOS Beta Server, sf.net/projects/wotlkmangosbeta), благодаря нему установка сервера MaNGOS может заметно упроститься.

Сall of Duty 4

Установка сервера для игры в Call of Duty 4 проще: нет такого выбора, а значит, и путаницы, но немного потрудиться все-таки придется. Необходимые файлы можно скачать с одного из зеркал, ссылки на которые найдешь на странице icculus.org/news/news.php?id=4095, в ветке «Download» сайта cod-4.ru или в форуме www.callofduty.ru/forum (ветка «Сервера под Linux»). Есть ссылки на разные версии в вариантах для Windows и Linux, в обычной и Full комплектациях. Обычная версия содержит только скрипт и бинарник для индексирования диска, а вариант Full – дополнительно некоторые библиотеки и пару карт. Помимо этого, для установки своего сервера нам понадобится DVD-диск с игрой.

Создаем рабочий каталог:

$ mkdir cod4; cd cod4

В примере буду использовать обычный вариант сервера, взятый с icculus.org. Качаем архив с одного из зеркал (размер чуть больше 3 Мб) и распаковываем:

$ wget -c http://0day.icculus.org/cod/cod4-linux-server-11212007.tar.bz2
$ tar xjvf cod4-linux-server-11212007.tar.bz2

Получаем в текущем каталоге ряд файлов (cod4_lnxded, cod4_lnxded-bin, libgcc_s.so.1, libstdc++.so.6), которые при помощи «chmod +x» делаем исполняемыми.
Копируем файлы с игрового диска из каталога Setup/Data или из каталога с установленной игрой в cod4. Во втором случае получаем около 6.5 Гб файлов. Все они не нужны – копируем только каталог main с файлами, имеющими расширение .iwd, каталоги video, Mods (переименовываем в mods), а также zone и файл localization.txt. Если есть под рукой файлы локализации, помещаем их в zone. Готово!

Сначала устанавливаем и активируем античит-систему PunkBuster:

$ ./pbsetup.run -e
$ ./pbsetup.run --add-game=cod4 --add-game-path=/where/i/uploaded/cod4/
$ ./pbsetup.run -u


Кстати, файл pbsetup.run доступен не во всех версиях сервера, последний релиз можно скачать с сайта www.punkbuster.com.
Самое время дать команду на старт:

$ sudo ./cod4_lnxded

Если есть файлы поддержки русского языка, добавляем в строку запуска «+set loc_language 6». Опционально указываем IP-адрес, порт, конфигурационные файлы и прочие параметры (кстати, активация Punkbuster может привести к тому, что зайти в игру нельзя – ботов она тоже убирает; если это так, просто не используем ее):

$ sudo ./cod4_lnxded +set dedicated 1 +set net_ip 192.168.1.158 +set net_port 28960 +exec server.cfg +map_rotate +set sv_punkbuster 1 +set loc_language 6

Параметр «+set dedicated 1» означает выделенный локальный сервер, «+map_rotate» - запуск непрерывной смены карт. Удобнее все настройки поместить в конфиг и положить в подкаталог main. Команды netstat/sockstat должны показать активные порты:

$ sockstat | grep cod4
root cod4_lnxde 63855 24 udp4 192.168.1.158:28960 *:*

На самом деле, во время игры открытых сервером портов будет больше (20500, 29900, 20510 и 28960). Не забываем прописать их в разрешающие правила файрвола.

INFO

  • Поиск на SourceForge.net выдаст большой список субпроектов для MaNGOS и COD.
  • Об установке сервера Counter Strike под Linux читай в Хакер Спец #051.

WWW

Сайты проектов, связанных с MaNGOS:

Сайты проектов, связанных с COD:

Содержание