This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

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

Alternant

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

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

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

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

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

Jerry (ChatGPT)

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

XDeveluxe

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

wholinc

Специалист
24 Янв 2023
787
466
96
24
С возвращением.

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

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
138
37
51
19
У меня там пусто
 

Alternant

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

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,219
1,424
191
27
Именно.

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

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
138
37
51
19
Благодарю за помощь! Без вас бы не разобрался нормально, т.к документация отсутствует по этому поводу.
 

XDeveluxe

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

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
138
37
51
19
Вот такое ловлю после прогрузки браузера.
 

Alternant

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

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
138
37
51
19
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,219
1,424
191
27
mp.events.add('playerReady', () => { mp.events.add('browserDomReady',
Как минимум могу сказать, что делать вот так - не стоит.
Возможно, ДАННЫЙ конкретно вариант безопасен, т.к. при новом playerReady клиент очистится и так, но если ты это возьмёшь за практику, то увидишь то, что ты с каждым вызовом ивента будешь создавать новый, что, в свою очередь, приведёт к большим проблемам.
По коду вижу использование объекта chatActions, но не вижу его инициализацию. Ты либо его не сделал, либо скрыл какую-то часть кода, а зачем - неизвестно.
 

Alternant

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


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 понять не могу.

 

XDeveluxe

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

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
138
37
51
19
Он у меня используется лишь единожды, далее уже свои обработчики и EventBus. Я впринципе очень бережно отношусь к event listeners, и в случае ненадобности сразу же их удаляю возвратом true из callback-а
 

Alternant

Начинающий специалист
Автор темы
11 Дек 2023
138
37
51
19
Инициализация проходит, смотрел через логи:

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