Oxide StudiosOxide Studios

Exports & API Reference

Complete API documentation for Oxide Chat.

Table of Contents


Overview

Oxide Chat provides full compatibility with the standard FiveM chat API, plus additional functionality.

Dual Export Names

Both export names work identically:

-- These are equivalent:
exports['oxide-chat']:addMessage(...)
exports['chat']:addMessage(...)

The chat export works because Oxide Chat uses provide 'chat' in its manifest.


Client-Side Exports

addMessage

Display a message in chat.

exports['oxide-chat']:addMessage(message)

Parameters

NameTypeDescription
messagetable/stringMessage data or simple string

Message Table Properties

PropertyTypeDescription
argstable{ author, message } or { message }
colortable/stringRGB array {r, g, b} or hex string #RRGGBB
templateIdstringChat type for styling
chatTypestringAlternative to templateId

Examples

-- Simple message
exports['oxide-chat']:addMessage('Hello world!')

-- With author
exports['oxide-chat']:addMessage({
    args = { 'System', 'Welcome to the server!' }
})

-- With color (RGB)
exports['oxide-chat']:addMessage({
    args = { 'Alert', 'Low health!' },
    color = { 255, 0, 0 }
})

-- With color (hex)
exports['oxide-chat']:addMessage({
    args = { 'Success', 'Transaction complete' },
    color = '#00FF00'
})

-- With chat type styling
exports['oxide-chat']:addMessage({
    args = { '', 'Server restarting...' },
    chatType = 'announcement'
})

addSuggestion

Add a command suggestion to autocomplete.

exports['oxide-chat']:addSuggestion(name, help, params)

Parameters

NameTypeDescription
namestringCommand name with / prefix
helpstringDescription text
paramstableArray of parameter definitions

Param Properties

PropertyTypeDescription
namestringParameter name
helpstringParameter description

Example

exports['oxide-chat']:addSuggestion('/pay', 'Pay a player money', {
    { name = 'id', help = 'Player server ID' },
    { name = 'amount', help = 'Amount to pay' }
})

addSuggestions

Add multiple suggestions at once.

exports['oxide-chat']:addSuggestions(suggestions)

Parameters

NameTypeDescription
suggestionstableArray of suggestion objects

Example

exports['oxide-chat']:addSuggestions({
    { name = '/job', help = 'Check your current job' },
    { name = '/money', help = 'Check your balance' },
    { name = '/inventory', help = 'Open inventory', params = {} },
})

removeSuggestion

Remove a command suggestion.

exports['oxide-chat']:removeSuggestion(name)

Parameters

NameTypeDescription
namestringCommand name with / prefix

Example

exports['oxide-chat']:removeSuggestion('/secretcommand')

clearChat

Clear all messages from chat.

exports['oxide-chat']:clearChat()

isEnabled

Check if chat is enabled.

local enabled = exports['oxide-chat']:isEnabled()

Returns

TypeDescription
booleanWhether chat is enabled

setEnabled

Enable or disable chat.

exports['oxide-chat']:setEnabled(enabled)

Parameters

NameTypeDescription
enabledbooleanEnable/disable chat

Example

-- Disable chat during cutscene
exports['oxide-chat']:setEnabled(false)

-- Re-enable after cutscene
exports['oxide-chat']:setEnabled(true)

getSuggestions

Get all registered suggestions.

local suggestions = exports['oxide-chat']:getSuggestions()

Returns

TypeDescription
tableMap of command name to suggestion data

Server-Side Exports

addMessage

Send a message to one or all players.

exports['oxide-chat']:addMessage(target, message)
-- or
exports['oxide-chat']:addMessage(message)  -- Broadcasts to all

Parameters

NameTypeDescription
targetnumberPlayer server ID or -1 for all
messagetableMessage data

Examples

-- Send to specific player
exports['oxide-chat']:addMessage(source, {
    args = { 'Bank', 'You deposited $1,000' },
    color = { 0, 255, 0 }
})

-- Broadcast to all players
exports['oxide-chat']:addMessage({
    args = { 'Server', 'Maintenance in 5 minutes' },
    chatType = 'announcement'
})

-- Using -1 for all
exports['oxide-chat']:addMessage(-1, {
    args = { 'Event', 'Double XP is now active!' }
})

addSuggestion

Send a command suggestion to a player.

exports['oxide-chat']:addSuggestion(target, name, help, params)

Parameters

NameTypeDescription
targetnumberPlayer server ID or -1 for all
namestringCommand name with / prefix
helpstringDescription text
paramstableParameter definitions

removeSuggestion

Remove a suggestion for a player.

exports['oxide-chat']:removeSuggestion(target, name)

clearChat

Clear chat for one or all players.

exports['oxide-chat']:clearChat(target)

Parameters

NameTypeDescription
targetnumberPlayer server ID, -1 for all, or nil for all

addTemplate

Register a message template.

exports['oxide-chat']:addTemplate(id, template)

Parameters

NameTypeDescription
idstringTemplate identifier
templatestringTemplate format string

registerMessageHook

Register a hook to intercept/modify messages.

local hookId = exports['oxide-chat']:registerMessageHook(callback)

Parameters

NameTypeDescription
callbackfunctionHook function

Returns

TypeDescription
numberHook ID for reference

See Message Hooks for detailed usage.


Client Events

chat:addMessage

Display a message.

TriggerEvent('chat:addMessage', {
    args = { 'Author', 'Message' },
    color = { 255, 255, 255 }
})

