XS-Boosting
Stolen cars to order, off a board only that player can see. Lock, alarm, hotwire and tracker, then a buyer, a chop shop or a fence.
Requirements
Required
- qbx_core or qb-core — the bridge detects which you run
- ox_lib
- oxmysql
Inventory
- One of ox_inventory, qb-inventory, qs-inventory, codem-inventory, core_inventory or ps-inventory. The bridge detects it.
- ox_inventory needs one extra line on the boosting unit that the others do not. See The items — this is the single most common reason a fresh install looks broken.
Optional
- ox_target or qb-target — nearly every interaction is a target option. Without one there is a built-in fallback, so it still works.
- A dispatch resource — XS-Dispatch, ps-dispatch, qs-dispatch, cd_dispatch or core_dispatch. Falls back to a plain notification.
- A vehicle keys resource — qbx_vehiclekeys, qb-vehiclekeys or qs-vehiclekeys. Keys are handed over when a hotwire lands.
- A fuel resource. Detected, used to set the tank on a spawned car.
Everything optional is auto-detected. If you want to pin any of it, Config.Bridges at the top of config.lua takes an explicit name instead of 'auto'.
Installation
- Drop the
XS-Boostingfolder into yourresourcesdirectory. - Add the items to your inventory resource. Do this before you start the server — see The items.
- Add
ensure XS-Boostingto yourserver.cfg, afterensure ox_libandensure oxmysql. - Start the server. The tables create themselves on first run.
sql/xs_boosting.sqlis in the folder if you would rather import it by hand — it is allCREATE TABLE IF NOT EXISTSand safe to re-run. /boostingin game, and place at least one vehicle spawn and one handover point. See Placing your map.
The server prints a warning at start listing any items it cannot find, and another if nothing has been placed yet. If neither appears, the install is good.
The items
The boosting unit is the whole way in. There is no command for players and no key bind — without the unit in their pocket they cannot open the interface, cannot take a contract, and cannot carry on one that is already running. That is deliberate: you decide who gets one, by selling it, dropping it as loot or handing it out.
Only boosting_unit is required. The rest are tools the config asks for, and you can point those at items you already have or switch them off.
ox_inventory
Paste into ox_inventory/data/items.lua. The same block is in items/ox_inventory.lua in the resource folder.
Two lines on the unit are doing real work. client.export is how ox_inventory opens anything at all — it does not use the framework's useable-item system, so without that line the item is a dead object that does nothing when used, with no error anywhere. consume = 0 stops the unit being eaten the first time somebody opens the board.
['boosting_unit'] = {
label = 'Boosting Unit',
weight = 1000,
stack = false,
close = true,
consume = 0,
client = {
export = 'XS-Boosting.openUnit',
},
description = 'Somebody else\'s contracts, somebody else\'s cars.',
},
qb-core and the rest
Paste into qb-core/shared/items.lua, inside QBShared.Items. The same block is in items/qb_core.lua. This one list covers qb-inventory, qs-inventory, ps-inventory, core_inventory and codem-inventory — they all read that table.
useable = true on the unit is the line that matters here. These inventories route a used item through the framework, which the resource already listens for.
['boosting_unit'] = { name = 'boosting_unit', label = 'Boosting Unit', weight = 1000, type = 'item', image = 'boosting_unit.png', unique = true, useable = true, shouldClose = true, combinable = nil, description = 'Somebody else\'s contracts, somebody else\'s cars.' },
The rest of the list
boosting_laptop— finds and kills the tracker.Config.Theft.tracker.item.boosting_toolkit— needed to strip a car.Config.Chop.tool.item.lockpick— forcing a door. Point it at the lockpick you already have if you have one.veh_wheels,veh_door,veh_bonnet,veh_ecu,veh_catalyst,veh_seats,veh_stereo,veh_airbag— what a stripped car gives up.
Once the item exists, /boostunit puts one in your pocket to test with, and /boostunit 12 sends one to that player id.
Placing your map
No coordinates live in config.lua. Every spawn, drop and shop is placed in game with /boosting and stored in the database, so the map is yours and an update never overwrites it.
The resource ships empty. Nothing appears on any board until you have placed at least a vehicle spawn and a handover point.
| Kind | What it is |
|---|---|
| Vehicle spawn | Somewhere a target car may appear. Tied to a tier — a tier with no spawns never comes up on a board. Place plenty; a used one rests before it is offered again. |
| Handover point | Where the buyer meets you. Required. A buyer turns up here in person while the job runs. |
| Chop shop | Strip a car for parts instead of selling it whole. |
| Lockup | Park a car mid-contract and stop the clock, or keep one for good. Both switch on and off separately. |
| Street fence | A bad rate and no rep, for a job that has already gone wrong. |
| Dead zone | Somewhere a tracker can be killed without stopping at the car. |
| Heist site / heist exit | The showroom, and the one way out every car has to leave through. |
Spawn points are saved at road height and the car is dropped in from just above, so park where you want the car to be and it will settle there.
/boostplaces prints what is placed and how much of it is switched on. It runs from the server console too.
Who gets to boost
Anyone holding the unit. Config.Access.checkSeconds decides how often the server re-checks it is still on them mid-job — lose it and the contract stops with it. Set it to 0 to only check when the interface is opened.
Admins are separate. Config.Admin takes an ace permission, a list of framework groups, or a list of licence identifiers — any one passing is enough. That gates /boosting, the admin panel inside the unit, and the other commands.
| Command | Does |
|---|---|
/boosting | Opens the builder. |
/boostunit | Puts a unit in your pocket. /boostunit 12 sends one to that id. |
/boostopen | Opens the interface without the item, for testing. |
/boostplaces | What is placed and how much is on. on switches the lot back on. |
/boostevent | Starts the contested contract now. stop calls it off. |
Tiers and payouts
Four tiers ship: Street, Clean, Exotic and Blacklist. Rep unlocks them in order. A tier decides what gets boosted, what it pays, how hard the car fights back and how long the clock runs — all of it in Config.Tiers, and you can add or rename as many as you like.
Every player gets their own board, so two people opening a unit at the same moment are not looking at the same cars. Config.Contracts.sharedBoard puts the whole server back on one board if you would rather have the race.
Fence prices drift per tier on a timer. A contract keeps the rate it was listed at, so a tier that is climbing makes the next batch of listings the ones worth waiting for. Config.Market.
A spawn point sits out after a contract has used it — Config.Contracts.spawnCooldownMinutes — so a server with a handful of them does not serve the same street corner all night. If every spot for a tier is resting, one gets used anyway rather than leaving a board short.
The police
There is no heat system. Nothing about this script tracks a wanted level or escalates anything. The only thing the police get is an alert through whatever dispatch resource you already run, and every alert can be switched off on its own in Config.Police.
- Theft — goes out when the engine catches. A delay can be set so the car is moving before anybody hears.
- Alarm — if one is sounding and nobody silences it in time.
- Chop shop — a chance, per job, that somebody sees it.
- Tracker — once it is live the police stop getting one alert and start getting a moving blip, until it is dealt with.
Config.Police.required sets how many officers must be on duty before anybody can take a contract at all. 0 switches that off.
If you run a police resource that books people, call exports['XS-Boosting']:OnArrested(src) when somebody is booked, so a contract lost to a cell costs what it should.
Crews and the heist
A crew is put together before anybody takes anything on — open the unit, find somebody standing with you and ask them. When one of you takes a contract the rest are pulled straight into it, with no second round of invites while the clock runs, and the crew survives the job. Config.Crew.
On a normal contract only two of you go on the job itself. The second pair of hands is not just company: a passenger can work the tracker from the seat next to you, or from anywhere in the city, while the car is already moving. On your own you have to stop and do it yourself. Config.Duo decides whether that is on, how the money splits and whether both get rep.
The heist is one job, two to four people, several cars out of one showroom in a single window. It needs a heist site and a heist exit placed, and a rep threshold on whoever calls it. The police are always told. Config.Heist.enabled = false and nothing else changes.
Before going live
- Place more spawn points than you think you need. Six listings per player come off the same pool, and a thin map means the same corners over and over.
- Decide how people get the unit before you switch it on. That is the whole access control.
- Check the payouts against your economy.
Config.Tiersships with numbers that suit a mid-weight server and they are the first thing you should tune. - Walk one contract end to end with
/boostopenbefore anybody else sees it — find it, get in, hotwire it, kill the tracker, hand it over. - The contested event is loud by design.
Config.Events.enabled = falseif you do not want a server-wide fight over a car.
Troubleshooting
Using the boosting unit does nothing
On ox_inventory, the item needs a client.export line pointing at XS-Boosting.openUnit in its own data/items.lua. ox_inventory does not use the framework's useable-item system, so without that line the item is a dead object and nothing is logged. On qb-style inventories the equivalent is useable = true.
The board is empty
Nothing has been placed yet, or the tiers have no spawn points. Run /boosting and put down at least one vehicle spawn and one handover point. A tier with no spawn points never comes up, so a board can be short rather than empty if only some tiers are built out.
attempt to index a nil value (global 'Config')
config.lua did not load, which is almost always start order. ensure ox_lib and ensure oxmysql must both come before ensure XS-Boosting in your server.cfg.
Everything I placed is switched off after a restart
That was a bug in versions before 0.5.5 — the enabled flag was read back wrongly, so every place loaded disabled. Update, then run /boostplaces on to switch back on anything that was saved while it was happening.
I can drive the car away without hotwiring it
Fixed in 0.5.6. GTA's own hotwire only delays the engine for a few seconds before it catches by itself, and most keys resources hand an unowned car to whoever sits in it, so the engine is now held off until the hotwire lands. If you are on an older build, update.
I cannot find the car
That is the search. A contract gives a zone and a description, never a waypoint, and the zone is deliberately pushed off centre so driving to the middle finds you nothing. Match the model, the colour and the plate. Bigger tiers use bigger zones — searchRadius per tier in Config.Tiers.
The police never get told
Check Config.Bridges.dispatch. On auto it detects XS-Dispatch, ps-dispatch, qs-dispatch, cd_dispatch and core_dispatch, and falls back to a plain notification if it finds none. Each alert can also be switched off on its own in Config.Police.
Updating
- Keep a copy of your edited
config.lua. - Replace the resource folder and merge your config back.
- Restart the resource. Any new tables or columns create themselves.
Everything you placed with /boosting lives in the database, not in config.lua, so your map survives an update untouched.