LINUX.ORG.RU

Свой локальный сервер WoW с блэкджеком и ботами, часть 3

 ,


1

1

Часть 3 - Сервисы для сервера, модификации клиента и обслуживание

Сервисы для сервера

Карта с расположением персонажей (включая ботов)

Примитивная карта, на которой разноцветными точками показывается последнее расположение персонажей на карте (из базы данных): https://github.com/DustinHendrickson/DustinsAzerothMap

Полезна в первую очередь для проверки работы Playerbots и для беглого контроля на наличие аномалий (пустые или переполненные зоны).

Это простенький сайтик с php, который крутить можно любым удобным способом. Надо поставить apache2 или nginx с php и модулем mysql (пример приведу для nginx).

После этого скачать сайт (в данном примере в /var/www/map):

cd /var/www
git clone https://github.com/DustinHendrickson/DustinsAzerothMap.git map

В map/config/playermap_config.php надо найти и поправить настройки для подключения к базе данных azerothcore. В идеале для этого лучше создать отдельного пользователя только с правами на чтение, но в домашней сети и на той же машине с сервером azerothcore можно использовать того же пользователя и тот же адрес для подключения, что и для сервера.

Установка веб-сервера и зависимостей:

apt install nginx php-fpm php-mysqli -y

Создаём конфиг для сайта /etc/nginx/sites-available/wowmap:

server {
    listen 80;
    server_name wowmap.example.ru;

    # Корневая директория сайта
    root /var/www/map;
    
    # Индексные файлы
    index index.html index.php;

    # Логи
    access_log /var/log/nginx/wowmap_access.log;
    error_log /var/log/nginx/wowmap_error.log;

    # Обработка статических файлов
    location / {
        try_files $uri $uri/ =404;
    }

    # Обработка PHP файлов через PHP-FPM
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php-fpm.sock;
        
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Запрет доступа к скрытым файлам (.htaccess, .git и т.д.)
    location ~ /\. {
        deny all;
    }

    # Кэширование статических файлов (опционально)
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Имя сервера server_name wowmap.example.ru имеет значение в случае, если крутиться на машине на одном порту будет несколько сервисов, тогда они будут открываться в зависимости от домена.

Выключаем страничку по умолчанию и включаем сайт:

ln -s /etc/nginx/sites-available/wowmap /etc/nginx/sites-enabled/
rm /etc/nginx/sites-enabled/default

Проверяем конфиг nginx: nginx -t, если всё нормально, то перезапускам: systemctl restart nginx.

Aowow (локальный WoWHead)

Является клоном сайта WoWHead времен лича. Полная база знаний по WoW, с возможностью посмотреть картинки и звуки. Тогда использовался adobe flash и сейчас просмотр 3d моделей в aowow не доступен. База использует извлеченные из клиента игры данные, это ~16 Гб для одного языка и ~32 гб на все.

Практическая целесообразность установки сомнительная, эти базы для 3.3.5a повсюду. Ставить имеет смысл только для удовлетворения собственного интереса в образовательных целях.

Aowow изначально разрабатывается для TrinityCore, но есть форк для azerothcore: https://github.com/azerothcore/aowow Форк рабочий, но есть нюансы и никто их не документировал. Ридми скопирована с оригинала.

Извлечение данных из клиента под базу

Сначала надо извлечь данные из своего клиента. Для этого используется экстрактор из mpq-архивов. Поэтому собираем его на машине с клиентом:

# Временная директория для работ с mpq
mkdir ~/MPQTemp && cd ~/MPQTemp
# Сам экстрактор
git clone https://github.com/Sarjuuk/MPQExtractor.git MPQExtractor
cd MPQExtractor
# Зависимости для сборки
git submodule init
git submodule update
# Сборка
mkdir build
cd build
cmake ~/MPQTemp/MPQExtractor
cmake --build .

Затем создаём скрипт для извлечения в правильном порядке архивов (вариант для английской локализации) ~/MPQTemp/extract.sh:

OUT_DIR="$HOME/MPQTemp/mpqdata"
CLIENT_DIR="~/Игры/WoW"
EXTRACTOR_PATH="$HOME/MPQTemp/MPQExtractor/build/bin/MPQExtractor"
mkdir -p "${OUT_DIR}"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/common.MPQ"  -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/common-2.MPQ"  -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/expansion.MPQ"  -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/lichking.MPQ"  -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/patch.MPQ"  -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/patch-2.MPQ"  -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/patch-3.MPQ"  -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/backup-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/base-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/expansion-locale-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/expansion-speech-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/lichking-locale-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/lichking-speech-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/locale-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/speech-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/patch-enUS.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/patch-enUS-2.MPQ" -e "*"
"${EXTRACTOR_PATH}" -f -c -o "${OUT_DIR}" "${CLIENT_DIR}/Data/enUS/patch-enUS-3.MPQ" -e "*"

Это имена файлов в клиенте ChromieCraft, в hd все файлы клиента в нижнем регистре.

Запускаем его, работа по извлечению будет долгой. Директория~/MPQTemp/mpqdata будет содержать необходимые ресурсы для работы aowow. Но предварительно надо еще сконвертировать аудиофайлы ffmpeg-ом.

С readme aowow взял скрипт для конвертации, но он удалит источник, даже если что-то пошло не так и мне лень её править, проще будет распаковать mpq заново, как в предыдущем шаге. Команда:

#!/bin/bash
cd ~/MPQTemp/mpqdata
find . -name "*.wav" | xargs -I % sh -c 'ffmpeg -hide_banner -y -i "%" -acodec libvorbis -f ogg "%_"; rm "%";' && find . -name "*.mp3" | xargs -I % sh -c 'ffmpeg -hide_banner -y -i "%" -acodec libmp3lame -f mp3 "%_"; rm "%";'

После конвертации директорию mpqdata надо удобным способом перекинуть на сервер, где будет разворачиваться aowow.

Установка на сервере

Пример установки в /var/www/aowow на машине рядом с сервером игры. Должен стоять web-сервер, nginx или apache2. Его лучше настроить заранее, пример приведу для nginx.

Установим nginx и зависимостей php:

apt install php-gd php-xml php-mbstring nginx php-fpm php-mysqli -y

Создаём конфиг для сайта /etc/nginx/sites-available/aowow:

server {
    listen 80;
    server_name aowow.example.ru;
    root /var/www/aowow;
    index index.php;

    error_log /var/log/nginx/aowow_error.log;
    access_log /var/log/nginx/aowow_access.log;

    # Увеличение лимитов для AoWoW (может требоваться)
    client_max_body_size 50M;
    client_body_timeout 60s;
    send_timeout 60s;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        
        # Дополнительные параметры для AoWoW
        fastcgi_param PHP_VALUE "upload_max_filesize = 50M\n post_max_size = 50M\n max_execution_time = 300";
        
        include fastcgi_params;
        
        # Таймауты для долгих запросов
        fastcgi_read_timeout 300s;
        fastcgi_connect_timeout 60s;
    }

    # Обработка SEO-friendly URL (если используются)
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php?$1 last;
    }

    # Защита конфигурационных файлов
    location ~* /(config|setup|sql|install)/ {
        deny all;
        return 403;
    }

    # Кэширование статики
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 7d;
        add_header Cache-Control "public, must-revalidate";
        access_log off;
        log_not_found off;
    }

    # Сжатие (gzip)
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
}

Имя сервера server_name aowow.example.ru имеет значение в случае, если крутиться на машине на одном порту будет несколько сервисов, тогда они будут открываться в зависимости от домена.

Выключаем страничку по умолчанию и включаем сайт:

ln -s /etc/nginx/sites-available/aowow /etc/nginx/sites-enabled/
rm /etc/nginx/sites-enabled/default

Проверяем конфиг nginx: nginx -t, если всё нормально, то перезапускам: systemctl restart nginx.

Скачаем проект:

cd /var/www/
git clone https://github.com/azerothcore/aowow.git

Копируем или перемещаем полученные ранее из клиента данные:

mv /ПУТЬ/К/mpqdata/ /var/www/aowow/setup/

Aowow будет крутиться от пользователя www-data и и он будет писать файлы в директорию проекта. Поэтому меняем права на директорию:

chown -R www-data:www-data /var/www/aowow

В базе данных с azeroth core создадим базу для aowow и пользователя для работы с ней и базами acore:

CREATE USER 'aowow'@'localhost' IDENTIFIED BY 'aowow';
CREATE DATABASE aowow;
GRANT SELECT on *.* to 'aowow'@'localhost';
GRANT ALL ON aowow.* to 'aowow'@'localhost';
FLUSH PRIVILEGES;

