wiki
JavaScript:
mp.gui.chat.show(false); //Отключаем дефолтный чат
let chatbox = mp.browsers.new('package://chat/index.html');//создаем новый чат который будет стилизован вами
chatbox.markAsChat(); //Помечаем этот "браузер" как браузер чата.
После чего вам нужно написать скрипты которые будут обрабатывать то что пишет игрок в чат.
Допустим у нас есть поле ввода чата.(его тоже надо написать как раз таки в "package://chat/index.html"путь может отлечаться как угодно как и название файла.)
При нажатии enter отправляется инвок из нашего "браузера" по типу mp.invoke("chatMessage", value);-если это сообщение и mp.invoke("command", value); если это команда.
Сами определяете(скриптом) когда это команда, а когда это сообщение.
Для обработки сообщений и команд на сервере есть такие эвенты как "playerChat" и "playerCommand" в которых вы определяете кто имеет доступ к команде, у кого есть доступ к чату(может бан какой висит на игроке)
И после оработки уже отправляете сообщение(если это просто сообщение) всем игрокам в определенном радиусе(
https://wiki.rage.mp/index.php?title=Pool::forEachInRange) отправляете как раз таки запрос в тот "браузер" который сделали для чата.(ведь у каждого клиенте кто на сервере имеется этот "браузер")