Every FiveM radio script on a pma-voice server works the same way underneath: pma-voice carries the audio, and the radio resource decides who may join which frequency and what the player sees. The Scully Radio v2 resource we sell is built exactly that way. To get it running you need pma-voice, OneSync and server build 5402 or newer; then you set a unique KVPHandle, pick how the radio opens (key, item or both), and lock the police and EMS channels to the right jobs or ACE groups.
The rest of this page is our own walk through the scully_radio2 folder in the download: the manifest, config.lua, functions/framework.lua, the client and server Lua and read me.txt. We read the code; we did not run the radio on a live server, so treat it as a guide to the files rather than a play test.
What the manifest asks for
fxmanifest.lua has three entries under dependencies: /server:5402 (the minimum artifact build), /onesync and pma-voice. A separate line adds dependency '/assetpacks', because the UI is escrowed. The radio drives pma-voice through its exports, setRadioChannel and setVoiceProperty, for joining channels, switching the radio on and passing the mic-click setting.
escrow_ignore leaves config.lua and every Lua file in client/, server/ and functions/ readable, which matters later: two of the fixes below are edits to open files.
Keep the folder name scully_radio2. The readme's ensure line and the export other resources call both use it.
First-run setup
- Start pma-voice, then add
ensure scully_radio2toserver.cfg. - Replace the shipped
KVPHandlevalue with something only your server uses. Edited names, callsigns and the chosen colour are stored client-side under keys such asscully_radio2_callsignjoined to that handle, so two servers sharing the default value would share those saved settings on a player's machine. - Set
RadioColour;defaultor any other name inRadioColoursis accepted. - Choose how the radio opens.
UseKeybindisuout of the box and sets up aradiocommand bound to that key, which each player may remap under FiveM's keybinding menu. Blank it and that command is not registered at all, leaving items as the only way in. - For an item radio, turn on
UseItemand addradioto your items. The config says item use is for QBCore and ESX only.
How it picks a framework and a callsign
functions/framework.lua checks for qb-core, es_extended and scully_core with GetResourceState. The first one present supplies names, jobs and notifications; with none of them, the radio falls back to standalone and shows the FiveM player name. There is no Qbox-specific branch in this build.
Callsigns differ by framework:
- QBCore:
metadata.callsignis placed before an initial plus surname, and anyone whose callsign readsNO CALLSIGNis listed by name only. - Scully's core: reads the character's own callsign field the same way.
- ESX: first initial and surname from the player's name data, with no callsign.
- Standalone: the FiveM name.
EnableEditing lets a player enter a custom name and callsign on the radio screen, and that entry beats the framework value until they change it back. Other resources can read the final label with the server export exports['scully_radio2']:getPlayerName(source).
Locking channels to police and EMS
WhitelistedAccess maps a channel number to allowed groups; out of the box channels 1 and 2 are for police and ems only. The client applies math.floor to the frequency before checking, so a lock on 1 also covers 1.1 through 1.99.
What counts as a group depends on the framework. QBCore and ESX compare job names. Scully's core asks its job-status export about police and EMS only. A standalone server uses ACE: each name in AcePerms turns into a permission named radio.<name>, and read me.txt gives sample add_ace and add_principal lines. The config says to ignore AcePerms on QBCore, ESX or Scully's core.
Colours and coloured radio items
With AllowColours on and item colours off, players change colour with the ColourCommand, which is rcolor in the file although its comment writes /rcolour 1-11. The number indexes RadioColours, which has 14 entries counting default. The pick is saved on the player's machine.
UseItemColours turns that command off and lets each coloured item open the radio in its own shade. read me.txt names 13 of them, from radio_blue to radio_white, and icons/ has a PNG for each plus radio.png.
Check this before switching item colours on. In the copy we read, the QBCore branch never registers radio_coral or radio_cyan as usable, and the ESX branch registers radio_green twice while leaving out radio_mint, radio_coral and radio_cyan. Because framework.lua is open, adding the missing registrations is a short edit.
Any inventory item whose name contains radio counts as having one. On QBCore, when the last such item leaves a player's inventory, the radio takes them off the channel.
Smaller settings
MicClicksis handed to pma-voice when the radio turns on.EnableListshows who is on the frequency and lights up the speaker;ShowSelfincludes the player, and/rlist(HideListCommand) hides it.RadioAnimsputsprop_cs_hand_radioin the character's hand while the radio is open.UseCustomChannelNameslabels frequencies fromChannelNames. A label of eight characters or more is not shown; the number is shown instead.- Volume moves in steps of 10, between 10 and 100.
guide.pngin the download marks the other controls, including Esc to close and the arrow keys to switch screens.
Choosing a FiveM radio script
If your server already runs pma-voice and you want job-locked channels, a live channel list and callsigns without a framework dependency, this one needs nothing else, and nearly everything you would tune is a key in config.lua. Scully first posted this radio on the Cfx.re forum in April 2022. A purchase covers updates to the resource for as long as Scully keeps shipping them; if a newer build is announced, contact us from the address on your order and we will send it. For staff tools from the same author, see the All In One Menu; the free emote menu is covered in our Scully emote menu guide, and the Scully studio page lists the rest.