How Integrations Work#
Fuel Stations talks to the rest of your server through small bridge files in client/custom/ and server/custom/. They are not encrypted, so you can read exactly what each one does and adapt it. On start, each layer looks at which resources are already running and picks its bridge:
Layer | Supported | Without it |
|---|---|---|
Framework |
| Falls back to the ESX bridge — a framework is required. |
Target |
|
|
Vehicle keys |
| The delivery job's truck and tanker are given without keys. |
Inventory |
| The jerrycan is a plain framework item or weapon. |
Notifications · progress |
|
|
3D prompts |
| Native GTA text with a dark backing. |
Phone · map | Any phone app or map script that reads the | Nothing — the map blips still work. |
Detection only sees resources that started before
qs-fuelstations. If something you run is ignored, move it aboveensure qs-fuelstationsinserver.cfg.
Frameworks#
The framework decides where money comes from and who counts as an admin. It is detected in this order and can be forced in config.lua if you renamed your framework resource:
-- Auto-detected. Only set by hand if you renamed your framework resource.
Config.Framework = esxHas and 'esx' or qbHas and 'qb' or vrpHas and 'vrpex' or 'esx'
-- Forced:
-- Config.Framework = 'qb'Account | ESX | QBCore |
|---|---|---|
Cash at the pump, jerrycans |
|
|
Card at the pump |
|
|
Job deposit and salary |
|
|
Qbox servers run through the QBCore bridge via Qbox's qb-core compatibility, and qbx_vehiclekeys has its own key bridge.
Target#
Set Config.UseTarget = true to replace the [E] prompts with target options. ox_target is used when it is running, otherwise qb-target. Every pump and charger model in Config.PumpModels gets:
On the pump: open the pump, buy a jerrycan, refill a jerrycan, store the hose.
On any vehicle: place the hose, pick the hose up, stop refuelling, use a jerrycan.
For the job: the foreman, the depot's storage tank, the tanker and the station's delivery point.
Each option only shows when it makes sense — a charger never offers a jerrycan, and the hose option only appears on a vehicle that takes that pump's grade.
Vehicle Keys#
Keys are only needed by the delivery job, so the driver can start the truck and tanker it spawns. The first supported key system found running is used; 'none' when there is none. If two are running at once, pick one by hand:
-- config.lua
Config.Vehiclekeys = 'wasabi_carlock'Each system has its own file in client/custom/vehiclekeys/ with two functions, AddVehiclekeys and RemoveVehiclekeys. For a key resource that is not listed, copy none.lua, rename the check at the top, fill in the two functions and add the resource to the vehicleKeys table in the config.
Inventories and the Jerrycan#
The jerrycan is the game's weapon_petrolcan, and its fuel is the weapon's ammunition. Your inventory must have that item defined — QBCore, qs-inventory and ox_inventory ship it.
Inventory | How the can is handled |
|---|---|
| Given full, with its fuel and quality in the item's metadata; refills rewrite that metadata, and what is poured is saved back. Buying a can also completes the Fuel Collector quest — defined in |
| On ESX, the can's durability and ammunition are kept in step with what is poured. |
Framework only | Added and removed through the framework. On ESX, |
Notifications, Prompts and Progress Bars#
Every message, every [E] prompt and the delivery job's progress bar go through three functions in your framework's client bridge, client/custom/framework/<framework>.lua:
Function | Default |
|---|---|
|
|
|
|
|
|
To use another notification or text UI resource, edit those functions — nothing else in the script needs to change. Server-side scripts can show the same notifications with the client event fuelstation:notification:
TriggerClientEvent('fuelstation:notification', source, 'Station closed for maintenance', 'error')Phones and Maps#
A phone app or map script can list every station with its live prices and stock, and set a GPS route to one, through two client exports:
local data = exports['qs-fuelstations']:getFuelStations()
-- data.stations { id, type = 'gas' | 'charge', name, x, y, z, level, prices }
-- data.counts { gas, charge, total }
-- data.prices current base price per grade
-- data.priceSymbol '€'
exports['qs-fuelstations']:setFuelWaypoint(x, y)A station that sells both fuel and electricity is listed twice — once as gas at its centre, once as charge at its first charger — so a map can show the two with different icons. Both exports live in client/custom/phone/app.lua.
Garages, HUDs and Mechanics#
Scripts that store, display or repair vehicles need to read and set fuel. There are two ways:
The exports,
GetFuelandSetFuel— a garage savesGetFuelwhen a car is stored and callsSetFuelwhen it is taken out.The state bag
Entity(vehicle).state.fuel, replicated to every client and the server — ideal for a HUD, and readable server-side without asking the driver's client.
Scripts written for LegacyFuel need no change at all. See Commands and Exports for every signature.
Adding a Framework or Resource#
Supporting something that is not on the list is one file. Every bridge is short and unencrypted:
Folder | What a bridge provides |
|---|---|
| The player's money, notifications, 3D prompts and progress bars. |
| Players, items and accounts: |
| The target options on pumps and vehicles. |
|
|
| The station list and waypoint exports. |
Copy the closest existing file, change the check at the top so it loads for your resource, and fill in the functions. config.lua, locales/, client/custom/ and server/custom/ are the editable part of the resource.
Languages#
41 translations ship in locales/: ar bg bn ca cs da de el en es et fa fi fr he hi hr hu id it ja ko lt lv ms nl no pl pt ro ru sk sl sv sw th tr uk ur vi zh. Pick one in the config, or set it once in server.cfg for every Quasar resource:
-- config.lua
Config.Language = 'es'# server.cfg — applies to every Quasar resource
setr qs:locale "es"A language missing a line falls back to English for that line and names the missing key in the console, so a partial translation never breaks the script. To add a language, copy en.json, translate the values, keep the {{placeholders}} as they are, and set its file name as the language.



