Configuration Reference

Every setting in oxide-radio, what it does, and its default value — plus how database-backed configuration works.

Every setting in oxide-radio, what it does, and its default value.

How Configuration Is Stored

This is the most important thing to understand about configuring oxide-radio.

  • Before the first start, the resource reads its settings from shared/config.lua.
  • On the first start, it copies every setting from that file into a database table called oxide_settings.
  • From then on, the database is the source of truth. Editing shared/config.lua after the first start changes nothing — the value already lives in the database and wins.

So there are two ways to work:

  1. First-time setup: edit shared/config.lua before you first start the resource. Your values get imported automatically.
  2. Changing a setting later: run /radio settings in game as an admin. The menu edits the database-backed settings live — no file editing, no restart. See Admin → The Settings Menu.

Starting over. If you want to wipe your settings and re-import from shared/config.lua, delete every row where resource = 'oxide-radio' in the oxide_settings table (using your database manager) and restart the resource. It re-imports everything from the file on the next start.

A few settings are config-only — they live in shared/config.lua and are not editable from the menu because they're animation and prop data, not the kind of thing you tune day to day. Those are marked below and appear as read-only "config-only" tiles in the settings menu so you know they exist.

Config File: shared/config.lua

All settings live in one file: shared/config.lua.

General

SettingTypeDefaultDescription
Config.EnabledbooleantrueMaster switch. Turning this off disconnects everyone from the radio and stops the radio item from working
Config.DebugbooleanfalsePrints extra [oxide-radio] lines to the server console. Handy while setting up; leave off on a live server
Config.Enabled = true
Config.Debug = false

Radio Item

SettingTypeDefaultDescription
Config.Itemstring'radio'The inventory item that opens the radio. Must exist in your inventory system. Renaming this may need a server restart on some frameworks to unregister the old item
Config.RequireItembooleantrueWhen true, players must be holding the radio item to tune in and stay connected. Set false to let anyone use the radio without an item
Config.Item = 'radio'
Config.RequireItem = true

Frequencies

These set the range of open civilian frequencies. Restricted job channels are not limited by this range — they can sit on any frequency.

SettingTypeDefaultDescription
Config.MinFrequencynumber1The lowest number a player can freely tune to
Config.MaxFrequencynumber9999The highest number a player can freely tune to
Config.MinFrequency = 1
Config.MaxFrequency = 9999

Both must be whole numbers. Frequencies are passed straight to pma-voice, which only accepts whole numbers.

Timing

SettingTypeDefaultDescription
Config.TalkingDelaynumber50The minimum time, in milliseconds, between "who's talking" updates sent to a channel's members. Lower feels more responsive but sends more network traffic. There's a safety floor of 25ms
Config.RevalidateIntervalnumber30000How often, in milliseconds, the server re-checks everyone on a restricted channel for job/duty/item access. Default is 30 seconds. Set to 0 to turn the periodic sweep off (access is still re-checked instantly on job/duty change either way)
Config.TalkingDelay = 50
Config.RevalidateInterval = 30000

Overlay

