Here is my rude but working solution how to handle client script errors on server-side:
local _AddEventHandler = AddEventHandler
local function FormatStackTrace()
return Citizen.InvokeNative(`FORMAT_STACK_TRACE` & 0xFFFFFFFF, nil, 0, Citizen.ResultAsString())
end
AddEventHandler = function(eventName, callback)
_AddEventHandler(eventName, function(...)
local args = { ... }
xpcall(function() callback(table.unpack(args)) end, function(message)
local error = {
message = message,
stackTrace = FormatStackTrace()
}
Citizen.Trace(error.message..'\n')
Citizen.Trace(error.stackTrace)
TriggerServerEvent('gotClientScriptError', error)
end)
end)
end
- Add this script to your resource
client_scripts
before all other client scripts. - Add server event handler to handle it (print in console, send to Discord channel etc.)
E.g.:
RegisterNetEvent('gotClientScriptError')
AddEventHandler('gotClientScriptError', function(error)
Citizen.Trace('Got an error from client '..source..':\n'..error.message..'\n'..error.stackTrace..'\n')
end)