Teclas#
Scoreboard no registra comandos de chat. Se abre con una sola tecla, registrada a través de ox_lib:
Tecla | Predeterminada | Aparece en el juego como |
|---|---|---|
|
| Press key to toggle the ScoreBoard |
Como es una asignación de teclas de FiveM, cada jugador puede reasignarla en Settings → Key Bindings → FiveM, y su elección se recuerda. Por eso también, cambiar Config.ScoreBoardKey más adelante solo afecta a los jugadores que nunca se han conectado: todos los demás conservan la tecla que ya tienen.
Una tecla fija en su lugar#
Para una tecla que los jugadores no puedan cambiar, desactiva la asignación y escucha directamente un control del juego:
Config.ModifyKey = true -- ignore the key mapping
Config.NewKeyNumber = 38 -- the control that opens it (38 = E)
Config.NewKey = "e" -- the key that closes it againConfig.NewKeyNumber es un índice de control de la lista de controles de FiveM. Config.NewKey es la misma tecla tal como la ve la interfaz — una letra minúscula como "e", o un nombre como "Tab" — y debe coincidir, o solo Escape cerrará la ventana.
Una asignación de tecla no consume nada mientras está inactiva; un control fijo se comprueba en cada frame. Usa la opción predeterminada salvo que necesites bloquear la tecla.
Exports que aporta tu script de trabajo#
Scoreboard no tiene exports propios que llamar. Funciona al revés: llama a dos exports del lado del servidor de tus scripts de trabajo, siempre que Config.DisplayedJobs apunte a ellos — consulta Integraciones.
getOnDutyCount
Devuelve cuántos jugadores están de servicio en este trabajo. Se llama sin argumentos cada vez que alguien abre el scoreboard. El número aparece en la tarjeta Active Jobs del trabajo.
exports('getOnDutyCount', function()
local count = 0
for _, onDuty in pairs(OnDuty) do
if onDuty then count = count + 1 end
end
return count -- number
end)isPlayerOnDuty
Devuelve si un jugador está de servicio. Se llama una vez por cada jugador con este trabajo cada vez que se abre el scoreboard. El ID de servidor del jugador llega como string; true muestra On Duty, cualquier otro valor Off.
Parámetro | Tipo | Descripción |
|---|---|---|
| string | El ID de servidor del jugador. |
exports('isPlayerOnDuty', function(src)
return OnDuty[tostring(src)] == true -- boolean
end)Ambas llamadas están protegidas: un error, un recurso detenido o un export inexistente cuenta como 0 o Off, y el scoreboard sigue funcionando. Varios trabajos de Quasar — qs-minerjob, qs-hunter y qs-lumberjack entre ellos — ya incluyen ambos, así que basta con que sus entradas apunten a ellos.
Un ejemplo completo#
Un script de trabajo que gestiona su propio turno necesita una tabla, un evento para entrar y salir de servicio, una limpieza cuando un jugador se desconecta y los dos exports.
Lado del servidor#
local OnDuty = {}
RegisterNetEvent('my-job:setDutyStatus', function(onDuty)
OnDuty[tostring(source)] = onDuty == true
end)
AddEventHandler('playerDropped', function()
OnDuty[tostring(source)] = nil
end)
exports('getOnDutyCount', function()
local count = 0
for _, onDuty in pairs(OnDuty) do
if onDuty then count = count + 1 end
end
return count
end)
exports('isPlayerOnDuty', function(src)
return OnDuty[tostring(src)] == true
end)Borrar la entrada en playerDropped es importante — sin ello, un jugador que se desconecta estando de servicio se sigue contando hasta el siguiente reinicio.
Lado del cliente#
TriggerServerEvent('my-job:setDutyStatus', true) -- clock in
TriggerServerEvent('my-job:setDutyStatus', false) -- clock outEn la configuración del scoreboard#
-- config/config.lua, inside Config.DisplayedJobs
my_job = {
order = 9,
label = "My Job",
icon = "fa-solid fa-briefcase",
onDutyExport = { resource = "my-job", fn = "getOnDutyCount" },
playerDutyExport = { resource = "my-job", fn = "isPlayerOnDuty" },
},La clave my_job debe ser el nombre del trabajo en tu framework. Para que se muestren las insignias, ese nombre también debe estar en Config.DisplayablePlayerJobs — el conteo funciona sin ello.
Leer la lista de jugadores desde el código#
Los datos de la ventana vienen de un callback de ox_lib, así que un script de cliente — una app de teléfono, una tablet, un contador del HUD — puede leer la misma instantánea:
local players, online, maxPlayers, myId, police, jobCounts, jobStats =
lib.callback.await('qs-scoreboard:getServerPlayers', false)Valor | Contenido |
|---|---|
| Un array de |
| El número de jugadores de la lista. |
| El número de slots. |
| El ID de servidor de quien hace la llamada. |
| Jugadores conectados con trabajo de policía. |
| El conteo de cada clave |
| El |
Cada llamada recorre a todos los jugadores conectados y llama a los exports de servicio, así que léelo cuando haga falta — al pulsar una tecla, o con un temporizador de varios segundos — nunca en cada frame.



