• Из-за обновления 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) последний раз были обновлены:

Кастомный чатик и его подключение

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
Доброй ночи, форумчане!
Вот доделал версточку чата, почти все подключил и тут возник вопрос, мол а как же мне туда отсылать сообщение?

У меня некоторые особенности сборки, заложником которых я стал. Все интерфейсы содержаться в 1 пекейдже и контролятся через Redux. Так быстрее ибо не нужно лишний раз с нуля запускать построение DOM, да и просто так удобнее лично мне, а насчет оптимизации пока не думал(играем в 10 фпс и загружаемся за 30 минут is coming).

Так вот, как я понял обозначить чат можно через browser.markAsChat(), но вот незадача, там не обозначишь ни тип сообщения, ни его параметры(цвет текста в зависимости от его типа, команды при которых не стоит отправлять сообщение в чат и прочее). В мыслях ничего нет, может кто-то уже сталкивался с подобным?

UPD: Посмотрел пару работ, вижу что не один я такой с одним браузером. Но я не могу понять как именно работает markAsChat, куда он пихает текст и прочее, документации по этому поводу нет, так что очень прошу обьяснить.

Заранее спасибо за ответы :3
 
Последнее редактирование:

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
888
1,160
5
Здравствуйте!
Для отправки сообщений в чат и управления их параметрами, вам скорее всего потребуется создать свои собственные функции или методы в вашем Redux-хранилище. Вы можете реализовать логику определения типа сообщения, его параметров и обработку команд прямо внутри этих функций. При этом вы сможете использовать browser.markAsChat() для обозначения чата, а дополнительную логику выполнить в ваших собственных функциях. Надеюсь, это поможет вам решить вашу проблему!
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
markAsChat нужен для того, чтобы RAGE понимал, в какой браузер слать стандартные RAGE Event'ы, если они придут в стандартные методы отправки сообщений (такие как "chat:рush").
Если у тебя должен быть кастомный вариант отправки данных с сообщением - значит ты можешь просто обходить стандартный ивент для отправки, тем самым тебе нужно создать обработчик на сервере и на клиенте (если планируешь использовать с клиента mp.gui.chat.push, который точно так же отправляет сообщение в стандартный ивент на браузере).
Таким образом ты начинаешь отправлять сообщение как обычный ClientEvent на клиент, из клиента в браузер в нужный ивент с нужными аргументами.
 

wholinc

Специалист
24 Янв 2023
778
457
96
24
markAsChat нужен для того, чтобы RAGE понимал, в какой браузер слать стандартные RAGE Event'ы, если они придут в стандартные методы отправки сообщений (такие как "chat:рush").
Если у тебя должен быть кастомный вариант отправки данных с сообщением - значит ты можешь просто обходить стандартный ивент для отправки, тем самым тебе нужно создать обработчик на сервере и на клиенте (если планируешь использовать с клиента mp.gui.chat.push, который точно так же отправляет сообщение в стандартный ивент на браузере).
Таким образом ты начинаешь отправлять сообщение как обычный ClientEvent на клиент, из клиента в браузер в нужный ивент с нужными аргументами.
С возвращением.

Ты можешь создать кастомную функцию, которая будет принимать в себя полный текст игрока, на клиенте детектить через playerCommand, далее триггерить на клиенте эвент с командой, проверять команду и просто вставлять в DOM свой элемент с цветом, шрифтом и так далее.
Посмотреть как реализован стандартный рейдж чат ты сможешь в "названиеТвоейПапкиРейдж/ui".
 
  • Like
Реакции: XDeveluxe

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
С возвращением.

Ты можешь создать кастомную функцию, которая будет принимать в себя полный текст игрока, на клиенте детектить через playerCommand, далее триггерить на клиенте эвент с командой, проверять команду и просто вставлять в DOM свой элемент с цветом, шрифтом и так далее.
Посмотреть как реализован стандартный рейдж чат ты сможешь в "названиеТвоейПапкиРейдж/ui".
У меня там пусто :D
 

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
Приду домой и могу скинуть содержимое
Было бы неплохо. Но я вроде догнал благодаря вам. Стандартные ивенты этo chat:push, chat:activate, chat:show. В документации они указаны только как методы класса Chat, но не сказано что у них есть API. И когда ты указываешь чат, то игра просто отправляет этот ивент не на свой браузер(обработчик), а на мой.
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
Стандартные ивенты этo chat:push, chat:activate, chat:show. В документации они указаны только как методы класса Chat, но не сказано что у них есть API. И когда ты указываешь чат, то игра просто отправляет этот ивент не на свой браузер(обработчик), а на мой.
Именно.

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

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
Именно.

