Программирование, радиоэлектроника,
саморазвитие и частичка из моей жизни здесь...

TrinityCore Single Player - обзор, история, сборка игрового сервера и запуск WoW под Linux

Собираем свой тестовый сервер с ботами для WoW на основе TrinityCore + NPCBots под Linux. Как развивались стратегии серии Warcraft, как появилась игра World of Warcraft. Моя история знакомства с WOW, игровой сервер на Mangos под FreeBSD. Как появились проекты MaNGOS и TrinityCore, обзор сборки TrinityCore Single Player - одиночная игра в WOW с компьютером. Компиляция и настройка ядра сервера, наполнение и обслуживание баз данных. Запуск World of Warcraft на Wine под Linux. Руководство по управлению NPCBots, списки полезных игровых команд, скриншоты из игры.

Если вы читаете данную строчку, то полагаю что хотя бы один из пунктов вас заинтересовал. ;)

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

Вся работа по установке и настройке сервера будет вестись преимущественно из консоли в операционной системе (ОС) GNU/Linux (Debian), но будут также примеры и рекомендации по применению приложений с графическим интерфейсом (например менеджер БД).

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

Цели статьи: знакомство с миром Warcraft, обучение техническим трюкам, практика и интересное провождение времени экспериментируя в WoW на своем локальном сервере.

Большинство рисунков в статье - кликабельные (откроются в полный размер в новой вкладке).

Будет интересно!

Содержание:

  1. Как появилась World of Warcraft, история стратегий серии Warcraft
  2. Мое знакомство с WOW, свой MANGOS сервер на FreeBSD
  3. Проекты MaNGOS, CMaNGOS и TrinityCore, история и факты
  4. TrinityCore Single Player - обзор проекта, игра в WOW с ботами
  5. Подготовка к сборке сервера
  6. Получение исходных кодов, компиляция и конфигурация
  7. Извлечение игровых ресурсов DBC, Maps, VMaps, MMaps
  8. Подготовка сервера БД, заливка SQL скриптов и игрового мира
  9. Тестовый пуск сервера, скрипты управления службами
  10. Создание игрового аккаунта, подготовка клиента WOW
  11. Запуск клиента World of Warcraft WotLK под Linux
  12. Управление ботами
  13. Список полезных игровых команд
  14. Обслуживание БД, резервное копирование
  15. В завершение

Итак, начинаем наше погружение...

Как появилась World of Warcraft, история стратегий серии Warcraft

История развития серии компьютерных игр WarCraft берет свое начало еще с далекого 1994-го года, когда 23-го ноября в мир вышла игра под названием "Warcraft: Orcs & Humans" (Военное ремесло: Орки и Люди), выпущенная компанией "Blizzard Entertainment".

Blizzard Entertainment (или просто Blizzard) - американская компания, разработчик и издатель компьютерных игр. Свое начало берет еще с 1991-го года под названием "Silicon & Synapse", а затем с 1993-го года именовалась как "Chaos Studios".

Первая часть Warcraft была сделана под вдохновением известной DUNE II от Westwood Studios и планировалась как ее своеобразный клон, но была очень позитивно оценена критиками и любителями стратегий реального времени (RTS, Real Time Strategy).

Игра работала под MS-DOS на компьютерах с микропроцессором начиная от 80386, требовала минимум 4МБ ОЗУ. Позже была выпущена версия под MacOS.

Основной сюжет и начало истории: открытие магического портала между мирами привело к противостоянию двух рас - людей (Humans) и орков (Orcs).

Игроку предстоит выбрать одну из сторон и сражаться за королевство Азерот (Azeroth), где не обойтись без добычи ресурсов, постройки разных зданий, тренировки юнитов, навыков защиты и нападения.

Вы только посмотрите какая на то время была проработанная и красивая пиксельная графика в разрешении экрана всего лишь 640x400 пикселей:

Игра Warcraft Orcs & Humans под MS-DOS, 1994-й год

Рис. 1. Игра "Warcraft: Orcs & Humans" под MS-DOS, 1994-й год.

Еще одой уникальной возможностью игры было наличие коллективного режима - можно было поиграть с другом через модем, сетевое подключение (IPX протокол) или прямое соединение двух ПК (через COM-порты, нуль-модем).

Годом позже, в 1995-м была выпущена вторая часть игры под названием "Warcraft II: Tides of Darkness" (Военное ремесло 2 - приливы тьмы). А в 1996-м вышло дополнение "Warcraft II: Beyond the Dark Portal" (Военное ремесло 2 - за темным порталом).

Обложки игры Warcraft II Tides of Darkness и дополнения Beyond the Dark Portal, 1995-1996

Рис. 2. Обложки игры Warcraft II "Tides of Darkness" и дополнения "Beyond the Dark Portal", 1995-1996.

Для запуска и полноценной работы игры нужен был уже более мощный процессор - 80486 и выше (рекомендуется от Pentium 60MHz). Требования возросли и к ОЗУ - минимум 8МБ.

В этой части продолжается противостояние Альянса людей и Орков. В игре улучшилась графика, анимация, звуковое и музыкальное сопровождение, усовершенствован искусственный интеллект, появилась возможность создавать свои карты, улучшен сетевой режим.

Дополнение к Warcraft II (expansion set) привнесло новую историю, миссии и новых героев - как со стороны альянса, так и для орды. Герои отличаются от других юнитов своей иконкой, большим запасом брони и повышенным уроном, ими также можно управлять. 

Игровой процесс стратегии реального времени Warcraft II, 1995-1996

Рис. 3. Игровой процесс стратегии реального времени Warcraft II, 1995-1996.

О своей истории знакомства с замечательной Warcraft II я уже писал в статье про Wargus - усовершенствованный WarCraft II на свободном движке Stratagus. На нижнем правом скриншоте из рисунка выше как раз показан интерфейс и игровой процесс в Wargus.

А дальше случилась "магия"... то, о чем фанаты серии Warcraft могли только мечтать - в июле 2002-го года вышла "Warcraft III: Reign of Chaos" (Военное ремесло 3 - господство хаоса), продолжение знаменитой стратегии, только на этот раз уже с элементами RPG (Role Playing Game, ролевой игры) и в трехмерном исполнении!

Основные новшества третьей части:

  • Красочная и сочная 3D графика;
  • Две дополнительные расы (Нежить и Ночные Эльфы) в дополнение к существующим (Альянс и Орда);
  • Уникальные герои со своими способностями, возможностью получать опыт, собирать и одевать различные влияющие на персонажа предметы;
  • Новый трехмерный редактор карт (редактор мира, World Editor).

Спустя год было выпущено дополнение "The Frozen Throne" (Ледяной трон). Появились новые юниты и герои, стало возможным построить магазин для покупки предметов, в тавернах можно нанимать нейтральных героев, был усовершенствован редактор игрового мира и еще много всего.

Обложки игры Warcraft III Reign of Chaos и дополнения The Frozen Throne, 2002-2003

Рис. 4. Обложки игры Warcraft III "Reign of Chaos" и дополнения "The Frozen Throne", 2002-2003 год.

Припоминаю как я впервые запустил Warcraft III на своем Celeron 600 с 64МБ ОЗУ и видеокартой Nvidia Riva TNT2 Pro 16M: первая миссия за альянс, герой Артес (Arthas) в сопровождении нескольких рыцарей, потрясающий звук и музыка, насыщенная цветами трехмерная графика, смена дня и ночи, погодные эффекты, анимация воды, красивые катсцены, увлекательная история, которую хочется узнать до конца...

Стратегия Warcraft III - начало кампании за ночных эльфов

Рис. 5. Warcraft III - начало кампании за ночных эльфов.

Несмотря на то что игра притормаживала (было маловато ОЗУ), впечатления остались самые позитивные. Ничего подобного и настолько красочного до этого я не играл.

Игра Warcraft III - кампания, Рексар (Rexxar) со своим верным медведем и друзьями

Рис. 6. Warcraft III - дополнительная кампания, Рексар (Rexxar) со своим верным медведем и друзьями.

Даже сейчас, спустя более чем 15 лет, 3-й варкрафт смотрится очень красиво, играть в него интересно и увлекательно. Благодаря наличию редактора мира была выпущена масса фанатских одиночных кампаний, а также карт для игры с компьютером и друзьями по сети.

И вот, 23-го ноября 2004 года, ровно за десять лет со дня рождения первой части "Warcraft: Orcs & Humans" (дата релиза специально выбрана в ее честь) выходит новая игра от Blizzard, представляющая собою огромный интерактивный мир онлайн, в котором можно создать и преобразить своего уникального персонажа, общаться и взаимодействовать с другими аватарами игроков - это World of Warcraft.

World of Warcraft (мир военного ремесла) - фентезийная MMORPG от Blizzard Entertainment, предоставляемая по платной подписке (минимум на один месяц).

MMORPG (Massively Multiplayer Online Role-Playing Game) - рассчитанная на широкие массы многопользовательская ролевая онлайн игра с большим количеством реальных игроков.

Что интересно, анонс WoW был сделан еще задолго до выхода Warcraft III - в 2001-м году. Фактически, разработка этих игр велась специалистами компании Blizzard параллельно.

Игровой мир WoW тесно связан с историей ранее выпущенных стратегий реального времени (RTS) Warcraft. Действия продолжаются в фентезийном мире Азерот (Azeroth), примерно после четырех лет от событий из игры "Warcfaft III: The Frozen Throne".

В 2007-м году вышло первое дополнение к World of Warcraft под названием "The Burning Crusade" (пылающий поход). Из особенностей:

  • Добавлен новый мир (Запределье);
  • Две новые расы;
  • Появилась еще одна профессия (ювелир);
  • Созданы новые подземелья;
  • И много всего другого.

Годом позже (в 2008) выходит еще одно дополнение - "Wrath of the Lich King" (Гнев Короля-Лича).

Особенности Wrath of the Lich King:

  • Добавлен новый  континент (Нордскол);
  • Появился новый героический класс;
  • Появилась профессия "начертание" (создание свитков и символов);
  • Стали доступны осадные орудия;
  • На двух новых полях боя (Берег Древних, Остров Завоеваний) теперь можно разрушать здания;
  • Появились парикмахерские (можно менять прическу героя);
  • Количество талантов увеличено до 71;
  • Новые подземелья;
  • Внедрены дополнительные графические спецэффекты.

Обложки World of Warcraft и также дополнений The Burning Crusade и Wrath of the Lich King

Рис. 7. Обложки World of Warcraft и дополнений The Burning Crusade и Wrath of the Lich King.

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

Год выпуска, названия дополнений к World of Warcraft и максимальный уровень игрока:

  • 2007 - The Burning Crusade (Пылающий поход) - 70;
  • 2008 - Wrath of the Lich King (Гнев Короля-Лича) - 80;
  • 2010 - Cataclysm (Катаклизм) - 85;
  • 2012 - Mists of Pandaria (Туманы Пандарии) - 90;
  • 2014 - Warlords of Draenor (Вожди Дренора) - 100;
  • 2016 - Legion (Легион) - 110;
  • 2018 - Battle for Azeroth (Битва за Азерот) - 120;
  • 2020 - Shadowlands (Тёмные Земли) - 60.

В целом, фентезийный мир Warcraft и его история - огромные! По ним пишут статьи, издают целые серии из книг, а в 2016-м году даже вышел одноименный фильм.

За все время своего существования WoW заслужила множество наград, а по своей популярности считается одной из лидирующих в жанре MMORPG.

Мое знакомство с WOW, свой MANGOS сервер на FreeBSD

Впервые я увидел World of Warcraft у друга на его домашнем компьютере. Игра заинтересовала своей красочностью и возможностями, но меня останавливали два фактора:

  1. Необходимость подключения к внешнему серверу, зависимость о него. Я в большинстве предпочитал все же оффлайн игры (работающие без интернет подключения);
  2. Платная подписка. Финансовое состояние на то время, к сожалению, не позволяло тратиться на подобные вещи.

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

До этого я уже немножко играл в MU Online (MMORPG от корейской компании Webzen) и понимал сколько времени может занять прокачка, околачивание мобов, рейды в подземельях, сбор лута, торговля и т.п.

С MU Online меня познакомил еще один коллега, он просто таки фанател от этой игрушки. Бывало мы в свободное время встречались в игровом мире, общались (как в аське, ICQ), бродили вместе и прокачивали своих персонажей, обменивались добытыми внутриигровыми предметами и "шмотками"...

MMORPG игра MU Online корейской компании Webzen

Рис. 8. Онлайн RPG игра MU Online корейской компании Webzen.

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

Экспериментировал я не только с Windows - был опыт настройки разных служб под замечательной операционной системой UNIX FreeBSD: веб-сервер Apache + PHP + MySQL, прокси-сервер Squid и адмника SAMS к нему, звонилка PPP, потоковый сервер Icecast (делал домашнее онлайн-радио), игровой сервер HLDS (Half-Life и Counter Strike)...

В процессе поиска какой-то информации по FreeBSD я наткнулся на одну интересную статью. В ней описывался процесс компиляции и настройки локального экспериментального сервера для работы с клиентом многопользовательской игры World of Warcraft, проект назывался "MANGOS".

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

Я подумал: А почему бы не попробовать? - будет же интересно и познавательно!

В качестве домашнего сервера и системы для экспериментов у меня тогда выступал компьютер с двумя процессорами Pentium-III 800MHz на борту, а в качестве рабочей станции - небольшой ноутбук с Core 2 Duo и видеокартой INTEL 945GM.

Этот "двухголовый" Pentium-III был собран в стильном и надежном серверном корпусе "CODEGEN CAT-8012-1U", за который я когда-то отдал целых 50$ (без блока питания).

Нашел в своем архиве фото этой системы тех времен:

Старый домашний сервер 2х Pentium-III 800MHz в классическом корпусе CODEGEN CAT-8012

Рис. 9. Мой старый домашний сервер 2х Pentium-III 800MHz в классическом корпусе Middle-Tower - CODEGEN CAT-8012.

В таком корпусе было установлено 3 кармана для ATA/SATA жестких дисков, парочка SCSI дисков с контроллером - этого вполне хватало для мультизагрузки нескольких операционных систем и разных экспериментов, а также для коллекции аудио/видео и свалки из разных файлов и архивов (персональный FTP/Samba сервер).

