INSTALLATION — ns-taxi
1. Requirements
| Requirement | Note |
|---|---|
| FiveM server with OneSync enabled | The server checks positions, seats and vehicles itself |
| oxmysql | Must start before ns-taxi |
MySQL / MariaDB user with CREATE, ALTER, INSERT, UPDATE, DELETE | Needed only for the automatic migration |
| Framework | qbx_core (primary), qb-core, es_extended, or standalone (Config.Framework) |
| ox_lib / ox_target (recommended) | Notifications, menus and interaction points; the resource works without them |
| qbx_radialmenu / qb-radialmenu (optional) | "Call a taxi" radial item (Config.PlayerRides.radial) |
2. Copy the resource
Put the folder in your resources directory, keeping the folder name exactly:
resources/[ns]/ns-taxi
The name matters: the NUI page, the exports, the events and the convars all use ns-taxi.
3. server.cfg
ensure oxmysql
ensure ox_lib # optional
ensure ox_target # optional
ensure qbx_core # or your framework
ensure ns-taxi
# Admin tools (/taxilevel, /taxilocations, /taxicompany ...)
add_ace group.admin ns-taxi.admin allow
# Optional: Discord log (see section 9). Server-only, never sent to players.
# set ns_taxi_webhook "https://discord.com/api/webhooks/..."
Framework admins (Qbox / QBCore permission, ESX group) are accepted as well while
Config.Admin.useFrameworkAdmin = true.
4. Database
With Config.Database.autoMigrate = true (default) the tables are created and upgraded on start:
ns_taxi_meta schema version
ns_taxi_drivers career: xp, reputation, rating, counters, earnings
ns_taxi_rides ride log (statistics, leaderboard, duplicate payout guard)
ns_taxi_vehicles cab condition per driver and model
ns_taxi_vehicle_upgrades bought upgrades per cab model
ns_taxi_achievements unlocked achievements
ns_taxi_customers customer memory (regulars, favourites, grudges)
ns_taxi_companies player taxi companies
ns_taxi_company_members company employees and grades
ns_taxi_company_log company bank / staff log
ns_taxi_fleet company cabs
ns_taxi_audit admin actions
ns_taxi_refunds payouts / escrow refunds kept for players who were offline
If your SQL user may not create tables, set Config.Database.autoMigrate = false and import
sql/ns-taxi.sql by hand. Every statement is CREATE TABLE IF NOT EXISTS / guarded — it never
drops or overwrites data.
5. The job (optional)
By default anyone can start a taxi shift (Config.Job.required = false). To limit it to a job,
set required = true and create the job taxi (Config.Job.name).
Qbox / QBCore — shared/jobs.lua:
taxi = {
label = 'Taxi',
defaultDuty = true,
grades = {
[0] = { name = 'Driver', payment = 50 },
[1] = { name = 'Senior Driver', payment = 75 },
[2] = { name = 'Manager', isboss = true, payment = 100 },
},
},
ESX — add taxi to the jobs / job_grades tables.
6. Taxi tablet item
The driver terminal is the taxi_tablet item (Config.Tablet.item). Players take it from the
dispatcher NPC at the HQ and open it by using the item, /taxi or F6.
ox_inventory — ox_inventory/data/items.lua:
['taxi_tablet'] = {
label = 'Taxi Tablet',
weight = 500,
stack = false,
close = true,
description = 'Taxi driver terminal. Start your shift and receive calls with it.',
},
QBCore: add taxi_tablet to qb-core/shared/items.lua; ESX: to the items table.
Config.Tablet.enabled = false turns the item off: the HQ duty point then starts and ends the shift.
7. Place the HQ and the ride locations
Every coordinate shipped with the resource is marked -- example (Downtown Cab Co.). Replace them:
HQ, garage, spawn points, cleaning / maintenance stations are in config.lua
(Config.TaxiCompany, Config.Cleaning.stations, Config.Maintenance.stations,
Config.Tablet.npc.coords). Stand on the spot, run /taxicoords (prints a vector4 in F8),
paste it and restart ns-taxi.
Pickup and drop-off spots (in game, no file editing):
- Run
/taxilocations(admin). - Stand where a passenger should wait, record the spot, name it and pick its role and tags.
/taxilocations viewshows the recorded spots in the world. - Spots are live at once and stored in
data/locations.json— keep that file when you update. Config.Locations.useDefaults = truealso uses the built-in spots ofdata/locations.lua; set it tofalseonce your own spots cover the map.
8. First test run
restart ns-taxiand look forns-taxi v0.13.1 ready (framework: qbox, locale: tr).in the console.- Take a tablet from the dispatcher NPC, use it → Start shift.
- Take a cab at the garage and wait for a ride offer (Y accepts, N declines).
- With
Config.Debug = true,/taxirideforces a test ride (never pays). /nsstatus(admin or console) shows every running NullSect resource with its version.
9. Discord log (optional)
Suspicious-activity flags, admin actions and large payouts can be posted to a Discord webhook.
The URL is a server-only convar — it is never put in config.lua, because that file is also
sent to every player:
set ns_taxi_webhook "https://discord.com/api/webhooks/..." # every category
set ns_taxi_webhook_security "https://discord.com/api/webhooks/..." # optional, security only
Categories and the payout threshold are set in Config.Logs (see CONFIGURATION.md).
Messages carry the player name, server id and license; mentions are disabled.
10. Troubleshooting
| Symptom | Cause / fix |
|---|---|
No framework adapter registered | Config.Framework names a framework that is not started. Use 'auto' or 'standalone'. |
Database initialisation failed | The SQL user cannot create tables → import sql/ns-taxi.sql, set autoMigrate = false. |
| No ride offers | You are not on shift, or no recorded / default spot is in range (Config.Dispatch.maxPickupDistance). Record spots with /taxilocations. |
| "You need a taxi tablet" / shift ends by itself | The tablet item is missing from your inventory (Config.Tablet.requireForShift). |
| Interaction does nothing | No ox_target / qb-target: stand in the circle and press E (Config.Target.promptControl). |
| Cab does not spawn | All spawn points are blocked or the model in data/vehicles.lua does not exist. |
| Tablet empty / fonts wrong | Check F8 for NUI errors; copy nui/ completely, including nui/fonts/. |
| No Discord messages | Convar name must use _: ns_taxi_webhook. The category must be on in Config.Logs.webhook. |
11. Updating
- Keep your own
config.lua,data/*.lua,data/locations.jsonandlocales/*.lua— compare them with the new ones instead of overwriting. - Replace everything else.
- Restart. New schema versions migrate themselves;
ns_taxi_metarecords the current version.