
# SylvaniaCore
**C++-ядро игрового мира [La Légion de Sylvania](https://legendesylvania.com)**
Эмулятор сервера *World of Warcraft®* — Legion 7.3.5
[](https://discord.gg/qmQBXbuXkx)
[](./LICENSE)
[](https://github.com/BlaMacfly/SylvaniaCore/stargazers)
[](https://github.com/BlaMacfly/SylvaniaCore/network/members)
[](https://github.com/slash-design/DestinyCore)
> Практическая инструкция по Docker, production-развёртыванию FelWell и
> синхронизации с собственным Git-сервером: [README.ru.md](./README.ru.md).
---
## 📖 О проекте
**SylvaniaCore** — ядро франкоязычного игрового мира **La Légion de Sylvania**
для *World of Warcraft® Legion 7.3.5*. Это форк
[DestinyCore](https://github.com/slash-design/DestinyCore), который, в свою
очередь, происходит из семейства TrinityCore. Проект постоянно развивается и
поддерживается для нужд игрового мира.
Репозиторий одновременно служит **актуальной кодовой базой** и **резервной
копией** production-сервера.
### Философия: «адаптивный blizzlike»
Это не *fun*-сервер и не сервер с *rates x∞*. Оригинальные значения Blizzard
(урон, баланс и экономика) **сохраняются**. Основная работа направлена на
**исправление отклонений от blizzlike**, а не на упрощение игры. Каждая
обнаруженная ошибка исправляется в источнике — в данных или в ядре, — а не
обходится командами игрового мастера.
---
## ✨ Дополнения SylvaniaCore
Помимо возможностей upstream-ядра, проект содержит собственные системы:
| Модуль | Описание |
| --- | --- |
| 🤖 **PlayerBots** | Управляемые боты-игроки (`src/server/game/PlayerBot`): групповые команды, роли танка и лекаря, управление экипировкой и автоматическое заполнение полей боя |
| ⚔️ **Осада столиц** | Ежедневные нападения отрядов ботов на столицы с назначенным командиром и PvP-флагом игроков (`src/server/game/CapitalSiege`) |
| 💰 **Наёмники** | Нанимаемые NPC-компаньоны: одиночный игрок может заключить с ними контракт за игровое золото (`src/server/game/Mercenary`) |
| 🇫🇷 **Локализация frFR** | Восстановление официальных французских текстов из клиента 7.3.5 — заданий, диалогов и broadcast-текстов — и перевод отсутствующего сценарного контента |
| 🐛 **Исправления контента** | Последовательное восстановление кампаний, подземелий и заданий по отдельным зонам: Мардум, Скитающийся остров, Вершина Смерча и другие |
---
## 🛠️ Требования
- **CMake 3.31+**
- **Boost 1.84.0**
- **MySQL 8.0** или **MariaDB 10.6+** — игровой мир использует MariaDB 11.4
- **OpenSSL 3.x**
- **GCC / Clang / MSVC** — рекомендуется Visual Studio 2022
Поддерживаемые платформы: **Linux, Windows и macOS**.
---
## 📦 Сборка
1. Клонируйте репозиторий:
```bash
git clone https://github.com/BlaMacfly/SylvaniaCore.git
cd SylvaniaCore
```
2. Настройте и соберите проект:
```bash
cmake -S . -B build -DTOOLS=ON
cmake --build build -j$(nproc)
```
3. Установите базы данных согласно разделу
[Установка базы данных](#-установка-базы-данных).
4. Запустите серверы:
```bash
./bin/worldserver
./bin/bnetserver
```
> ℹ️ В исходном коде намеренно сохранены внутренние имена upstream-проекта:
> `DestinyCore`, названия целей CMake и пути конфигурации. Это обеспечивает
> совместимость с upstream-обновлениями и существующими сценариями
> развёртывания.
### Docker Compose
Ядро, сервер Battle.net и MariaDB 11.4 можно собрать и запустить вместе:
```bash
cp .env.example .env
# Поместите DB_world_*.sql и DB_hotfixes_*.sql (или .sql.gz) в docker/db-dumps/
# Поместите dbc/, maps/, vmaps/, mmaps/, cameras/ и gt/ клиента 7.3.5 в data/
docker compose up --build -d
docker compose logs -f worldserver
```
Схемы `auth`, `characters` и `shop` импортируются автоматически при первом
запуске MariaDB. Полные дампы `world` и `hotfixes` также импортируются из
`docker/db-dumps/`. Перед публикацией сервера обязательно замените пароли в
`.env`. Объявляемый клиентам адрес задаётся переменной `EXTERNAL_ADDRESS`.
### Production-развёртывание FelWell
Production-шаблон настраивает игровой мир `FelWell` по адресу
`legion.moon-well.online:8085`:
```bash
cp .env.production.example .env.production
# Обязательно замените оба пароля в .env.production
docker compose --env-file .env.production up --build -d
docker compose --env-file .env.production logs -f bnetserver worldserver
```
При запуске запись `auth.realmlist` автоматически синхронизируется с
`REALM_NAME`, `REALM_ADDRESS` и `REALM_PORT`. DNS-запись `A/AAAA` должна
указывать на VPS, а брандмауэр должен разрешать TCP-порты `1119`, `8081` и
`8085`. MariaDB должна оставаться только во внутренней сети Docker и не должна
публиковаться в Интернет.
Volumes `database-data` и `sylvania-logs` сохраняют базу данных и журналы
соответственно. Изменения в `docker/db-dumps/` не импортируются повторно, если
база уже была инициализирована.
---
## 💾 Установка базы данных
Репозиторий содержит **только схемы** `auth`, `characters` и `shop`. Базы
`world` и `hotfixes` слишком велики для хранения в Git; их необходимо загрузить
из **релизов upstream-репозитория DestinyCore**.
> ⚠️ **Никогда не импортируйте файлы из `sql/base/dev/`.** Это **пустые**
> структуры таблиц без игровых данных, предназначенные для разработчиков
> upstream-проекта. После такого импорта `worldserver` может запуститься, но
> клиент останется на экране загрузки из-за пустой базы `world`.
### 1. Загрузка upstream-базы
Загрузите последний релиз базы на странице
[slash-design/DestinyCore/releases](https://github.com/slash-design/DestinyCore/releases).
На момент написания это `DB735.02.rar` размером около 84 МБ. Архив содержит два
дампа:
| Файл | База | Размер после распаковки |
| --- | --- | --- |
| `DB_world_735.02.sql` | `world` | около 375 МБ |
| `DB_hotfixes_735.02.sql` | `hotfixes` | около 127 МБ |
Оба дампа самостоятельно выполняют `CREATE DATABASE`, а затем `USE` для баз
`world` и `hotfixes`. Если нужны другие имена баз, измените эти две строки в
начале соответствующего файла.
### 2. Создание и импорт баз
```bash
# Базы auth / characters / world / hotfixes
mysql -u root -p < sql/create/create_mysql.sql
# База shop не создаётся upstream-скриптом
mysql -u root -p -e "CREATE DATABASE shop DEFAULT CHARACTER SET utf8;"
# Схемы из репозитория
mysql -u trinity -p auth < sql/base/auth_database.sql
mysql -u trinity -p characters < sql/base/characters_database.sql
mysql -u trinity -p shop < sql/base/shop_database.sql
# Полные базы из upstream-релиза
mysql -u trinity -p < DB_world_735.02.sql
mysql -u trinity -p < DB_hotfixes_735.02.sql
```
### 3. Автоматическое применение обновлений ядром
Не импортируйте файлы из `sql/updates/` вручную. В `worldserver.conf` должно
быть указано:
```ini
Updates.EnableDatabases = 31 # auth + characters + world + hotfixes + shop
Updates.AutoSetup = 1
```
При первом запуске `worldserver` самостоятельно применит около 330 файлов из
`sql/updates/world`, а также обновления для `characters` и `hotfixes`. Таблица
`updates` в upstream-дампах изначально пуста — это нормально: история
обновлений будет применена целиком. Процесс может занять несколько минут.
### 4. Исправления контента игрового мира (необязательно)
В `sql/sylvania/` хранится версионируемая история исправлений игровых данных:
артефактов, кампаний, подземелий, модулей «Наёмники» и «Осада столиц». Они не
относятся к механизму автоматических обновлений и импортируются вручную в
хронологическом порядке после завершения предыдущих этапов. Production-база
`world` игрового мира не распространяется.
### 🩺 Клиент завис на экране загрузки?
Следующие два сообщения появляются при каждом подключении на **всех** серверах
этого семейства и **не являются ошибками**:
```text
Client tried to call not implemented method ResourceService.GetContentHandle
Received not handled opcode [CMSG_GET_ACCOUNT_CHARACTER_LIST ...]
```
`ResourceService` — незавершённая upstream-реализация сервиса Battle.net, а
`CMSG_GET_ACCOUNT_CHARACTER_LIST`, то есть межсерверный список персонажей,
намеренно объявлен как `STATUS_UNHANDLED` в
`src/server/game/Server/Protocol/Opcodes.cpp`. Если клиент не проходит экран
загрузки, проверьте:
- правильность импорта `world` и `hotfixes`, учитывая предупреждение о
`sql/base/dev/`;
- кеш клиента — очистите каталог `Cache`;
- извлечённые данные: `dbc/`, `maps/`, `vmaps/`, `mmaps/`, `cameras/` и `gt/`
должны происходить из клиента **7.3.5 build 26972**, а `DataDir` должен
указывать на содержащий их каталог;
- `DBErrors.log` и начальные строки журнала `worldserver`, где будет указана
проблемная таблица.
---
## 🌍 Подключение к игровому миру
Игровой сервер открыт, а инструкции по подключению опубликованы на официальном
сайте: **[legendesylvania.com](https://legendesylvania.com)**.
---
## 🤝 Участие в разработке
Мы приветствуем исправления ошибок, улучшения документации и новые возможности:
1. Создайте форк репозитория.
2. Создайте отдельную ветку для изменения.
3. Откройте pull request.
Discord открыт **для разработчиков и всех желающих участвовать в развитии
ядра**. Там можно обсудить исправление до начала работы, задать вопросы по
архитектуре или попросить проверить pull request. Это не Discord игрового мира.