• Просьба не публиковать сообщения с предложениями продажи модов или сборок!

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

Серверная vs клиентская часть в ragemp

Заметил такую особенность что новичкам часто сложно понять идею разделения на серверную и клиентскую часть. Те кто приходят из САМПа тоже не до конца понимают эту концепцию, т. к . в samp есть только серверный скриптинг и отдельной клиентской части просто нет.

В этой статье я расскажу свое виденье и как я это понимаю и использую для написания скриптов для ragemp.

Дисклеймер: ниже будет описано лично мое представление об этом вопросе. Я не являюсь профессиональным скриптером под rage mp и не связан с разработкой самого мультиплеера. Я не знаю большинства возможностей движка и как реализованы многие игровые механики. Основываюсь только на личном опыте и своих предположениях. Скорее всего в моем понимании есть пробелы и неточности. Буду благодарен если Вы меня поправите там где я ошибаюсь и мы сделаем эту статью лучше :)


Итак, скрипты которые мы пишем для сервера ragemp могут состоять из серверной, клиентской части или иметь и ту и другую. По сути серверный и клиентский скрипт это две независимые программы, которые хоть и лежат на сервере в соседний папках, но выполняются абсолютно в разных местах:
  • серверная часть (все что в папке packages) выполняется на сервере и не передается на клиент.
  • клиентская часть (все что в client_packages) передается на клиент и выполняется непосредственно на компьютерах игроков которые играют на сервере.
1610110499888.png
Зачем же нужно такое разделение? Это дает нам как разработчикам скриптов больше гибкости и больше возможностей. Часто благодаря этому можно сделать работу скриптов более производительной.

К примеру я хочу написать мини игру, какой-нибудь тетрис. Игрок вводит команду и у него открывается какое-то окошко с игрой. Сам тетрис может полностью работать локально у игрока. Все вычисления, обработка нажатий кнопкой и логика игры - все будет работать локально на компьютере игрока и сервер не будет тратить свои ресурсы на нее. Он вообще может не знать что игрок запустил эту мини игру и на каком она этапе. Это круто, ведь так мы можем сильно разгрузить сервер и переложить вычисления на игроков.
Если мы вернемся к САМПу, то там вся работа идет только через сервер. Т. е. если мы хотим на клиенте отобразить что-то в интерфейсе, то мы вызываем соответствующую функцию на сервере, а уже он передает ее по сети на клиент. Это уже не очень круто, не забываем про пинг (задержка доставки сетевых пакетов между клиентом и сервером) и что одновременно в эту мини игру может играть много игроков. В таком случае сервер будет выполнять огромное количество бесполезной работы, да и интерфейс игры отзывчивым явно не назовешь.

1610111570212.png

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

Казалось бы к чему тогда вообще нам серверная часть, ведь практически все и так выполняется на клиенте?
Когда мы делаем что-то на клиенте, то это выполняется только на этом клиенте и другие игроки этого не увидят. Например, мы может создать объект на клиентской части и его увидит только один игрок. А если нам нужно чтобы объект видели все игроки, например новогоднюю елочку возле мэрии? Окей отправим через сервер event и выполним mp.objects.new на всех клиентах. Супер, но это сработает только на тех игроков кто в данный момент находится на сервере. Как же быть с теми кто зайдет позже? Ну можно хранить на сервере таблицу со списком объектов которые нужно создать и отправлять ее всем игрокам которые подключаются к серверу. отличная идея и мы бы так и делали если бы у нас не было серверных функций.

Если посмотреть на команду mp.objects.new, то она есть как в списке серверных, так и в списке клиентских. Такие функции еще называют shared. Если мы используем ее на клиенте, то созданный объект видит только игрок у которого на клиенте была вызвана эта функция. Если же мы создаем объект на сервере, то сервер ragemp под капотом делает примерно тоже самое что мы придумали в предыдущем абзаце. Он делает так, чтобы объект создался для всех игроков которые есть на сервере и которые зайдут в будущем. Только теперь мы уже не паримся об этом, все реализовано внутри.

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

1610111457660.png

Вместо заключения:
  • Клиентская и серверная часть - это две разные программы, которые зачастую будут запущены на разных компьютерах (серверная часть только на сервере, клиентская - на компьютерах всех игроков подключенных к серверу).
  • Серверная часть более безопасна в плане защиты от читерства и взлома, т. к. физически запущена только на сервере и злоумышленник не имеет доступа к памяти процесса или файлам сервера.
  • Функции и события доступные к использованию на сервере и на клиенте можно найти на wiki в соответствующих разделах 1610111946266.png
  • Сервер не умеет работать с интерфейсом игры, физикой и ничего не знает об игровой карте.
  • Функция выполненная на клиенте, выполнится только на этом компьютере и не повлияет на других игроков.
  • Клиенты не общаются на прямую между собой, а только через сервер.
 
Тема довольно абстрактная, поэтому сложно все точно объяснить. Надеюсь кому-то статья поможет лучше понимать этот вопрос.
 
Очень даже полезная и понятная тема =)
 
Последнее редактирование:
Назад
Верх