Использовав на объекте своего браузера markAsChat ты помечаешь для сервера, что все отправленные стандартные ивенты, которые ты описал в сообщении, нужно отправлять именно в твой браузер. Ты можешь использовать эти стандартные ивенты, если у тебя просто вывод текста, а можешь создать свои, но тогда нужен и кастомный ивент на сервере, который будет нужную информацию отправлять в новый кастомный ивент.
Благодарю за помощь! Без вас бы не разобрался нормально, т.к документация отсутствует по этому поводу.
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
Благодарю за помощь! Без вас бы не разобрался нормально, т.к документация отсутствует по этому поводу.
К сожалению, документация отсутствует к больше 50% возможностям, поэтому всё приходится узнавать поэтапно.
 

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
1708943574895.png
Вот такое ловлю после прогрузки браузера.
 

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
Потому что ты используешь объект chatAPI, которого у тебя нет?
Не-а, нет такого обьекта у меня. RAGE обращается к нему после подгрузки event-ов чата. Быть может ошибка образовывается из-за отсутствия содержимого тут:
Посмотреть как реализован стандартный рейдж чат ты сможешь в "названиеТвоейПапкиРейдж/ui".
 

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
JavaScript:
export const Chat = () => { // Функциональный компонент Реакта
  const chat = useAppSelector((state) => state.chat);
  const dispatch = useAppDispatch();

  const handleChatPushEvent = (text: string) => {
    const formatedText = text.split(' ');
    if (!formatedText) return;

    console.log(text); // Пока в этапе теста просто логаю

    if (formatedText[0].startsWith('/')) {
      if (formatedText[0].startsWith('me', 1)) {
        // chatActions.pushMessage({
        // })
      }
    }
  };

  const handleChatShow = (toggle: boolean) => { // Обращаемся к Redux чтобы он изменил DOM
    dispatch(chatActions.show(toggle));
  };

  const handleChatClear = () => {
    dispatch(chatActions.clearChat()); // Аналогично с первым обработчиком
  };

  const handleChatActivate = (toggle: boolean) => {
    dispatch(chatActions.activateInput(toggle));// Аналогично с первым обработчиком
  };

  useEffect(() => {
    if (mp.events) {
      let api = {
        'chat:push': handleChatPushEvent,
        'chat:show': handleChatShow,
        'chat:activate': handleChatActivate,
        'chat:clear': handleChatClear,
      };
      for (let fn in api) {
        console.log('Event ', fn);
        // @ts-ignore
        mp.events.add(fn, api[fn]);
      }
    }
  }, []);

  return <>{chat.isOpen && <MainChat />}</>;
};

Это основной скрипт Chat-а на уровне взаимодействия Rage - UI.


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

mp.events.add('playerReady', () => {
  mp.events.add('browserDomReady', (loadedBrowser: BrowserMp) => {
    if (browser === loadedBrowser) {

mp.gui.chat.show(false);
      browser.markAsChat();
      mp.events.callRemote('auth:startsesstion');
    }
  });
});
Накидываем новый браузер
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
mp.events.add('playerReady', () => { mp.events.add('browserDomReady',
Как минимум могу сказать, что делать вот так - не стоит.
Возможно, ДАННЫЙ конкретно вариант безопасен, т.к. при новом playerReady клиент очистится и так, но если ты это возьмёшь за практику, то увидишь то, что ты с каждым вызовом ивента будешь создавать новый, что, в свою очередь, приведёт к большим проблемам.
По коду вижу использование объекта chatActions, но не вижу его инициализацию. Ты либо его не сделал, либо скрыл какую-то часть кода, а зачем - неизвестно.
 

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
Тут проблема на на браузере.


JavaScript:
  mp.keys.bind(0x75, false, () => {
    mp.console.logInfo('f6');
    mp.gui.chat.show(isChatShow);
    isChatShow = !isChatShow;
  });

Вот такой примитивный бинд. Я нажимаю F6, нажатие проходит и каждый раз вызывает одну и ту же ошибку:

Uncaught ReferenceError: chatAPI is not defined
at <anonymous>:1:1

которая ссылает на:
chatAPI.show(true); (Не имеет значения true или false);

Т.е в процессе выполнения
mp.gui.chat.show(isChatShow);
фактически меняется на

chatAPI, но чем является chatAPI понять не могу.

1708947187140.png
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,220
1,425
191
27
Так может у тебя не вызывается инициализация ивентов (метод useEffect), поэтому рейдж не видит куда он должен обратиться с твоим запросом .show и пытается обратиться к стандартному объекту chatAPI? Проблема именно на браузере. Клиент к этому не имеет никакого отношения.
 

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
Как минимум могу сказать, что делать вот так - не стоит.
Возможно, ДАННЫЙ конкретно вариант безопасен, т.к. при новом playerReady клиент очистится и так, но если ты это возьмёшь за практику, то увидишь то, что ты с каждым вызовом ивента будешь создавать новый, что, в свою очередь, приведёт к большим проблемам.
По коду вижу использование объекта chatActions, но не вижу его инициализацию. Ты либо его не сделал, либо скрыл какую-то часть кода, а зачем - неизвестно.
Он у меня используется лишь единожды, далее уже свои обработчики и EventBus. Я впринципе очень бережно отношусь к event listeners, и в случае ненадобности сразу же их удаляю возвратом true из callback-а
 

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
139
37
50
18
Так может у тебя не вызывается инициализация ивентов (метод useEffect), поэтому рейдж не видит куда он должен обратиться с твоим запросом .show и пытается обратиться к стандартному объекту chatAPI? Проблема именно на браузере. Клиент к этому не имеет никакого отношения.
Инициализация проходит, смотрел через логи:
1708948256818.png

В консоль выводил из цикла где ивенты добавляются