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

    Ошибка: Ваша версия Grand Theft Auto V не поддерживается 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/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


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

Мануал RageFW - набор инструментов для разработки сервера RAGE:MP

Harvey Specter

Специалист
BackEnd developer
7 Ноя 2020
255
90
95
Кринж это писать "было принято решение написать собственный (который теперь также используется в основных библиотеках) RPC" к этому и была предъява, пусть пишут что хотят, но зачем хуйню писато о том что вы создали что то своё)
Гугл тоже придумали поисковик, но это не значит, что нельзя создавать альтернативы, как, например, Яндекс или Bing. Порой свои решения лучше подходят под конкретные задачи и позволяют оптимизировать процесс под нужды проекта. В конце концов, выбор между "создать с нуля" и "использовать готовое" всегда зависит от контекста и требований задачи. Поэтому мы и написали сообственный. Не засоряй мне тему своими неуместными сообщениями, хочешь конфликта - пиши в лс, там поговорим.
 

MoonFusion

Старожил
BackEnd developer
14 Июн 2021
371
223
143
Гугл тоже придумали поисковик, но это не значит, что нельзя создавать альтернативы, как, например, Яндекс или Bing. Порой свои решения лучше подходят под конкретные задачи и позволяют оптимизировать процесс под нужды проекта. В конце концов, выбор между "создать с нуля" и "использовать готовое" всегда зависит от контекста и требований задачи. Поэтому мы и написали сообственный. Не засоряй мне тему своими неуместными сообщениями, хочешь конфликта - пиши в лс, там поговорим.
Ещё раз, что отличает "твой" RPC от RageRPC кроме типизации?)
 

youngBeaver

Покинул форум.
BackEnd developer
24 Янв 2023
1,202
469
171
Если не секрет, то зачем апать мануал? Типо кого интересует разработка они сами зайдут и посмотрят этот раздел, а для "рядовых пользователей" это не поможет запустить сборку
 

Harvey Specter

Специалист
BackEnd developer
7 Ноя 2020
255
90
95
Апну для новых людей.
 
Реакции: aspidemon

UchihaMadara

Гений
FrontEnd developer
27 Окт 2020
876
321
141
Не видел тему до этого.

добавлены мидлвейры для ивентов Сервера и Клиента. Их можно повесить на моменте регистрации ивента для проверки входящих данных и потенциальной отмены колбека, если такая понадобится
Вот это странный момент. Middlwares, как я понимаю, это набор условий, при которых EventHandler должен сработать У вас же игровой процесс. Каждое событие должно быть обработано. Игрок зашёл в N зону - он должен увидеть Response для своих действий. Или там кнопку в UI нажал - ему прилетает Response - Успех/Ошибка.
Многие любят создавать сотню Render обработчиков, которые вызываются каждый кадр. И просто закидывают туда кучу условий, при которых Render не будет выполняться дальше.
Вот эти Middlewares тоже самое получается.


RageFW позволяет легко вызывать события и получать ответы между всеми компонентами сервера (server, client, cef). Больше не нужно вручную прокидывать дополнительные события!
Вот это тоже странный момент. Нарушается логика и ответственность. Сервер может напрямую взаимодействовать с CEF, а CEF напрямую вызывать сервер.
Каждая сторона делает что хочет, исключая состояние клиента.

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

aspidemon

Начинающий специалист
26 Сен 2022
133
46
85
Не видел тему до этого.


Вот это странный момент. Middlwares, как я понимаю, это набор условий, при которых EventHandler должен сработать У вас же игровой процесс. Каждое событие должно быть обработано. Игрок зашёл в N зону - он должен увидеть Response для своих действий. Или там кнопку в UI нажал - ему прилетает Response - Успех/Ошибка.
Многие любят создавать сотню Render обработчиков, которые вызываются каждый кадр. И просто закидывают туда кучу условий, при которых Render не будет выполняться дальше.
Вот эти Middlewares тоже самое получается.



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

Ответственность CEF - это получить данные, отобразить UI, ответить клиенту. А тут получается, что UI взаимодействует с сервером и выполняет бизнес-логику.
Думаю автор имеет ввиду, что используя его библиотеку будет удобнее просто написать одну строчку на вебе, что бы передать данные на сервер, в любом случае это все происходит через клиентскую часть, просто удобнее использовать например:

JavaScript:
// CEF side

global.callServer('event.name', param);
// Автор скорее всего реализовал и преобразование в строку и может еще как-то обрабатывает param
// После чего в реализованной функции callServer вызывается ивент который находится на клиентской части, а этот ивент, в свою очередь,
// является просто "мостиком" для перекидывания данных между вебом и сервером
JavaScript:
// CLIENT side
// Предположительно ивент может выглядеть так
mp.events.add('client:browser.to.server', (name, ...args) => {
    mp.events.callRemote('server:browser.to.server:events:call', name, args);
});
// Соответственно, все работает так же как и обычно, ничего нового тут нет, в любом случае даже на своем сервере
//ты обязан будешь реализовать что-то подобное, иначе у тебя
// будет целая "туча" подобных ивентов, которые по факту являются "водой" в твоем коде,
//и легче будет организовать все через один ивент - и код чище, и тебе комфортнее работать,
// плюс можно отслеживать через сервер все ивенты
JavaScript:
// SERVER side
custom.events.add('server:browser.events:name', (player, ...args) => {
    // todo event
});

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

UchihaMadara

Гений
FrontEnd developer
27 Окт 2020
876
321
141
удобнее просто написать одну строчку на вебе, что бы передать данные на сервер
О чем я и говорю. Нарушается ответственность. Каждый начинает выполнять то, что ему не положено выполнять. UI не должен взаимодействовать с сервером и управляться сервером.
 

aspidemon

Начинающий специалист
26 Сен 2022
133
46
85
О чем я и говорю. Нарушается ответственность. Каждый начинает выполнять то, что ему не положено выполнять. UI не должен взаимодействовать с сервером и управляться сервером.
Ну так, по факту, оно и выполняет свою ответственность, просто для удобства, что б не прописывать постоянно на клиенте новые ивенты через которые нужно перекинуть данные их просто прокидывают через один ивент, так намного читабельнее код становится, все что здесь меняется это подход к написанию кода и не более, все в мультиплеере работает одинаково, ты не сможешь изменить работу клиента, сервера или веб части

UPD: К слову говоря, такая практика (прокидывание браузерных ивентов через один ивент в клиенте на сервер) используется на многих слитых модах
 

aspidemon

Начинающий специалист
26 Сен 2022
133
46
85
Каждый начинает выполнять то, что ему не положено выполнять.
От использования этого ресурса ничего не меняется в работе мультиплеера, но становиться читабельнее и комфортнее писать код в моменте разработки, если говорить "по факту", то этот ресурс просто вкусовщина, ты либо флудишь в своем коде целой кучей ивентов, либо используешь какие-либо либы/пишешь сам либы, которые помогают тебе комфортнее и чище писать код, что в будущем, на огромном проекте, даст преимущество в скорости фикса багов например, я уж не говорю про упрощенную совместную разработку с кем-либо