Работа на таком домашнем сервере в FreeBSD выполнялась по большей мере в консоли и по SSH, но также была настроена и графическая среда KDE 3 с набором разных программ - Amarok, XMMS, XChat, GIMP, Open Office...

Экран загрузки классической версии операционной системы UNIX FreeBSD

Рис. 10. Экран загрузки классической версии операционной системы UNIX FreeBSD. Талисман BSD ОС - Beastie (рисунок в ASCII).

Итак, я собрал все необходимые ресурсы и документацию, скачал исходные коды, а также архив с SQL дампом игрового мира (база данных YTDB для Мангоса).

Потом навестил друга и одолжил у него клиент WoW, занимающий немного шокирующие (как для игры того времени) 16 ГБ дискового пространства!

Для сравнения достаточно было представить что Warcraft III с дополнением Frozen Throne и паком сторонних карт с кампаниями занимал примерно 1,2Гб и при этом там было столько контента, миссий с классной графикой и озвучкой... А тут целых 16 ГБ - почти в 13 раз больше!

Дальше оставалось только ждать праздников - когда будет побольше свободного времени чтобы все это не спеша настроить и запустить.

Помню как сейчас это праздничное утро, когда попив чая приступил к компиляции из исходных кодов сервера MANGOS. Меня уже не могло испугать то, что на не очень мощной машине какой-то порт программы в FreeBSD (источник из дерева программ для скачивания и компиляции) мог собираться очень долго.

Но затраченное на компиляцию MANGOS из исходных кодов (sources) время на двух P-III 800MHz исчислялось часами! Помогая родителям по кухне и с приготовлениями к празднику периодически заглядывал в комнату и немножко опасался что сборка программы может зависнуть или завершиться неудачей, что может не хватить какой-то библиотеки, исчерпаться доступный объем ОЗУ и т.п.

Но опасения были напрасны - все скомпилировалось. Дальше следовала еще одна достаточно длительная по времени процедура - извлечение необходимых для сервера ресурсов из самой игры. Несколько часов "прогрева микропроцессоров" и готово.

Подправив конфигурационные файлы проекта импортировал в MySQL дамп базы данных игрового мира - YTDB (SQL-файл был примерно 200МБ). Процесс занял несколько минут очень интенсивного "шуршания" жесткого диска.

После запуска скомпилированных бинарных файлов сервера в консоли побежала целая "простыня" из разных логов, а потом все замерло - Mangos успешно запущен и ждет подключений.

Изменив IP-адрес сервера в специальном файле игры, сразу же запустил ее. Меня приветствовал экран логона - поля для ввода логина с паролем на фоне портала, который охраняют два суровых каменных стража.

Экран логона в World of Warcraft - The Burning Crusade

Рис. 11. Экран логона в игре World of Warcraft с дополнением The Burning Crusade.

После логина с заранее заготовленными для аккаунта данными предстояло создать нового персонажа. Помню что тогда это был Ночной Эльф (Night Elf) - мускулистый персонаж с длинными волосами и светящимися глазами.

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

начало игры World of Warcraft за эльфов, недалеко от стартовой локации Тельдрассил

Рис. 12. World of Warcraft - начало игры за эльфов, недалеко от стартовой локации "Тельдрассил".

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

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

Игра оставила лишь позитивные воспоминания. Еще немного удивляло то, что на относительно слабенькой графической карте от INTEL все работало и выглядело просто замечательно.

Именно таким я припоминаю этот старый "теплый" WoW того времени.

Проекты MaNGOS, CMaNGOS и TrinityCore, история и факты

Попробую рассказать о том как возникли такие проекты, небольшой экскурс в историю.

Все началось с утечки альфа-версии клиента WoW (один из первых рабочих прототипов). В целях ускорения процесса разработки и отладки продукта компания Blizzard наняла небольшую группу внешних тестировщиков (за пределами компании), внутри этой группы и случилась утечка коллекции файлов игры (бинарных, не исходников).

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

Хакеры, которым была интересна данная тема, начали процесс реверс-инжиниринга клиента, исследования его протокола общения по сети, логов и работы.

Так появилась первая версия примитивного эмулятора сервера (StormCraft Sandbox) - песочницы, которая позволяла выполнять прогулки по миру игры. Суть его функционирования была проста - обеспечить клиентской части данные о логине и входе в игровой мир.

В процессе многочисленных экспериментов и доработок родился эмулятор WoW сервера под названием StormCraft. После чего начали появляться другие группы разработчиков и проекты по эмуляции: WoW Daemon, WOWCraft, WoWEmu, EWOW, WoWWoW, OpenWOW, LudMilla, DelphiEmu, Fusion, vWoW, WCell ...

Языки на которых писались такие программы: C++, C#, Delphi 6/7 и даже Visual-Basic.

Ниже показан скриншот рабочего стола того времени одного из (предположительно) разработчиков или отладчиков фанатского сервера LudMilla на классической Windows XP:

Старая версия игры WoW с запущенным эмулятором сервера LudMilla на Windows XP

Рис. 13. Одна из первых версий игры WoW с запущенным эмулятором сервера LudMilla на Windows XP.

Компания Blizzard конечно же была не в восторге от появления подобных проектов и предприняла не мало закономерных попыток (причем успешных) все это присечь и закрыть.

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

На основе утечки кода WOWD (на то время не Open Source), предоставленного человеком под ником "Kronos", был создан эмулятор сервера WOWSP (WOW Single Player), являющийся перепакованной версией WOWD.

Снимок экрана (WinXP) с тестом раннего клиента WoW совместно с WOWD

Рис. 14. Скриншот экрана (WinXP) с тестом раннего клиента WoW совместно с WOWD.

При содействии "Kronos" и еще нескольких талантливых реверсеров и программистов возник новый, переписанный и на этот раз уже с открытым исходным кодом, проект под названием MaNGOS.

Имя было выбрано совместным голосованием, поскольку старое WOWSP содержало в себе "WoW" и нарушало копирайт. Также рассматривался вариант "MaMGOS".

Датой рождения проекта можно считать день голосования за его название - 28 августа 2005 года.

В основе проекта лежит модифицированное и дополненное ядро WOWD. Проект MaNGOS изначально был очень маленьким, за него отвечали несколько программистов, но со временем он вырос до того чем и является сейчас.

Экран Windows XP разработчика одного из эмуляторов WoW с запущенным снифером сетевых пакетов

Рис. 15. Рабочий стол Windows XP разработчика одного из эмуляторов WoW с запущенным снифером сетевых пакетов.

Теперь это не просто эмулятор, а универсальный MMO-фреймворк, который можно приспособить для работы с разными сетевыми ролевыми играми.

Таким образом, благодаря появлению проекта MaNGOS стало возможным поиграть и опробовать WoW на своем экспериментальном сервере.

MaNGOS - аббревиатура от "Massive Network Game Object Server" (сервер объектов для крупной сетевой онлайн игры), написанный на C/C++ свободный кросплатформенный набор программ (сервер) для игр серии World of Warcraft.

CMaNGOS - ответвление проекта MaNGOS, плучившее название "Continued MaNGOS". Это программное обеспечение от большей части разработчиков оригинального MaNGOS, ушедших из проекта из-за разногласий по дальнейшему развитию идеи.

На сайте CMaNGOS заявлена поддержка Linux, macOS и Windows 10+. Доступные ядра игры: Classic (1.12), The Burning Crusade (2.4.3), Wrath of the Lich King (3.3.5).

Для работы программного комплекса MaNGOS требуется сервер баз данных (БД), в роли которого может выступать MySQL (MariaDB) или PostgreSQL.

На сервер БД загружается SQL-дамп, в котором содержатся игровые скрипты, описание квестов, параметры заселения мира юнитами и предметами...

Наиболее известные базы данных для MaNGOS - это UDB и YTDB, являющиеся отдельными (от мангоса) проектами.

Написанием скриптов (динамически подгружаемые модули для управления искусственным интеллектом, сценариями бытв, поведением монстров и т.д.) занимается пока что только одна команда - это ScriptDev2.

И в сервере и в БД даже сейчас встречаются недочеты в программной части, ошибки в скриптах мс неуправляемыми игроками персонажами (NPC, Non Player Cahracter), при выполнении квестов и т.д.

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

Но зато можно создать домашний сервер, или же в пределах небольшой локальной сети.

Что касается следующего проекта, то он является наиболее динамично развивающимся форком MaNGOS - это TrinityCore.

Идея его создания возникла в приватном общении между некоторыми разработчиками в сообществе UDB. Им не нравилось медлительное внедрение патчей в проекте MaNGOS, а также ощущалась нехватка поддержки со стороны разработчиков БД.

TrinityCore - проект, который объединяет в себе наработки из MaNGOS и ScriptDev2. Для поддержки базы данных к TrinityCore создан родственный проект Trinity Database.

TrinityCore project = TrinityCore + TrinityScript + Trinity Database.

Проекты MaNGOS, CMaNGOS и TrinityCore содержат хорошо проработанную документацию, а также руководства по инсталляции и настройке, форумы и другие полезные ресурсы.

Много исторической информации и несколько скриншоты по теме я извлек из архивного, когда-то существовавшего англоязычного сайта www.gotwow.ic.cz. Его старые версии все еще можно посмотреть через Веб Архив (archive.org).

На всякий случай, вот дамп основного контента сайта в формате HTML с рисунками, без трекеров, без загрузки внешних ресурсов и лишнего JS-кода, в папке 'gallery' есть немного сохранившихся скриншотов - 7Zip архив (1,5 МБ).

Я думаю что после рассказанного выше у вас появилось понимание того, насколько длинный и сложный путь развития имеют проекты MaNGOS/CMaNGOS и TrinityCore, появившиеся благодаря другим родственным проектам, в которые вложили свое время и усилия не мало программистов, реверсеров, хакеров и просто фанатов своего дела.

Что касается компании Blizzard - без появления ее замечательной и инновационной игры World of Warcraft не было бы никаких фанатских эмуляторов сервера, а также и этой статьи.

Сложно даже представить сколько сил и времени дизайнеров, разработчиков, мастеров звука, оптимизаторов, тестировщиков и другого персонала потребовалось для создания красивого и живого мира World of Warcraft. А еще это все нужно постоянно поддерживать - сервера, форумы, дополнения, исправление багов...

Игра продолжает развиваться и что примечательно - теперь на официальных серверах в нее можно поиграть даже без платной подписки, просто зарегистрировавшись на сайте и скачав клиент. Развитие персонажа в пробном варианте ограничено 20-м уровнем.

Ну а если хочется просто поэкспериментировать с миром игры, серверным ПО, базой данных, то проекты MaNGOS/CMaNGOS и TrinityCore - это то что нужно.

TrinityCore Single Player - обзор проекта, игра в WOW с ботами

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

А как насчет одиночной (или кооперативной) игры с управляемыми компьютером персонажами (ботами)? - для этой цели существует TrinityCore Single Player project.

TrinityCore Single Player - это общее название соборок на основе ядра и БД от TrinityCore, дополненных возможностью создавать в игре управляемых компьютером персонажей (NPC, ботов), а также различными оптимизациями и балансировкой окружения под одного игрока (single player).

За реализацию ботов отвечает мод NPCBots от разработчика trickerer. Ботами в игре выступают создаваемые и управляемые искусственным интеллектом персонажи (NPC), которых можно нанять и настроить например так, что они будут собирать лут, сопровождать вас, защищать и т.д.

Вот некоторое из того что умеют умные боты NPCBots:

  1. Атака, бой с использованием магии и различного оружия;
  2. Наложение заклинаний на игрока (баффинг, buffing) для усиления его способностей (броня, урон и т.п.);
  3. Исцеление и лечение (healing);
  4. Воскрешение (resurrecting);
  5. Поведение в режиме стража (без хозяина);
  6. Группирование;
  7. Посещение подземелий с играком (DungeonFinder);
  8. Участие в рейдах;
  9. Режим PvP, драка с опозиционными к герою игроками;
  10. Обеспечение игрока расходными материалами (маг, чернокнижник);
  11. Получение наложенных игроком заклинаний;
  12. Одевание одежды, предметов, доспехов, оружия;
  13. Получение и выполнение заданной роли;
  14. Управление возможностями и способностями;
  15. и другое.

Мод пока что поддерживает только ветку TrinityCore 3.3.5 (WotLK). Для его установки понадобится патчинг исходных кодов Тринити, но есть также и готовые пропатченые ответвления проекта.

В сборках TrinityCore Single Player (далее TrinityCore SP) часто можно увидеть и другие полезные моды, среди которых: "Eluna LUA Engine", "Autobalance for NPCBots" и другие.

Чтобы сэкономить время и силы на интеграцию интересных модов можно воспользоваться готовыми сборками исходных кодов ядра TrinityCore с уже накатанными патчами и установленными модами.

В этой статье я предлагаю рассмотреть одну из таких сборок - проект TrinityCore Single Player от Zaicopx, описание которого можно найти в одной из тем c релизами по эмуляторам на зарубежном форуме OwnedCore.

Сборка оснащена следующими модами:

  1. NPCbots by trickerer - поддержка ботов для TrinityCore 3.3.5;
  2. Autobalance for NPCBot - автобалансировка окружения при игре с ботами;
  3. Solo LFG - возможность поиска подземелий как в одиночном, так и в групповом режиме;
  4. Eluna LUA Engine - добавление поддержки скриптового языка LUA;
  5. Skip Death Knight Starting Area - отключение посещения стартовой зоны для класса Death Knight;
  6. Racial Swap Skills Abilities NPC - позволяет менять квалификации между ботами с разными рассами.

А вот список некоторых модифицированных настроек и возможностей ядра:

  • Для изучения доступно 11 профессий;
  • Завершение любого квеста всегда дает полную награду;
  • Уничтожение существ - всегда полная награда;
  • Разведка карты - всегда полная награда;
  • Убраны требования к группе при исполнении рейдов;
  • Радиус атаки - уменьшен наполовину;
  • Радиус следования для существ - отключен;
  • Радиус содействия для существ - уменьшен наполовину;
  • Скорость перемещения - увеличена (значение 1.15);
  • Смертельная болезнь - отключено;
  • Отключен дисконнект от сервера когда игрок долго не активен (AFK, Away From Keyboard);
  • Двукратное начисление опыта в викенд;
  • Активированы боты продавца и покупателя (Ahbot);
  • Максимальное количество ботов на игрока установлено в - 19;
  • Можно увеличивать скорость течения времени в игре;
  • Награда за время онлайн;
  • Ручная установка скорости атаки;
  • Автобалансировка сложности врагов и монстров при одиночном и групповом (с ботами) посещении подземелий.

