Scoreboard in game: the player list, names, jobs and duty badges, the server overview, active jobs, police-gated heist cards, job levels, colours and texts.
Players open the scoreboard with Z. The key is registered through ox_lib as a FiveM key mapping, so each player can change it under Settings → Key Bindings → FiveM, where it is listed as Press key to toggle the ScoreBoard.
Option
Default
What it does
Config.ScoreBoardKey
"z"
The default key, and the key that closes it again.
Config.CooldownTime
1
Seconds between two opens, so a spammed key cannot flood the server with requests.
To close it, press Escape, the same key again, or the ESC button in the header. While the search box has the focus neither key closes it, so a name with a z in it can be typed freely — click outside the box, or use the button.
Every time it opens, it asks the server for a fresh snapshot, plays a short intro sound, and starts in the compact layout.
The scoreboard has two layouts. The compact one is the header and the player list — enough to find someone's ID and get back to playing. Open Full Screen in the header turns it into a three-column dashboard; Minimize Menu brings it back.
Column
Panels
Shown in
Left
Available Heists, then Job Progress
Full screen
Centre
The header and the player list
Always
Right
Server Overview, then Active Jobs
Full screen
The header carries the logo, the server's name with a LIVE badge, the number of players online against the slot count, and the two buttons.
One row per online player: server ID, name, job with its icon, duty status and ping. Your own row is tagged YOU. The search box filters by name, job or ID at once, and clicking a column heading sorts by it — click again to reverse.
A job reaches the list in two steps. First it must be in Config.DisplayablePlayerJobs — anyone whose job is not on that list shows Config.DefaultJobName (Unknown) instead. Then Config.PlayerJobs gives it a label and an icon:
lua
Config.DisplayablePlayerJobs = { "miner", "police", "ambulance", "mechanic", "truck_driver" }
Config.PlayerJobs = {
police = {
label = "Police Officer", -- shown in the list
gradeExport = "Recruit", -- text added after the label, or nil
icon = "fa-solid fa-shield"-- Font Awesome icon
},
}
Both use the job's name as the framework stores it (police, truck_driver). A displayed job with no Config.PlayerJobs entry still shows, with its name capitalised and a question-mark icon. gradeExport is plain text appended to the label — every player with that job shows the same words — so leave it nil unless you want a fixed title.
Config.DisplayablePlayerJobs also decides what is counted. The police count behind the heist cards, the duty badges and the Active Jobs numbers only see jobs on this list — add every job you want to appear anywhere.
Under the overview, one card per profession shows how many players are working it, with a bar measured against the busiest job. The cards come from Config.DisplayedJobs, in order:
lua
truck_driver = {
order = 8, -- position in the list
label = "Truck Drivers", -- name on the card
icon = "fa-solid fa-truck", -- Font Awesome icon
onDutyExport = { resource = "qs-truckjob", fn = "getOnDutyCount" },
playerDutyExport = { resource = "qs-truckjob", fn = "isPlayerOnDuty" },
},
onDutyExport
The number on the card
{ resource = "...", fn = "..." }
Whatever that export returns — the players actually on shift.
nil
Every online player with that job, on shift or not.
The key (truck_driver) is the job's name in your framework. The shipped list covers police, paramedics, mechanics, taxi drivers, electricians, fishers, firefighters and truck drivers. Exports are called safely: if the resource is stopped or the export does not exist, the card shows 0 and nothing breaks.
The left column lists your robberies as image cards, each Available or Locked depending on how many officers are online. The panel's title shows the current police count, and every card shows it against the number that card needs, with a bar.
Jobs counted as police. Add your sheriff or state police jobs here.
Config.CurrentPoliceExport
nil
Leave it nil to count. A number here is used instead of the count — handy for testing the cards.
Police are counted when they are online with a police job; the count does not check whether they are on shift. Each police job must also be in Config.DisplayablePlayerJobs.
fleeca = {
order = 4, -- position in the list
minimumPolice = 1, -- officers needed to unlock it
label = "FLEECA", -- name on the card
image = "fleeca.png", -- background picture
description = "..."-- kept for reference; not shown on the card
},
Five pictures ship with the interface — store.png, liquor.png, jewelry.png, fleeca.png and pacific.png — and the shipped cards need:
Card
Officers needed
Store Robbery
1
Liquor Shop
1
Jewelry
1
Fleeca
1
Pacific
10
The cards are information only. They tell players what is worth trying right now; your heist scripts still enforce their own police requirement.
With Config.ShowJobLevels = true, the player sees their own level in each Quasar job they have played, highest level first. Every card shows the level, the experience earned against the experience that level needs, a percentage, and a bar whose colour steps up through five tiers:
Levels
Tier
1–2
Recruit
3–4
Officer
5–7
Sergeant
8–12
Captain
13+
Elite
The panel sits under the heists in full screen, and only appears when the player has at least one job on record.
Levels are read from the database for everyone online two seconds after the resource starts, then every Config.UpdateJobExperienceTime minutes (5). The scoreboard shows the last reading, so a level gained a minute ago — or a player who joined since — appears on the next one.
Config.JobsProgress holds each job's two numbers, and they must match the Config.LevelExperience in that job's own config. If they drift apart the level stays right, but the bar and the percentage do not.
The interface texts live in Config.Translations, so translating the scoreboard means editing one table. Job labels, Active Jobs cards and heist names come from their own tables above.
Keys
Where they appear
serverName · liveLabel
The header: your server's name and its LIVE badge.
A few short labels are fixed in English: YOU, Available, Locked, Active Jobs, Job Progress, No players found and the word online in the header counter.