• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/ru/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Урок Client-Server взаимодействие

MoonFusion

Гуру
Автор темы
high coder
14 Июн 2021
308
249
123

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

1696795857789.png



Начнём с терминологии, когда мы пишем backend для своего проекта под RageMp, у нас есть возможность писать серверную и клиентскую часть, что такое серверная и клиентская часть? Разберём по первой же картинке с гугла:

1696796012674.png


В нашем случае, client это человек который запускает Rage Multiplayer Launcher, вводит НАШ IP/PORT и заходит в игру, при этом подключаясь к серверу, думаю абсолютно очевидно что клиент у нас не один, их много и любой клиент может к нам подключиться.

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

Теперь поговорим об их взаимодействии в общем.

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

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

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

Теперь давайте рассмотрим, какие у нас есть инструменты для взаимодействия сервера и клиента внутри платформы Rage Multiplayer.​

Начнём пожалуй с того как вообще устроено это взаимодействия, в рейдже постарались и сделали достаточно доступное представление взаимодействия в виде неких "ивентов", от вас скрывается вся логика сетевого взаимодействия, все что вам нужно знать в такой реализации, это то что у вас есть способ отправить и получить ивент
( клиент -> сервер, клиент -> клиент, CEF -> клиент, клиент-CEF, сервер -> клиент, сервер -> сервер ).

Посмотрим поочередно как это делается, начнём с клиент-клиент, сервер-сервер и CEF-клиент.
Для взаимодействия client-client, или server-server мы будем использовать mp.event.call(eventName, ...args) и mp.events.add(eventName, ...args) для того что бы отловить этот ивент.

К примеру:
JavaScript:
// Client-side
mp.events.add('foo', (arg1) => {
    mp.console.logInfo(arg1);
});

mp.events.call('foo', 'hello client fron client!');

// console-output: hello client from client!

Т.е. мы добавляем ивент с помощью mp.events.add, после чего вызываем его с помощью mp.events.call, так же и с server-server:
JavaScript:
// Server-side

mp.events.add('foo', (arg1) => {
    console.log(arg1);
});

mp.events.call('foo', 'hello server from server!');

// console-output: hello server from server!

Ещё один вид взаимодействий, это CEF-client, в обе стороны, тут все немного сложнее.
Когда мы создаём браузер с клиента RageMp, платформа будет слушать определённые ивенты с CEF, для их вызова на стороне CEF мы можем использовать mp.trigger, давайте посмотрим на примере:
JavaScript:
// CEF

mp.trigger('foo', 'hello from CEF!');

// Client-side

mp.events.add('foo', (arg1) => {
    mp.console.logInfo(arg1);
});

// console-output: hello from CEF!

В обратную сторону все работает немного сложнее, все сильно зависит от того что вы используете при написании Frontend составляющей проекта на CEF, это может быть React, Vue3, Jquery, или просто чистый JS, мы посмотрим на пример чистого JS:
JavaScript:
// Client-side

const browser = mp.browsers.new('package://index.html');

browser.execute(`alert(\`hello from client!\`)`);

// CEF

// alert-output: hello from client!

Теперь рассмотрим server-client.
Мы должны точно так же зарегистрировать ивент там, где мы его хотим получить, с помощью mp.events.add, но вот вызов этих ивентов уже будет отличаться, для вызова client ивентов с сервера используется player.call(eventName, [...args]) ( метод доступен у каждого инстанса игрока ), заметьте что в player.call необходимо передавать аргументы в виде массива данных, причем если вы хотите передать какой-либо объект, его следует обернуть в JSON.

Пример client-server:
JavaScript:
// client

mp.events.add('foo', (arg1, jsonObj) => {
    mp.console.logInfo(arg1);

    const obj = JSON.parse(jsonObj);
    mp.console.logInfo(obj.test);
});

// server

const jsonObj = JSON.stringify({ test: 'object!'});
player.call('foo', ['hello from server!', jsonObj]);

// console-output:
// hello from server!
// object!

В случае с клиентом, что бы взывать серверный метод, т.е. client-server, на клиенте существует метод mp.events.callRemote(eventName, ...args), важно учитывать что в таком случае клиент автоматически ставит в начало аргументов объект игрока, т.е. на сервер, при добавлении ивента необходимо первым параметром получить объект игрока, смотрим на примере:
JavaScript:
// client

const jsonObj = JSON.stringify({ test: 'object!' });

mp.events.callRemote('foo', 'hello from client!', jsonObj );

// server

mp.events.add('foo', (player, arg1, jsonObj) => {
    const obj = JSON.parse(jsonObj);
    console.log('playerId: ' + player.id);
    console.log(arg1);
    console.log(obj.test);
});

// console-output:
// playerId: 0
// hello from client!
// object!

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

mippoosedev

Гуру
2 Мар 2021
294
139
100
Не пропагандируй browser.execute. Функционал mp распространяется на все фреймворки, которые ты только можешь себе представить. Ведь он вшивается напрямую самим рейджом. Так что browser.call работает повсеместно ;3
 
  • Like
Реакции: MoonFusion