Создаём начальную структуру базы aowow:

cd /var/www/aowow
mysql -u root aowow < setup/db_structure.sql

В базу acore_world надо добавить таблицу:

cd /var/www/aowow
mysql -u root acore_world < setup/spell_learn_spell.sql

Запускаем интерактивную установку:

cd /var/www/aowow
sudo -u www-data php aowow --setup --locales=enUS

Там надо ввести данные подключения к бд. Host везде localhost, префикс не вводим, login/pass: aowow/aowow. База aowow - aowow, база world - acore_world, база auth - acore_auth. Если что-то пошло не так, то скрипт можно перезапустить, на ошибки PHP Deprecated можно не обращать внимания.

Когда базы будут указаны скрипт выдаст предупреждение о несоответствии версий базы world. А после нажатия на Enter ошибку TDB world db is structurally outdated. Её игнорируем и делаем continue, это код не до конца адаптирован под azerothcore.

После будет предложено поменять параметры. Надо указать SITE_HOST и STATIC_HOST. Это адреса, по которым будет доступен сайт. Например:

SITE_HOST: aowow.example.ru
STATIC_HOST: aowow.example.ru/static

Или ip адрес, если нет домена и сайт на нём будет крутиться один.

Дальше он проверит доступность файлов и если всё правильно работает, то приступит к заполнению базы, процесс длительный и один раз придется пропустить ошибку вручную. Если было сообщение о недоступности файлов по адресам, то проблема с настройкой переменных SITE_* или сайта в nginx. Одна ошибка будет с парой десятков не найденных картинок, её тоже можно пропустить:

[ERR]   [build] subscript 'simpleimg' returned with errors

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

Модификации клиента

RCEPatcher

В оригинальном клиенте игры (как ChromieCraft) была обнаружена возможность удалённого выполнения кода со стороны людей с доступом к серверу. На гитхабе выложен патч, который вместо выполнения кода приводит к падению игры: https://github.com/stoneharry/RCEPatcher/

Надо понимать, что это одна из обнаруженных и костылями поправленных уязвимостей в древнем софте и что там еще осталось одному богу известно.

Возможность не теоретическая, на некоторых пиратских серверах RCE на стороне клиента - не баг, а фича. Но для локального использования можно не заморачиваться, да и патчить под линуксом неудобно.

Аддоны

Аддоны помещаются в директорию игры Interface/Addons (в hd версии файлы в нижнем регистре) и, обычно, просто работают. Основная сложность - найти сейчас совместимую с 3.3.5a версию, они часто валяются в каких-нибудь архивах в сети без вменяемой истории обновлений (она полезна, когда встречаются баги).

Один из удобных архивов для 3.3.5a: https://github.com/NoM0Re/WoW-3.3.5a-Addons/tree/main/src

Аддонов полно, опишу только не типичные и связанные с управлением ботами.

Для управления ботами:

Есть два аддона для управления ботами.

Посвежее: https://github.com/Macx-Lio/MultiBot

Альтернативный вариант под ботов: https://github.com/noisiver/unbot-addon/tree/english

Оба представляют из себя панельки из набора кнопочек, по сути текстовых макросов, которые при нажатии вбивают текстовые команды Playerbots в чат. Можно обходиться без них, но они удобны для изучения доступных возможностей и благодаря отсутствию необходимости самому писать макросы и раскидывать их по панелькам.

Озвучка нейросеткой от сообщества

Суть аддона в том, что при взаимодействии с неписями он запускает проигрывание озвученных диалогов. Качество довольно неплохое, можно набрать квестов и прослушивать, а не стоять и читать перед неписями.

Сам аддон: https://github.com/mrthinger/wow-voiceover/releases/download/v1.4.3/AI_VoiceOver-WoW_3.3.5-v1.4.3.zip Пак звуков для WotLK: https://abs.freemyip.com:84/share/7PI-N5L1 Пак звуков для оригинальной игры + TBC (TBC хромает местами по качеству): https://github.com/Aelaksmith/Aivoiceover3.3.5 Пак звуков чисто для оригинальной игры. Если не нужны диалоги TBC: https://github.com/mrthinger/wow-voiceover/releases/download/v1.3.1/AI_VoiceOverData_Vanilla-v1.0.0.zip

Обслуживание

Бэкап базы данных (опционально)

