Before You Begin#
Before installing Advanced Racing, make sure your server meets the minimum requirements. Three things are mandatory; the rest is optional and picked up on its own when it is running.
Requirement | Status | Notes |
|---|---|---|
| Required | Database access for tracks, competitions, results and profiles. |
| Required | Callbacks, notifications and shared helpers. |
Framework | Required | ESX, QBCore or Qbox — detected automatically. It pays buy-ins and prizes, names drivers and decides who is an admin. |
| Optional | Adds two quests: Race Entry and Race Winner. |
| Optional | The Racing app: races, tracks, the leaderboard and joining a race from the phone. |
The framework is found by looking for its resource among the ones already started, and each one is served by a small open-source bridge:
Framework | Resource it looks for | Bridge |
|---|---|---|
ESX |
|
|
QBCore |
|
|
Qbox |
|
|
Downloading Advanced Racing#
After purchasing Advanced Racing, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Advanced Racing.
After extracting the download, you should have the following folder:
qs-advancedracing/
├── shared/
│ ├── config.lua -- what you may edit: every setting
│ └── enums.lua -- names of track types, race types and classes
├── custom/ -- framework bridges, notifications and quests (open source)
├── locales/ -- 28 translations
├── client/ -- the race, the track creator and the map cards
├── server/ -- races, results, ratings and the database
├── html/ -- the tablet and the race HUD
├── race.sql -- the database tables
└── fxmanifest.luaKeep the folder named
qs-advancedracing. The phone's Racing app and theexports['qs-advancedracing']calls of other scripts look for it by that name.
Installing the Resource#
Move the qs-advancedracing folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-advancedracing/Then open your server.cfg and make sure every dependency starts before it:
ensure oxmysql
ensure ox_lib
# Framework — only the one you use
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Optional
# ensure qs-inventory
# ensure qs-smartphone
ensure qs-advancedracingThe loading order matters. The framework is detected only if it is already started when Advanced Racing starts. If it is not found, the resource stops on boot with a framework error — see Common Errors.
The Database#
Advanced Racing keeps everything in six tables. Import race.sql once, before the first start, with HeidiSQL, phpMyAdmin or any MySQL / MariaDB client.
Table | Holds |
|---|---|
| One racing profile per character: name, avatar, rating, ranking, tag and colours — plus the Automated organiser the server uses for its own competitions. |
| Every track: its checkpoints, props, picture, type and whether it is verified. |
| Every competition, scheduled or past. |
| Each driver's competition result: time, vehicle, class, position, rating change and money. |
| The tracks each player starred. |
| The feed on the tablet's Home page: new tracks, new competitions and winners. |
The file only creates what is missing (
CREATE TABLE IF NOT EXISTS,ADD COLUMN IF NOT EXISTS), so importing it again after an update is safe and keeps every track, result and profile. Those last lines are MariaDB syntax; on MySQL 8 see Unknown column 'image'.
Nobody needs to be registered by hand. A driver's profile is created the first time they open the tablet or join a race, named after their character's first name.
The Tablet Item#
The racing tablet opens two ways: with F10 (Config.AccessTabletWithKey), which needs nothing more, and by using the item named in Config.TabletItem — tablet by default. The script makes that item usable but does not create it: it has to exist in your inventory's item list.
Run this once against your database:
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('tablet', 'Tablet', 1);Add it to qb-core/shared/items.lua:
tablet = { name = 'tablet', label = 'Tablet', weight = 500, type = 'item', image = 'tablet.png', unique = false, useable = true, shouldClose = true, description = 'A racing tablet' },Add it to ox_inventory/data/items.lua:
['tablet'] = {
label = 'Tablet',
weight = 500,
stack = false,
close = true,
},Add it to qs-inventory/shared/items.lua:
['tablet'] = {
name = 'tablet',
label = 'Tablet',
weight = 500,
type = 'item',
image = 'tablet.png',
unique = false,
useable = true,
shouldClose = true,
description = 'A racing tablet'
},Already have a tablet item used by another script? Point Config.TabletItem at a different name. Set it to nil to open the tablet by key only, or set Config.AccessTabletWithKey to nil to open it by item only.
Admin Access#
Admins verify tracks — which is what makes a track available for competitions — can delete any race, and can always organise competitions whatever their rating. There is nothing to set up: admin is read from your framework.
Framework | Counts as admin |
|---|---|
ESX | Group |
QBCore · Qbox | Permission |
The check is framework:playerIsAdmin in custom/esx/server.lua or custom/qb/server.lua. Both are open source — change it there to use your own staff list or ace.
Configuring the Resource#
Every setting is in open-source files. Changes apply after a restart of the resource.
File | Contents |
|---|---|
| The language, ratings and tags, race behaviour, vehicle classes, the intro camera, the creator's keys and props, money, the tablet, payouts, currency format, the recent-events texts, debug and automated competitions. |
| The names of the track types, race types and vehicle classes, and the checkpoint colours. |
| Every text players read, one file per language. |
| Framework bridges, notifications and the inventory quests. |
The values worth reviewing first:
Config.Locale = 'en' -- a file name from locales/
Config.MoneyType = 'money' -- money, bank or black_money
Config.TabletItem = 'tablet' -- nil to disable the item
Config.AccessTabletWithKey = 'F10' -- nil to disable the key
Config.CompetitionCreationMinElo = 1250 -- rating needed to organise competitions
Config.DnfTimer = 120 -- seconds left to finish after the winner (competitions)
Config.Debug = true -- set to false on a live server
Config.Debugships astrue. Turn it off on a live server: it prints every race event to the console and registers the/race_camstest command. The full reference is in Usage → The Configuration.
Verifying the Installation#
Restart your server and read the console. A healthy start prints the framework it picked and the result of the version check:
[INFO] Successfully loaded the framework. esx
You are using the latest version of qs-advancedracing!If a newer version exists, the second line says so and lists what changed. Then join your server and work through the first loop:
Open the tablet
Press F10 or use the tablet item. Home greets you by your character's name and shows the recent events.
Build a track
Tracks → Create. Turn on Track Creation Mode, close the tablet, get in a car and drive the route — E drops a checkpoint, ENTER a pair of props. Reopen the tablet, name it and press Create Track.
Run a race
On the track's card press New Race, give it 60 seconds and a DNF timer, and create it. Drive to the start line — the blip is on your map — and press E to join. The intro, the countdown and the race follow on their own.
Competitions need a verified track. As an admin, click the tick on a track's card to verify it — see Usage → Competitions.