Я когда-то реализовывал простенький RPC для рейджа (https://www.npmjs.com/package/@aspidemon/rage-rpc), что б и немного кода в продакшн было и легче работать с браузером, разве не проще прописать что-то подобное?

JavaScript:
// SERVER side

mp.events.add('playerJoin', (player) => {
    eventHandler.callBrowser(player, 'browser:openHUD', player.id);
});


JavaScript:
// WEB side

eventHandler.add('browser:openHUD', (_playerID) => {
    hudState = true;
    playerID = _playerID;
    // todo
});

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

Еще раз повторюсь, в любом случае, ДАЖЕ ЕСЛИ НЕ ИСПОЛЬЗОВАТЬ ПОДОБНЫЕ БИБЛИОТЕКИ/РЕСУРСЫ, тебе нужно будет создавать ивент на клиенте вручную, ибо иначе ты с сервера напрямую браузеру не сможешь ничего передавать, в любом случае ты будешь делать все тоже самое, что и делает этот ресурс, но если ты хочешь, что бы твой код выглядел нормально, а не как каша из непонятно чего, ты используешь подобные ресурсы или библиотеки и кайфуешь от того, что теперь тебе нужно всего создать ивент, потом вызвать его сразу с серверной части и не париться о том, что б создавать ивенты на клиентской части, потом прописывать какой именно браузерный ивент вызвать, потом создать этот ивент еще нужно, короче, просто упрощаешь себе жизнь
 
Последнее редактирование:
Реакции: youngBeaver

UchihaMadara

Гений
FrontEnd developer
27 Окт 2020
876
321
141
все в мультиплеере работает одинаково, ты не сможешь изменить работу клиента, сервера или веб части
Я хз зачем ты мне объясняешь как устроен mp.


оно и выполняет свою ответственность
Оно не выполняет свою ответственность. Проложи точно такой же мост, только до БД. А че, удобно же, можно не писать лишние ивенты на клиент-сайд и сервер-сайд. Кнопку нажал = INSERT INTO accounts....

Как ты говорил?
так намного читабельнее код становится
Видишь код обработчик нажатия кнопки, сразу понимаешь, что там заносятся данные в таблицу БД
 

Harvey Specter

Специалист
BackEnd developer
7 Ноя 2020
255
90
95
Оно не выполняет свою ответственность. Проложи точно такой же мост, только до БД. А че, удобно же, можно не писать лишние ивенты на клиент-сайд и сервер-сайд. Кнопку нажал = INSERT INTO accounts....
Зачем на сервере регестрировать евент который может быть вызван напрямую с браузера и затрагивает БД, или разрешает ее модифицировать? Ответ: Я тоже не знаю.

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

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

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34
Я хз зачем ты мне объясняешь как устроен mp.



Оно не выполняет свою ответственность. Проложи точно такой же мост, только до БД. А че, удобно же, можно не писать лишние ивенты на клиент-сайд и сервер-сайд. Кнопку нажал = INSERT INTO accounts....

Как ты говорил?

Видишь код обработчик нажатия кнопки, сразу понимаешь, что там заносятся данные в таблицу БД
Так будет тоже самое, если без использования rpc.
Отправляешь с веба на клиент, на клиенте регистрируешь и отправляешь на сервер, на сервере регистрируешь и делаешь запрос в БД.
Кнопку нажал и INSERT INTO…

Это ведь просто обертка для удобства, не более. Так или иначе мы работаем с тем API который нам дает RAGE и не более того.
 
  • Haha
Реакции: UchihaMadara

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,214
2,072
208
35
Уже звучит как анекдот. Здесь опять нарушается зона ответственности.
мне кажется что опасность не в библиотеке, в том числе архитектурная, а в руках разработчика
кто-то построит структурный проект с мидлварями а кто-то монструозный говнокод с вызовами в скуль по кнопке из юи

можно же встроить правильно нечто подобное, чтобы он не размывал ответственность, через какие нибудь образные свои ServerAPI, ClientAPI, UIBridge
и использовать просто как часть инфраструктуры

а тем кому надо они охуенно справятся и так
я неделю назад смотрел код, где у чела каждый клик по кнопке в юайке вызывает серверный евент который делает инсерт
охуенно :super_klass:

Так будет тоже самое, если без использования rpc.
Отправляешь с веба на клиент, на клиенте регистрируешь и отправляешь на сервер, на сервере регистрируешь и делаешь запрос в БД.
Кнопку нажал и INSERT INTO…
На самом деле нет
Вы чуть-чуть на разных языках говорите. Ты - как разработчик, а Учиха как проектировщик скорее.
И без орм будет то же самое что с ним - че то там пушится и записывается в бд прямым селектом, правильно
Так и зачем тогда ебаться

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

нарушается зона ответственности.

именно так и есть

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

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

С другой стороны ну на рагемп про щас бы про клир код и архитектуру говорить, лмао
Работает и похуй, ещё и удобно, ёбнешься

Грю, тут люди "сборку с нуля чтобы не ставить ебучую баганую редагу" на прямом скуле пишут
А вы развели

Для почти любого рядового разработчика здесь это будет скорее полезно чем нет почти в любом случае
А до разделений зон ответственности, слоёв и дизайна кода он сам когда-нибудь дойдёт

Или нет
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34
мне кажется что опасность не в библиотеке, в том числе архитектурная, а в руках разработчика
кто-то построит структурный проект с мидлварями а кто-то монструозный говнокод с вызовами в скуль по кнопке из юи

можно же встроить правильно нечто подобное, чтобы он не размывал ответственность, через какие нибудь образные свои ServerAPI, ClientAPI, UIBridge
и использовать просто как часть инфраструктуры

а тем кому надо они охуенно справятся и так
я неделю назад смотрел код, где у чела каждый клик по кнопке в юайке вызывает серверный евент который делает инсерт
охуенно :super_klass:


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

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



именно так и есть

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

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

С другой стороны ну на рагемп про щас бы про клир код и архитектуру говорить, лмао
Работает и похуй, ещё и удобно, ёбнешься

Грю, тут люди "сборку с нуля чтобы не ставить ебучую баганую редагу" на прямом скуле пишут
А вы развели

Для почти любого рядового разработчика здесь это будет скорее полезно чем нет почти в любом случае
А до разделений зон ответственности, слоёв и дизайна кода он сам когда-нибудь дойдёт

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

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,214
2,072
208
35
Ну хорошо, давай на примере наглядном что ли разберем. У тебя задача при нажатии кнопки, пусть к примеру это будет кнопка подтверждения продажи машины, выдать игроку N-ую сумму денег и записать это в базу данных. Как ты это сделаешь, если по вашим словам мухи отдельно, котлеты отдельно.

на абстрактном?
ну давай

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

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

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

4. ответ от сервера - сервер не шлёт "открой модалку", он шлёт состояние или результат
клиент принимает образный state и в зависимости от него сам решает че делать дальше - вывести нотифайку, закрыть модалку, отдать ошибку

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

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

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

UchihaMadara

Гений
FrontEnd developer
27 Окт 2020
876
321
141
У тебя задача при нажатии кнопки, пусть к примеру это будет кнопка подтверждения продажи машины, выдать игроку N-ую сумму денег и записать это в базу данных. Как ты это сделаешь, если по вашим словам мухи отдельно, котлеты отдельно.
На клиенте ты регистрируешь Событие "sell.vehicle", которое ожидает, что игрок Согласился/Отказался от сделки. Это событие можно вызвать разными путями.
1. Кнопка UI
2. Горячая клавиша Y/N
3. Команда /acceptsellvehicle или /cancelsellvehicle
4. Вышел из зоны трейда(условно) = отказался от сделки.
5. Открыл другое меню = отказался от сделки.

Одно событие под все эти штуки.
На клиенте ты ждёшь, что хоть кто-то с ним будет взаимодействовать.

Задача UI - принять данные (Игрок X хочет вам продать автомобиль за 100к$), выстроить контент, вернуть результат на клиент - Согласился или Отказался. На этом его ответственность заканчивается.

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

Задача сервера - принять данные от клиента, например согласился, соответственно изменить данные в БД. Если отказался - сообщить инициатору сделки, что сделка отменена.
 
Реакции: Inoi

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34
на абстрактном?
ну давай

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

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

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

4. ответ от сервера - сервер не шлёт "открой модалку", он шлёт состояние или результат
клиент принимает образный state и в зависимости от него сам решает че делать дальше - вывести нотифайку, закрыть модалку, отдать ошибку

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

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

архитектурно такое взаимодействие выглядело бы правильно, на мой взгляд
Это все понятно, но я имел немного не это. Я про сам путь ивента от веба на сервер. Он у нас идет CEF-client-server, верно? Так rpc делает то же самое, но в обертке. Как ни крути, все проходит через клиент, что бы сервер понимал кто его триггерит
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,457
866
181
34
По поводу валидации на клиенте я не согласен. В большинстве случаев валидация нужна так же и на сервере. К примеру, нужно посмотреть, есть ли у игрока вообще эта машина, которую он хочет продать. Клиент не имеет и не должен хранить такую информац пока не спросит о ней у сервера
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,214
2,072
208
35
Это все понятно, но я имел немного не это. Я про сам путь ивента от веба на сервер. Он у нас идет CEF-client-server, верно? Так rpc делает то же самое, но в обертке. Как ни крути, все проходит через клиент, что бы сервер понимал кто его триггерит
Да

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

Но в хорошей разработке - это просто нарушение архитектурных принципов.


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

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

Similar threads