Если сервер используется для чего-то большего, чем просто потыкать палочкой, то хорошей идеей будет делать периодические бэкапы базы данных на всякий случай. Способ выбрать можно по желанию и на своё усмотрение, кому-то проще будет просто останавливать mysql и делать копию файлов /var/lib/mysql, кому-то проще сделать копию или срез с виртуалкой. Покажу вариант с перконой.

Установка перконы:

curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
apt install gnupg2 lsb-release ./percona-release_latest.generic_all.deb
apt update
percona-release enable pxb-84-lts
apt install percona-xtrabackup-84
rm ./percona-release_latest.generic_all.deb

Создаём директорию mkdir /opt/mysql_backup/ и скрипт /opt/backup_database.sh:

#!/bin/bash
DB_USER=root
DB_PASSWORD=""
day=$(date +%F)
# Запускается процедура резервного копирования и подготовки базы к восстановлению
xtrabackup --user="$DB_USER" --password="$DB_PASSWORD" --backup --target-dir=/opt/mysql_backup/"${day}" --datadir=/var/lib/mysql && xtrabackup --prepare --target-dir=/opt/mysql_backup/"${day}"

# Удаляются резервные копии старше 7 дней (-mtime +7)
find /opt/mysql_backup -mindepth 1 -mtime +7 -delete

Запустим, после этого будет копия базы в /opt/mysql_backup/ГОД-МЕСЯЦ-ДЕНЬ. Хранение копии каждого дня ~2.5Гб.

Если работает, то можно добавить в крон и вызывать его каждый день часа в 4 ночи: 0 4 * * * root /opt/backup_database.sh

Фиксация версий сервера и модулей (опционально)

Сервер и модули постоянно обновляются, поэтому установленные как по этому гайду сегодня и завтра версии будут отличаться. Иногда встречаются несовместимости во время установки или обновления, поэтому полезно фиксировать для себя версии, с которыми работает сервер.

Чтобы не делать это ручками можно для удобства завести скрипт типа /opt/acore_versions_lock.sh:

#!/bin/bash
OUT="/opt/acore.version"
ACORE_DIR="/opt/azerothcore-wotlk"
cd "${ACORE_DIR}"
echo -n "Azerothcore version: " > "${OUT}"
git log -1 --oneline >> "${OUT}"
for i in $(find modules/ -mindepth 1 -maxdepth 1 -type d)
do
    cd "${ACORE_DIR}/${i}"
    echo -n "$i version: " >> "${OUT}"
    git log -1 --oneline >> /opt/acore.version
done

Должен получиться файл с таким выводом (совместимые версии на моём сервере, последний mod-transmog был слишком свежим для ветки playerbots на момент установки):

cat /opt/acore.version
Azerothcore version: f42434df1 Merge pull request #177 from mod-playerbots/20260313-ac-core-merge
modules/mod-playerbots version: 4b7b0958 Merge pull request #2205 from mod-playerbots/test-staging
modules/mod-individual-progression version: efc8311 Update professions.sql (#1113)
modules/mod-ah-bot-plus version: 1822d96 Fix typo in mod_ahbot.conf.dist comments
modules/mod-transmog version: 2427a32 fix(Core): Validate item template before creating item in Transmogrify (#225)
modules/mod-ollama-chat version: 186d6a1 Fine tuning random chat a bit more
modules/mod-player-bot-level-brackets version: b03737f Merge pull request #82 from DustinHendrickson/Dustin/propertyfixes

Обновление

Перед обновлением стоит снять бэкап с базы данных и сделать копию проекта /opt/azerothcore-wotlk/. В случае изменения структуры БД, могут быть проблемы с откатом на предыдущую версию, если в новой что-то пойдет не так.

Обновление как сервера, так и модулей происходит вытягиванием нового кода git pull и последующей пересборкой ./acore.sh compiler all.

Миграция базы данных в большинстве случаев происходит автоматически, но в отдельных модулях (типа трансмога) новые sql файлы надо скопировать ручками. Иногда требуется ручное вмешательство и, по хорошему, оно описывается в README проекта.

Так же может смениться формат конфигурационных файлов, они не конвертируются автоматически в этом случае надо будет перенести свои настройки ручками в новую версию или добавить в старую новые параметры.

Полезная информация и ссылки

На Wiki Playerbots можно посмотреть доступные команды, советы по применению в рейдах, полезные макросы и другую информацию по модулю.

Документация Azerothcore

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 9)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.