Полагаю что вас заинтересовал такой набор возможностей. Поэтому будем приступать к экспериментам.

Описанный ниже процесс компиляции ядра и настройки сборки TrinityCore SP можно без особо кардинальных изменений применить и для сборки чистого TrinityCore (без модов), а также как руководство для компиляции других, базирующихся на ядре TrinityCore, сборок сервера под GNU/Linux.

Подготовка к сборке сервера

Все действия будут выполняться под операционной системой (ОС) Debian GNU/Linux. На момент написания статьи это 10-я версия этой ОС - Debian Buster.

Давайте посмотрим что и как будет связано при взаимодействии:

Как работает игровой сервер TrinityCore, связь с клиентом игры

Рис. 16. Упрощенная схема взаимодействия сервера TrinityCore с клиентом игры.

Для работы ядра TrinityCore фактически нужно чтобы были запещены три службы:

  1. Auth Server - сервер авторизации и предоставления доступа к игровым мирам (реалмам, realms);
  2. World Server - собственно сервер игрового мира;
  3. Database - сервер баз данных 'auth' (авторизация), 'characters' (персонажи) и 'world' (мир).

Вот вам и Тринити (Троица).

Службы авторизации и игрового мира будут общаться с сервером БД через порт 3306 (по умолчанию). Клиент (сама игра) будет вести коммуникацию с серверами Auth и World через порты 3724 и 8085 соответственно.

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

Один Auth Server может предоставлять доступ сразу к нескольким разным мирам (со своими рейтами, особенностями), для этого запускаются несколько серверов мира (World Server), работающих на разных портах.

В базе данных 'auth' прописываются данные для подключения ко всем мирам. После авторизации в игре можно выбрать в каком игровом мире хочется играть.

В этой статье рассмотрена сборка и настройка TrinityCore с одним игровым миром - один World Server на порту 8085 (по умолчанию).

Документация по TrinityCore (установка, настройка, структура БД, полезные ссылки) находится вот тут - www.trinitycore.info

В разделе "Installation Guide" (руководство по установке) по пунктам описан процесс сборки и настройки для разных операционных систем. Проект развивается, поэтому рекомендую держать документацию "под рукой".

Для сборки и запуска проекта ТринитиКор понадобится компьютер с микропроцессором, поддерживающим инструкции SSE2 - начиная от INTEL Pentium 4, Xeon, Pentium/Celeron D, Pentium/Celeron M, AMD Athlon 64 и новее (INTEL Core Duo/Quad, Core i5, i7, i9, AMD FX, Turion, Opteron, Phenom, Ryzen и т.д).

SSE2 (Streaming SIMD Extensions 2) - расширение для ранее введенных 70-ти инструкций SSE, добавляющее 144 новых инструкции. Одна такая команда процессора позволяет обрабатывать данные сразу в несколько потоков (SIMD, Single Instriction Multiple Data).

Проверить наличие инструкций SSE2 у процессора на текущей Linux-системе можно командой:

cat /proc/cpuinfo | grep 'sse2' | wc -l

Если выведет "0" - инструкции отсутствуют, а если другое число - значит все ок.

Чтобы не засорять основную Linux систему рекомендую выполнять сборку проекта в виртуальной машине KVM, QEmu или VirtualBox, также можно воспользоваться LXC-контейнерами.

В случае с виртуальной машиной не забудьте в BIOS'е компьютера разрешить аппаратную виртуализацию (Intel VIrtualization, Intel-VT, AMD SVM mode, AMD-V) - это ускорит работу гостевой ОС и всех программ внутри нее. Желательно выделить 2 ядра микропроцессора и минимум 4ГБ оперативной памяти.

Плюсы сборки и запуска проекта в виртуальной машине:

  1. Установка пакетов, программ, изменение настроек и окружения не будут влиять на основную рабочую ОС;
  2. Возможность делать снимки гостевой системы (snapshots) после каждого успешного этапа сборки и настройки. В случае ошибки можно поэкспериментировать и если что сделать откат к прежнему состоянию;
  3. Изоляция сервера от основной системы, плюс к безопасности.

Для работы с TrinityCore SP понадобится старенький клиент игры версии 3.3.5 (WotLK). На официальном сайте такую версию уже не скачать.

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

В моем случае, в наличии оказался DVD-бокс - сборник игр в комплекте с WotLK. Два двухсторонних DVD по 4,7 ГБ.

 Сборник игр из классической серии WarCraft, StarCraft, Diablo на двух DVD дисках, пиратка

Рис. 17. Старый сборник игр из серии WarCraft/StarCraft/Diablo на двух DVD дисках, пиратка.

Подобные экземпляры, в том числе и английские лицензионные, еще встречаются на распродажах игровых дисков для PC - можно поискать на сайтах с объявлениями о продаже разных вещей.

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

Качать 10-20 ГБ из интернета в 200х годах мог себе позволить далеко не каждый. У большинства был лимитированный канал и даже платный трафик, скорость закачки составляла 64-128 кбит/с (8-16 кбайт/с). При полной и стабильной скорости 128 кбит/с (ADSL или выделенка) закачка 16ГБ длилась бы более 12-ти полных суток!

Будем считать что клиентская часть игры уже есть. Приступим к получению исходников сборки TrinityCore Single Player и их компиляции.

Получение исходных кодов, компиляция и конфигурация

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

Программы, библиотеки

Установим необходимые инструменты, утилиты и библиотеки:

apt install htop mc p7zip-full screen
apt install git clang cmake make gcc g++ libmariadbclient-dev 
apt install libssl-dev libbz2-dev libreadline-dev libncurses-dev
apt install libboost-all-dev mariadb-server p7zip default-libmysqlclient-dev

Установим высокий приоритет для использования компилятора CLang:

update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100
update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang 100

Создаем пользователя 'wow' для сборки и запуска сервера:

sudo adduser wow
sudo mkhomedir_helper wow
sudo passwd wow

Последняя команда запросит новый пароль для пользователя 'wow' - придумайте надежный (буквы разного регистра+цифры+какой-то символ) и запишите/запомните его, потом он пригодится.

Установив пакет 'pwgen' можно одной командой сгенерировать много надежных паролей, например:

apt install pwgen
pwgen -n -s -B 21

Сохраните себе несколько таких строчек с паролями - далее в статье вы сможете их использовать для установки доступов к БД и т.п.

Переключимся на нашего пользователя и перейдем в его домашний каталог, в котором и будет продолжена работа:

sudo su wow
cd /home/wow

Исходные коды проекта

Для получения исходных кодов я рекомендую сделать локальный клон GIT-репозитория проекта. Понадобится скачать примерно 550 МБ данных - получим версию в разработке, исходные коды с самыми последними изменениями.

Клонирование нужно выполнять обязательно в рекурсивном режиме (с подтягиванием зависимостей), поскольку к проекту подключен внешний модуль (из другого репозитория) - Eluna Lua engine.

Если же скачать архив с исходниками из раздела 'Releases' на GitHub'е разработчика, то там директория "src/server/game/LuaEngine" будет пуста.

Проект без данного модуля не соберется, появится ошибка:

fatal error: "LuaEngine.h" No such file or directory

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

git clone --recursive https://github.com/zaicopx/TrinityCore-Single-Player

Процесс будет выглядеть примерно так:

Cloning into 'TrinityCore-Single-Player'...
remote: Enumerating objects: 418027, done.
remote: Counting objects: 100% (8/8), done.
......
Receiving objects: 100% (3788/3788), 3.04 MiB | 2.37 MiB/s, done.
Resolving deltas: 100% (2675/2675), done.
Submodule path 'src/server/game/LuaEngine': checked out '057afab1fbf...'

В конце будет сказано что субмодуль 'LuaEngine' также был обработан - все в порядке.

Следующими командами мы: смотрим содержимое текущей директории, удаляем директорию '.git' в папке с деревом исходных кодов, а потом (на всякий случай) пакуем весь проект в 7-Zip архив с максимальным уровнем сжатия.

ls
rm -rf TrinityCore-Single-Player/.git
7z a -m0=lzma2 -mx=9 TrinityCore-Single-Player-01-08-2021.7z TrinityCore-Single-Player/

В результате, в домашней директории '/home/wow/' должна появиться поддиректория 'TrinityCore-Single-Player' с деревом исходных кодов проекта, а также наш 7z-архив (примерно 40-50М).

Компиляция

Создаем директорию для сборки 'build' и переходим в нее:

cd /home/wow/TrinityCore-Single-Player
mkdir build && cd build

Выполним конфигурирование проекта для сборки:

cmake ../ -DCMAKE_INSTALL_PREFIX=/home/wow/server -DCONF_DIR=/home/wow/server/etc -DTOOLS=1 -DSCRIPTS="dynamic" -DWITH_WARNINGS=1

Параметры и их описание:

  • -DCMAKE_INSTALL_PREFIX - путь к директории, в которую будет установлена программа ("/home/wow/server");
  • -DCONF_DIR - путь к директории с будущими конфигурационными файлами проекта;
  • -DTOOLS=1 - разрешить компиляцию утилит для извлечения ресурсов (map/vmap/mmap etractor/assembler);
  • -DSCRIPTS="dynamic" - указывает что наш собранный сервер будет компилировать пользовательские скрипты "на лету" (динамичкески);
  • -DWITH_WARNINGS=1 - отображать сообщения с предупреждениями в процессе компиляции.

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

Для компиляции проекта можно просто запустить:

make

Но если в системе (виртуальной машине или хосте) установлено 2 иболее ядер, то процесс компиляции можно ускорить, указав программе 'make' задействовать нужное количество ядер (или потоков) CPU.

Например, выполним компиляцию в два потока (2 ядра CPU):

make -j 2

Тут нужно понимать что для каждого дополнительного потока нужен дополнительный объем оперативной памяти. Поэтому следите за использованием RAM, например с помощью программы "htop", запущенной в отдельном терминале.

Время сборки зависит от частоты процессора и количества задействованных для компиляции ядер. Например, на Сore i5 с двумя ядрами по 2,7GHz проект собрался примерно за 1 час.

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

Компиляция проекта TrinityCore Single Player под GNU/Linux

Рис. 18. Процесс компиляции проекта TrinityCore Single Player под GNU/Linux.

Процентный индикатор демонстрирует сколько еще осталось до завершения. В конце не должно быть никаких сообщений об ошибках:

Успешное завершение компиляции TrinityCore Single Player под GNU/Linux

Рис. 19. Успешное завершение компиляции TrinityCore Single Player под GNU/Linux.

Если что-то пошло не так, то можно поискать темы с заданными ключевыми словами по форуму проекта. Вот ссылка на тему, в которой есть вопросы и решения проблем при компиляции ядра (110+ страниц с комментариями) - "https://community.trinitycore.org/topic/120-compile-or-cmake-problems/".

Использование поисковой системы с точным запросом по указанному сайту - возможно что более быстрый и эффективный способ найти нужную информацию. Для этого в поисковой системе вводим следующую конструкцию с запросом:

site:community.trinitycore.org lua engine

Здесь вместо "lua engine" - подставьте свой запрос, например: "compilation error 123", "missing library xyz" и т.п.

Теперь, когда проект скомпилирован, можно его установить в ранее указанную (при конфигурировании) директорию - '/home/wow/server'.

Выполним команды:

make install
ls -la /home/wow/server

На экран будет выведен лог установки, а также содержимое указанной директории, в которой у нас теперь есть три поддиректории:

  • bin - содержит бинарные исполняемые файлы (сервер мира и авторизации, утилиты распаковки данных), а также папки для скриптов;
  • etc - здесь лежат конфигурационные файлы;
  • lib - библиотеки с наборами функций для БД и игры.

ВАЖНО: директорию 'TrinityCore-Single-Player' с исходными кодами после компиляции и инсталляции - не удяляем!

Конфигурационные файлы

В завершение этого этапа подготовим конфигурационные файлы с сохранением их оригиналов:

cd /home/wow/server/etc
cp authserver.conf.dist authserver.conf
cp worldserver.conf.dist worldserver.conf

Создадим папку для данных из игры, которые необходимы серверу:

mkdir /home/wow/server/data

Откроем в редакторе конфигурационный файл сервера мира (World server):

nano /home/wow/server/worldserver.conf

Укажем там путь и название папки с игровыми данными:

DataDir = "../data"

Для сохранения изменений в файле и выхода из редактора 'nano' нажимаем CTRL + X, а потом Y и ENTER.

Итоговая структура директорий на этом этапе получается примерно следующей:

server
│
├── bin
│   ├── authserver
│   ├── lua_scripts
│   │   └── extensions
│   ├── mapextractor
│   ├── mmaps_generator
│   ├── scripts
│   │   ├── libscripts_battlefield.so
│   │   ├── libscripts_commands.so
│   │   └── ...
│   ├── vmap4assembler
│   ├── vmap4extractor
│   └── worldserver
├── data
├── etc
│   ├── authserver.conf
│   └── worldserver.conf
└── lib
    ├── libcommon.so
    ├── libdatabase.so
    ├── libgame.so
    └── libshared.so

Этот этап завершен!

Извлечение игровых ресурсов DBC, Maps, VMaps, MMaps

Итак, ядро Тринити скомпилировано и установлено. При настройке сборки (команда cmake) мы указали опцию '-DTOOLS=1' и поэтому в директории 'bin' теперь есть набор утилит для извлечения игровых ресурсов: mapextractor, vmap4extractor, mmaps_generator и vmap4assembler.

Из клиентской части игры мы будем извлекать следующие данные:

  1. DBC - множество файлов, представляющих из себя небольшие базы данных с параметрами предметов, персонажей и игрового мира;
  2. Maps - собственно карты локаций, данные по которым сервер будет знать параметры области, ее ID и т.д.;
  3. VMaps (Visual Maps) - визуальные (или векторные) карты. Содержат параметры и границы объектов, стен, интерьера. Это поможет серверу, к примеру, предотвратить случай когда NPC будет атаковать противника, которого он попросту не видит (через стену) и т.д.;
  4. MMaps (Movement Maps) - карты путей, помогут серверу проложить оптимальный путь перемещения (например для NPC), предотвратить коллизии юнитов в игровом мире и т.д.;
  5. Cameras - настройки камеры для сцены.

