Everything a server owner changes in Quasar Framework (qs-core) lives in plain Lua config files and in server.cfg. This page is the complete reference for this FiveM roleplay framework: every option of the core config, the theme colours, languages, items, jobs and gangs, the inventory and weapon settings, and the loading screen. Each section lists the option, its default value and what it changes in game, followed by a short example.
File | What it configures |
|---|---|
| Accounts, characters, spawn, saving, paychecks, death, world, webhooks, bans, inventory backend, theme and identifiers. |
| The base item catalogue. |
| Jobs, grades and salaries. |
| Gangs and gang grades. |
| qs-core's texts in each language (every resource has its own |
| Inventory slots and weight, trunks, gloveboxes, stashes, stacks, keys and starting items. |
| Magazine sizes, throwables, and the weapon and ammo items. |
| Loading screen name, texts, key hints and tips. |
| Language ( |
Core settings — qs-core/shared/config.lua#
This is the main config of the framework. It is a shared file, so the server and every client read the same values.
Accounts and starting money#
Option | Default | What it does |
|---|---|---|
|
| The money accounts every character has, and the balance a new character starts with. An account that is missing on an existing character is added with this starting balance when the character loads. Money commands and exports only work with accounts listed here. |
-- A harder start: less cash, a smaller bank balance
Config.Accounts = {
cash = 250,
bank = 1500,
black_money = 0,
}Characters, spawn and saving#
Option | Default | What it does |
|---|---|---|
|
| How many characters one player can create. Character creation is refused once the limit is reached. |
|
| Where a new character appears for the first time (x, y, z, heading). Afterwards each character spawns where it last was. |
|
| The job given to every new character. It must exist in |
|
| The grade of that default job. |
|
| How often (in milliseconds) every online character is saved. Characters are also saved when the player disconnects, logs out and when |
|
| Prints debug lines in the console, prefixed |
Config.MaxCharacters = 3
-- New characters start at the airport
Config.DefaultSpawn = vec4(-1037.74, -2737.84, 20.17, 330.0)
-- Autosave every 10 minutes
Config.SaveInterval = 10 * 60 * 1000
Config.Debug = falsePaycheck#
Option | Default | What it does |
|---|---|---|
|
| Turns paychecks on or off. Read once when |
|
| Time between paychecks, in milliseconds. |
Every interval, each player with a loaded character whose job grade has a salary above 0 receives that salary in their bank account and a Paycheck received notification. Salaries are set per grade in shared/jobs.lua (see Jobs and grades below).
Config.Paycheck = {
enabled = true,
interval = 15 * 60 * 1000, -- every 15 minutes
}Death and hospitals#
When a player dies they go down instead of respawning. After respawnTime seconds they can press E to respawn at the nearest hospital, and they can press G to call paramedics.
Option | Default | What it does |
|---|---|---|
|
| Seconds a downed player must wait before E respawns them at the nearest hospital. |
|
| When |
|
| Cooldown in milliseconds between two G calls to paramedics. |
|
| The animation a downed player lies in. |
|
| Respawn points (x, y, z, heading). The nearest one to where the player went down is used. |
Config.Death = {
respawnTime = 60, -- one minute to wait for EMS
loseCashOnDeath = true,
emsCooldown = 60000,
anim = { dict = 'mini@cpr@char_b@cpr_def', clip = 'cpr_pumpchest_idle' },
hospitals = {
vec4(298.6, -584.6, 43.26, 65.0), -- Pillbox Hill
vec4(-247.6, 6331.4, 32.4, 200.0), -- Paleto Bay
vec4(1839.6, 3672.9, 34.28, 210.0), -- add Sandy Shores
},
}A downed player can also be revived with /revive or the txAdmin Heal action. EMS treatment is covered in Jobs, Police & EMS.
World toggles#
Option | Default | What it does |
|---|---|---|
|
| Removes GTA's wanted level: players never get wanted stars. |
|
| Turns off GTA's emergency dispatch, so NPC police, ambulances and fire trucks are not sent to players. |
|
| Keeps friendly fire on, so players can damage each other. |
|
| Keeps the weather dry: whenever the weather is about to turn to rain, thunder or clearing, it changes to clouds instead. |
|
| Removes ambient pedestrians from the streets. |
|
| Removes NPC traffic and parked cars, plus garbage trucks, random boats and trains. |
-- An empty city with rain allowed
Config.DisableRain = false
Config.DisablePeds = true
Config.DisableTraffic = trueWebhooks and bans#
Option | Default | What it does |
|---|---|---|
|
| Discord webhook URL for money logs ( |
|
| Discord webhook URL for admin logs: |
|
| Reserved: nothing is posted to this channel in the current version. |
|
| Checks the |
Config.Webhooks = {
money = 'https://discord.com/api/webhooks/XXXXXXXX/money-channel',
admin = 'https://discord.com/api/webhooks/XXXXXXXX/admin-channel',
connections = '',
}
Config.EnableBans = trueThe admin menu (qs-admin) has its own webhook in its config.lua. See Administration.
Inventory backend#
Option | Default | What it does |
|---|---|---|
|
| Which inventory |
To use qs-inventory, run it instead of qs-coreinventory in server.cfg. Quasar Framework always prefers qs-coreinventory while it is started. See Integrations.
Config.Inventory = 'auto'Identifiers and language fallback#
Option | Default | What it does |
|---|---|---|
|
| The identifier type that links a player to their characters and saved colour palette. Do not change it on a live server: existing characters are stored under the current identifier and would no longer be found. Bans and groups always use the Rockstar |
|
| Fallback language for |
-- don't change this on a live server
Config.Identifier = 'license'
Config.Locale = 'en'Theme colours#
Every Quasar Framework interface — HUD, inventory, menus, notifications, chat — reads one shared palette. Config.Theme in qs-core/shared/config.lua is the server's default palette: change it and every interface is reskinned for players who have not picked their own colours.
Key | Default | What it colours |
|---|---|---|
|
| The palette name. |
|
| Main text. |
|
| Secondary, muted text. |
|
| The primary colour. |
|
| A darker shade of the primary colour. |
|
| The accent colour. |
|
| Gradient start. |
|
| Gradient end. |
|
| Glow effects. |
|
| Borders. |
|
| Panel backgrounds. |
|
| Health status bar. |
|
| Armour status bar. |
|
| Hunger status bar. |
|
| Thirst status bar. |
-- A red server theme
Config.Theme = {
name = 'red',
text = '#fff1f1',
muted = '#cc8e8e',
primary = '#ef4444',
primaryDim = '#dc2626',
accent = '#f87171',
gradientFrom = 'rgba(239, 68, 68, 0.60)',
gradientTo = 'rgba(220, 38, 38, 0.30)',
glow = 'rgba(239, 68, 68, 0.45)',
border = 'rgba(248, 113, 113, 0.45)',
panel = 'rgba(78, 20, 20, 0.32)',
health = '#5cf07c',
armor = '#3b82f6',
hunger = '#f0a83a',
thirst = '#24c8d8',
}Per-player palettes#
Players can also choose their own colours. On their first join, the intro (qs-intro) asks them to pick a palette, and later they can change it with /colors. A player's palette is saved to their account in the player_colors table and replaces Config.Theme for that player only.
Option | Default | What it does |
|---|---|---|
|
| Registers the colour picker command. With |
|
| The name of that command ( |
Config.AllowColorChange = true
Config.ColorCommand = 'theme' -- players type /theme instead of /colorsLanguages#
Quasar Framework ships in 10 languages — en, es, fr, de, it, pt, pl, ru, tr and ar — and one convar in server.cfg switches every resource:
setr qs:locale "de"It must be setr (a replicated convar). With a plain set, only the server changes language and every text on the players' screens stays in English. Restart the server after changing it.
Adding a language#
Every resource keeps its texts in its own locales folder (qs-core, qs-coreinventory, qs-clothing, qs-corechat, qs-corehud, qs-coremulticharacter, qs-coreshops, qs-corevehiclekeys, qs-coreweapons, qs-intro, qs-needs and every resource in [addons]). Each folder is loaded automatically, so a new language is just a new file per resource.
Copy the English file
In each resource, copy
locales/en.luatolocales/<code>.lua— for examplelocales/nl.luafor Dutch.Rename the table and translate
Change
Locales.entoLocales.nland translate every value. Keep the keys exactly as they are, and keep placeholders such as%sand%d: they are replaced by names and amounts.lua Locales = Locales or {} Locales.nl = { no_permission = 'Geen toestemming.', player_not_found = 'Speler niet gevonden.', invalid_amount = 'Ongeldig bedrag.', paycheck = 'Salaris ontvangen: $%d', -- ...every other key from en.lua }Switch the server to it
Set
setr qs:locale "nl"inserver.cfgand restart the server.
Items#
Every item on the server lives in one catalogue owned by qs-core. The inventory, shops, ESX scripts and QBCore scripts all read item labels, weights and settings from it.
Base items#
qs-core/shared/items.lua defines the base items. Other resources add their own on start (weapons and ammo, food and drinks, police, EMS, job and drug items).
Item | Label | Weight (g) | Usable |
|---|---|---|---|
| Water Bottle | 500 | Yes |
| Bread | 300 | Yes |
| Bandage | 100 | Yes |
| Phone | 190 | Yes |
| ID Card | 10 | No |
| Pistol | 1000 | Yes |
| Lockpick | 100 | Yes |
| Repair Kit | 2500 | Yes |
| Screwdriver | 200 | Yes |
Item fields#
Field | Default | What it does |
|---|---|---|
| the item name | The name players see. |
|
| Weight of one item, in grams ( |
|
| Whether the item can be used. Without |
| — | The text shown with the item. |
| inventory default ( | Maximum amount per slot for this item. |
| — |
|
| — | A GTA weapon name such as |
| — | Rounds loaded the first time a |
Item images are PNG files named after the item (for example water.png) in qs-coreinventory/web/images.
Adding items#
Add items to the base table in qs-core/shared/items.lua, or register them from any resource with the RegisterItems export — this is how the Quasar Framework resources add theirs:
-- server.lua of your own resource
local core = exports['qs-core']
core:RegisterItems({
coffee_beans = { label = 'Coffee Beans', weight = 250, useable = false, description = 'Freshly roasted.' },
energy_bar = { label = 'Energy Bar', weight = 80, useable = true, description = 'A quick snack.' },
gold_watch = { label = 'Gold Watch', weight = 150, useable = false, unique = true },
})exports['qs-core']:RegisterItem(name, data) adds a single item. Registering a name that already exists replaces its definition. To give a usable item an effect, see Inventory, Items & Weapons; ESX and QBCore scripts can also bring their items through the bridges, see ESX & QBCore Compatibility.
Jobs and grades#
Jobs are defined in qs-core/shared/jobs.lua. Each job has grades, and each grade has its own salary, paid by the paycheck (see Paycheck above).
Default jobs#
Job | Label | Grades (level: label — salary) |
|---|---|---|
| Civilian | 0: Freelancer — 200 |
| Police | 0: Recruit — 500 · 1: Officer — 750 · 2: Sergeant — 1000 · 3: Chief — 2000 (boss) |
| EMS | 0: Trainee — 500 · 1: Paramedic — 800 · 2: Doctor — 1200 · 3: Chief — 2000 (boss) |
| Hunter | 0: Hunter — 200 |
| Delivery Driver | 0: Driver — 200 |
| Miner | 0: Miner — 175 |
| Lumberjack | 0: Lumberjack — 175 |
| Fisherman | 0: Fisherman — 150 |
unemployed is the default job (Config.DefaultJob), so every civilian also receives the Freelancer salary.
Job fields#
Field | Default | What it does |
|---|---|---|
| the job name | The job name players see. |
| — | The duty state for a character that has no stored duty value yet (characters created by Quasar Framework start on duty). Scripts read it as |
| — | A table of grades indexed from |
| — | The grade id (for example |
| — | The grade name players see. |
| — | The amount paid to the bank every paycheck. |
|
| Marks the boss grade. ESX and QBCore scripts see it as the boss rank. |
-- qs-core/shared/jobs.lua — add a mechanic job inside the Jobs table
['mechanic'] = {
label = 'Mechanic',
defaultDuty = true,
grades = {
[0] = { name = 'apprentice', label = 'Apprentice', salary = 300 },
[1] = { name = 'mechanic', label = 'Mechanic', salary = 550 },
[2] = { name = 'boss', label = 'Owner', salary = 1200, isBoss = true },
},
},Jobs can also be added from a server script with exports['qs-core']:RegisterJob(name, definition) (or several with RegisterJobs). A grade that does not exist falls back to the job's lowest grade. Give a job in game with /setjob <id> <job> [grade], for example /setjob 1 mechanic 2.
Gangs#
Gangs are defined in qs-core/shared/gangs.lua. Every character starts in the none gang (No Gang, grade Unaffiliated).
Field | Default | What it does |
|---|---|---|
| the gang name | The gang name players see. |
|
| Gang ranks indexed from |
| — | The rank id. |
| — | The rank name players see. |
|
| Marks the leader rank. |
-- qs-core/shared/gangs.lua — below Gangs['none']
Gangs['ballas'] = {
label = 'Ballas',
grades = {
[0] = { name = 'recruit', label = 'Recruit', isBoss = false },
[1] = { name = 'og', label = 'OG', isBoss = false },
[2] = { name = 'boss', label = 'Shot Caller', isBoss = true },
},
}Use lowercase gang names. Gangs can also be added from a script with exports['qs-core']:RegisterGang(name, data) and assigned with exports['qs-core']:SetGang(source, name, grade). QBCore scripts see the gang through the qb-core bridge.
Driving jobs and gangs from your own scripts?
SetJob,SetGang,RegisterJob,RegisterGangand the events they fire are listed in Commands and Exports.
Inventory — qs-coreinventory/shared/config.lua#
qs-coreinventory is the FiveM inventory that ships with Quasar Framework: slots and weight, a secondary container (trunk, glovebox or stash), quick slots and an item wheel.
Player inventory#
Option | Default | What it does |
|---|---|---|
|
| How much a player can carry, in grams (50 kg). Adding an item over this limit fails with Too heavy to carry. |
|
| Number of player inventory slots. |
|
| Number of columns of the player grid. |
|
| Maximum amount per slot, unless the item sets its own |
|
| Items given to every brand-new character. |
Config.MaxWeight = 80000 -- 80 kg
Config.Slots = 40
Config.Columns = 5
Config.DefaultStack = 100
Config.StartingItems = {
{ name = 'water', count = 3 },
{ name = 'bread', count = 3 },
{ name = 'phone', count = 1 },
{ name = 'id_card', count = 1 },
{ name = 'bandage', count = 2 },
}Trunk and glovebox#
Option | Default | What it does |
|---|---|---|
|
| Slots of a vehicle trunk. |
|
| Columns of the trunk grid. |
|
| Trunk weight limit, in grams. |
|
| How close (in metres) you must stand to the back of a vehicle for the inventory to open its trunk. |
|
| The trunk closes when you walk farther than this from the vehicle. Also the auto-close distance of stash zones without their own radius. |
|
| Slots of a glovebox. |
|
| Columns of the glovebox grid. |
|
| Glovebox weight limit, in grams. |
The trunk opens when you open the inventory standing behind an unlocked vehicle you have the keys for; the glovebox opens when you open it seated in a vehicle you have the keys for. Contents are saved by plate.
Config.TrunkSlots = 20
Config.TrunkMaxWeight = 150000
Config.GloveboxMaxWeight = 10000Stashes#
Option | Default | What it does |
|---|---|---|
|
| Stashes registered when the server starts: |
Config.Stashes = {
{ id = 'town_locker', label = 'Town Locker', slots = 50, maxWeight = 200000, columns = 5 },
}A registered stash is opened from a script, either with a stash zone (players open their inventory inside it) or directly. See Inventory, Items & Weapons.
Keys#
Option | Default | What it does |
|---|---|---|
|
| Default key that opens and closes the inventory (command |
|
| Default key held to open the item wheel. |
|
| How many slots (from slot 1) the item wheel shows. |
Quick slots always use keys 1 to 5 for slots 1–5. The keys are FiveM key mappings: the default only applies to players who have not bound the action yet, and every player can rebind it in Settings → Key Bindings → FiveM.
Config.OpenKey = 'I'
Config.RadialKey = 'TAB'
Config.RadialSlots = 6Weapons — qs-coreweapons/config.lua#
qs-coreweapons turns every GTA weapon into an inventory item: 105 weapons and 9 ammo types, registered in the item catalogue when the resource starts.
Option | Default | What it does |
|---|---|---|
|
| Rounds per category: the rounds a weapon has the first time it is equipped, and the rounds one ammo item loads. |
|
| Stack size of throwable weapons (grenades, molotovs...). Each throw uses one item. |
| 105 weapons | Weapon items: |
| 9 ammo types | Ammo items: |
Weapon categories are melee, pistol, smg, shotgun, rifle, mg, sniper, launcher, flare, taser, throwable and misc. An ammo item loads into a weapon of the same cat. A new weapon must exist in your game build or be streamed as an add-on; restart qs-coreweapons and its item is registered automatically.
-- Bigger pistol magazines: 15 rounds on first equip and per pistol ammo item
WeaponsConfig.MagSize = {
pistol = 15,
smg = 30,
rifle = 30,
shotgun = 8,
sniper = 10,
mg = 100,
launcher = 1,
flare = 1,
taser = 1,
}
-- Inside WeaponsConfig.Weapons: an add-on weapon you stream yourself
weapon_mycarbine = { weapon = 'WEAPON_MYCARBINE', cat = 'rifle', label = 'Custom Carbine', weight = 3400 },
-- Inside WeaponsConfig.Ammo: ammo entries look like this
ammo_pistol = { cat = 'pistol', label = 'Pistol Ammo', weight = 200 },The full list of the 105 weapons and 9 ammo items, with weights and categories, is in Inventory, Items & Weapons.
Loading screen — loadingscreen/config.js#
The loading screen is what players see while they connect. Its texts are set in [core]/loadingscreen/config.js; edit the file and restart the loadingscreen resource, and the next player who joins sees the change.
Option | Default | What it does |
|---|---|---|
|
| The big title — your server name. |
|
| The line under the title. |
|
| A one-line description under the subtitle. |
| 8 entries: | Key hints shown as |
| 5 tips | Lines that rotate at the bottom of the screen. |
|
| Seconds between two tips. |
// loading screen branding. no build step, just restart the resource.
window.LOADING_CONFIG = {
name: 'LOS SANTOS RP',
subtitle: 'Serious Roleplay',
about: 'Whitelisted roleplay community · discord.gg/yourserver',
keys: [
{ key: 'I', label: 'Inventory' }, // matches Config.OpenKey = 'I'
{ key: 'TAB', label: 'Item wheel' },
{ key: '1-5', label: 'Quick slots' },
{ key: 'U', label: 'Lock vehicle' },
{ key: 'T', label: 'Chat' },
],
// rotating lines at the bottom
tips: [
'Read the rules on our Discord before you play.',
'Use /me and /do in the chat to roleplay your actions.',
],
tipInterval: 6, // seconds
};Related pages#
Page | What it covers |
|---|---|
| |
Usable items, stashes, shops and the full weapon list. | |
The job center, civilian jobs, police and EMS settings. | |
Admin menu, groups, bans and webhooks. | |
Every command, export and event. |



