ДонНТУ   Портал магистров

Разработка и управление серверной частью онлайн-игры World of Warcraft

Содержание

Введение

Кто в наше время не слышал про игру Warcraft? Это, пожалуй, одно из самых удачных творений компании Blizzard, которое принесло ей и славу, и большие деньги. В данной статье я расскажу об истории как самой игры World of Warcraft, так и об истории создания эмуляторов под неё. Также уделено особое внимание самому популярному эмулятору в наше время – TrinityCore и его важнейшим составляющим.

1. От Warcraft до World of Warcraft

Экран игры Orcs and HumansПервая версия игры под названием Warcraft: Orcs and Humans была выпущена еще в 1994 году для DOS, а позже также и для MacOS. Игра имела большой успех и Blizzard, не задумываясь, продолжила выпускать все новые дополнения. Наибольшую популярность имела серия Warcraft III, состоящая из 2 дополнений – Reign of Chaos и The Frozen Throne. Одним из основных нововведений были «герои» – уникальные юниты, которые накапливали опыт, получали навыки и использовали в бою артефакты. Также эти версии игр считали «открытыми», так как в них стало доступно создание карт, как похожих на стандартные, так и совершенно уникальных.

Логотип World of WarcraftФанаты игры длительное время ожидали выхода продолжения, поскольку технологии и графика, используемые в игре, стали устаревать и уступать другим аналогичным играм. И вот компания в 2004 году выпускает свое новое творение, которое в край изменило всю концепцию игры – World of Warcraft. Популярность этой игры росло с каждым годом, и согласно отчетам компании на 31 декабря 2012 года количество подписчиков составило 9.6 миллиона человек. Игра вошла в Книгу рекордов Гиннеса, как самая популярная MMORPG в мире и принесла множество наград, включая Gamespot’s Game of the Year Award, как лучшая игра 2004 года.

2. История создания и последующая эволюция эмуляторов

Но несмотря ни на что, игра была и есть платной, что делает её недоступной для огромного количества потенциальных игроков во всем мире. Именно это стало толчком для создания энтузиастами различного рода эмуляторов, способных стать альтернативой официальному серверу. Но чтобы близзарды не предъявляли никаких претензий и не прикрывали подобные проекты, вся разработка происходила при определенных условиях. В первую очередь – программный продукт разрабатывался в некоммерческих образовательных целях, имел открытый исходный код и мог использоваться лишь в ознакомительных целях.

Первым эмулятором считается WoW Daemon (WoWd) от команды Team Python. Эта команда состояла из двух частей: молодых энтузиастов, в большинстве – непрофессиональных программистов, желанием которых было научиться программировать и понимать структуру эмулятора-сервера. Вторая часть – это естественно профессиональные программисты, которые вносили большие и сложные изменения в проект, поскольку желали получить денежную выгоду с проекта. Эти люди понимали, что эмулятор-сервер должен принимать данные от клиента, обрабатывать и отсылать ответы в зависимости от результатов обработки. Но для того, чтобы узнать всю информацию о пакетах (номер, назначение, структуру) необходимо было анализировать трафик между клиентом и официальным сервером. И тут в бой вступили хакеры, разработавшие программы-сниферы, с которыми играли на официальных серверах и получали оттуда все необходимые данные. И за несколько недель они получили полный набор опкодов, которые и должен обрабатывать сервер. Уже через достаточно небольшой период времени были реализованы функции создания персонажей и входа в игровой мир, что резко изменило представление у людей, разрабатывающих эмулятор. Часть разработчиков поняли, что можно начать зарабатывать деньги и ушли в закрытый проект – WoWPython, а другая часть – продолжили разрабатывать проект с отрытым исходным кодом под названием OpenWow. Но давление компании Blizzard было высоко, поэтому оба проекта прекратили разработку, но стали отличной базой для других проектов.

Работа над OpenWow стала основой для создания нового эмулятора с русским названием Ludmilla. Проект был очень нестабильным, поскольку несколько раз то закрывался, то открывался. Состав разработчиков постоянно менялся, а сам проект делали то частным (закрытым от общественности), то опять публичным.

Эта нестабильность была не по душе большей части состава, что опять стало причиной распада команды и заброса разработки проекта. Стали появляться интересные проекты, которые имели закрытый исходный код. Такими проектами были WoWEMU, WoWWoW и RunWOW. Об этих проектах стоит сказать пару предложений.

WoWEMU – коммерческий и закрытый проект, разработкой которого занимался всего 1 человек, хотя в написании отдельных функций ему несомненно помогали другие программисты. Основой данного проекта стали полученные данные еще во времена разработки WoWd, но отличительной особенностью стало то, что разработчик решил не использовать базу данных SQL, а хранить данные в файлах, содержимое которых можно было спокойно посмотреть в любом текстовом редакторе. Поскольку в этот период времени стабильной разработки не было, то WoWEMU смог вырваться по работоспособности вперед и стал активно продаваться в виде откомпиленного ядра. Хакерам не нравилась подобная деятельность разработчика, поскольку он пользовался данными, полученными другими людьми, получая при этом выгоду. Поэтому они сломали защиту эмулятора, что в последствии привело к закрытию данного проекта.

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

