Skip to content

Radio Station Framework

Primary config files:

  • config.lua
  • shared/config_defaults.lua

config.lua is the server-owner file. It contains the values most servers are expected to edit: framework, permissions, stations, MLO placement, item names, visible feature toggles, and common emitter settings.

shared/config_defaults.lua contains deeper compatibility defaults for timing, audio behavior, scheduler cadence, diagnostics, call routing, and runtime internals. Most servers should leave it alone unless they are tuning after focused QA.

Use:

Config.Framework = "auto"

Supported values:

  • auto
  • qbox
  • qbcore
  • esx
  • standalone

Leave this on auto unless the server needs to force a specific bridge.

DJ access is controlled by:

  • Config.DJJobName
  • Config.DJJobs
  • Config.DJGrades
  • Config.DJBossGrades
  • Config.DJAcePermission
  • Config.AllowMultipleDJs
  • Config.DebugAllowAllDJs

The default job is dj, with boss grade 3.

Config.DebugAllowAllDJs should stay false in production.

Admin/station tools are group-based by default:

Config.AdminToolsEnabled = true
Config.EmitterAdminUseGroups = true
Config.EmitterAdminGroups = { "admin", "god", "superadmin" }

This supports common QBCore/Qbox group names without hardcoding FiveM identifiers.

Optional ACE support:

Config.EmitterAdminUseAce = false
Config.EmitterAdminAcePermission = "rsradio.emitteradmin"

Legacy identifier fallback:

Config.EmitterFxAdminIdentifiers = {}

Prefer groups or ACE for production. Hardcoded identifiers are only kept as a compatibility fallback.

Admin commands:

  • /radiostationadmin opens the Station Creator/Admin UI.
  • /radioemitterfx opens the Emitter FX panel.

Both commands still require the configured admin/group/ACE permissions.

Fresh installs ship without predefined stations. Build stations with the in-game Station Creator (recommended) or define them in Config.RadioStations. Published Station Creator stations are loaded from SQL at runtime.

A config-defined station looks like:

Config.RadioStations = {
coastline = {
label = "Coastline FM",
shortLabel = "Coastline",
format = "Alternative",
audienceKey = "rs-radio:coastline",
micChannel = 6901,
djLocation = vec3(-1278.32, -1618.21, 3.37),
blip = {
enabled = true,
label = "Coastline FM",
coords = vec3(-1271.81, -1615.12, 3.37)
},
media = {
musicFolder = "songs/stations/coastline/music",
stationAdsFolder = "songs/stations/coastline/ads",
sfxFolder = "songs/stations/coastline/sfx"
}
}
}

Studio seating and booth prop wiring are included for the bundled rs_rebelradio MLO and do not normally need customer configuration.

If Config.EnableDJTabletCommand = true, authorized DJs can also use /radiotablet as a shortcut. The recommended production flow is still the configured booth/location interaction.

The standard package plays local .ogg and .mp3 files under songs/. Remote audio links are not available in the standard package. Only use local content you own or are licensed to use.

Common listener/emitter values:

  • Config.VehicleRadioKeybind
  • Config.ListenerUiPassthroughControls
  • Config.EmitterDefaultRadius
  • Config.VehicleEmitterRadius
  • Config.BoomboxEmitterRadius
  • Config.EmitterSfxOverlayGain

Config.ListenerUiPassthroughControls should include the controls that must continue while the listener UI is open. By default this includes PTT support for pma-voice.

Config.EmitterSfxOverlayGain keeps SFX overlays under program music loudness.

Common boombox settings:

  • Config.BoomboxEnabled
  • Config.BoomboxItemName
  • Config.BoomboxPropModel
  • Config.BoomboxEmitterRadius

The inventory item name must match Config.BoomboxItemName.

Common Walkboy settings:

  • Config.WalkboyEnabled
  • Config.WalkboyItemName
  • Config.WalkboyPropModel
  • Config.WalkboyHeadphoneModel
  • Config.WalkboyEmitterRadius

The Walkboy uses the listener radio interface. It can be worn, opened, and stored, but cannot be placed in the world. The inventory item name must match Config.WalkboyItemName.

Static prop radios are optional and are not inventory items. When enabled, players can use target on configured world props to open the listener UI. The UI closes when the player walks beyond the configured auto-close distance, and the server also rejects prop-radio controls from outside that range.

Common static prop settings:

  • Config.RadioPropTargetsEnabled
  • Config.RadioPropTargets
  • Config.RadioPropTargetDistance
  • Config.RadioPropAutoCloseDistance
  • Config.RadioPropEmitterRadius
  • Config.RadioPropDefaultStation

Config.RadioPropTargets accepts model names or table entries. Use table entries when a server wants per-model labels, stations, radius, volume, or distance overrides.

Example:

Config.RadioPropTargetsEnabled = true
Config.RadioPropTargets = {
"ex_prop_ex_tv_flat_01",
"xm_prop_x17_tv_flat_01",
"vw_prop_vw_cinema_tv_01",
"prop_tv_flat_01",
{
model = "prop_tv_flat_02",
label = "Lobby Radio",
station = "south",
radius = 22.0,
autoCloseDistance = 4.0
}
}

The feature auto-detects ox_target or qb-target.

For local testing, enable the admin-only test command:

Config.RadioPropTestCommandEnabled = true
Config.RadioPropTestCommand = "rsradiotestprop"
Config.RadioPropTestModel = "prop_picnictable_01"

Use /rsradiotestprop to spawn a targetable picnic-table radio, /rsradiotestprop on to spawn it with the emitter already enabled, and /rsradiotestprop clear to remove the last test prop you spawned.

Set Config.Locale to choose the runtime language:

  • en
  • fr
  • pt-BR
  • zh-CN โ€” Simplified Chinese (Mandarin). zh and zh-SG also select this.
  • zh-HK โ€” Traditional Chinese (Cantonese, Hong Kong conventions). zh-TW, zh-MO, and yue also select this.

All non-English locales cover the listener UI, DJ UI, station admin UI, emitter/effects UI, ox_lib menus, notifications, alerts, and on-screen prompts.

shared/locales.lua is escrow-exempt. Server owners can add another locale there by following the existing keyed, exact-text, formatted-message, and NUI dictionaries, then selecting it with Config.Locale.

Weather settings:

  • Config.EnableWeatherModule
  • Config.WeatherAuthorityProvider
  • Config.WeatherAuthorityResource
  • Config.WeatherAuthorityFallback
  • Config.WeatherExternalShowAllRegions

If another resource applies world weather, let rs_radio consume that state rather than compete with it.

Recommended production posture:

  • keep Config.Framework = "auto" unless needed
  • use properly licensed local .ogg/.mp3 files under songs/
  • keep trace logging off
  • keep Config.DebugAllowAllDJs = false
  • use admin groups or ACE instead of hardcoded identifiers
  • verify stations, doors, target zones, and blips after moving MLO coordinates