Settings for the on-screen roster overlay (the small list of who's on your channel).

SettingTypeDefaultDescription
Config.ShowRosterbooleantrueWhen true, players can toggle an on-screen list of who's on their channel. Turn off to disable the overlay entirely
Config.OverlayKeystring'U'The default key for toggling the overlay. This only applies to players who have never set the key themselves — everyone else rebinds it in Settings → Key Bindings → FiveM in their own game. Changing it here does not move an existing player's key
Config.ShowRoster = true
Config.OverlayKey = 'U'

Config.JobChannels

The restricted channels reserved for specific jobs. This is a table mapping a frequency number to a channel definition.

Each definition has these fields:

FieldTypeDefaultDescription
labelstringThe name shown on the radio for this frequency (e.g. 'Police Dispatch')
jobstableA list of job names allowed on this frequency. Case-sensitive — list every spelling your server uses
minRanknumber0The lowest job grade allowed. 0 means any grade. Use this to keep a command channel to senior ranks
dutyOnlybooleanfalseWhen true, players must be clocked in (on duty) to join
defaultbooleanfalseWhen true, players of these jobs are tuned to this frequency the moment they clock on (see Config.AutoJoinDefault). If several are marked, the lowest frequency wins

The defaults ship with police and EMS channels:

Config.JobChannels = {
    [1] = {
        label = 'Police Dispatch',
        jobs = { 'police', 'lspd', 'bcso', 'sasp', 'sheriff', 'statetrooper', 'LSPD', 'BCSO', 'SASP' },
        minRank = 0,
        dutyOnly = false,
        default = true,
    },
    [2] = {
        label = 'Police Tac 1',
        jobs = { 'police', 'lspd', 'bcso', 'sasp', 'sheriff', 'statetrooper', 'LSPD', 'BCSO', 'SASP' },
        minRank = 0,
        dutyOnly = false,
        default = false,
    },
    [3] = {
        label = 'Police Command',
        jobs = { 'police', 'lspd', 'bcso', 'sasp', 'sheriff', 'statetrooper', 'LSPD', 'BCSO', 'SASP' },
        minRank = 3,       -- only grade 3 and up
        dutyOnly = false,
        default = false,
    },
    [4] = {
        label = 'EMS Dispatch',
        jobs = { 'ambulance', 'ems', 'EMS' },
        minRank = 0,
        dutyOnly = false,
        default = true,
    },
    [5] = {
        label = 'EMS Tac',
        jobs = { 'ambulance', 'ems', 'EMS' },
        minRank = 0,
        dutyOnly = false,
        default = false,
    },
}

Notes and tips:

  • Match your job names exactly. The jobs list is case-sensitive. If a channel isn't working for a job, the job name spelling or capitalization is almost always the cause. The defaults include several common spellings so they work on more servers out of the box — trim each list down to the names your server actually uses.
  • Any frequency is allowed. A restricted channel can use any whole frequency, even one outside your MinFrequencyMaxFrequency range. The open range only limits free civilian tuning.
  • Editing in-game. After the first start, edit these live from /radio settings under Channels — a grid where you add and remove frequencies and set each one's label, jobs, min rank, duty flag, and clock-on default.

Config.AutoJoinDefault

Config.AutoJoinDefault = true

When a player clocks on, they are tuned automatically to the lowest-numbered channel their job qualifies for that is marked default = true. A player who is already on a channel is never moved, so anyone who tuned somewhere else keeps their channel. Set this to false to make everyone dial in by hand.

  • Running oxide-police / oxide-ems? Those resources register their own channels at runtime, which take priority over anything here on the same frequency. Configure their channels in those resources, not here. See Features → Job resource integration.

Config.Animation (config-only)

The animation and handheld prop played while a player is transmitting on the radio. This is config-only — it is not in the settings menu, because it's animation data rather than a day-to-day setting. To change it, edit shared/config.lua before the first start (or edit the file and delete the resource's oxide_settings rows to re-import).

FieldTypeDefaultDescription
animDictstring'random@arrests'The animation dictionary played while transmitting
animClipstring'generic_radio_chatter'The animation clip within that dictionary
flagnumber50The animation flag
prop.modelstring'prop_cs_hand_radio'The handheld radio prop model
prop.bonenumber6286The ped bone the prop attaches to
prop.offsetvector3vec3(0.08, 0.03, -0.01)Position offset of the prop
prop.rotationvector3vec3(-59.99, 15.54, -52.55)Rotation of the prop
Config.Animation = {
    animDict = 'random@arrests',
    animClip = 'generic_radio_chatter',
    flag = 50,
    prop = {
        model = 'prop_cs_hand_radio',
        bone = 6286,
        offset = vec3(0.08, 0.03, -0.01),
        rotation = vec3(-59.99, 15.54, -52.55),
    },
}

Config.HoldAnimation (config-only)

The held pose and prop shown while the radio panel is open (a phone-style pose). Also config-only, for the same reason as above.

FieldTypeDefaultDescription
enabledbooleantrueWhether to play the hold pose while the panel is open
modelstring'prop_amb_phone'The prop model held while the panel is open (a phone prop is used as a placeholder until a dedicated radio model ships)
bonenumber28422The ped bone the prop attaches to
offsetvector3vec3(0.0, -0.005, 0.0)Position offset of the prop
rotationvector3vec3(0.0, 0.0, 180.0)Rotation of the prop
Config.HoldAnimation = {
    enabled = true,
    model = 'prop_amb_phone',
    bone = 28422,
    offset = vec3(0.0, -0.005, 0.0),
    rotation = vec3(0.0, 0.0, 180.0),
}

Next Steps