FiveM notify script

Notify documentation

The whole UI of your server in one style. Notifications, "[E]" bubbles floating over the NPC, progress bars, street and zone notices, key hints and announcements — and your other scripts keep working as they are: ox_lib, qb-core and other notify systems are taken over.

  • Version 2.0.1
  • Requirements: FXServer build 35245+. No database, no other resource needed (it takes over ox_lib / qb-core / okok notifications when they exist).
  • Frameworks: QBCore · Qbox Legacy · standalone · 'custom' (only used for admin permissions)
  • Languages: es · en · pt · fr
  • No lock-in: every other ROLO SCRIPT resource is optional, and so is this one for them: they fall back to ox_lib or the base game when rolo_notify is not running.
  • No tickets needed: everything you may want to adapt is in open files (see Escrow: what is open).

What's new in 2.0.1: key prompts fixed (in Open terminal · [G] counter · [H] duty, a · before a [KEY] starts a new key row, so the first action keeps its own key); Config.Framework = 'custom' for your own admin permission check.

Features

  • 🔷 World bubbles: neon key tile + glass pill over the NPC / vehicle / object in front of you (or at exact coordinates). Several keys per bubble, the key reacts when pressed, texts like "Presiona [E] para abrir" are cleaned up by themselves.
  • 🔔 Notifications: success, error, warning, info, money, police, phone, admin — icon, progress bar, sounds, duplicates grouped (x2, x3…), updatable by id.
    • With image (item image from your inventory or any URL, phone app icons).
    • Timers (timer = 120 → countdown 02:00) and sticky ones with a progress bar you update.
  • ⏳ Progress bar and circle with the same style: animations, scenarios, props, disabled controls, cancel with X. Same data as lib.progressBar, plus QBCore.Functions.Progressbar.
  • 🛣️ Street notices (street, zone, compass, postal code with nearest-postal) and zone notices ("Entrando en · VINEWOOD") — never at every crossing.
  • ⌨️ Key hints panel for any script.
  • 📢 Announcements for everyone (/aviso; rolo_interface's chat keeps /anuncio for player ads).
  • 🎛️ Player settings (/ajustesnotify): drag the notifications and street card anywhere, size, dark background, duration, how many at once, volume, color theme, sounds, grouping, street / zone notices, do not disturb (/nomolestar) and muted types. Saved on each player's PC.
  • 👑 Admin panel (/notifyadmin): server-wide defaults with live preview (position, color, background, sounds, bubble height, street / zone timing) — no config editing, applied to everyone instantly.
  • 🎵 Sounds: ROLO chimes made in the UI (no files), GTA sounds, your own .ogg files, or none.
  • 📜 History (/notificaciones) and a test command (/notifytest) that shows everything in seconds.
  • 🌍 Spanish, English, Portuguese, French · QBCore / Qbox / standalone · 0.00 ms idle.

Installation

  1. Put rolo_notify in resources. Start it right after your core:

    ensure ox_lib
    ensure qb-core        # or qbx_core
    ensure rolo_notify
    
  2. Turn off any other notify / text UI script doing the same job.

  3. Recommended patches (1 line each, see patches/) so 100% of your scripts use rolo_notify:

    • ox_lib/resource/interface/client/textui.lua → patches/ox_lib_textui.lua (the "[E]" box → bubble)
    • ox_lib/resource/interface/client/notify.lua → patches/ox_lib_notify.lua
    • ox_lib/resource/interface/client/progress.lua → lines in patches/snippets.lua
    • qb-core/client/functions.lua → Notify + Progressbar lines in patches/snippets.lua
    • qb-core/client/drawtext.lua → patches/qb-core_drawtext.lua

    Every patch only acts while rolo_notify is started: stop it and everything goes back to normal. Updating those resources removes the patches — paste them again.

    • Target menu (the eye), any framework: rolo_notify can't restyle another resource's screen by itself (FiveM gives each resource its own NUI), so the ROLO look for the target menu is one folder you copy once. Only that folder goes into the target resource; the rest of patches/ stays in rolo_notify.
      • qb-target (QBCore): copy the folder patches/qb-target/html into qb-target/ (replace its html folder, back it up first) and restart qb-target. GPL-3.0 like qb-target (patches/qb-target/NOTICE.md).
      • ox_target (Qbox, ox_core and any server that runs ox_target; also RSG's RedM fork): copy the folder patches/ox_target/web into ox_target/ (replace its web folder, back it up first) and restart ox_target (patches/ox_target/NOTICE.md). It covers qtarget too, because ox_target provides it.
      • Every target menu of every script gets the ROLO look; the target's code and options don't change. The console reminds you at start while qb-target or ox_target runs without it (Config.TargetSkinHint). Updating the target resource puts its original menu back: copy the folder again. To undo, put your backup back.
  4. Scripts with their own "notify system" option in their config: set it to ox_lib / oxlib / qbcore.

  5. Admins: framework groups in Config.AdminGroups, or the ace rolo_notify.admin. Another framework: Config.Framework = 'custom' and your check in bridge/server.lua.

Commands

Command
/ajustesnotify the player's own settings
/nomolestar do not disturb on / off
/notificaciones history
/notifytest shows every feature
/aviso <text> announcement (admins)
/notifyadmin server defaults panel (admins)

Exports (client)

exports.rolo_notify:Notify('Texto', 'success', 5000, 'Título')
exports.rolo_notify:Notify({ text = 'Te dieron Agua x2', type = 'success', image = 'water' })
exports.rolo_notify:Notify({ id = 'heist', title = 'Robo en curso', text = 'La policía llega en', type = 'police', timer = 120 })
exports.rolo_notify:Notify({ id = 'dl', text = 'Descargando...', sticky = true, progress = 40 }) -- call again with the same id to update
exports.rolo_notify:CloseNotify('dl')

exports.rolo_notify:ShowPrompt('myscript:door', { text = '[E] Abrir puerta', coords = vector3(x, y, z) })
exports.rolo_notify:ShowPrompt('myscript:shop', { rows = { { key = 'E', text = 'Comprar' }, { key = 'G', text = 'Vender' } }, entity = ped })
exports.rolo_notify:HidePrompt('myscript:door')

exports.rolo_notify:ShowHints('driving', { title = 'Controles', keys = { { 'W', 'Acelerar' }, { 'X', 'Cancelar' } } })
exports.rolo_notify:HideHints('driving')

local ok = exports.rolo_notify:Progress({ label = 'Reparando', duration = 5000, canCancel = true,
    anim = { dict = 'mini@repair', clip = 'fixing_a_ped' }, disable = { move = true, combat = true } })

Exports (server)

exports.rolo_notify:Notify(source, 'Texto', 'error')
exports.rolo_notify:NotifyAll('Texto', 'info')
exports.rolo_notify:CloseNotify(source, 'id')
exports.rolo_notify:Announce('Título', 'Mensaje', 9000)

Or TriggerClientEvent('rolo_notify:notify', source, 'Texto', 'success').

Integrations / Custom

Everything you may want to adapt is in open files (config.lua, locales/, bridge/, patches/): you never need the escrowed code.

Exports: see Exports (client) and Exports (server) above. More exports, used by the takeover patches and by other ROLO SCRIPT resources:

-- client
exports.rolo_notify:GetTheme()                  -- the colours this player sees: { accent, accentLight, accentDark, glow, border, text... }
exports.rolo_notify:OpenSettings()              -- opens the player's settings panel
exports.rolo_notify:IsPromptOpen('myscript:door')
exports.rolo_notify:PressPrompt('myscript:door', 'E')    -- animates the key as pressed
exports.rolo_notify:DrawText3D(x, y, z, 'Text')           -- call every frame (QBCore-style DrawText3D); shown as a bubble
exports.rolo_notify:ProgressCircle({ label = '...', duration = 3000 })
exports.rolo_notify:IsProgressActive() / CancelProgress()
-- the ox_lib / qb-core entry points the patches call:
-- OxNotify, OxShowTextUI, OxHideTextUI, OxIsTextUIOpen, OxProgress, ProgressUI, ProgressUIEnd, QBNotify, QBProgress, QBProgressResource

Events: TriggerClientEvent('rolo_notify:notify', source, text, 'success', 5000, 'Title') (or a data table as the first argument), TriggerClientEvent('rolo_notify:closeNotify', source, id) and TriggerClientEvent('rolo_notify:announce', -1, 'Title', 'Text', 9000). Server defaults saved by the admin panel use rolo_notify:server:save (admins only, checked by Bridge.IsAdmin).

Where to plug in your own system

What Where (open file)
Who is an admin (/aviso, /notifyadmin) with your own framework Config.Framework = 'custom' and your check in Bridge.IsAdmin(src) in bridge/server.lua (also Config.AdminGroups and the ace rolo_notify.admin)
Which other notify / text UI systems are taken over Config.Capture in config.lua: oxTextUI, oxNotify, oxProgress, qbDrawText, okokNotify, okokTextUI, mythicNotify, pNotify, cdDrawTextUI, jgTextUI (set one to false to leave that system alone)
Take over one more system Takeover.Install in bridge/client.lua: add Provide('other_resource', 'exportName', function(...) api.Notify({ text = ... }) end) (same pattern as the others) or register its event with RegisterNetEvent
The 1-line patches for ox_lib / qb-core / ESX patches/*.lua (paste instructions in Installation)
Notification types, colours, icons, sounds Config.Types, Config.TypeAliases, Config.Sounds (and your own .ogg files, see Custom sounds)
Postal codes on the street card Config.Postal (any resource that exports getPostal)
Words cut from key hints ("Press [E] to open" shows "[E] Open") Config.KeyHints.leadWords / linkWords in config.lua (add your language)
Colours and themes Config.Theme, Config.ColorPresets
Commands, positions, durations, how many at once Config.Notify, Config.Street, Config.Zones, Config.Progress, Config.Announce, Config.AdminCommand, Config.TestCommand
Texts locales/*.lua

Example, take over another notify resource:

-- bridge/client.lua, inside Takeover.Install
Provide('my_old_notify', 'Send', function(text, ntype, ms) api.Notify({ text = text, type = ntype, duration = ms }) end)

Escrow: what is open

These files stay open (editable) when the resource is escrowed, exactly as escrow_ignore in fxmanifest.lua says:

  • config.lua;
  • locales/*.lua: every text;
  • bridge/*.lua: bridge/client.lua (takeover of other systems) and bridge/server.lua (admin permissions);
  • patches/*.lua: the one-line patches for ox_lib and qb-core;
  • patches/qb-target/html and patches/ox_target/web: the ROLO skins for the qb-target / ox_target menus (HTML / CSS / JS).

The rest of the Lua code (client/, server/, shared/) is encrypted. This resource has no webhooks, no database and no item definitions, so there is no config_server.lua, compat/ or items/.

Custom sounds

Set Config.Sounds.mode = 'custom' and put success.ogg, error.ogg, warning.ogg, info.ogg, money.ogg, police.ogg, phone.ogg, admin.ogg in html/sounds/.


ROLO SCRIPT · Support and updates on our Discord.

Stuck?

Write to us in the Discord support channel with the script, your framework and the console error.