RunWOW – коммерческий проект, некоторое время был довольно популярным, хотя и стоил довольно дорого – 200-300 у.е. Он был собран из украденных исходников WoWWoW и дополнен поддержкой SQL и полноценной обработкой dbc файлов, что в корне изменило работоспособность контента. Вскоре проект закрылся и его исходники стали доступны всем желающим.

Экран эмулятора MangosВообще, можно накопать огромное количество эмуляторов-сервера, каждый из которых имеет свою историю и внес определенный вклад в дальнейшее развитие эмуляторов. Но особое значение имеет эмулятор, который разрабатывается с 2005 года – MaNGOS (Massive Network Game Object Server). Этот проект стал наследником проекта Людмила и взял от нее самое лучшее: поддержку SQL, язык программирования С++, открытость ядра и его свободное распространение, правильную реализацию обработки dbc-файлов клиента. Данный проект существует по сей день (под другим названием – cmangos), активно развивается и пользуется популярностью среди разработчиков различных категорий.

Единственным полноценным конкурентом этому проекту по моему мнению является лишь один проект – TrinityCore. Будучи изначально лишь форком (англ. fork – ответвление) Мангоса, проект смог очень далеко уйти как по количеству разработчиков, так и по работоспособности контента. И в данный момент сложно говорить о схожести исходного кода обоих проектов, поскольку со времен отделения большая часть кода TrinityCore была переписана.

Что же привело к разделению проектов? Несомненно, важной причиной стали, как показывает история, разногласия внутри коллектива. Если разработчики MaNGOS придерживались идеи полностью отказаться от всевозможных хаков, т.е. исключить из кода частные неоптимальные реализации контента, то разработчики TrinityCore постоянно вносили в код подобные изменения, что и позволило им намного опередить по работоспособности проект MaNGOS. Некоторые программисты не хотели переходить на «мусорник», поэтому остались и продолжили работу над «чистым» кодом Мангоса, другие же – перешли в команду TrinityCore. Это позволило TrinityCore первыми внедрить различные крупные модули, которые на Мангосе стали появляться лишь спустя года. А ведь обычным игрокам не имеет значения, как реализована та или иная составляющая игры, ему важно, чтобы она работала, как и предполагалось изначально задумкой Blizzard. Поэтому вскоре большая часть крупных серверов перешла на TrinityCore, а MaNGOS сейчас остался скорее отличной платформой для изучения C++.

Логотип эмулятора TrinityCore

3. Что такое TrinityCore?

TrinityCore (в переводе c англ. Tinity – троица) – это объединение трех неотъемлемых компонент эмулятора Wow-сервера: ядра, скриптов и базы данных. В отличие от MaNGOS'a разработка всех этих компонент производится в едином репозиторие, что позволяет разработчикам сразу менять компоненты одной составляющей при изменении другой.

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

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

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

4. Базы данных MySQL

Логотип эмулятора TrinityCoreПоскольку информация о каждом персонаже – это набор различного рода данных, то эти данные нужно где-то хранить, чтобы после перезагрузки сервера можно было загрузить последнюю информацию о каждом персонаже. Причем, чтобы оптимизировать весь процесс хранения данных, нужно данные разбить по таблицам. Это разбиение позволит разделить таблицы на 2 типа – со статическими и динамическими данными. К статическим данным можно отнести, например, постоянную информацию о юните – его модель, размер, скорость передвижения. Но даже эти данные могут быть по желанию изменены и эти изменения будет производить само ядро. А изначальная информация будет содержаться в статических таблицах. Обычно для таких таблиц применяется движок MyISAM, поскольку его преимущество именно в обработке запросов на чтение.

К динамической информации можно отнести параметры, которые могут изменяться в режиме реального времени. Например, текущий запас здоровья юнита, количество денег, местоположения и т.д. Данная информация вычисляется в ядре по реализованным алгоритмам, посылается клиенту в виде определенных опкодов и записывается в базу данных. Для записи информации в ядре реализованы несколько вариантов, например организация прямого запроса (Append), связываемых переменных (prepared statements) либо транзакций (transaction).

Прямой запрос в базу данных позволит быстро выполнить любой запрос, который указывается в прямом виде, например INSERT INTO `table` VALUES (1, 2, 3).

Связываемые переменные – часть функциональности SQL-баз данных, предназначенная для отделения данных запроса и собственно выполняемого SQL-запроса. Так мы отдельно задаем запрос, вместо данных подставляя в него номера связываемых переменных (:1, :2,...) или просто вопросительные знаки. Далее вызываем запрос, указывая, какие именно данные надо подставить вместо указанных переменных. Подобные выражения обладают рядом преимуществ:

– один и тот же подготовленный запрос можно использовать несколько раз для разных данных, тем самым сокращая код;

– запросы со связываемыми переменными лучше кэшируются сервером, сокращая время синтаксического разбора;

– запросы со связываемыми переменными обладают готовой встроенной защитой от SQL-инъекций.

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

Для управления таблицами, где выполняется постоянная перезапись данных, используется движок InnoDB, который в СУБД Percona Server и MariaDB подменяется на механизм XtraDB. Основным отличием этого движка является поддержка транзакций и внешних ключей

Система управления базами данных MySQL является наиболее популярной, эффективной и то же время бесплатной. Поэтому её функционал активно применяется в составе TrinityCore.

5. CMake

Логотип CmakeCMake – кроссплатформенная утилита для автоматической сборки программы из исходного кода. При этом сама CMake непосредственно сборкой не занимается, а представляет из себя front-end. В качестве back-end`a могут выступать различные версии make.

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

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

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

6. GNU Debugger

Логотип GNU GDBGNU Debugger — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая С, C++, Free Pascal, FreeBASIC, Ada и Фортран. GDB — свободное программное обеспечение, распространяемое по лицензии GPL.

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

GDB активно развивается. Например, в версии 7.0 добавлена поддержка «обратимой отладки», позволяющей отмотать назад процесс выполнения, чтобы посмотреть, что произошло. Также в версии 7.0 была добавлена поддержка скриптинга на Python.

Для работы с GDB были созданы и другие инструменты отладки например, датчики утечки памяти.

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

7. Как зарабатывают деньги на разработке компании Blizzard?

Кузня BlizzardСоздав игру, которая завоевала популярность среди разных возрастных категорий во всем мире, компания Blizzard дала также толчок развитию огромного количества «пиратских» серверов. Открытость исходного кода эмуляторов, талантливость программистов и заинтересованность инвесторов делала подобные проекты очень популярными среди категории людей, которые не могли либо не хотели оплачивать игровое время на официальном сервере. Конечно, такие игроки не получали полное наслаждение от игры, поскольку игра содержала в себе огромное количество недоработок в виде нерабочих квестов, заклинаний и других аспектов игры. Также важным моментом есть то, что обновления игрового контента по отношению к официальному серверу выходили с явным запозданием, ведь с каждым подобным обновлением нужно было менять структуру ядра, номера опкодов, экстракторы карт либо dbc-файлов. А это занимает немало времени даже у опытных программистов.

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

Вторая причина является юридической. В своде правил всех пиратских серверов можно встретить фразу: «Данный не официальный сервер игры World of Warcraft является экспериментальной не коммерческой разработкой, созданной для ознакомления пользователей с игрой World of Warcraft. Данный сервер не является нарушением EULA World of Warcraft, т.к. для его разработки не производилась декомпиляция или исследования клиентской части игры, а сама разработка не является производной (derivative work) от оригинальной игры, а только ознакомительным проектом-подражанием». Действительно, для того чтобы играть на пиратском сервере, пользователей не заставляют менять структуру клиентского ПО, а сервер лишь эмулирует работу официального серверного ПО.

Если игра на пиратских серверах бесплатная, то на чем же зарабатывают деньги владельцы этих серверов? Несмотря на некоммерческую особенность серверов, описанную в самом первом же пункте соглашения, заработок происходит косвенным путем. Игроки не могут напрямую покупать игровые предметы, валюту, преимущества – ведь это нарушит права на интеллектуальную собственность компании Blizzard. Но они могут покупать внутреннюю, придуманную самим сервером виртуальную валюту (у разных серверов это называется по разному – бонусы, монеты и т.д.), которую в последствии смогут обменять на игровые предметы. Причем, эту валюту игроки скорее не покупают, а получают в подарок взамен «Пожертвованиям на развитие проекта». И количество таких пожертвований на крупных серверах может достигать десятков тысяч в сутки.

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

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

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

Список использованных источников

  1. История Эмуляторов World of Warcraft [Электронный ресурс]. — Режим доступа: http://wowscript.narod.ru/wowemuhistory.html, свободный. — Загл. с экрана.
  2. Транзакция (информатика) [Электронный ресурс]. — Режим доступа: http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B0%D0%BD%D0%B7%D0%B0%D0%BA%D1%86%D0%B8%D1%8F_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29, свободный. — Загл. с экрана.
  3. CMake [Электронный ресурс]. — Режим доступа: http://ru.wikipedia.org/wiki/CMake, свободный. — Загл. с экрана.
  4. GNU Debugger [Электронный ресурс]. — Режим доступа: http://ru.wikipedia.org/wiki/GDB, свободный. — Загл. с экрана.