Для извлечения ресурсов нужны файлы игры (клиент) точно такой же версии, как и ветка собранного нами сервера, а именно - 3.3.5 (WotLK, Wrath of the Lich King). С другой версией игрового клиента сервер TrinityCore SP не заработает!

Файлы игры можно скопировать на USB носитель (лучше жесткий или SSD диск), а потом подключив его к серверу примонтировать размед, например в точку монтирования '/mnt'.

mount /dev/sdX /mnt

Здесь 'sdX' - это название подключенного устройства и раздела, например: sda1, sdb1 и т.д. Вывести список блочных устройств можно командой 'lsblk'.

Также файлы можно скопировать на сервер по сети или другим способом.

Будем считать что директория с игрой называется 'WOW_3.3.5' и она скопирована в '/mnt'. Таким образом по пути ''/mnt/WOW_3.3.5/' должен быть доступен, к примеру, файл 'Wow.exe' и директория 'Data'.

Перейдем в эту директорию в консоли:

cd /mnt/WOW_3.3.5/

Извлечение DBC и Maps

Запускаем команду извлечения данных, находясь при этом в директории с игровым клиентом:

/home/wow/server/bin/mapextractor

Начнется процесс распаковки:

Распаковка DBC и Maps из клиента игры для сервера TrinityCore

Рис. 20. Начало распаковки DBC и Maps из клиента игры для сервера TrinityCore.

Завершение будет выглядеть вот так:

Extract Transport197349 (131/135)                  
Extract Transport197350 (132/135)                  
Extract Transport201834 (133/135)                  
Extract Stormwind (134/135)                  
Extract ChamberofAspectsRed (135/135)                  
Processing........................100%

Время работы ~ 5 минут.

В директории с игрой должны появиться две новые поддиректории:  'dbc' (~175M) и 'maps' (~278M). Копируем их (рекурсивно) в директорию 'data' для нашего сервера:

cp -r dbc maps /home/wow/server/data

Распаковка VMaps

Запускаем следующий екстрактор:

/home/wow/server/bin/vmap4extractor

На экран будет выведено много данных, по завершению программа должна сказать что все готово и ошибок нет:

