How Integrations Work#
Trucker Job reaches your framework and every other resource through small, open bridge files. The framework and the vehicle key script are detected when the resource starts, by looking at what is already running; the rest is picked up automatically when present, or switched on in config/config.lua.
Layer | Supported | Without it |
|---|---|---|
Framework |
| Required. Detected automatically. |
Database |
| Required. |
Library |
| Required. |
Target |
| Players press |
Vehicle keys |
| The truck is handed over with no key from a key script. |
Outfits |
| Set |
Inventory | The framework's own · | Only the shop and the manifests use items, and both ship switched off. |
Fuel |
| The tank is left as the game spawns it. |
Police dispatch | Any, through | Nobody is alerted. A report still voids the run's pay. |
Job money |
| Legal payouts go straight to the driver's cash. |
Text prompts |
| The built-in 3D text. |
Notifications | The job's own, or any of yours through | The job's own notifications are the default. |
Optional integrations stand down quietly. A missing key script, fuel script or target never stops a run — that part of the job simply does without it. Detection only sees resources that are already started, so keep everything it should find above
ensure qs-truckjobinserver.cfg.
Frameworks#
Config.Framework is set from whichever of es_extended, qb-core or qbx_core is running; Qbox uses the QBCore bridge. There is no standalone mode. What each bridge does:
| ESX | QBCore · Qbox |
|---|---|---|
Driver identifier |
|
|
Run pay | The |
|
Stolen-cargo pay | The | A |
Leaderboard names |
|
|
The job | Registered in the database automatically | Added by you to |
The truck | Spawned with natives, so it works on every ESX version | QBCore's own spawn, with a |
Both bridges are open, in client/framework/ and server/framework/, so a server with a modified core can adapt how money, items or the job are read without touching anything else.
Target#
Off by default: players walk up to the dispatcher and press E. To use a third-eye instead:
Config.Target = true
Config.TargetScript = "ox" -- "ox" for ox_target, "qb" for qb-targetThe dispatcher gets a single option, Truck Driver Job, within 3 metres, which opens the panel. The target is only used there — every objective on a run is a ground marker and a key press.
Vehicle Keys#
The keys to the work truck are handed over through whichever supported key script is running, and taken back when the truck is returned or the run ends. It is detected when Trucker Job starts, so the key script has to start first.
A key script that is not on the list is not detected, so client/vehiclekeys/none.lua is the bridge in use. Put your script's calls in it:
-- client/vehiclekeys/none.lua
if Config.Vehiclekeys ~= 'none' then
return
end
function AddVehiclekeys(vehicle, plate, item)
exports['my_keys']:GiveKeys(plate) -- your key script's export
end
function RemoveVehiclekeys(vehicle, plate)
exports['my_keys']:RemoveKeys(plate)
endOutfits#
With Config.Clothing = true the driver changes into the trucker outfit when a run starts, and back into their own clothes when it ends. The outfit is the table at the top of client/clothing.lua — one for male and one for female characters, using skinchanger's component names on both frameworks:
local playerClothing = {
male = {
["arms"] = 0,
["tshirt_1"] = 15, ["tshirt_2"] = 0,
["torso_1"] = 65, ["torso_2"] = 2,
["pants_1"] = 9, ["pants_2"] = 1,
["shoes_1"] = 12, ["shoes_2"] = 0,
["helmet_1"] = -1, ["helmet_2"] = 0,
["chain_1"] = 0, ["chain_2"] = 0,
-- mask, bags, glasses, vest, watches... are listed commented out
},
female = {
-- the same keys
},
}Framework | Outfit on | Own clothes back |
|---|---|---|
ESX |
|
|
QBCore · Qbox |
|
|
Running illenium-appearance? Its reload line sits commented out right next to the qb-clothes one in the same file. Set Config.QuasarInventory = true if you run qs-inventory: the inventory is locked while the outfit changes.
Fuel#
Config.Fuel = true
Config.FuelExport = exports['LegacyFuel'] -- any fuel script with SetFuel(vehicle, amount)Every truck starts with a full tank. Any resource that exports SetFuel(vehicle, amount) works — LegacyFuel, cdn-fuel and ps-fuel among them: point Config.FuelExport at its exports.
Police Dispatch#
When a stolen-cargo run is reported, Config.DispatchExport runs on the driver's client — at the moment the trailer is handed over, not when the offer is taken, because that is when the police would hear of it. Put your dispatch script's call inside it:
Config.DispatchExport = function()
exports['qs-dispatch']:SuspiciousActivity()
endJob Management#
While qs-job-management is running, a legal run's payout is handed to it through AddJobMoney for the truck_driver job instead of being added to the driver's cash, and Job Management decides from there. Stolen-cargo money never goes through it — it is always paid to the driver in black money.
Notifications and Prompts#
With Config.DefaultNotifications = true the job uses its own notifications, styled like its panel and with sounds. Set it to false and every message goes through SendTextMessage in config/config.lua instead, where the GTA notification and a custom resource are already written out as comments:
Config.DefaultNotifications = false
function SendTextMessage(msg, type) -- type: 'info', 'error' or 'success'
lib.notify({ description = msg, type = type })
endThe "press E" prompts at each objective float in the world with Config.DrawText3D = true, or show as a hint in the corner with false. With qs-textui running, the in-world prompts are drawn by it automatically.
Discord Logs#
Off by default. Paste a webhook into Url, set Enabled to true and choose the events. Each event takes true (the shared URL), false (off), or a URL of its own — so money can go to a staff channel while runs go somewhere everybody sees.
Event | Posted when |
|---|---|
| A driver takes a run — with the truck, the kind of load and its size, the pay and the experience. |
| The truck is handed back and the run pays out — or says payment refused when the money could not move. |
| A run is abandoned, with whether it was an illegal one. |
| Money for a run actually landed in the driver's account. |
| Experience granted, with the level before and after, progress to the next one and the lifetime total. |
Config.Webhooks = {
Enabled = true,
Url = 'https://discord.com/api/webhooks/...', -- the shared channel
Name = 'qs-truckjob', -- how the bot presents itself
Avatar = '', -- an image URL, or '' for none
Timestamp = true,
Events = {
MissionStarted = true,
MissionFinished = true,
MissionAbandoned = true,
MoneyPaid = 'https://discord.com/api/webhooks/...', -- a staff channel of its own
ExperienceGiven = false,
},
}Languages#
Eleven complete translations ship in config/translations.lua: English (en), Italian (it), Spanish (es), French (fr), Portuguese (pt), German (de), Russian (ru), Turkish (tr), Dutch (nl), Simplified Chinese (cn) and Traditional Chinese (zh-tw). Set Config.Language at the top of that file.
To add another, copy the ['en'] block under a new code, translate it and set the language to that code — any key left out falls back to English instead of showing a raw key. The currency symbol is the CURRENCY_TYPE key, and Config.CurrencyPosition puts it before ("prefix", $500) or after ("suffix", 500 zł) the amount.



