All important questions about RoadPhone — setup, troubleshooting, and tips
Use this page to quickly find answers to common questions and fixes. If something is missing, reach out on our Discord server.
I found a bug — what should I do?
Please post a detailed bug report in our Discord channel #errors. Include steps to reproduce, screenshots, and logs if possible. We’ll try to fix it as soon as we can.
I don’t hear music in the Music app
Make sure you’re using our xSound version and start xSound before RoadPhone.
Checklist
Clear your client cache.
Check that GTA music is turned on.
Verify your Windows volume mixer isn’t at 0% (this is independent of FiveM).
If your loading screen uses YouTube and you muted it there, the sound is muted everywhere. Unmute the loading screen.
How can I remove apps?
Open /public/static/config/config.json, search for AppStore, and remove the block for the app(s) you want to disable.
Images / Videos are not saved in the Gallery
Make sure you entered your Fivemanage MEDIA KEY correctly in API.lua.
Open /public/static/config/config.json, search for Service, then copy an example job and change: number, name, img, jobname, and the coords.
On start it shows ESX nil
Follow the instructions in config.lua (ESX init).
Add my own notifications
In ClientAPI.lua, find sendNotification(text) and replace ESX.ShowNotification(text) with your notification trigger.
Talk on the radio and voice at the same time
If you use SaltyChat, set EnableHardCoreMode to false in your SaltyChat config.
Mouse stuck in the center when opening the phone
Go to Settings → Keyboard/Mouse → Mouse Input Method → Raw Input.
Notify EMS when someone is down
This example refers to esx-ambulancejob. If you use a different script, adapt accordingly.
In esx_ambulancejob/client/main.lua, find SendDistressSignal() and replace:
SendDistressSignal()
Copy
function SendDistressSignal() exports['roadphone']:sendDispatch("Injured person", "ambulance", nil)end
Phone doesn't open after reviving
If you’re using an old ESX Ambulancejob or a custom one, change Config.ESXplayerSpawnEvent to playerSpawned.
Disable cryptocurrency
In config.lua, set Config.Crypto = false.
Lock radio channels
In config.lua, configure Config.lockedRadioChannels with the channel list.
Change the phone language
App names are excluded from translation. To localize app names, change them in config.json.
In config.lua, set the locale to your preferred language.
SaltyChat: Radio doesn’t work
If you have SaltyRadio on the server, remove it.
If not, try our SaltyChat version.
Car is locked after delivery
Edit the GiveCarKeys function in clientAPI.lua.
GiveCarKeys (ESX)
Copy
function GiveCarKeys(plate, model) TriggerEvent("vehiclekeys:client:SetOwner", plate)end
GetExtendedPlayers error (es_extended 1.1/1.2)
Add this to es_extended/server/functions.lua:
GetExtendedPlayers helper
Copy
ESX.GetExtendedPlayers = function(key, val) local xPlayers = {} for _, v in pairs(ESX.Players) do if key then if (key == 'job' and v.job.name == val) or v[key] == val or v.variables[key] == val then xPlayers[#xPlayers+1] = v end else xPlayers[#xPlayers+1] = v end end return xPlayersend
Problems with VideoCall
Clear your client cache.
On the first video call after clearing the cache, accept the F8 prompt to allow recording.
Accept the Windows Defender warning when it appears.
Use a fixed prefix for phone numbers
Edit server/serverAPI.lua function getPhoneRandomNumber. If you change the prefix to more than two digits, also update the string.format.
Phone number prefix
Copy
function getPhoneRandomNumber() local prefix = 49 local numBase = math.random(1000000, 9999999) -- 7 digits local num = string.format("%02d%07d", prefix, numBase) return numend-- Output example: 497649867
I forgot my phone PIN
Clear your cache once — this will remove the PIN lock.
Add jobs to the Jobs App
Open /public/static/config/config.json, search for JobsApp, then copy an example and change the name, coords, and icon.
Finding IconsVisit Iconify, search for an icon, choose Vue + Components, and copy the icon name from the shown code.
OxInventory snippets
The following example items block will block/unblock the phone based on inventory.
OxInventory items
Copy
['phone'] = { label = 'Handy', weight = 190, stack = false, consume = 0, client = { add = function(total) if total > 0 then exports['roadphone']:unblockPhone() end end, remove = function(total) if total < 1 then exports['roadphone']:blockPhone() end end }},['purple_phone'] = { label = 'Handy', weight = 190, stack = false, consume = 0, client = { add = function(total) if total > 0 then exports['roadphone']:unblockPhone() end end, remove = function(total) if total < 1 then exports['roadphone']:blockPhone() end end }},['green_phone'] = { label = 'Handy', weight = 190, stack = false, consume = 0, client = { add = function(total) if total > 0 then exports['roadphone']:unblockPhone() end end, remove = function(total) if total < 1 then exports['roadphone']:blockPhone() end end }},['red_phone'] = { label = 'Handy', weight = 190, stack = false, consume = 0, client = { add = function(total) if total > 0 then exports['roadphone']:unblockPhone() end end, remove = function(total) if total < 1 then exports['roadphone']:blockPhone() end end }},['blue_phone'] = { label = 'Handy', weight = 190, stack = false, consume = 0, client = { add = function(total) if total > 0 then exports['roadphone']:unblockPhone() end end, remove = function(total) if total < 1 then exports['roadphone']:blockPhone() end end }},['black_phone'] = { label = 'Handy', weight = 190, stack = false, consume = 0, client = { add = function(total) if total > 0 then exports['roadphone']:unblockPhone() end end, remove = function(total) if total < 1 then exports['roadphone']:blockPhone() end end }},