Jixryo Chat

A command bar, not a chat room. Each player sees only the commands they may run, with the parameters lit as they type, and script messages fade in and out.

Version 1.0.0 Updated See it on its script page

On this page

Jixryo Chat is the resource chat, version 1.0.0. It takes the stock chat resource's place and keeps its name, so every script that sends chat messages or registers command suggestions keeps working. T opens a command bar, not a chat room: there is no free text and no OOC. Each player sees only the commands the server says they may run, and messages scripts send show for a few seconds and fade.

What players get

  • A command bar on T. Tap T and the bar opens; the keyboard goes to it a moment later (or as soon as you let go of T). Type a slash command and Enter runs it. Esc closes it.
  • Only the commands you may run. The list under the bar is built from the server's own command registry, filtered by the ACE command.<name> for you, plus the commands your own game registered that you may run. Commands starting with +, - or _ are left out.
  • Suggestions as you type, with each command's help and parameters (from the suggestions scripts register) lit as you type them, and your recent commands (30 kept on your PC).
  • Script messages fade in and out after 8 seconds while the bar is closed; the last 50 are kept to scroll back through with Page Up and Page Down while it is open.
  • No OOC. The /ooc command is hidden from the list and refused with "/ooc is off on this server."; messages from the senders "OOC" and "Proximity OOC" are muted.
  • An unknown command answers "Unknown command /name" instead of the stock chat's error.
  • /me above heads. What a player says with /me is drawn over their head, in line of sight, within 20 m, up to 3 stacked, for 4 seconds plus 60 ms a character (10 seconds at most), 200 characters at most. Your own does not show in first person.
  • The bar hides itself while the pause menu is open, while the screen is faded out, and when another resource asks it to hide (a cutscene, a camera).

What staff get

Nothing of its own. Staff see their own commands in the list because the server checks their ACEs like anyone else's.

Install

  1. Stop the stock chat and cc-chat (the theme). This resource is called chat and stands in the stock one's place; two resources cannot share the name. Remove or rename the stock chat folder from your resources, then put this one in.

  2. Upload the folder whole. The page is already built in web/build.

  3. Order in server.cfg. It declares no dependencies and needs no Jixryo Core.

    server.cfg
    ensure chat
  4. Items. None.

  5. The database. None. Recent commands are kept in the resource's own KVP on the player's PC.

  6. Full restart. The text chat is switched off in the game (SetTextChatEnabled(false)) when the client starts.

How other scripts' calls behave

Jixryo Chat answers as chat, the stock resource, for the calls other scripts already make:

CallWhat happens
chat:addMessage (event, server to a game)Shown, after cleaning: up to 10 arguments of 2,000 characters, a template of 4,000, a template id, up to 20 parameters, a colour, a kind. Muted senders are dropped. Messages that arrive before the page is ready are queued (50 at most).
chatMessage (event, old style)The author and text become a message.
__cfx_internal:serverPrintPrinted to F8 and shown with the print template.
chat:addSuggestion, chat:addSuggestions (events)A command's help and up to 12 parameters (name 40 characters, help 200). As in the stock chat, a suggestion without help or parameters never wipes one with them.
chat:removeSuggestion (event)Takes a command out of the list.
chat:addTemplate (event)A message template by id (4,000 characters, the first one wins).
chat:clear (event)Clears the queue and the page.
chat:addMode, chat:removeMode (events)Accepted and ignored: there are no chat modes.
exports.chat:addMessage(message) (client)The same as the event.
exports.chat:addSuggestion(name, help, params) (client)The same as the event.
exports.chat:addMessage(target, message) (server)Sends a message to one player, or to everyone when the target is left out.
exports.chat:registerMessageHook(...) (server)Accepted and ignored.
exports.chat:registerMode(...) (server)Returns false: no modes.
__cfx_internal:commandFallback (server)An unknown command: the old chatMessage server event fires first (a script may cancel it), otherwise the player is told "Unknown command /name" (once per 250 ms). The event is then cancelled so the stock error never shows.

Its own additions:

CallWhat happens
exports.chat:hide(reason, hidden) (client)Hides the bar and messages while a reason stands (hidden = false clears it). Each resource's reasons are kept apart, and a resource that stops has its reasons cleared.
chat:init (event, game to server)The game asks for its command list (at most once every 2 seconds per player). The server also sends everyone a fresh list a second after any resource starts or stops.
chat:commands (event, server to a game)The names of the commands this player may run. Only the server may send it.

The /me text comes from the player state bag me, which this resource reads but does not set [inferred: the /me command that sets the state bag is in another resource; it is not in this one's code].

Its own API

Exports and events are the table above. Commands and key mappings:

NameWhat
+openchatOpens the bar (the key mapping "Open the command bar", T by default).
-openchatOn release: the keyboard goes to the bar.

Page calls (the built page to the client): ready (the page gets the config, the history, the templates, the commands and the queued messages), close, run (the typed command, up to 512 characters; hidden commands are refused with the "off" text; the command is remembered and executed in the player's game).

State: none of its own; it reads the player state bag me.

Commands and keybinds

Command or keyWhoWhat
TEveryoneOpens the command bar (a key mapping: players can change it in GTA's settings).
Enter, EscEveryone, in the barRun the command; close the bar.
Page Up, Page DownEveryone, in the barScroll back through the last 50 messages.

The resource registers no slash commands of its own.

Configuration

KeyDefaultWhat it does
Config.key'T'The default key for the bar.
Config.fade8Seconds a new message stays on screen while the bar is closed.
Config.keep50Messages kept to scroll back through while the bar is open.
Config.history30Recent commands kept on the player's PC.
Config.hide{ 'ooc' }Commands hidden from the list and refused.
Config.mute{ 'OOC', 'Proximity OOC' }Message senders dropped.
Config.text.unknown'Unknown command /%s'What an unknown command answers.
Config.text.off'/%s is off on this server.'What a hidden command answers.
Config.me.enabledtrue/me above heads.
Config.me.bag'me'The player state bag read.
Config.me.distance20Metres within which another player's /me shows.
Config.me.stack3How many stack over one head.
Config.me.time, .perChar, .maxTime4000, 60, 10000Milliseconds shown: the base plus this per character, up to the most.
Config.me.maxLength200Characters of a /me kept.
Config.me.height0.42Metres above the head bone.
Config.me.firstPersonfalseWhether your own /me shows in first person.

Security

  • No free text. The game's text chat is off and the bar only runs commands; what you type goes to the game's own ExecuteCommand, so every command keeps its own permission check on the server.
  • The command list comes from the server, filtered by the ACE command.<name> per player, and only the server may send it (a game that sends chat:commands to itself is ignored).
  • Every message is cleaned before the page sees it: lengths capped, arguments and parameters counted, colours read as numbers. Templates are HTML the stock chat also accepted, from scripts only.
  • Hidden commands are refused before they run, and muted senders never reach the page.
  • /me text is stripped of control characters, trimmed and cut to 200 characters; one per player every 400 ms; shown only within 20 m and with a clear line of sight, checked every 250 ms.
  • Unknown commands are rate limited to one message per player every 250 ms.

Tests

There is no suite for this resource in dev-tools/luarun/tests, and the README it would describe does not exist: nothing was run for it on 2026-10-31. The page's source is jixryo-ui/apps/chat.

Check it in game

  1. Press T: the bar opens, and the list shows only commands you may run (compare a staff account with a player's).
  2. Type / and a letter: suggestions with help, and the parameters light as you type them. Enter runs the command; Esc closes the bar.
  3. Type /ooc hello: "/ooc is off on this server." Type /nosuchcommand: "Unknown command /nosuchcommand".
  4. Have a script send a chat message: it fades after 8 seconds with the bar closed, and Page Up scrolls back to it with the bar open.
  5. /me waves near another player: it shows over your head for them within 20 m, not through walls, and not for you in first person.
  6. Open the pause menu: the bar and messages hide; close it: they are back.
Next step

Ready to look around?

Browse the suite, or paste your server.cfg and see what each script does to your server.