Before You Begin#
Before installing Trucker Job, make sure your server meets the minimum requirements. Three things are mandatory; everything else is optional and only adds to the job.
Requirement | Status | Notes |
|---|---|---|
| Required | Database access. The tables install themselves. |
| Required | Server callbacks and the scheduled leaderboard resets. |
Framework | Required |
|
Target | Optional |
|
Vehicle keys | Optional | Hands the driver the keys to the work truck. Eleven key scripts are detected on their own. |
Outfits | Optional |
|
Fuel | Optional | Any fuel script with a |
| Optional | Used automatically for the "press E" prompts while it is running. |
Every optional integration stands down quietly when its resource is missing. Integrations has the full list and how each one is chosen.
github.comReleases · overextended/oxmysqlMySQL resource for FXServer.github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Downloading Trucker Job#
After purchasing Trucker Job, 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 Trucker Job.
After extracting the download, you should have the following:
qs-truckjob/
├── client/
│ ├── framework/ -- ESX and QBCore bridges (editable)
│ ├── vehiclekeys/ -- one bridge per key script (editable)
│ └── clothing.lua -- the trucker outfit (editable)
├── config/
│ ├── config.lua -- every setting
│ └── translations.lua -- the language and every text
├── server/
│ └── framework/ -- ESX and QBCore bridges (editable)
├── shared/
├── web/build/ -- the interface, already built
└── fxmanifest.lua
[sql]/
└── qs-Truck.sql -- optional: the tables are created on startInstalling the Resource#
Move the qs-truckjob folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-truckjob/Once copied, open your server.cfg and make sure every dependency — and everything it should detect — starts before Trucker Job:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Optional: target, keys, fuel, text prompts
ensure ox_target
ensure qs-vehiclekeys
ensure LegacyFuel
ensure qs-textui
ensure qs-truckjobThe loading order matters. The framework and the vehicle key script are found by looking at what is already started, so one that starts after Trucker Job is not found and the job runs without it.
The Database#
There is no SQL file you have to import. On its first start Trucker Job creates its four tables, adds any column an older install is missing, and matches its identifier columns to your framework's own collation so the leaderboard can read your players' names.
Table | Holds |
|---|---|
| Each driver's level and experience, plus the all-time, season and daily experience and earnings the leaderboards rank. |
| When the daily and the season rankings were last reset. |
| Leaderboard prizes kept for winners who were offline at the reset, paid the next time they log in. |
| The last daily and season winners, shown on the leaderboard. |
The
[sql]/qs-Truck.sqlfile does exactly the same work and is only there for the manual route — preparing the database outside the server, or checking what will be created. Every statement in it isIF NOT EXISTSorINSERT IGNORE, so importing it is safe either way.
The Job#
By default only players with the truck_driver job can take a contract. Anybody can still walk up to the dispatcher and open the panel to browse the shop, the leaderboard and the guide.
Nothing to do. On ESX the job is registered for you on first start: a truck_driver row in jobs and grade 0, Driver, in job_grades. Every other job you add to Config.TruckDriverJob is registered the same way, and an existing row is never duplicated.
QBCore keeps its jobs in a file, not in the database, so add this to qb-core/shared/jobs.lua and restart:
['truck_driver'] = {
label = 'Truck Driver',
defaultDuty = true,
offDutyPay = false,
grades = {
['0'] = { name = 'Driver', payment = 50 },
},
},Add this to qbx_core/shared/jobs.lua and restart:
['truck_driver'] = {
label = 'Truck Driver',
defaultDuty = true,
offDutyPay = false,
grades = {
[0] = { name = 'Driver', payment = 50 },
},
},Then hand the job out the usual way — /setjob <id> truck_driver 0 works on all three frameworks. To let anyone drive, or to accept more than one job:
-- config/config.lua
Config.RequireJob = true -- false lets anyone work, without needing a job
Config.TruckDriverJob = { -- jobs allowed to drive
['truck_driver'] = true,
['logistics'] = true, -- any other job you want to allow
}Items (Optional)#
Trucker Job only uses inventory items in two optional places: the shipping manifests handed out with every paid run (Config.Items.receiveItem, off by default) and the shop (Config.Shop.Enabled, off by default). If you switch either on, every item they name has to exist in your inventory.
Item | Label | Used for |
|---|---|---|
| Shipping Manifest | Given with every paid run. Sold and bought back by the shop. |
| Blank Manifest | Given as well with a paid stolen-cargo run. Sold and bought back by the shop. |
Add to ox_inventory/data/items.lua:
['legal_manifest'] = {
label = 'Shipping Manifest',
weight = 10,
stack = true,
close = true,
description = 'Paperwork for a legal load',
},
['illegal_manifest'] = {
label = 'Blank Manifest',
weight = 10,
stack = true,
close = true,
description = 'Nobody checks what is inside',
},Add to qb-core/shared/items.lua, or to qs-inventory/shared/items.lua if you run Quasar Inventory:
['legal_manifest'] = {
name = 'legal_manifest', label = 'Shipping Manifest', weight = 10, type = 'item',
image = 'legal_manifest.png', unique = false, useable = false, shouldClose = true,
description = 'Paperwork for a legal load'
},
['illegal_manifest'] = {
name = 'illegal_manifest', label = 'Blank Manifest', weight = 10, type = 'item',
image = 'illegal_manifest.png', unique = false, useable = false, shouldClose = true,
description = 'Nobody checks what is inside'
},With the default ESX inventory, run this once against your database:
INSERT IGNORE INTO `items` (`name`, `label`, `weight`) VALUES
('legal_manifest', 'Shipping Manifest', 1),
('illegal_manifest', 'Blank Manifest', 1);Configuring the Resource#
Everything is set in a handful of open files, and every value that touches money is read by the server — the client never decides what a run pays. The files you may edit:
File | Contents |
|---|---|
| Every setting, in eleven numbered sections — general, world, trucks, routes, cargo, levels, shop, guide, leaderboard, marker, debug — plus the Discord webhooks. |
| The language ( |
| The trucker outfit, for male and female characters. |
| The ESX and QBCore bridges: money, items, the job check, the truck spawn and the yard blip. |
| One small bridge per vehicle key script. |
The values worth reviewing first:
-- config/config.lua
Config.RequireJob = true -- only Config.TruckDriverJob may take a contract
Config.Target = false -- true: third-eye on the dispatcher
Config.TargetScript = "ox" -- "ox" or "qb"
Config.Clothing = true -- the trucker outfit while on a run
Config.Fuel = false -- true: fill the tank on spawn
Config.UnloadAtDelivery = true -- hand-loaded freight comes off at the drop-off
Config.EnableLeaderboard = true -- the statistics view and its prizes
Config.Debug = false -- explain every step in the console
Config.Shop = {
Enabled = false, -- the supply store inside the panel
-- ...
}
-- config/translations.lua
Config.Language = "en" -- en, it, es, fr, pt, de, ru, tr, nl, cn, zh-twThe configuration is read when the resource starts, so restart it after editing. Runs live in the server's memory: a driver who is halfway through one when the resource restarts loses it, so make changes while nobody is driving.
Updating from an Older Version#
Replace the qs-truckjob folder and keep your database. On start the script adds every leaderboard column an older table is missing, so drivers keep their levels and their experience. Before you overwrite the old folder:
Carry your coordinates, contracts and prices over into the new
config/config.luarather than reusing the old file — the rigs, the cargo modes, the loading docks and the markers are new sections it does not have.Copy your outfit across into the new
client/clothing.luaif you had changed it.Check your other scripts for the events below. They were removed because any client could fire them to pay itself.
Removed | What happens now |
|---|---|
| Nothing to call. The server prices every run from the distance it chose and pays it once the truck is back at the depot. |
| Nothing to call. Experience comes from a completed run. |
| The manifests in |
| Nothing used it. The panel reads the level itself. |
The leaderboard board prop | The Statistics button in the job panel. Open the panel from elsewhere with |
Verifying the Installation#
Restart your server and read the console. There should be no red lines from qs-truckjob; on ESX the first start also registers the job:
[qs-truckjob] Registered the ESX job "truck_driver"If your database and your framework use different collations you will also see a line saying the identifier columns were aligned — that is the script fixing it, not an error. Then join and work through the first run:
Give yourself the job
/setjob <your id> truck_driver 0, then follow the Truck Yard blip to the dispatcher, under the floating blue marker.Open the job panel
Press
Ebeside the dispatcher, or use your target. The camera cuts to a close-up and the panel opens with your level, the contracts and the rigs.Take a contract
Pick Standard Freight and the Packer, then Start route. The screen fades, you are in the cab, and the GPS points at a trailer bay at the port.
Finish the run
Reverse onto the trailer, deliver it, bring the truck back to the yard and press
Eon the green marker. The money and the experience arrive, and Usage covers everything else a run can be.
To watch every step in the console while you set things up, set
Config.Debug = true— and turn it off again on a live server; it prints a lot.