chat:addSuggestion

Add a suggestion.

TriggerEvent('chat:addSuggestion', '/command', 'Help text', {
    { name = 'param', help = 'Parameter help' }
})

chat:addSuggestions

Add multiple suggestions.

TriggerEvent('chat:addSuggestions', {
    { name = '/cmd1', help = 'Command 1' },
    { name = '/cmd2', help = 'Command 2' },
})

chat:removeSuggestion

Remove a suggestion.

TriggerEvent('chat:removeSuggestion', '/command')

chat:clear

Clear all messages.

TriggerEvent('chat:clear')

chatMessage (Legacy)

Legacy event for simple messages.

TriggerEvent('chatMessage', 'Author', { 255, 0, 0 }, 'Message text')

Server Events

chat:addMessage

Send from server to client.

TriggerClientEvent('chat:addMessage', source, {
    args = { 'Server', 'Welcome!' }
})

chat:addSuggestion

Send suggestion to client.

TriggerClientEvent('chat:addSuggestion', source, '/help', 'Show help')

chat:addSuggestions

Send multiple suggestions.

TriggerClientEvent('chat:addSuggestions', source, suggestions)

chat:removeSuggestion

Remove a suggestion.

TriggerClientEvent('chat:removeSuggestion', source, '/command')

chat:clear

Clear client's chat.

TriggerClientEvent('chat:clear', source)
TriggerClientEvent('chat:clear', -1)  -- All players

Message Format

args Array

The args array determines the message format:

-- Two elements: author and message
args = { 'John', 'Hello everyone!' }
-- Output: "John: Hello everyone!"

-- One element: message only
args = { 'System message' }
-- Output: "System message"

-- Empty author
args = { '', 'Pre-formatted message' }
-- Output: "Pre-formatted message"

Color Formats

Colors can be specified as RGB arrays or hex strings:

-- RGB array
color = { 255, 128, 0 }

-- Hex string
color = '#FF8000'

-- Nested array (legacy support)
color = {{ 255, 128, 0 }}

Chat Types

Apply styling from Config.ChatTypes:

-- Using templateId
{ templateId = 'announcement' }

-- Using chatType
{ chatType = 'police' }

Chat type styling includes:

  • Color
  • Prefix (e.g., "[LSPD]")
  • Italic formatting

Message Hooks

Intercept and modify messages before they're sent.

Registering a Hook

-- Server-side
local hookId = exports['oxide-chat']:registerMessageHook(function(source, author, message)
    -- Return modified message
    return {
        author = author,
        message = message:gsub('badword', '****')
    }
end)

Hook Callback Parameters

ParameterTypeDescription
sourcenumberPlayer server ID
authorstringMessage author
messagestringMessage content

Hook Return Values

ReturnEffect
falseCancel the message
{ cancel = true }Cancel the message
{ author = '...' }Modify author
{ message = '...' }Modify message
nilNo modification

Hook Examples

-- Profanity filter
exports['oxide-chat']:registerMessageHook(function(source, author, message)
    local filtered = message:gsub('badword', '****')
    return { message = filtered }
end)

-- Block messages from muted players
local mutedPlayers = {}

exports['oxide-chat']:registerMessageHook(function(source, author, message)
    if mutedPlayers[source] then
        return false  -- Cancel message
    end
end)

-- Add prefix based on player data
exports['oxide-chat']:registerMessageHook(function(source, author, message)
    local Player = QBCore.Functions.GetPlayer(source)
    if Player and Player.PlayerData.metadata.vip then
        return { author = '[VIP] ' .. author }
    end
end)

Hook Cleanup

Hooks are automatically removed when their registering resource stops.


Integration Examples

Shop Purchase Notification

-- Server-side
RegisterNetEvent('shop:purchase', function(itemName, price)
    local src = source
    exports['oxide-chat']:addMessage(src, {
        args = { 'Shop', 'Purchased ' .. itemName .. ' for $' .. price },
        color = '#00FF00'
    })
end)

Job-Specific Announcement

-- Server-side
function AnnounceToJob(jobName, message)
    for _, playerId in ipairs(QBCore.Functions.GetPlayers()) do
        local Player = QBCore.Functions.GetPlayer(playerId)
        if Player and Player.PlayerData.job.name == jobName then
            exports['oxide-chat']:addMessage(playerId, {
                args = { '', message },
                chatType = jobName
            })
        end
    end
end

-- Usage
AnnounceToJob('police', '[DISPATCH] 10-90 at Legion Square')

Dynamic Suggestion Updates

-- Client-side: Update suggestions based on job
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job)
    -- Remove old job suggestions
    exports['oxide-chat']:removeSuggestion('/oldcommand')

    -- Add new job suggestions
    if job.name == 'police' then
        exports['oxide-chat']:addSuggestion('/cuff', 'Handcuff a player')
        exports['oxide-chat']:addSuggestion('/escort', 'Escort a player')
    end
end)

Temporary Chat Disable

-- Client-side: Disable during cutscene
function StartCutscene()
    exports['oxide-chat']:setEnabled(false)
    -- ... cutscene code ...
end

function EndCutscene()
    exports['oxide-chat']:setEnabled(true)
end

Custom Chat Type

-- Config addition (config/main.lua)
Config.ChatTypes.gang = {
    prefix = 'GANG',
    color = '#9B59B6'
}

-- Server-side usage
exports['oxide-chat']:addMessage(source, {
    args = { '', gangName .. ' Radio: ' .. message },
    chatType = 'gang'
})