......
####Extracting WORLD\WMO\DUNGEON\LD_STRATHOLME\FROSTWYRM_FINAL01.WMO
#######################]
Processing Map 534
[###################################Extracting WORLD\WMO\AZEROTH\BUILDINGS\HUMAN_BARN_SILO\BARN_CLOSED.WMO
Extracting WORLD\WMO\AZEROTH\BUILDINGS\HUMAN_FARM\FARM_CLOSED.WMO
Extracting WORLD\WMO\AZEROTH\BUILDINGS\HUMANTWOSTORY\HUMANTWOSTORY_CLOSED.WMO
#Extracting WORLD\WMO\AZEROTH\BUILDINGS\GOLDSHIREINN\GOLDSHIREINN_CLOSED.WMO
##Extracting WORLD\WMO\DUNGEON\CAVERNSOFTIME\HYJALTREEAREACOLLISION.WMO
#Extracting WORLD\WMO\DUNGEON\CAVERNSOFTIME\CAVERNSOFTIMEHYJAL.WMO
#########################]
Extracting World\wmo\Dungeon\Hellfire\Hellfire_Military.wmo
Processing Map 540
......
Done!

Extract V4.00 2012_02. Work complete. No errors.

Время работы ~ 10 минут.

Будет создана новая директория 'Buildings'.

Создаем директорию 'vmaps' и запускаем дополнительный екстрактор, который будет использовать данные из 'Buildings':

mkdir vmaps
/home/wow/server/bin/vmap4assembler Buildings vmaps

Вывод в процессе работы будет примерно такой:

using Buildings as source directory and writing output to vmaps
Read coordinate mapping...
spawning Map 0
spawning Map 1
spawning Map 13
spawning Map 25
..........
Converting Zulgurubtree04.m2
Converting Zulgurubtree05.m2
Ok, all done

Время работы ~ 4 минуты.

Копируем директорию 'vmaps' в серверную 'data' :

cp -r vmaps /home/wow/server/data

Извлечение MMaps

Создаем директории с игрой новую поддиректорию 'mmaps' и запускаем последний распаковщик ресурсов:

mkdir mmaps
/home/wow/server/bin/mmaps_generator

Будет проделано много работы, соответственно на экране будет не мало данных о процессе:

Discovering maps... found 105.
Discovering tiles... found 6035.

Using 2 threads to generate mmaps
[Map 000] Creating navMesh...
[Map 000] We have 687 tiles.                          
[Map 001] Creating navMesh...
[Map 001] We have 988 tiles.                          
[Map 030] Creating navMesh...
0% [Map 000] Building tile [24,54]
[Map 030] We have 35 tiles.
...........
53% [Map 571] Building tile [21,30]
[Map 571] [21,30]:  Building movemap tiles...
[Map 571] [21,30]:  Building navmesh tile...
[Map 571] [21,30]:  Adding tile to navmesh...
[Map 571] [21,30]:  Writing to file...
...........
Finished. MMAPS were built in 2 Hours 26 Minutes 47 Seconds.

Время работы ~ 2 часа 30 минут.

Это время распаковки на 2х ядрах CPU. На процесоре с большим количеством ядер все завершится еще быстрее.

Копируем на этот раз директорию 'mmaps' к данным нашего сервера:

cp -r mmaps /home/wow/server/data

Cameras

Тут все просто - копируем готовую папку в директорию 'data':

cp -r Cameras /home/wow/server/data

В результате, в директории 'data' нашего сервера должны быть следующие папки с файлами внутри:

  1. Cameras,
  2. dbc,
  3. maps,
  4. mmaps
  5. vmaps.

Очистка клиента

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

cd /mnt/Games/WOW_3.3.5 && ls
rm Cameras/* && rmdir Cameras
rm Buildings/* && rmdir Buildings
rm maps/* && rmdir maps
rm mmaps/* && rmdir mmaps
rm vmaps/* && rmdir vmaps
rm -rf dbc

Этот этап завершен!

Подготовка сервера БД, заливка SQL скриптов и игрового мира 

Дальше будет не менее интересно - база данных и наполнение игрового мира.

Серверный пакет для БД ("mariadb-server") мы уже установили еще на этапе подготовки к компиляции.

MariaDB - поддерживаемая сообществом система управления реляционными базами данных с открытым исходным кодом, форк сейчас уже платного MySQL, который в 2009-м году поглотила компания Oracle.

Официальный сайт проекта MariaDB - mariadb.org

Сервер игры и сервер БД будут у нас работать в пределах одной ОС - на одном компьютере или в одной виртуальной машине.

Настройка сервера БД

Следующие команды нужно исполнять от имени суперпользователя (root). Поэтому рекомендую открыть новый терминал и все будущие операции, которые требуют высокого уровня доступа проделывать там.

Открываем для редактирования конфигурационный файл сервера БД:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Ищем и указываем адрес, на котором будет работать сервер БД - по умолчанию это локалхост 127.0.0.1. В данном случае подключение к БД смогут делать лишь приложения, имеющие доступ к локальному интерфейсу системы.

Для доступа к БД извне (за пределами сервера, по сети) можно будет использовать SSH-туннель. Такая конфигурация безопасна и не требует дополнительной настройки файрвола.

Также укажем что максимальный размер пакета (по умолчанию 16М) теперь 512МБ. Это нужно чтобы в БД можно было загрузить большой дамп (одним файлом).

bind-address           = 127.0.0.1
max_allowed_packet     = 512M

Сохраняем файл и выходим из редактора. После этого перезапускаем службу 'mariadb':

sudo systemctl restart mariadb

Дале мы запустим интерактивный конфигуратор, который поможет сделать следующее:

  • Установит пароль для пользователя root (сервера БД);
  • Удалит анонимные и тестовые базы данных;
  • Заблокирует доступ для root при подключении не через локальный интерфейс.

Придумайте надежный пароль для сервера БД (или используйте сгенерированный программой 'pwgen'), запишите его где небудь и вперед:

sudo mysql_secure_installation

Теперь создадим нового пользователя БД с логином 'trinity', и поскольку на сервере будут только базы данных игрового сервера, то для удобства работы назначим ему полный доступ (как у root).

Под пользователем 'trinity' потом будем создавать базы данных для TrinityCore, наполнять игровой мир, выполнять скрипты, работать с БД через визуальный менеджер.

Подключаемся к интерактивной консоли сервера БД:

sudo mariadb

Далее нужно будет запустить несколько SQL-команд, в двух из которых указан пароль пользователя 'trinity' как 'PASSW@RD1234' - исправьте его на свой и выполняйте команды по очереди:

CREATE USER 'trinity'@'localhost' IDENTIFIED BY 'PASSW@RD1234';
GRANT ALL PRIVILEGES ON *.* TO 'trinity'@'localhost' WITH GRANT OPTION;
CREATE USER 'trinity'@'%' IDENTIFIED BY 'PASSW@RD1234';
GRANT ALL PRIVILEGES ON *.* TO 'trinity'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit;

Пользователь БД готов!

Теперь нужно внести данные доступа к серверу БД в конфигурационные файлы игрового сервера.

Открываем на редактирование файл с настройками службы авторизации (authserver):

nano /home/wow/server/etc/authserver.conf

Ищем переменную с названием 'LoginDatabaseInfo', для этого можно использовать поиск в редакторе 'nano' - жмем CTRL+W, вводим искомую строку и ENTER.

Значение переменной записывается в следующем формате: "MySQL_Host;Port;Username;Password;database".

В результате строка должна у нас выглядеть вот так (только поменяйте пароль 'PASSW@RD1234' на реальный для пользователя 'trinity'):

LoginDatabaseInfo = "127.0.0.1;3306;trinity;PASSW@RD1234;auth"

Сохраняем файл и выходим. Дальше редактируем файл с настройками службы игрового мира (worldserver):

nano /home/wow/server/etc/worldserver.conf

Здесь нужно найти три строки (опции для трех баз данных) и также их изменить, указав актуальный пароль для 'trinity':

LoginDatabaseInfo     = "127.0.0.1;3306;trinity;PASSW@RD1234;auth"
WorldDatabaseInfo     = "127.0.0.1;3306;trinity;PASSW@RD1234;world"
CharacterDatabaseInfo = "127.0.0.1;3306;trinity;PASSW@RD1234;characters"

Сохраняем все и выходим.

Создание баз данных

Теперь предстоит создать три пустых БД, вот их названия и будущее назначение:

  1. auth - данные аккаунтов, пароли, GM (Grand Master) доступы, информация реалма и т.п.
  2. characters - данные персонажей, инвентаря, банков с предметами, билетами и т.п.
  3. world - информация о NPC, квестах, объектах игрового мира и т.д.

Подключаемся к консоли БД:

sudo mariadb

Выполняем по очереди следующие SQL-инструкции:

GRANT USAGE ON *.* TO 'trinity'@'localhost' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;
CREATE DATABASE `world` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `characters` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE `auth` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON `world` . * TO 'trinity'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `characters` . * TO 'trinity'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON `auth` . * TO 'trinity'@'localhost' WITH GRANT OPTION;

Первая из них - снимает ограничения на количество запросов и подключений к серверу, следующие три - создают наши БД, и последине три - назначают нашему 'trinity' полный доступ к этим БД.

Наполнение БД

Следующие команды нужно выполнять из-под пользователя 'wow'! Переходим в терминал, где вели работу с этим пользователем.

В свежем TrinityCore (который мы и используем) теперь не нужно заливать БД через консоль сервера MySQL (MariaDB) - все выполняется автоматически программой-сервером 'worldserver'.

Перейдем в папку 'bin' нашего игрового сервера и первый раз запустим наш скомпилированный 'worldserver':

cd /home/wow/server/bin
./worldserver

Процесс быстро завершится, увидим примерно следующее:

запуск игрового сервера worldserver для TrinityCore, не найден файл наполнения игрового мира

Рис. 21. Первый запуск игрового сервера worldserver для TrinityCore, не найден файл наполнения игрового мира.

Как видим, были исполнены несколько SQL-скриптов (auth_database.sql, characters_database.sql), которыми созданы таблицы для игровых аккаунтов и пероснажей - значит программа получила доступ к БД, настройки в конфигурационных файлах мы сделали верно.

В конце говорится что игровой мир пуст и сделана неудачная попытка его наполнить. Для наполнения БД 'world' программа ищет четко обозначенную специальную версию SQL-файла, в которой и должен содержаться весь дамп этой БД.

Также дается ссылка где искать такой дамп - https://github.com/TrinityCore/TrinityCore/releases

В моем случае файл называется вот так:

TDB_full_world_335.21051_2021_05_14.sql 

TDB - сокращение от Trinity DataBase.

Переходим по ссылке на указанный Git-репозиторий и ищем релиз с названием, в котором содержится кодовое число релиза для указанного программой файла.

В моем случае это: 335.21051.

  • 335 - это версия ветки проекта (3.3.5, WotLK);
  • 21051 - кодовый номер релиза БД.

У вас БД может требоваться уже поновее и номер соответственно будет другой.

Качаем архив с БД и распаковываем его с помощью 7-Zip в директорию, где лежит файл 'worldserver' - в '/home/wow/server/bin'.

Например (с SQL-файлом моей версии, у вас имя будет другое):

cd /home/wow/server/bin
7z x TDB_full_world_335.21051_2021_05_14.7z
ls

Теперь снова запускаем 'worldserver':

./worldserver

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

Using configuration file /home/wow/server/etc/worldserver.conf.
Using SSL version: OpenSSL 1.1.1d  10 Sep 2019 (library: OpenSSL 1.1.1d  10 Sep 2019)
Using Boost version: 1.67.0
Database World is empty, auto populating it...
>> Applying 'TDB_full_world_335.21051_2021_05_14.sql'...
....
Updating World database...
>> Applying update "2021_05_17_00_world_335.sql" '68AED0F'...
>> Applying update "2021_05_17_01_world_335.sql" 'B3D675E'...
....

И завершится он с ошибкой (но не пугайтесь, все идет по плану):

Table 'characters.characters_npcbot_stats' doesn't exist
Could not prepare statements of the Character database, see log for details.

Программа говорит нам что не хватает некоторых таблиц, а именно связанных с модулем NPCBot.

Создаем структуры в БД для модуля NPCBot

Ситуация здесь следующая: исходные коды модуля NPCBot изначально интегрированы в TrinityCore, бинарные файлы у нас уже скомпилированы соответственно также с поддержкой ботов.

Модулю сейчас не хватает таблиц в базе данных - их нужно создать. Для этого в папке "TrinityCore-Single-Player/sql/Bots/" проекта существует набор SQL-скриптов.

Более подробно о процессе установки модуля можно узнать в его репозитории, ссылку я приводил выше в обзоре TrinityCore Single-Player.

Следующие команды нужно выполнять также от имени пользователя 'wow'.

Перейдем в папку со скриптами, выведем на экран список файлов:

cd /home/wow/TrinityCore-Single-Player/sql/Bots/
ls

Чтобы не обрабатывать каждый скрипт по отдельности, здесь есть два Shell-скрипта, которые соберут весь SQL-код из файлов в два файла - по скрипту на каждую из БД (characters и world).

Выполним эти скрипты и посмотрим что получилось:

sh ./merge_sqls_characters_unix.sh
sh ./merge_sqls_world_unix.sh
ls

Должны появиться два новых файла: 'ALL_characters.sql' и 'ALL_world.sql'.

Следующие команды нужно исполнять из-под пользователя 'root', переходим в нужный терминал и запускаем все по очереди:

cd /home/wow/TrinityCore-Single-Player/sql/Bots/
sudo mariadb characters < ALL_characters.sql
sudo mariadb world < ALL_world.sql

SQL-скрипты должны выполниться без каких-либо ошибок.

Теперь все готово к первому полноценному запуску!

Тестовый пуск сервера, скрипты управления службами

Итак, будем запускать сервер авторизации и сервер игрового мира.

Для этого рекомендую открыть два отдельных окна с терминалом (консоль Linux), переключиться в каждом из них под пользователя 'wow' и перейти в директорию с бинарными файлами:

su wow
cd /home/wow/server/bin

Сервер авторизации

В первом терминале запускаем сервер авторизации:

./authserver

Пример вывода:

Старт скомпилированного authserver проекта TrinityCore Single Player

Рис. 22. Запуск скомпилированного authserver проекта TrinityCore Single Player.

Как видим, сервер авторизации успешно подключился к БД и добавил доступ к игровому миру (Realm, реалм) с адресом 127.0.0.1 и портом 8085.

Таким образом, сервер авторизации позволит подключиться к службе игрового мира только по IP-адресу 127.0.0.1 - то есть с локального компьютера.

Если игровой клиент (WotLK) будет запускаться (например через транслятор Wine) на той же Linux системе что и сервер, то ничего менять не нужно.

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

Узнаем IP-адрес сетевого интерфейса сервера, к которому будем подключаться с компьютера где работает игра, запустим на сервере такую команду:

ip a

В выведенном списке сетевых интерфейсов ищем тот по которому будем подключаться с игрового клиента, узнаем из строчки что начинается на 'inet' его iP-адрес.

Допустим это будет '192.168.1.155'.

Переходим в терминал с правами 'root' и подключаемся через консоль MariaDB к базе данных 'auth':

sudo mariadb auth

Выполняем там SQL-запрос, который изменит IP-адрес для всех реалмов (миров) на '192.168.1.155' (не забудьте изменить на свой):

UPDATE `realmlist` SET address = '192.168.1.155';
quit

Переходим в окно где запущен сервер 'authserver' и останавливаем его нажатием CTRL+C. Потом запускаем снова и в конце должны увидеть что iP-адрес реалма теперь изменен.

Loading IP Location Database...
Added realm "Trinity" at 192.168.1.155:8085.

Сервер игрового мира

Теперь во втором терминале запускаем сервер игрового мира:

./worldserver

После запуска программа автоматически применит недостающие обновления БД и начнется процесс инициализации модулей и загрузки игровых ресурсов.

Вот часть начального вывода и того что будет по завершению загрузки:

Using configuration file /home/wow/server/etc/worldserver.conf.
Using SSL version: OpenSSL 1.1.1d  10 Sep 2019 (library: OpenSSL 1.1.1d  10 Sep 2019)
Using Boost version: 1.67.0
Updating Auth database...
>> Auth database is up-to-date! Containing 1 new and 87 archived updates.
Updating Character database...
>> Character database is up-to-date! Containing 1 new and 62 archived updates.
Updating World database...
>> World database is up-to-date! Containing 22 new and 5718 archived updates.
Realm running as realm ID 1
Using World DB: TDB 335.21051
Will clear `logs` table of entries older than 1209600 seconds every 10 minutes.
Client cache version set to: 21051
Using DataDir ../data/
WORLD: MMap data directory is: ../data/mmaps
VMap support included. LineOfSight: 1, getHeight: 1, indoorCheck: 1
VMap data directory is: ../data/vmaps
Initialize Eluna Lua Engine...
[Eluna]: Searching scripts from `lua_scripts`
Loading Trinity strings...
>> Loaded 1019 trinity strings in 2 ms
Initialize data stores...
.........
[Eluna]: Executed 3 Lua scripts in 23 ms
World initialized in 0 minutes 19 seconds
Starting up anti-freeze thread (60 seconds max stuck time)...
TrinityCore rev. unknown 1970-01-01 00:00:00 +0000 (Archived branch) (Unix, RelWithDebInfo, Dynamic) (worldserver-daemon) ready...
TC>

Если все в порядке, то 'worldserver' в терминале должен выдать приглашение на ввод команд, консоль игрового мира 'TC>'. Завершить работу сервера можно так же как и в случае с 'authserver' - нажать в терминале сервера CTRL+C.

Чтобы узнать текущую версию БД игрового мира переключимся на терминал с root-доступом и подключимся к базе данных 'world':

sudo mariadb world

Для чтения содержимого таблицы 'version' выполним простой SQL-запрос:

SELECT * FROM `version`;

В консоль будет выведено содержимое таблички 'version', где в моем случае в столбике 'db_version' указано: 'TDB 335.21051'. Это именно та версия дампа TDB, которую я и скачивал в архиве.

При обновлении и перекомпиляции ядра, а также после заливки новой версии TDB здесь всегда можно узнать текущую используемую версию БД TrinityCore.

Скрипты для автозапуска служб

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

Запуск служб будет выполняться от имени пользователя 'wow' (не от 'root', плюс к безопасности) в программе 'screen', которая позволит программам выполняться в фоновом невидимом терминале, к которому в любой момент подключиться и отправить нужные команды.

Создадим юниты для Systemd.

Откроем в редакторе новый файл (будет сохранен в /etc/systemd/system/):

sudo nano /etc/systemd/system/tc-authserver.service

Добавим в него содержимое:

[Unit]
Description=TrinityCore Auth Server
After=network.target mariadb.service

[Service]
Type=forking
WorkingDirectory=/home/wow/server/bin
User=wow
ExecStart=/usr/bin/screen -dmS tc-authserver /home/wow/server/bin/authserver
ExecReload=/usr/bin/pkill -f --signal 15 tc-authserver; /usr/bin/screen -dmS tc-authserver /home/wow/server/bin/authserver
ExecStop=/usr/bin/pkill -f --signal 15 tc-authserver
Restart=always
RestartSec=10s

[Install]
WantedBy=multi-user.target

Выходим и сохраняем файл.

Директивой 'After=network.target mariadb.service' мы указываем что наша служба 'authserver' должна быть запущена после инициализации сетевой подсистемы, а также после запруска сервера БД (MariaDB).

Программу 'screen' запускаем с с указанием программы которая будет там работать, а также с параметрами:

  • -d -m - старт в фоне, без подключения текущего терминала к скрину;
  • -S - название сессии (в данном скрипте это 'tc-authserver').

Директивы 'Restart=always' и 'RestartSec=10s' сделают так, что при остановке процесса 'authserver' он будет автоматически перезапущен, подождав для этого 10 секунд.

Для остановки службы используется программа 'pkill' (от Process Kill), которая отправит процессу сигнал с номером 15 - SIGTERM (Signal Terminate). Поиск процесса выполняется по наличию подстроки 'tc-authserver' в названии процесса и его аргументах (в  помощь опция -f).

Теперь откроем в редакторе новый файл (будет сохранен в /etc/systemd/system/):

sudo nano /etc/systemd/system/tc-worldserver.service

Его содержимое:

[Unit]
Description=TrinityCore World Server
After=network.target mariadb.service

[Service]
Type=forking
WorkingDirectory=/home/wow/server/bin
User=wow
ExecStart=/usr/bin/screen -dmS tc-worldserver /home/wow/server/bin/worldserver
ExecReload=/usr/bin/screen -S tc-worldserver -p 0 -X stuff "server shutdown force 0\\r"; /usr/bin/screen -dmS tc-worldserver /home/wow/server/bin/worldserver
ExecStop=/usr/bin/screen -S tc-worldserver -p 0 -X stuff "server shutdown force 0\\r"
RestartSec=10s
Restart=always

[Install]
WantedBy=multi-user.target

Здесь также использована программа 'screen'. Название сессии для сервера мира - 'tc-worldserver'. Остановка сервера мира выполняется не так как в случае с сервером авторизации.

Просто "тушить" службу с помощью 'pkill' - не безопасно. Вместо этого с помощью 'screen', в сессию где запущен 'worldserver', отправим специальную строку с командами - после этого он корректно остановится и закроет все подключения.

Команда остановки сервера выглядит вот так: "server shutdown force 0". Два символа слеш в конце и буква 'r' (в листинге юнита) - это специальный символ перевода каретки (r - return), можно сказать что аналог нажатия клавиши ENTER после ввода символов.

Делаем новосозданные нами юниты SystemD активными:

sudo systemctl enable tc-authserver.service
sudo systemctl enable tc-worldserver.service

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

Также можно их запустить вручную (start), посмотреть статус (status) и при надобности остановить (stop):

sudo systemctl start tc-authserver.service
sudo systemctl status tc-authserver.service

sudo systemctl start tc-worldserver.service
sudo systemctl status tc-worldserver.service

sudo systemctl stop tc-authserver.service
sudo systemctl stop tc-worldserver.service

Для подключения к виртуальным терминалам, в которых работают обе службы, используем 'screen' с указанием названия сессии. Но прежде нужно перейти под пользователя, от имени которого работают наши игровые службы - 'wow'.

su wow

А теперь пробуем подключиться:

screen -r tc-authserver
screen -r tc-worldserver

Чтобы выйти из 'screen'-сессии,  не завершая, ее достаточно нажать клавиши 'CTRL+a', а потом отпустив их еще 'd'.

Проверка и итог

Итак, службы запущены - давайте проверим готовы ли принимать подключения порты 3724 (authserver) и 8085 (worldserver), запустим программу 'ss' (SockStat) и отфильтруем вывод с помощью 'grep':

ss -t4a | grep -E '3724|8085'

Если все в порядке, то увидим две строчки:

LISTEN    0         128                0.0.0.0:3724             0.0.0.0:*       
LISTEN    0         128                0.0.0.0:8085             0.0.0.0:*

Обе службы, без активных подключений со стороны клиента, потребляют ~30М (authserver) и ~1700М (worldserver) оперативной памяти.

Это можно легко проверить с помощью команды:

ps -eo pid,vsz,rss,comm | grep -E 'authserver|worldserver'

Примерный вывод:

   661  91676 29072 authserver
 1322 1968712 1389848 worldserver

По колонкам:

  • Первая - PID, Process ID
  • Вторая - VSS, размер виртуальной памяти (в байтах), закрепленной за процессом. Из этого числа лишь часть может быть реально задействована в ОЗУ;
  • Третья - RSS, суммарное число памяти (в байтах), отображенной в страницах физической ОЗУ.

Точного числа мы тут не увидим, но для оценки примерного уровня использования ОЗУ этого достаточно.

Еще можно узнать потребляемое службами TrinityCore количество ОЗУ используя SystemD:

sudo systemctl status tc-authserver.service
sudo systemctl status tc-worldserver.service
sudo systemctl status mariadb.service

Потребление памяти ядром TrinityCore - authserver, worldserver, mariadb

Рис. 23. Потребление памяти ядром TrinityCore - authserver, worldserver, mariadb.

Создание игрового аккаунта, подготовка клиента WOW

Итак, сервер готов - можем создать на нем свой первый игровой аккаунт.

Подключаемся через 'screen' к терминальной сессии, в которой работает наш игровой сервер ('worldserver'), не забываем это делать от имени пользователя 'wow':

screen -r tc-worldserver

Откроется консоль управления игровым сервером с приглашением для ввода команд ('TC>'). Сервер понимает очень большое количество команд. Для вывода их списка и получения справки по ним - достаточно начать с ввода 'help' + ENTER.

Создаем аккаунт

Процедура создания аккаунта очень проста - всего лишь одна команда. Например, создадим аккаунт с логином 'trinity' и паролем 'sUperp@ss':

account create trinity sUperp@ss

Теперь созданному аккаунту можно дать права супер-мастера (GM, Grand Master), который может управлять сервером и делать в игровом мире практически что угодно:

account set gmlevel trinity 3 -1

После логина здесь указан уровень доступа '3' (GM), а число '-1' отвечает за то что эти права будут обеспечены во всех реалмах.

Чтобы получить справку по этой команде, выполните слудующую:

help account set gmlevel

Аналогично можно получить справку и по другим командам или их частям, например: 'help account set', 'help account 2fa' и т.д.

Настраиваем клиент

Теперь нужно настроить игровой клиент - указать в его настройках IP-адрес или имя хоста созданного нами сервера.

Переходим в папку с игрой, ищем там папку 'Data', а в ней файл 'realmlist.wtf'. Если для игры доступно несколько локализаций (языков), то в этой же папке могут присутствовать подпапки 'enUS', 'ruRu' и подобные - файл 'realmlist.wtf' будет находиться там.

Открываем этот файл с помощью любого текстового редактора, например: Блокнот (под Windows), Kate, Leafpad, nano (под Linux).

Прописываем (изменяем) там IP-адрес, который мы задавали в базе данных 'auth' в табличке 'realmlist' на этапе тестирования сервера атворизации - '192.168.1.155:

set realmlist 192.168.1.155

Сохраняем и выходим из редактора.

Запускаем игру и логинимся под созданным ранее пользователем - все должно работать. Теперь можно попробовать создать персонажа и войти в игровой мир.

Надеюсь у вас все получилось. )

Запуск клиента World of Warcraft WotLK под Linux

Большинство конечно же запускает WoW под Windows, но это также вполне успешно можно сделать и под Linux. На помощь приходит транслятор Wine (winehq.org), а для упрощения работы с ним можно использовать написанный на Python менеджер PlayOnLinux (playonlinux.com), Q4Wine и аналогичные проекты.

Подразумевается что у вас в Linux уже установлено графическое окружение и настроен драйвер видеокарты (INTEL, NVIDIA, AMD). Также на ноутбуке у вас может быть настроена служба 'bumblebee', позволяющая переключаться с интегрированной на дискретную видеокарту (технология NVIDIA Optimus).

Чтобы проверить поддерживается ли 3D рендеринг (rendering) текущим драйвером для видеокарты - можно использовать команду 'glxinfo' (информация про OpenGL и GLX):

glxinfo | grep direct

Если видим строчку 'direct rendering: Yes' - значит поддержка пристуствует.

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

Настройка и первый запуск игры

Установим программу PlayOnLinux (далее просто POL):

apt install playonlinux

Запускаем (можно с консоли ввсести 'playonlinux'), а потом переходим в меню настройки версий Wine: Tools -> Manage Wine versions. В открывшемся окне будет две вкладки: 'Wine versions (x86)' и 'Wine versions (amd64)'.

Переходим на вкладку с 'x86' (выбрана по умолчанию) и в списке 'Available Wine versions' выбираем версию, которая станет доступна для запуска устанавливаемых игр.

Например, я взял одну из последних версий Вайна - 6.15.

Нажимаем кнопочку '>' - откроется окно установки Wine, жмем 'Next', после чсчего начнется процесс скачивания файлов. По завершению окно скачивания закроется, в списке 'Installed Wine versions' появится выбранная нами версия. Закрываем это окно. Транслятор Wine установлен.

Теперь в сайдбаре основного окна программы клацаем пункт 'Install a program' (установить программу). В открывшемся дополнительном окне клацаем на строчку 'Install a non-listed program' (установка программы не из списка) - откроется окно 'Manual installation' (ручная установка), клацаем 'Next' (дальше).

Далее из появившегося списка выбираем 'Install a program in a new virtual drive' (установить программу на новый виртуальный диск), жмем Next.

В поле 'Please enter a name for your application's virtual drive' вводим название будущего виртуального хранилища - 'WOW'. Жмем Next.

В списке 'What would you like to do before installation?' (что вы хотите сделать перед установкой) клацнем чекбоксы напротив следующих пунктов:

  1. 'Use another version of Wine' (Использовать другую версию Вайна);
  2. 'Configure Wine'  (настроить Вайн).

Жмем Next. В списке 'Which version of wine would you like to use?' (какую версию Вайна хотите использовать) я выбрал ту, которую устанавливал - 6.15. Нажимаем Next.

В списке 'What kind of virtual drive do you want to create?' (какой тип виртуального хранилища вы хотите создать) - выбираем '32 bit windows installation' (32-битная установка Windows), поскольку скачивали 32-битную версию Wine (x86). Клацаем Next.

Появится новое окно 'Wine Mono Installer' (установщик Mono для Wine), клацаем кнопочку Install. Начнется закачка файлов, потом окно исчезнет и спустя несколько секунд появится новое с названием 'Wine Configuration' (настройка Wine).

Дальше нужно выполнить настройки ОС и графики. Привожу их списком, в котором сперва указано название вкладки, а потом название опции и после значка '=' ее значение:

  1. Applications -> Windows Version = Windows 7;
  2. Graphics -> Automatically capture the mouse in full-screen windows = [v];
  3. Graphics -> Emulate virtual desktop = [v];
  4. Graphics -> Desktop size = 1600 x 900.

Здесь мы настроили: эмуляцию ОС Windows 7, автозахват курсора мышки в полноэкранном режиме, эмуляция виртуального рабочего стола и его разрешение.

Жмем OK, окно закроется. Возвращаемся к предыдущему окну - видим там запрос 'Please select the install file to run' (пожалуйста, выберите инсталляционный файл для запуска). Клацаем Browse (пролистать).

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

В диалоге выбора файла перемещаемся по пути '/home/PlayOnLinux's virtual drives/WOW/drive_c/windows'  и выбираем файл notepad.exe. Клацаем Open и потом Next.

Откроется окно с виртуальным рабочим столом, а в нем будет открыта программа Notepad. Закрываем ее, окно также закроется.

В предыдущем окне теперь появился список с запросом 'Please choose a file for PlayOnLinux to make a shortcut' (пожалуйста, выберите файл для которого ПлейОнЛинукс создаст ярлык).

Теперь копируем каталог с игрой (клиент, например WOW) в директорию '/home/PlayOnLinux's virtual drives/WOW/drive_c/'. Желательно чтобы в названии каталога с игровыми файлами не было никаких спецсимволов, русских букв и даже пробелов.

Возвращаемся к окну PlayOnLinux Wizard со списком - выбираем Browse, клацаем Next, Browse. Перемещаемся по дереву файлов и директорий в каталог с игрой и выбираем там файл для запуска игры 'wow.exe'.

В появившейся строчке с названием 'Please choose a shortcut name for' вводим название создаваемого для выбранного файла ярлыка, например 'WOW'.

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

Для завершения процесса создания ярлыков клацаем Cancel. В окне менеджера PlayOnLinux должен появиться значок с названием игры.

Теперь осталось установить еще несколько компонентов для  - это шрифты. Выбираем из списка значок с названием игры, потом клацаем на панели инструментов 'Configure' (настройка). Переходим на вкладку 'Install components' (установка компонентов).

В списке выбираем компонент и устанавливаем аго нажав 'Install'.

Компоненты, которые нужно установить:

  1. Microsoft Core Fonts;
  2. tahoma2;
  3. RegisterFonts.

Все готово. Теперь можно запустить игру и она должна заработать.

На фото ниже показан экран входа в игру (интерфейс переключен на RU), справа снизу указано что мы подключены к серверу 'Trinity'.

Стартовый экран World of Warcraft WotLK, запущенный под Linux и подключенный к локальному серверу TrinityCore

Рис. 24. Стартовый экран World of Warcraft WotLK (3.3.5), запущенный под Linux и подключенный к локальному серверу TrinityCore.

А вот скриншот экрана выбора игровых миров - у нас он один единственный (Trinity):

Список игровых миров в WOW, клиент подключен к экспериментальному серверу Trinity Core

Рис. 25. Меню выбора игровых миров в WOW, клиент подключен к экспериментальному серверу Trinity Core.

Тест World of Warcraft (WotLK) под Linux на локальной сборке Trinity Core Single Player

Рис. 26. Первый тест World of Warcraft (WotLK) под Linux на локальной сборке Trinity Core Single Player.

Все работает! Даже на интегрированной INTEL видеокарте графика мира очень красивая.

Игра WoW на экспериментальном сервере Trinity Core с модулями NPCBots и AutoBalance

Рис. 27. Игра WoW на экспериментальном сервере Trinity Core с модулями NPCBots и AutoBalance.

Посокльку игра у нас в Wine запускается с виртуальным рабочим столом (отдельное окно), то с помощью ALT+TAB можно будет переключаться на другие приложения в операционной системе - консоль, мессенджер, браузер и т.п.

Проверил работу в двух разрешениях экрана 1280x720 и 1600x900 - все хорошо, если не считать высокой нагрузки на CPU и мелькания курсора при его перемещении. Нужно выполнить несколько дополнительных настроек для оптимизации...

Улучшение производительности

Установив некоторые дополнительные опции в менеджере PlayOnLinux можна добиться лучшей производительности Wine при обработке графического игрового приложения WoW.

Настроим игру на работу с OpenGL (Open Graphics Library) - кроссплатформенный программный интерфейс для приложений с 2D и 3D графикой. Можно сказать что очень сильный конкурент другой не мене популярной технологии - Direct3D.

Выбираем в менеджере POL нашу игру, а потом клацаем в тулбаре кнопочку 'Configure' (настройки), переходим на вкладку 'Display' (дисплей).

Устанавливаем там для параметров следующие значения:

  • GLSL Support = enabled;
  • Direct Draw Renderer = opengl;
  • Video memory size = 2048. Тут указываем размер видеопамяти (в мегабайтах) для используемой видеокарты. Если размер вам не известен - оставляем 'default'.

Теперь идем в папку с игрой -> в подпапку 'WTF' -> и открываем для редактирования файл настроек 'Config.wtf'. Добавляем в него следующую строчку:

SET gxApi "opengl"

Сохраняем и закрываем.

Запустив WoW под Linux после этих настроек получим вот что:

  1. Улучшится изображение и отклик;
  2. Уменьшится нагрузка на микропроцессор;
  3. Курсор мыши станет двигаться плавно и без мерцания.

На видеоадаптере от INTEL игра при таких оптимизациях и с настройками графики 'Ультра' работает просто отлично, изображение очень приятное.

Тест игры World of Warcraft под Wine (PLayOnLinux) с дополнительными оптимизациями

Рис. 28. Тест работы World of Warcraft под Wine (PLayOnLinux) с дополнительными оптимизациями.

NVIDIA Optimus

Если в системе установлены две видеокарты (INTEL - интегрированная, NVIDIA - дискретная) и в Linux уже установлены проприетарные драйвера для карточки от NVIDIA, то можно попробовать использовать технологию "PRIME Render Offload", с помощью которой обработку графики в определенной программе можно предоставить графическому процессору от NVIDIA.

Для запуска PLayOnLinux с PRIME Render Offload нужно выполнить следующую команду:

 __NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only __GLX_VENDOR_LIBRARY_NAME=nvidia playonlinux

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

Для наблюдения за нагрузкой и температурой GPU от NVIDIA можно установить и запустить программу nvidia-smi:

apt install nvidia-smi
nvidia-smi

# Вывод данных с интервалом 0,5 сек.
watch -n .5 nvidia-smi

В случае установки на ноутбук программы BumbleBee, запускать игры и программы на дискретной видеокарте можно используя команды 'optirun' или 'primusrun'.

Для проверки работоспособности связки и получения информации можно установить пакет утилит 'mesa-utils' и использовать программу 'glxgears':

apt install mesa-utils
glxgears -info
primusrun glxgears -info

Первая команда - запустит графический тест на интегрированной (по умолчанию) видеокарте с выводом информации о ней, а вторая - на дискретной (будет переключена с помощью 'primusrun') и также с отображением информации.

Запускаем PlayOnLinux на дискретной видеокарте:

primusrun playonlinux

Аналогично можно запускать и другие программы под Linux, требующие высокопроизводительный дискретный видеоадаптер.

Решение проблемы с вводом русских символов

Играя в игру World of Warcraft с русским интерфейсом под Linux можно столкнуться с проблемой, когда ввод русских букв не работает - вместо введенных символов отображаются знаки вопроса, например: '????? ? ???'.

На скриншоте ниже показан такой случай, когда с интерфейсом все в порядке, а ввести имя персонажа русскими буквами невозможно:

Не работает ввод русских букв в World of Warcraft под Linux

Рис. 29. Не работает ввод русских букв в World of Warcraft под Linux.

Такая же проблема будет везде, где нужно ввести какое-то сообщение или команду, в которых есть русские буквы.

Причиной этого может быть то, что основная локаль в Линукс системе - английская, например "en_US.UTF-8".

Вариант решения проблемы - запуск игры, вернее транслятора Wine для нее, с принудительно указанной русской кодировкой символов 'ru_RU.UTF-8'.

Итак, смотрим какие локали установлены и настроены в Linux-системе (команда в консоли):

locale -a

Если в выведенном на экран списке нет локали 'ru_RU.KOI8-R' (может быть в нижнем регистре), то ее следует установить - делается это программой реконфигурации:

dpkg-reconfigure locales

Отмечаем пункт 'ru_RU.UTF-8' (выбрать пункт, потом нажать пробел) и подтверждаем (OK).

Теперь чтобы клиент WOW заработал с этой локалью нужно запускать программу PlayOnLinux из консоли с помощью вот такой команды:

env LC_ALL=ru_RU.UTF-8 playonlinux

Описание магии: команда 'env' (environment) присвоит переменной окружения с именем 'LC_ALL' значение 'ru_RU.UTF-8' (русский язык, мультибайтная кодировка UTF-8), тем самым мы указываем что следующая команда (в данном случае 'playonlinux') должна быть запущена с учетом данной переменной и ее нового значения. Это значение станет в запускаемой программе основной кодировкой при всех операциях.

После запуска все надписи в интерфейсе POL станут на русском языке, ввод русского текста в игре теперь должен заработать корректно!

Станет возможным вводить русские символы в именах персонажей, удалять персонажей (требуется ввести слово 'УДАЛИТЬ'), можно по русски что-то написать в чате и т.д.

World of Warcraft под Linux - ввод русских букв теперь работает исправно
Рис. 30. World of Warcraft под Linux - ввод русских букв теперь работает исправно.

World of Warcraft под Linux - ввод русских букв в чате также работает

Рис. 29. World of Warcraft под Linux - ввод русских букв в чате также работает. После ввода команды Миранда скажет: 'Привет, как дела? :)'.

Управление ботами

В разделе с обзором TrinityCore Single Player я перечислил основные возможности модуля NPCBot. Пришло время для экспериментов.

Добавление, удаление и другие операции с ботами выполняются через введенные в окне игрового чата команды. Хочу заметить что они доступны только аккаунтам с игровым уровнем GM (Grand Master).

Для получения справки по командам для ботов достаточно выполнить любую из следующих (они равносильны, вторая - это сокращение):

.npcbot
.npcb

Добавление ботов

Выведем список классов для ботов и их ID (любая из команд):

.npcb lookup
.npcb loo

Теперь, указав требуемый класс, можно получить список ID для доступных ботов из этого класса, например для 'Hunter' (охотник, Class_ID=3):

.npcb lookup 3

В списке будут отображены: ID, имя и расса бота.

Чтобы добавить его в игру, выберем нужный ID (например ID=70038, Kerra, Night Elf) и выполним любую из следующих команд:

.npcb spawn 70038
.npcb sp 70038

NPC должен появиться на том же месте где стоит игрок.

Представители некоторых классов могут вызывать существ. Например при добавлении бота из класса 'охотник' появившийся NPC через несколько секунд вызовет своего спутника - какое-то случайное существо.

Как добавить бота в World of Warcraft на сервере с TrinityCore + NPCBot

Рис. 31. Как добавить бота в WoW на сервере с TrinityCore + NPCBot.

Вместо ручного ввода ID бота (числа) для команды в окне сообщений, можно еще сделать так: удерживая клавишу SHIFT клацнуть на строчку в списке с нужным ботом - в поле ввода команды появится ссылка (Link) на юнита с его именем в виде '[Kerra]'. Команда в итоге будет выглядеть примерно так: '.npcb spawn [Kerra]'.

Боты в NPCBot после первого появления (spawning) в игровом мире имеют максимальный уровень - 80 (для WotLK). Как только вы наймете бота (для управления им) - его уровень станет таким же как и вашего персонажа.

В табличке собраны классы игроков в WoW и соответствующие им интервалы ID ботов в NPCBot:

Class Клас ID класса ID ботов Мин. уровень
для найма
Warrior Воин 1 70001..70038 1
Mage Маг 8 70301..70336 1
Warlock Чернокнижник,
Варлок
9 70351..70377 1
Hunter Охотник 3 70101..70139 1
Rogue Разбойник 4 70151..70181 1
Death Knight Мертвый рыцарь,
Рыцарь смерти
6 70451..70465 1
Druid Друид 11 70401..70418 1
Paladin Паладин 2 70051..70074 1
Priest Жрец 5 70201..70240 1
Shaman Шаман 7 70251..70268 1
Monk Монах  -  -  
Demon Hunter Охотник на
демонов
 -  -  
BladeMaster Мастер клинков 12  -  
Sphynx Сфинкс 13 70553..70554  
ArchiMage АрхиМаг 14 70555 20
DreadLord ДредЛорд 15 70557..70561 60
SpellBreaker Рушитель
заклинаний
16 70563..70567 20
Dark Ranger Темный рейнджер 17 70568..70572 40

Обозначения:

  • Зеленым - выделены классы ботов, которыми можно управлять и брать к себе в команду;
  • Серым - классы, которые доступны в более новых дополнениях WoW, а в WotLK их нет;
  • Сиреневым - обозначены специальные классы, взятые из игры Warcraft III. Этих ботов можно добавить, но чтобы их нанять у игрока должен быть уже некоторый уровень прокачки.

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

Сервис наемников

Есть еще один интересный способ добавлять ботов в игру - вызвать NPC, который предоставит сервис выбора наемников. Делается это командой:

.npc add 70000

На местности появится высокий NPC с огромным запасом жизни (66936). Клацаем на нем ПКМ, а далее пункт 'I need your services' (мне нужны твои услуги) - смотрим какие есть классы и какие боты в них доступны.

Lagretta - bots for hire, NPC предоставляющий услуги выбора наемников (ботов) в игре WoW

Рис. 32. Lagretta - bots for hire, NPC предоставляющий услуги выбора наемников (ботов) в игре WoW. У нашей Миранды теперь два персональных телохранителя - сестрички Kyra и Kerra.

Для каждого наемника указано его имя, пол (male - мужчина, female - женщина), а также раса. Клацаем на подходящий вариант - получим запрос: 'Do you want to hire BotName?'. Подтверждаем. Выбранный наемник должен появиться недалеко от нас.

Чтобы убрать NPC, который предлагает услуги найма, достаточно выделить его мышкой и ввести следующую команду:

.npc delete

Заметьте что команду мы даем серверу а не персонально модулю NPCBots - команда называется '.npc' а не '.npcb'.

Удаление ботов

Чтобы удалить бота из игры - нужно подойти к нему, выделить его (клацнуть на нем мышкой), а потом ввести любую из следующих команд:

.npcb delete
.npcb del

После этого выбранный NPC должен плавно исчезнуть.

Чтобы бот остался в игре, но перестал быть нанятым вами:

.npcb remove
.npcb rem

Использование макросов

Также есть возможность вызвать случайного NPC из определенного класса - для такого действия нужно создать специальный макрос.

Макрос (Macros) - слеш-команда (slash, вводится после символа слеш '/') или чаще группа таких команд, которые можно выполнить нажав всего лишь на одну кнопку или же отправив команду с названием макроса.

Для вызова окна управления макросами нужно в окно игрового чата ввести команду: '/macro' или '/макро'. Также это окно можно вызвать так, как показано на скриншоте ниже:

Как вызвать окно с макросами в игре World of Warcraft

Рис. 33. Как вызвать окно с макросами в игре World of Warcraft. Эльфийка Миранда немножко заскучала пока мы игрались с макросами :).

В появившемся окне нажимаем кнопочку 'Создать' (Create) -> Вводим название макроса -> Выбираем для него подходящую иконку -> жмем ОК.

Теперь в поле 'Введите макрос' (Enter macro) нужно ввести код (список слеш-команд), который будет исполняться при вызове только что созданного макроса. Команды в макросе будут выполняться по очереди.

Например, вот код для добавления в игровой мир случайного бота с классом 'Воин' (Warrior), выбранного из списка ID от 70001 до 70038:

/run id = math.floor(math.random(70001, 70038));
/run SendChatMessage(".npcb spawn "..id, "SAY");

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

По аналогии можно создать и макрос для быстрого удаления выделенного NPCBot, вот его код:

.npcbot delete

Значки уже готовых макросов можно перетягивать на нижнюю панель быстрого доступа. Таким образом можно организовать возможность быстрого добавления ботов с нужными классами, а если что-то не понравится - так же быстро в пару кликов их удалить.

Вот скриншот, на котором во 2-ю строчку нижнего тулбара добавлено четыре кнопки: три в начале - для вызова случайных ботов из разных классов, а ещеь одна в конце - для быстрого удаления выделенного юнита:

Макросы для вызова ботов в World of Warcraft на экспериментальном сервере TrinityCore

Рис. 34. Макросы для добавления ботов в World of Warcraft на экспериментальном сервере TrinityCore.

Получается простое и удобное управление добавлением и удалением NPC.

Добавляемые в WoW боты, проекты TrinityCore и NPCBots

Рис. 35. Добавленные в WoW боты стараются внимательно слушать байки нашего героя.

Настройки и команды

Клик правой клавишей мыши (ПКМ) по вблизи находящемуся боту вызывает его меню управления. После того как вы наймете юнита в команду, такое меню будет содержать подпункты.

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

Чтобы принять управление ботом на нем нужно клацнуть ПКМ, а потом выбрать из предложенных вариантов разговора - '<Hire bot>' (нанять бота). На предложение 'Do you wish to hire BotName?' - отвечаем утвердительно. Теперь клацнув ПКМ на новом компаньйоне появится его меню управления.

Диалоговое меню управления ботом NPCbot в подключенной к локальному серверу TrinityCore игре World of Warcraft

Рис. 36. Диалоговое меню управления ботом NPCbot в подключенной к локальному серверу TrinityCore игре World of Warcraft.

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

Также вы можете оснащать своего бота разными предметами и оружием.

На страничке проекта NPCBots подробно описаны все возможности ботов. Переписывать все это здесь накладно и не практично, поэтому приведу лишь перевод основных пунктов меню с краткими пояснениями:

  • Manage equipment - управлять снаряжением. Содержит подменю, где можно вывести список вещей в инвентаре NPC, экиперовать его и дать/сменить оружие, автоэкиперовка (из ваших вещей в наличии, на выбор);
  • Manage roles - управления ролями. Тут можно настроить поведение бота, например заставить его собирать ресурсы или определенный лут (выпадающие предметы), атаковать и т.д.;
  • Manage formations - управление построением. Можно изменить дистанцию следования (как далеко держаться от игрока), а также таймаут при атаке;
  • Manage abilities - управление способностями, которые доступны юниту. Можно разрешить или запретить лечение, исцеление, боевой крик и т.д.;
  • Manage talents - управление талантами: вооружение, ярость, защита и т.д.;
  • Give consumable - дать боту расходные материалы;
  • <Create group> - создать группу (взять юнита в группу);
  • Hold your position - оставайся на позиции;
  • Stay here and dont't do anything - оставайся здесь и ничего не делай;
  • Follow me - следуй за мной;
  • You are dismissed - ты уволен/a! Будьте осторожны, юнит может обидеться и при повторной попытке нанять его начнет атаковать (обида длится примерно 5 минут);
  • Nevermind - не бери в голову (отмена действий).

В зависимости от класса нанятого юнита, в меню могут присутствовать и другие пункты с возможностями. Например у Варлока и Охотника будет пункт '<Choose pet type>' (выбрать тип питомца), позволяющий определить тип существа, которое будут сопровождать NPC.

Вот как работает экипировка нанятых ботов:

  1. Клацаем на юните ПКМ - откроется меню управления;
  2. Выбираем 'Manage equipment';
  3. В появившемся подменю можно указать часть тела бота, для которой бкудет подбираться экиперовка. А можно просто - 'Auto-equip...';
  4. Появится список предметов (из вашего инвентаря), доступных для экиперовки выбранного бота. Выбираем предмет - готово;
  5. Чтобы обновить вид бота с учетом новой экипировки идем в подменю на уровень обратно и клацаем пункт 'Update visual' (обновить визуально).

Экипировка ботов-помощников в World of Warcraft на тестовом сервере TrinityCore + NPCBots.

Рис. 37. Экипировка ботов-помощников, TrinityCore + NPCBots. Две сестрички Kyra и Kerra теперь имеют экипировку не хуже чем у Миранды.

Если нанятый бот в пределах видимости, то выделив его можно дать ему следующие команды:

  • /stand - стоять (stand, stay, stop) на месте;
  • /wave - следовать (follow) за мной.

А вот аналогичные по эффекту команды всем нанятым ботам, независимо от того где они и как далеко от вас:

.npcbot command standstill
.npcb c sta
.npcbot command stopfully
.npcbot command follow

Чтобы временно убрать всех своих ботов из игрового мира, а потом снова вернуть (с сохранением всех их параметров) - можно использовать следующие команды:

.npcb hide
.npcb unhide

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

Задать фракцию для выбранного NPC можно так:

.npcb set faction f

Будет выбран дружелюбный ко всем режим. Другие режимы:

  • a - Alliance, команда альянса;
  • h - Horde, команда орды;
  • m - Monster, враждебен ко всем;
  • f - Friendly, дружелюбен со всеми.

Также можно выбрать фракцию как у определенного юнита, клацнув по нему с зажатой кнопкой SHIFT (вместо набора a, h, m, f).

Чтобы воскресить погибших в бою ботов:

.npcbot revive
.npcb rev

Как только игрок сядет на какой-то транспорт, его спутники-боты также будут на своем транспорте. Если нужно чтобы все боты послезали с транспорта можно использовать следующую команду:

.npcbot vehicle eject
.npcb veh e

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

Список полезных игровых команд

Приведу также некоторые часто используемые игровые команды. Большинство из них тестировалось на WoW WotLK 3.3.5.

Справка:

  • /? - помощь по игре;
  • .commands - список всех команд;
  • .help <cmd_name> - справка по команде.

Грандмастер:

  • .gm <on/off> - вкл/выкл режим GM (Grand Master);
  • .gm fly <on/off> - вкл/выкл режим полета (Fly). Пробел - летим выше, X - ниже;
  • .gm visible <on/off> - изменить видимость персонажа;
  • .bank - отобразить окно с инвентарем;
  • .die - гибель игока или выбранного персонажа.

Аккаунт:

  • .levelup 1 - увеличить уровень героя на 1 (число можно изменять);
  • .ann <TEXT> - большой анонс, от имени сервера;
  • .nameann <TEXT> - анонс с указанным текстом от имени игрока;
  • .gmann <TEXT> - анонс от имени GM без отображения имени;
  • .gmnameann <TEXT> - анонс от имени GM + имя игрока;
  • .reset level - сброс уровня игрока.

Инвентарь и вещи:

  • .additem <item_name> 5 - добавить предмет с именем 'item_name' в количестве 5-ти штук. Также можно указать предмет ссылкой (вместо указания его имени) - клацнув по нему с зажатой клавишей SHIFT (например в окне с предметами у торговца);
  • .repairitems - отремонтировать все вещи игрока или выбранного персонажа.

Навыки и заклинания:

  • .aura <spell_id> - добавляет ауру;
  • .reset spells - сброс заклинаний;
  • .reset talents - сброс очков таланта;
  • .learn all recipes <profession> - изучить все рецепты для профессии;
  • .learn all talents - изучить/получить все таланты;
  • .unaura <spell_id> - убирает ауру.

Модификации параметров:

  • .maxskill - увеличение значений всех навыков к максимуму;
  • .modify energy <N> - изменить значение энергии на число N;
  • .modify hp <N> - количество здоровья (Health Points);
  • .modify mana <N> - количество маны;
  • .modify money <N> - нужны деньги?;
  • .modify rep <N> - репутация;
  • .modify scale 1.5 - изменить размер персонажа в 1,5 раза;
  • .modify speed all <N> - изменить скорость перемещения во всех режимах (число от 0.1 до 50);
  • .modify speed fly 15 - изменить скорость перемещения в режиме полета на 15;
  • .modify speed swim <N> - скорость плавания = N (число);
  • .modify speed walk <N> - скорость ходьбы.

Перемещения и телепортация:

  • .explorecheat 1 - открывает всю карту;
  • .tele <location_name> - телепортация в локацию с именем 'location_name'. Например: .tele exodar  .tele ghostlands;
  • .gps - показать текущие координаты.

Существа, NPC:

  • .npc add <ID> - добавить существо с указанным идентификатором ID;
  • .npc delete - удалить выбранное существо;
  • .npc set factionid <N> - изменить фракцию для выбранного существа на N (число);
  • .npc follow - заставит выбранное существо следовать за вами;
  • .npc follow stop - прекратить следование выбранного существа за игроком;
  • .npc info - информация про существо.

Разное:

  • /macro, /m - окно макросов;

Управление сервером:

  • .reload all - перезагрузка всех таблиц на сервере;
  • .reload <table_name> - перезагрузка указанной таблицы;
  • .reload config - перезагрузка настроек мира;
  • .server info - информация о сервере (версия TC, время работы, количество игроков и подключений);
  • .server motd - вывести "сообщение дня" на сервере;
  • .server plimit <N> - установить лимит количества игроков на сервере;
  • .server restart force 5- перезапуск сервера через 5 секунд;
  • .server restart cancel - отмена ранее запрошенного перезапуска сервера;
  • .server set motd - задать на сервере "сообщение дня";
  • .server shutdown force 5 - остановка сервера. В случае из статьи сервер остановится и снова запустится, поэтому нужно остановить службу systemd 'tc-worldserver' (командой systemctl stop tc-worldserver.service);
  • .wchange <M> <N> - изменить погоду где: M - тип (0 - отмена, 1 - дождь, 2 - снег, 3 - песок), N - интенсивность (число);
  • .whispers <on/off> (шептуны) - вкл/выкл прием личных сообщений (ЛС).

Всего же для GM существует более 500 команд команд и с релизами ядра они могут изменяться и добавляться. Увидеть список команд с описанием можно на страничке документации проекта TrinityCore - GM+Commands

Что касается макросов в игре, то их также очень много, полезную информацию по данной теме можно извлечь из странички проекта Fandom 'WoWpedia' - Macro_commands.

Самый актуальный для вашего ядра TC список команд с краткой справкой по ним можно извлечь из таблички 'command' в базе данных мира 'world'. Подключимся к БД через консоль:

sudo mariadb world

Размер окна консоли для удобства изучения лучше сделать пошире - например развернуть на весь экран.

Вот запрос чтобы вывести первые 2 строки с командами:

SELECT * FROM `command` LIMIT 2;

В первой колонке 'name' размещаются названия команд, а во второй 'help' - их описание.

следующим запросом можно отфильтровать все записи, содержащие например подстроку 'item' в названии команды:

SELECT * FROM `command` WHERE name LIKE '%item%';

Подстроку 'item' в данном запросе можно заменить на какую вам угодно, например: additem, server, spell и т.д.

Также можно искать интересуемый текст по колонке со справкой 'help'. Например ищем упоминание 'fly' (полет):

SELECT * FROM `command` WHERE help LIKE '%fly%';

Пример вывода такой команды:

Результат выполнения SQL команды в базе данных TrinityCore, локальный сервер для WoW

Рис. 38. Результат выполнения SQL команды в базе данных TrinityCore, локальный сервер для WoW.

Сначала это может показаться смесью из разного текста, но ориентируясь на разделители колонок (символы '|') все становится вполне закономерным и понятным.

Все операции с SQL можно также выполнять и в менеджере БД с графическим интерфейсом, об этом будет сказано ниже.

Обслуживание БД, резервное копирование

Для работы с Базой Данных TrinityCore и для ее обслуживания можно использовать как консоль 'MariaDB', так и менеджеры с графическим интерфейсом. В одной из статей я делал обзор на свободный и кроссплатформенный менеджер БД DBeaver, который поддерживает большое количество разных типов БД, работает под FreeBSD, GNU/Linux, Windows, macOS и в других системах где есть поддержка JAVA.

Также можно воспользоваться легковесным клиентом HeidiSQL. Он поддерживает MariaDB, MySQL, MSSQL, PostgreSQL, SQLite. Написан для работы под Windows, но можно запускать и в других ОС - с использованием транслятора Wine.

Использование DBeaver

Подключиться удаленно (с другого компьютера) к SQL серверу TrinityCore, который установлен в виртуальной машине или на другом ПК, можно используя SSH-туннелирование.

Например, в программе DBeaver такая возможность уже встроена, поэтому для подключения нужно будет указать: IP-адрес сервера, логин и пароль пользователя на сервере, а также данные учетной записи для доступа к базам данных в MariaDB.

Сперва настраиваем туннель: он будет проложен к нашему серверу (например IP=192.168.1.155, как в этой статье) через подключение по протоколу SSH, для авторизации указываем логин и пароль существующего на сервере пользователя.

Дальше настраиваем подключение к ДБ: через проложенный по SSH туннель мы имеем доступ к локалхосту (localhost) сервера, поэтому в качестве хоста для подключения укажем именно его, а дальше останется указать имя пользователя с паролем для БД (в статье я создавал 'trinity').

Подключение к базе данных TrinityCore используя SSH-туннель и универсальный менеджер БД DBeaver

Рис. 39. Подключение к базе данных TrinityCore используя SSH-туннель и универсальный менеджер БД DBeaver.

Потом нажимаем 'Test connection' - если все было верно указано, то тест будет успешным, можно приступать к работе с БД. Разобраться в интерфейсе DBeaver и привыкнуть к работе с ним достаточно просто, это не должно занять много времени.

Просмотр с помощью DBeaver содержимого таблиц в базе данных MMORPG сервера с TrinityCore

Рис. 40. Просмотр с помощью DBeaver содержимого таблиц в базе данных MMORPG сервера с TrinityCore.

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

Резервное копирование БД

Резервирование БД можно выполнять с помощью того же DBeaver:

  1. Выделяем нужную БД, жмем ПКМ -> Tools -> Dump database;
  2. Режим исполнения (Execution method) выбираем как 'Online backup in single transaction' (бекап за одну транзакцию, без блокировки таблиц);
  3. Ставим галочку возле пункта 'Dump events';
  4. Указываем место для сохранения файла (Output folder, File name).

И так с каждой из трех БД: 'auth', 'characters' и 'world'.

То же самое только в комплексе можно сделать из консоли сервера всего одной командой (бекап всех БД на сервере):

mysqldump -u root -A -R -E --triggers --single-transaction --quick > TC_server_full_backup.sql

Описание параметров:

  • -u root - имя пользователя для подключения к БД;
  • -A - все базы данных на сервере;
  • -R - сохранить также хранимые процедуры и функции;
  • -E - включить в дамп данные планировщика событий (Event Scheduler);
  • --triggers - сохранять значения триггеров;
  • --single-transaction - поможет сделать корректный дамп на "горячем" сервере (с активными подключениями), без блокировки таблиц и подключений;
  • --quick - оптимизация для сохранения большого количества данных.

Также можно сделать дампы трех БД по отдельности:

sudo mysqldump -u root --routines --triggers --single-transaction auth > auth.sql
sudo mysqldump -u root --routines --triggers --single-transaction characters > characters.sql
sudo mysqldump -u root --routines --triggers --single-transaction --quick world > world.sql

Параметр '--routines' тут является более наглядным эквивалентом укороченного '-R'.

На момент написания статьи хранимые процедуры я нашел только в БД 'world' (для модуля NPCBots), но в будущем они могут появиться и в остальных БД, причем как в ядре, так и в каком-то устанавливаемом для TrinityCore моде. Поэтому дампы БД лучше делать сразу с опцией --routines'.

Восстановление БД

Если вы делали дампы трех баз данных по отдельности, то прежде чем их заливать на новый сервер нужно создать сами БД, а также дать права (GRANT) пользователю 'trinity' на доступ к ним -  это было описано в разделе про создание БД.

Заливка дампов в уже созданные базы данных:

mariadb auth < auth.sql
mariadb characters < characters.sql
mariadb world < world.sql

Если же был сделан дамп всех трех БД в один SQL-файл, то тут базы данных создадутся автоматически - при заливке дампа на сервер. После этого нужно будет лишь дать пользователю 'trinity' права на доступ к этим БД.

Заливка полного дампа сервера (с созданием баз данных):

mariadb < TC_server_full_backup.sql

В завершение

Вот и подошло к концу это интересное путешествие.

Даже без учета того факта что в статье не были затронуты темы модификации ядра (программировение на C++), написания скриптов на языке Lua, создания предметов и квестов  в базе данных, программирования боссов... то поле для экспериментов с игровым миром WoW всеровно достаточно большое.

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

Также это позволит познакомиться с магическим миром и вселенной Warcraft, увидеть то насколько красивая игра получилась у разработчиков из Blizzard, какое внимание они уделили деталям, юмору и окружению игрового мира WoW.

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

Источники и полезные ссылки:

  1. World of Warcraft - Википедия
  2. TrinityCore project

"Blizzard®", "Warcraft®", "World of Warcraft®" - являются зарегистрированными торговыми марками компании Blizzard Entertainment, Inc. Все права соблюдены.

Если статья оказалась полезной - помочь проекту можно тут: 👍 ПОМОЩЬ, 🎁 DONATE
Комментарии к публикации (7):
Alex #1Alex
26 Май 2022 14:19

Огромное спасибо за материал! Больше 15 лет назад мог только мечтать о возможности поиграть в WoW и тогда в руки попал WoWEmu, с тех пор много воды утекло. Благодаря вашему материалу захотелось снова окунуться в этот мир на пару вечеров на собственном приватном сервере.

+1
ph0en1x #2ph0en1x
26 Май 2022 23:33

Приветствую, Alex!
Готовить эту статью в процессе экспериментов было очень интересно, заодно нашел много новых фактов, освежил некоторые воспоминания. Спустя столько лет в мире эмуляторов для MMORPG много чего изменилось, а старенький клиент WoTLK до сих пор может порадовать качественной графикой и анимацией, атмосфера в нем приятная и в некотором смысле "теплая".
Спасибо за комментарий. Рад что этот материал оказался полезным Smile

+1
Hvostd #3Hvostd
23 Июль 2022 11:07

К сожалению, хочется увидеть ссылки для "готовой" сборки сервера и подходящего клиента. Чтобы качнуть, поставить и сразу играть. И все это под Windows. За статью громадное спасибо!

0
ph0en1x #4ph0en1x
23 Июль 2022 11:50

Приветствую!

Готовые сборки для Windows и под разные клиенты (WoTLK, Legion...) можно найти в специальной ветке зарубежного форума OwnedCore, ссылку на которую я приводил в статье. Чтобы найти сборки для игры с ботами изучайте темы содержащие в названии:" Single Player", "NPCBots".

Например, в той ветке может быть тема с названием "TrinityCore NPCBots Repack (Update ...)" - это сборка от zaicopx, на основе ее данных я писал свою статью. В ней есть описание и ссылки для скачивания архивов сборки под Windows (~1ГБ).

Все настраивается очень просто (фактически в готовом варианте), а информация из моей статьи поможет быстрее "приручить" ботов в игровом процессе, поскольку команды управления сервером TrinityCore что под Windows, что под Linux - в большинстве одни и те же.

Компиляция TrinityCore с NPCBots под Windows - это уже отдельное приключение.

0
SomeOldWowUser #5SomeOldWowUser
31 Август 2022 14:48

Для Linux Desktop попробуйте Lutris. В нём удобно доставлять и настраивать wine/proton для отображения графики. Единственное, что все так же печалит при использовании эмуляции в wow под linux - это кодировка русского языка, которая не работает или не правильно поддерживается, а вместо букв отображаются знаки вопрос, вроде: "?????? ???? ????"

Жаль WebZen все так же не делает клиентов для linux/mac, а так иногда охота залипнуть в MuOnline... Эх старые добрые времена с mu.tts.lt Smile

+1
Crazy_Dimon #6Crazy_Dimon
28 Ноябрь 2022 08:31

Спасибо за статью, особенно за историю вопроса! Очень было познавательно почитать.
Собственно накатило, поиграть в старый ВОВ... лет 10 уже не играл, начал искать, наткнулся на сборку под Windows https://github.com/celguar/spp-classics-cmangos . Поставил, очень понравилось, НО! Просто держать домашний комп включенным для игры как-то накладно, тем более, что есть домашний сервер на Debian. Начал искать подобное spp-classics-cmangos, но под linux.
И тут у меня завал - есть отдельно сервер mangos (cmangos, trinity) и отдельно mangosbot ... и вот скрестить ужа с ежом у меня не получается Sad
Может сталкивались с подобным?

0
ph0en1x #7ph0en1x
28 Ноябрь 2022 14:36

Приветствую!

Не сталкивался, но быстрый обзор информации с репозиториев у 'celguar' показал что для C(ontinued)-MaNGOS (сокращенно cmangos) существуют отдельные форки с поддержкой mangosbot, которые можно как и в примере из моей статьи рекурсивно склонировать и собрать.

Начните с изучения информации по mangosbot - https://github.com/celguar/mangosbot-bots

Там указаны ссылки на форки с поддержкой этого бота для: Vanilla (он же Classic), TBC и WotLK. В любой из них понадобится использовать ветку (Branch) 'ike3-bots'.

Например, для рекурсивного (с подтягиванием сторонних модулей) клонирования репозитория из ветки 'ike3-bots' для WotLK нужно выполнить команду:

git clone https://github.com/celguar/mangos-wotlk.git --recursive -b ike3-bots

После выполнения команды вы получите у себя на компьютере исходный код cmangos с уже привязанным 'ike3-bots'. Дальше нужно изучить какие библиотеки и зависимости необходимы проекту, установить их и потом пробовать компилировать cmangos с ботами.

Понадобится изучить документацию по сборке cmangos под Linux, поискать примеры и другую информацию. Возможно прежде стоит попробовать собрать чистый cmangos по официальным инструкциям, а потом проделать все по аналогии но уже с форком где в комплекте будут боты.

Эксперименты по сборке лучше выполнять в виртуальной машине, делая при этом после каждого успешного этапа снепшоты (snapshot, снимок состояния). Если что-то пойдет не так или же будет допущена ошибка, то всегда можно будет вернуться к одному из предыдущих состояний и продолжить не с нуля, а с точки где часть работы уже выполнена.

наткнулся на сборку под Windows ... Просто держать домашний комп включенным для игры как-то накладно, тем более, что есть домашний сервер на Debian.

Если на сервере с Debian есть достаточное количество ОЗУ и доступна аппаратная виртуализация (Intel-VT/AMD-V), то есть еще вариант. Можете на нем запустить виртуальную машину (VirtualBox или KVM+Virt-Manager), установить чистую и оптимизированную Windows и туда перенести сборку spp-classics-cmangos.

Потом сделать этой виртуальной машине проброс портов для подключения к реалму и серверу миров. Таким образом можно будет подключаться к серверу на Debian, внутри которого будет жить виртуалка с игровым сервером. Еще можно организовать себе подключение к рабочему столу виртуальной машины с Windows по VNC и т.д.

0