lezvieprod

RAGE MP или как сейчас делают сервера для GTA 5

Всем привет! Год назад я познакомился с таким проектом как Rage MP (RAGE Multiplayer). Если вы знакомы с такими понятиями как SAMP, MTA, CRMP, или вам интересно как сейчас делают сервера для GTA 5, думаю вас заинтересует эта статья.

Rage MP — это мультиплеерная модификация для игры GTA 5. Принцип работы такой же, как и у SAMP: вы запускаете ланучер, выбираете сервер для игры, подключаетесь и наслаждаетесь игрой в ГТА 5. Почему я уделил внимание этому проекту? Дело в том, что разработка серверов для GTA 5 действительно интересный процесс. И так, по порядку.

RAGE MP существует с 2016 года и был разработан группой опытных специалистов. Сам проект написан на языке C++ (Foundation) и обеспечивает разработчика мощным API для разработки сервера. Собственно, тут и начинается самое интересное. RAGE MP использует Node.js для работы сервера, для клиентской части - обычный JavaScript. Для внутриигрового интерфейса используется CEF (Chromium Embedded Framework), благодаря которому, можно работать с веб-приложениями прямо на сервере. Что я имею ввиду? RAGE MP позволяет разработчику использовать огромный спектр веб-технологий для своего сервера: HTML, CSS, React, Vue, jQuery и множество других библиотек и фреймворков. Разработчик может строить сложные интерфейсы, анимации, да и в целом использовать все то, что есть в обычном вебе. Прежде чем двигаться дальше, стоит сразу уточнить одну деталь: сервер на RAGE MP имеет три части: бекенд, клиент и браузер он же CEF. Тут может назреть вопрос: в чем разница между клиентом и браузером? Клиент в данном случае посредних между сервером и браузером. На клиенте, с помощью API Rage MP, мы можем получать какие-нибудь локальные данные игрока, например скорость автомобиля или координаты. В браузере же мы можем лишь принять эти данные и взаимодействовать с ними, например вывести на экран или положить в глобальное хранилище по типу Redux. Далее я опишу принцип взаимодействия бекенда с клиентом и браузером.

В современных SPA, мы привыкли что для общения между сервером и клиентом необходимы роуты, да и в целом хоть какой-то URL для обращений по нему. В RAGE MP этот процесс отличается. Если вы до этого работали с библиотекой Socket.IO то для вас вряд ли то, что я дальше опишу будет чем-то новым. И так, для обращений между сервером и клиентом используются события. Например. Мы можем создать событие на сервере под названием ADD_NEW_USER и передать callback, в котором обращаемся к базе данных и создаем в ней нового пользователя.

Вариант 1
Вариант 1

Вызывать это событие можно как с сервера, так и запросом с клиента. Сразу стоит отметить, что браузер не может вызывать события, созданные на сервере. Браузер может взаимодействовать только с клиентом. Если мы хотим отобразить данные нового пользователя в CEF, мы должны сначала оздать событие на клиенте, вызывающее событие на сервере. Таким образом, данные пройдут сначала сервер, потом клиент, и только потом браузер. Тут можно сразу подвести к одной из сложностей разработки: большое количество событий, в которых можно просто запутаться и потерять логическую цепочку. Однако есть способ облегчить этот процесс: создавать события, которые должны вернуть что-либо. Если в первом варианте нам надо было создавать дополнительное событие на клиенте, которое получало бы данные с сервера, то во втором варианте мы можем иметь лишь одно событие на клиенте.

Вариант 2
Вариант 2

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

Все это дело не облегчает JavaScript с его динамической типизацией. Как раз тут есть выход. Для разработки сервера мы можем использовать TypeScript или C#. По поводу шарпа я ничего сказать не могу, так как не углублялся в его изучение, да и в последний раз работал с ним в Unity лет 6 назад, а вот про TypeScript можно сказать пару слов. Разработчиками RAGE MP были созданы два репозитория на гитхабе, которые содержат типизацию функций и объектов сервера. Поэтому, TypeScript становится весьма выгодным решением для разработки сервера. Ну и наконец, стоит затронуть сборщики проекта.

В вебе, как правило, мы используем такие популярные сборщики как: Webpack, Rollup или Gulp. Да можно начать обсуждать что Gulp это таск-менеджер, а не сборщик, но сейчас не об этом. И так, как собирать проект, написанный для RAGE MP? На самом деле, все также как и в обычном веб приложении. Мы указываем entry, output, добавляем плагины на оптимизацию кода, на копирование и так далее. Однако стоит обсудить подводные камни. У нас три части проекта: бекенд, клиент и браузер. Их всех надо как-то собирать в отдельные папки и, соответственно, в отдельные файлы. Да, возможно спецы по сборщикам скажут, что проблем здесь нет, да и вообще все просто. Возможно для них оно так и есть, но во время работы над своим проектом, я столкнулся с некоторыми проблемами. Например, мне нужны были определенные плагины и настройки для сборки React, но не нужны были для бекенда и клиента и наоборот. В ходе экспериментов, я пришел к такому решению: для сборки React приложения использовать Webpack, а для сервера и клиента любой другой сборщик. Таким образом, на моем проекте используются два сборщика. Все это подкрепляется библиотеками concurrently и nodemon. Возможно, у вас возник вопрос, а почему бы не использовать webpack-dev-server или, например, dev-server-rollup вместо nodemon? На самом деле можно, однако, я написал более производительный для себя конфиг с использованием nodemon.

Подводя итоги, могу сказать, что разработка сервера для RAGE MP, это действительно новый опыт, который может не только прокачать навыки разработчика, но и весьма вероятно принести неплохие деньги. Однако стоит учитывать, что разработка сервера для RAGE MP – это настоящий бизнес-проект, тут не получится за месяц написать что-то достойное. По-хорошему, для проекта нужна команда разработчиков, маркетологов, и как минимум project manager. Да, конечно, можно и на чистом энтузиазме одному человеку написать весь проект, а потом начать его рекламировать, но стоит понимать, что это займет уйму времени, а поддерживать проект с десятками тысяч строк кода – задача не из легких.