Installation Guide
V3 is in public beta. These pages are for zerio-radio V3. Still on V2? See the V2 documentation.
This guide walks you through installing zerio-radio v3 on your FiveM server. If you are coming from v2, read Migrating from v2 first.
Prerequisites
Before installing, make sure you have:
- OneSync enabled
- oxmysql and ox_lib installed and started
- QBCore, Qbox or ESX, or no framework (standalone)
- If you use ox_inventory: version 2.47.0 or newer
- A voice server. During the beta you run it yourself: see Self-Hosting. You need the transaction ID and email of your zerio-radio purchase to get your licence.
Stop any other radio resource (for example qb-radio, or an old copy of
zerio-radio) before you install. Both would react to the same radio item.
Installation Steps
Download and Extract
Download zerio-radio and extract it. The download contains two resources: zerio-radio and zerio-radio-prop. zerio-radio-prop comes inside the zerio-radio folder. Move it out so both sit next to each other in your resources folder:
resources/
└── [zerio]/
├── zerio-radio/
└── zerio-radio-prop/zerio-radio-prop must be its own resource. FiveM does not load a resource
that is nested inside another resource’s folder, and zerio-radio will not
start without it.
Set Up the Voice Server
During the beta, you run the voice server yourself. Follow Self-Hosting the Voice Server, then continue with Add the Items. Voice servers hosted by Zerio, set up as below, are coming in the full release.
Hosted by Zerio (Coming in full release): you set it up once in the customer portal:
- Open the setup link from your purchase email.
- Pick the region closest to where your FiveM server is hosted (EU or NA).
- Enter a Server ID, for example
my-rp-server(letters, numbers, hyphens and underscores). - Optionally set a portal email. You need it to sign in to the portal later.
- Copy the values the wizard shows you. The admin token is only shown once, so save it somewhere safe.
Open configs/voice.lua and fill in Domain and ServerId from the wizard, and set PortalUrl to the hosted portal:
Config.VoiceServer = {
Enabled = true,
Domain = "eu.radio.zerio-scripts.com", -- or "na.radio.zerio-scripts.com"
ServerId = "my-rp-server",
PortalUrl = "https://portal.radio.zerio-scripts.com",
}Then add the admin token to your server.cfg:
set zerio_voice_admin_token "your-token-from-the-setup-wizard"Use set, never setr. setr sends the value to every player’s game, and
the token gives full control over your voice server.
To manage your server later, sign in at portal.radio.zerio-scripts.com with your Server ID and portal email. If you switch region there, update Domain in configs/voice.lua to match.
If you run several environments (for example a test server and a live server) from the same files, you can set the voice server per environment in server.cfg instead. See Voice Server.
Add the Items
By default players open the radio by using a radio item. Add the items to your inventory. If you run standalone with no inventory, skip to the Standalone tab.
Item images are in the _ITEM IMAGES folder of the download: radio, radio_battery, radio_scanner, radio_jammer, mobile_radio_jammer and radio_repeater. There is no image for radio_repair_kit, so add your own if you want one. Copy the images to your inventory’s image folder (ox_inventory/web/images/ or qb-inventory/html/images/).
Use this tab for ox_inventory on any framework, including Qbox. Add the entries to ox_inventory/data/items.lua:
return {
-- your existing items ...
['radio'] = {
label = 'Radio',
weight = 1000,
stack = false,
allowArmed = true,
consume = 0,
client = {
export = 'zerio-radio.Open',
}
},
['radio_scanner'] = {
label = 'Radio Scanner',
weight = 1000,
stack = false,
close = true,
},
['radio_jammer'] = {
label = 'Radio Jammer',
weight = 1000,
stack = false,
close = true,
},
['mobile_radio_jammer'] = {
label = 'Mobile Radio Jammer',
weight = 1000,
stack = false,
close = true,
},
['radio_repeater'] = {
label = 'Radio Repeater',
weight = 1000,
stack = false,
close = true,
},
['radio_repair_kit'] = {
label = 'Radio Repair Kit',
weight = 500,
stack = true,
close = true,
},
}The radio must have stack = false. Each radio keeps its own connected channels and battery charge on the item.
Every codeplug radio you add in configs/opentype.lua (for example police_radio) needs an entry like radio, with the same client.export = 'zerio-radio.Open'.
If you turn on the battery system, also add the battery item:
return {
['radio_battery'] = {
label = 'Radio Battery',
weight = 100,
stack = false,
close = true,
consume = 0,
server = {
export = 'zerio-radio.UseBatteryItem',
}
},
}The jammer and repeater items are registered as usable items through your framework, which ox_inventory passes on. On a standalone server without a framework, use the commands instead (see the Standalone tab).
You do not need a client.remove callback on the radio. zerio-radio
notices when a radio is dropped, given away, stored or removed, and
disconnects that radio’s channels.
Add to server.cfg
Start zerio-radio after its dependencies. The order is: oxmysql, ox_lib, your framework, your inventory, optional resources (target, Discord, dispatch), zerio-radio-prop, then zerio-radio.
# Voice server token (set, not setr)
set zerio_voice_admin_token "your-token-from-the-setup-wizard"
# Dependencies
ensure oxmysql
ensure ox_lib
# Framework and inventory
ensure qb-core
ensure ox_inventory
# Optional
ensure ox_target
# Zerio Radio
ensure zerio-radio-prop
ensure zerio-radioStart Your Server
Start or restart your server. zerio-radio creates its database tables on the first start, so you don’t need to run any SQL by hand.
When the voice server is set up correctly, the console shows a line like this and no red warning box:
[zerio-radio:voice] loaded — voice server at https://eu.radio.zerio-scripts.com/s/my-rp-serverIf you see a red box instead, check Troubleshooting.
Create Channels and Towers
Channels and towers live in the database. Join the server and open the admin menu with /radioadmin to create them. See Who can open /radioadmin? if you get no access.
If you want a starting point, run sql/!data.sql once on your database. It adds four channels (911 Police Radio, 912 EMS Radio, 913 Fire Radio and 100 Dispatch) and nine towers around the map. Running it a second time fails, because those frequencies and tower IDs already exist.
When towers are enabled (enabled in configs/features/towers.lua), players
only have signal near a tower. With towers enabled and no towers in the
database, nobody has signal and push-to-talk is blocked with “No signal”. Add
towers in /radioadmin (or run sql/!data.sql), turn towers off, or raise
defaultSignal. See Radio
Towers.
Test the Installation
- Give yourself a
radioitem and use it (or use/radioor F5 if you changed the open type). - Join a channel, for example 911.
- Have a second player join the same channel.
- Hold Left Alt (or the key in
Config.PTTKeybind) and talk. The other player should hear you.
Commands and Keybinds
Commands
| Command | Who | Description |
|---|---|---|
/radio | Everyone | Opens the radio. Only exists when Config.OpenType.Value contains "command". |
/radioscanner | Everyone | Opens the radio scanner. Only exists when Config.Scanner.OpenType is "command" (the default). |
/changeradio <frequency> | Everyone | Joins a frequency without opening the radio, or leaves the radio with 0. In item mode the player must carry a radio and have used it. |
/callsign <text> | Everyone | Sets your callsign. Run it with no text to clear it. |
/radioadmin | Admins | Opens the admin menu. |
/placejammer [type] | Ace zerio.jammer | Starts placing a ground jammer. |
/personaljammer [type] | Ace zerio.jammer | Turns your personal jammer on or off. |
/removejammer <id> | Ace zerio.jammer | Removes a jammer. |
/listjammers | Ace zerio.jammer | Prints active jammers and their IDs to the server console. |
/placerepeater [type] | Ace zerio.repeater | Starts placing a repeater. |
/removerepeater <id> | Ace zerio.repeater | Removes a repeater. |
/listrepeaters | Ace zerio.repeater | Prints active repeaters and their IDs to the server console. |
/listtowers | Admins | Prints every tower and its health to the server console. |
zerio:testdispatch | Server console, or admins with the ace command.zerio:testdispatch | Sends a test alert to the dispatch panel (Coming in full release). Optional priority: low, medium, high or critical. |
The command names for /radio, /radioscanner, /changeradio, /callsign and /radioadmin can be changed in the config. The jammer and repeater commands work on every framework, not only standalone.
Keybinds
Players can change every keybind in Settings → Key Bindings → FiveM. The default keys only apply to players who haven’t bound the keybind yet.
| Keybind | Default key | Notes |
|---|---|---|
| Talk over Radio | Left Alt | Push-to-talk on your active channel. Set the default key with Config.PTTKeybind in configs/gameplay.lua. |
| Switch Radio Talk Channel | Not bound | Moves your active channel to the next channel you’re on, in frequency order. Set a default key with Config.CycleTalkChannelKeybind. |
| Open Radio | F5 | Only when Config.OpenType.Value contains "keybind". |
| Open Radio Scanner | F6 | Only when Config.Scanner.OpenType is "keybind". |
| Toggle Radio Deafen | Not bound | Mutes all incoming radio audio without leaving any channel. |
| Cancel Man-Down Alert | Backspace | Cancels a man-down countdown that started by mistake. |
| Confirm Speaker Placement (Zerio Radio) | Enter | Used by admins when placing a speaker. |
| Cancel Speaker Placement (Zerio Radio) | Backspace | Used by admins when placing a speaker. |
Upgrading from v2
Coming from v2? Your database upgrades itself on the first start, but your config has to be copied over by hand. Follow Migrating from v2.
Troubleshooting
Red “admin token missing” box in the console
Cause: The zerio_voice_admin_token convar is not set, is empty, or is still CHANGE_ME.
Solution:
- Add
set zerio_voice_admin_token "<token>"toserver.cfg, aboveensure zerio-radio. - Restart the server. Radio voice and dispatch stay off until the token is set.
- If you lost the token, sign in at portal.radio.zerio-scripts.com with your Server ID and portal email, and use Reset admin token in the account settings. Then put the new token in
server.cfg.
Red “admin token REJECTED” box in the console
Cause: The voice server does not accept the token.
Solution:
- Check that you copied the whole token, inside the quotes.
- Check that you used
set, notsetr. - Check that
DomainandServerIdinconfigs/voice.luabelong to the same server the token was made for. - Restart zerio-radio after changing
server.cfg.
Red “voice admin API unreachable” box in the console
Cause: zerio-radio can’t reach the voice server at the address built from configs/voice.lua.
Solution:
- Check
Domain: only the host, likeeu.radio.zerio-scripts.com, with nohttps://and no trailing slash. - Check
ServerId: it must match the Server ID you entered in the setup wizard. - Check that your host’s firewall allows outgoing HTTPS connections.
Red “voice server is too old” or “this zerio-radio is unsupported” box in the console
Cause: zerio-radio checks the voice server’s version on start and every few seconds after that. “Voice server is too old” means the voice server is older than zerio-voice 1.0.0. “This zerio-radio is unsupported” means the voice server no longer supports your version of zerio-radio. Radio voice is off in both cases, and admins see a notice in game.
Solution:
- “Unsupported”: update zerio-radio to the version the box names, or newer.
- “Too old”: update the voice server. Hosted voice servers are kept up to date by Zerio, so contact support if you see this on a hosted region.
- Voice comes back on by itself once the check passes. The console then prints “Voice server version check passed, voice is back on”.
Yellow “stops working with the voice server on …” line in the console
Cause: Your version of zerio-radio is being phased out. It keeps working until the date in the message. Admins also see the notice in game, when it first appears and when they open /radioadmin.
Solution: Update zerio-radio to the version in the message, or newer, before that date.
Red “voice server licence not valid” box in the console
Cause: Only for a zerio-voice server you run yourself. The voice server has no valid licence, so it refuses radio voice. Channels, dispatch and everything else keep working. The box and the in-game notice to admins give the reason, for example no licence key set, an expired or revoked licence, or the licence already in use on the maximum number of servers.
Solution: Fix the licence key in the voice server’s config.json. Voice comes back on by itself once the licence is valid. Hosted regions never need a licence.
”Radio not connected — reconnecting” when pressing push-to-talk
Cause: The player’s connection to the voice server dropped. Pressing push-to-talk makes the radio reconnect straight away.
Solution: Wait a moment and try again. If it keeps happening for everyone, check the server console for one of the red boxes above.
”Radio audio isn’t working” when pressing push-to-talk
Cause: The radio’s audio engine didn’t start in the player’s game, so they can neither talk nor hear.
Solution: Have the player rejoin the server. If it keeps happening, contact support.
”Could not find dependency zerio-radio-prop”
Cause: zerio-radio-prop is missing, still inside the zerio-radio folder, or not started.
Solution:
- Move
zerio-radio-propout so it sits next tozerio-radio. - Add
ensure zerio-radio-propaboveensure zerio-radio.
”No signal — cannot transmit”
Cause: The player’s signal on the active channel is zero. Most often towers are enabled but there are no towers in the database. A jammer, a 0% signal zone or a dead battery also cause it.
Solution: See Why do players have no signal?
Using the radio item does nothing
Cause: The open type or the item definition doesn’t match your setup.
Solution:
- Check that
Config.OpenType.Valueinconfigs/opentype.luais{ "item" }. - ox_inventory: check that the item has
client = { export = 'zerio-radio.Open' }. - QBCore: check that the item has
useable = true. - Check that the item name is a key in
Config.OpenType.Items.
Players can’t hear each other
Cause: Voice is not connected, or the player’s microphone is not the one the radio uses.
Solution: See Players can’t hear each other on the radio.
”ox_inventory … has no post-hook events” warning
Cause: Your ox_inventory is older than 2.47.0.
Solution: Update ox_inventory. On older versions every copy of a radio item acts as one radio, and drops and gives are noticed late.
Need Help?
If you’re still having issues, join our community server and create a support ticket.