Pepper Taxi
Taxi career with 50 levels, NPC missions, player-owned company and admin panel – ESX Legacy.
Overview
Pepper Taxi is a long-term taxi career for ESX Legacy: 50 levels, reputation, 15 customer types and 12 mission types up to a limousine career, plus ratings, challenges, rides with real players and an optional player-run taxi company. Everything is controlled through the dispatch tablet (F6) at the Downtown Cab Co. taxi centre.
- NPC jobs with countdown, accept/decline with
Y/Nwithout a mouse - 12 mission types: city, airport, hotel, night, long distance, remote, business, multi-stop, event, VIP, chauffeur, limousine
- 13 taxis in 6 vehicle classes, unlocked through level, reputation, rating or challenges
- 1–5 stars from server-side measured values, reputation from Bronze to Legend, daily and weekly challenges
/taxirequests from players and a “player as passenger” mode- Taxi company (public or player-owned) with ranks, salaries and company account
- Admin panel with offline editing and audit log, German and English
Requirements
| Dependency | Required/optional | Used for | Link |
|---|---|---|---|
| FiveM server build 7290+ with OneSync (Legacy or Infinity) | required | declared in fxmanifest.lua as /server:7290 and /onesync |
https://docs.fivem.net/docs/server-manual/setting-up-a-server/ |
ESX Legacy 1.9+ (es_extended) |
required | players, money, admin groups, characters | https://github.com/esx-framework/esx_core |
| oxmysql | required | database (career, statistics, company, logs) | https://github.com/overextended/oxmysql |
| Fuel script | optional | taxis get the fuel state bag set when they spawn (Config.VehicleRules.Fuel) |
– |
ox_lib, ox_target and ox_inventory are not required. No ESX job is needed. Pepper Taxi only runs on ESX Legacy (no QBCore/Qbox).
Installation
- Download the resource from the Cfx.re portal → Granted Assets.
- Extract it to
resources/[pepper]/pepper_taxi. Do not rename thepepper_taxifolder – other resources call the exports viaexports.pepper_taxi, and the server events use the resource name as prefix. - Add it to your
server.cfgafter its dependencies:
ensure oxmysql
ensure es_extended
ensure pepper_taxi
- Database: with
Config.Database.AutoInstall = true(default) the resource creates missing tables on start (13 tables prefixedtaxi_). The manual way is importingsql/install.sql– it can safely be imported more than once. - Grant admin rights (details under “Commands and permissions”), for example:
add_ace group.admin pepper_taxi.admin allow
Pepper Taxi uses no inventory items – there are no items or images to add.
First test
- Start the server and check the console that
pepper_taxistarts without errors. - Drive to the taxi centre (yellow taxi icon, Downtown Cab Co.) and press
Eat the terminal. - Pick the standard taxi and get in – the first job arrives after 15–45 seconds.
- Accept with
Y, pick up the passenger and stop at the destination – stars, pay and XP appear. - Open the tablet with
F6; as an admin you see the Admin tab there.
Configuration
All settings are open in config/ (readable and editable under Asset Escrow):
| File | Controls |
|---|---|
config/config.lua |
language, centre, tablet, dispatch, AFK, security, pay, damage, rating, reputation, duty bonus, vehicle rules, NPCs, player rides, company, admin, sounds/UI |
config/vehicles.lua |
vehicle classes and taxis with requirements |
config/levels.lua |
XP curve, titles, career bonus, level rewards |
config/customers.lua |
15 customer types |
config/missions.lua |
12 mission types |
config/locations.lua |
81 pickup and destination points across the map |
config/challenges.lua |
pools for daily and weekly challenges |
config/server.lua |
optional Discord webhook for logs (server-side only) |
locales/de.lua, locales/en.lua |
all in-game and tablet texts |
General
Config.Locale = 'de'
Config.TimeSource = 'game'
Config.Database = { AutoInstall = true, SaveInterval = 300 }
| Option | Default | Description |
|---|---|---|
Config.Locale |
'de' |
language (de or en) |
Config.Debug |
false |
verbose logs for troubleshooting |
Config.Currency |
'$' |
currency symbol in the UI |
Config.TimeSource |
'game' |
time of day for customers/missions: 'game' or 'server' |
Config.Resets.DailyHour |
5 |
daily challenge reset (server time) |
Config.Resets.WeeklyDay |
1 |
weekday of the weekly reset (1 = Monday) |
Centre, tablet and dispatch
Config.Tablet = { Command = 'taxitablet', DefaultKey = 'F6', AcceptKey = 'Y', DeclineKey = 'N', ... }
Config.Dispatch = { MinMissionDelay = 60, MaxMissionDelay = 300, OfferTimeout = 25, RequireInTaxi = true, ... }
| Option | Default | Description |
|---|---|---|
Config.Center.Terminal |
vector3(895.9, -179.9, 74.7) |
terminal at the centre (E) |
Config.Center.SpawnPoints |
4 spots | taxi spawn points, checked in order for a free spot |
Config.Center.MaxStartDistance |
60.0 |
start of duty only this close to the centre (checked server-side) |
Config.Tablet.DefaultKey |
'F6' |
key for the tablet |
Config.Dispatch.FirstMissionDelay |
{ 15, 45 } |
seconds until the first job |
Config.Dispatch.MinMissionDelay / MaxMissionDelay |
60 / 300 |
seconds between jobs |
Config.Dispatch.OfferTimeout |
25 |
seconds to accept |
Config.Dispatch.MaxIgnoredOffers |
3 |
expired offers in a row → automatically off duty |
Config.Dispatch.RequireInTaxi |
true |
jobs only while sitting in your own taxi |
Pay, rating and reputation
| Option | Default | Description |
|---|---|---|
Config.Economy.PayAccount |
'bank' |
'bank' or 'money' |
Config.Economy.GlobalMultiplier |
1.0 |
multiplier on all payouts (e.g. 1.5 for an event weekend) |
Config.Economy.MinPayout |
25 |
minimum payout per successful ride |
Config.Economy.MaxRepairDeduction |
0.8 |
repair deduction at most 80 % of the pay |
Config.Rating.SpeedLimit |
36.0 |
m/s (~130 km/h) – above counts as speeding (× customer tolerance) |
Config.Rating.DamagePerStar |
120 |
−1 star per 120 damage points |
Config.Reputation.Tiers |
Bronze … Legend | tiers with a pay bonus up to +15 % |
Config.DutyBonus.DutyBonusXP |
120 |
XP per hour of active duty |
Vehicles and passengers
Taxis live in config/vehicles.lua; add add-on vehicles with their spawn name. Requirements (all optional): level,
reputation, rating, rides, challenge, companyGrade. Do not change the key after release – it is stored in the database.
| Option | Default | Description |
|---|---|---|
Config.VehicleRules.PlatePrefix |
'TAXI' |
plate prefix |
Config.VehicleRules.DeleteOnDutyEnd |
true |
remove the taxi at end of duty |
Config.VehicleRules.Fuel |
100.0 |
value for the fuel state bag |
Config.Passenger.BoardTimeout |
30 |
seconds, then the NPC is placed into the taxi |
Config.Passenger.Seats |
{ 2, 1, 0 } |
preferred seats (rear first) |
Player rides and company
| Option | Default | Description |
|---|---|---|
Config.PlayerRequests.Enabled |
true |
/taxi requests on/off |
Config.PlayerRequests.Cooldown |
120 |
seconds between two requests of a player |
Config.PlayerRequests.Timeout |
300 |
an open request expires after … seconds |
Config.Company.AllowPurchase |
true |
players can take over the company |
Config.Company.PurchasePrice |
750000 |
purchase price (does not go into the company account) |
Config.Company.DriverShareDefault |
0.35 |
driver share if the rank sets none |
Config.Company.VehicleSpawnCost |
150 |
operating cost per taxi handed out |
Discord webhook
In config/server.lua (never sent to clients):
ServerConfig = {
LogWebhook = '', -- empty = off
LogWebhookName = 'Pepper Taxi',
}
Gameplay
- Start a shift: press
Eat the centre and pick an unlocked taxi – it spawns on a free parking spot. - Jobs: arrive every 1–5 minutes by default with countdown and sound, as long as you sit in your own taxi and are not on a break.
Yaccepts,Ndeclines. - Pickup: drive to the marked point – the passenger waves, walks to the taxi and gets in.
- Ride: take them to the destination, some missions have stops on the way. The HUD shows route and status.
- Arrival: stop at the destination – stars, pay, XP and reputation appear with the reasons.
Which missions you get depends on level, reputation, rating, vehicle class, time of day and position.
Taxi company
| Mode | Description |
|---|---|
| Public (default) | Nobody owns the company – everyone drives and receives the full pay. |
| Player-owned | Once a player owns the company, only the owner and employees drive. Fares go to the company, drivers receive their rank's share, salaries are paid from the company account. |
Take it over in the tablet (“Take over the company”) or by admin assignment. The owner can give it up, or an admin makes it public again.
Commands and permissions
| Command / key | Who | What |
|---|---|---|
F6 / /taxitablet |
everyone | open the tablet (anywhere on duty, otherwise at the centre) |
Y / /taxiaccept |
drivers on duty | accept a job or the newest player request |
N / /taxidecline |
drivers on duty | decline a job |
/taxi [text] |
everyone | call a taxi – all drivers on duty are notified |
/taxicancel |
everyone | cancel your own request |
E |
everyone | terminal at the centre |
Every player can change the keys in GTA settings → Key Bindings → FiveM.
Admin rights (always checked server-side): ESX group from Config.Admin.Groups (default superadmin, admin)
or ACE pepper_taxi.admin:
add_ace group.admin pepper_taxi.admin allow
With Config.Admin.RequireReason = true every admin change needs a reason; all changes end up in the audit log.
Permissions inside the player company (hire, fire, ranks, vehicles, finance) depend on the rank in
Config.Company.DefaultRanks.
Exports and events
Server exports:
| Export | Returns / description |
|---|---|
GetTaxiPlayerData(source) |
career and statistics (level, XP, reputation, rating …) |
IsTaxiDriverOnDuty(source) |
boolean |
GetTaxiDriverStatus(source) |
status, e.g. 'OFF_DUTY', 'AVAILABLE', 'PLAYER_PASSENGER', 'BREAK' |
SetPlayerPassengerActive(source, active) |
switch “player as passenger” on/off – returns ok, reason |
CreatePlayerTaxiRequest(source, message) |
create a taxi request (e.g. from a phone app) – returns requestId or nil, reason |
CancelPlayerTaxiRequest(source) |
cancel the player's request |
GetOpenTaxiRequests() |
open requests |
GetOnDutyDrivers() |
drivers on duty |
GetTaxiCompany() |
company info (label, mode, balance, employees, owner) |
IsTaxiCompanyEmployee(sourceOrIdentifier) |
boolean, grade |
local onDuty = exports.pepper_taxi:IsTaxiDriverOnDuty(source)
There is deliberately no export that lets other resources create money, XP or reputation.
Server events (internal, AddEventHandler, e.g. for a phone app):
| Event | Parameters |
|---|---|
pepper_taxi:requestCreated |
request |
pepper_taxi:requestAccepted |
request, driverSource |
pepper_taxi:requestClosed |
requestId, reason (finished, cancelled, expired) |
FAQ
The resource does not start or reports missing dependencies.
oxmysql and es_extended must come before pepper_taxi in your server.cfg. The manifest requires server build 7290+
and OneSync – without OneSync the resource does not start.
The console says the database is unavailable, or tables are missing.
Check that oxmysql is running and mysql_connection_string is correct. Config.Database.AutoInstall = true creates
missing tables; alternatively import sql/install.sql.
Does Pepper Taxi run on QBCore or Qbox?
No. The resource uses es_extended directly and is built for ESX Legacy 1.9+ only.
Do players need an ESX job?
No. Everyone can go on duty at the centre. Employees and ranks of a player company are managed by the script itself.
I do not get any jobs.
You must sit in your own taxi (Config.Dispatch.RequireInTaxi), not be on a break and be “available”. Up to 5 minutes can
pass between two jobs (Config.Dispatch.MaxMissionDelay = 300).
At start of duty it says “All parking spots are occupied”.
Remove vehicles from the spawn points or add more entries to Config.Center.SpawnPoints.
The passenger does not get in or does not appear.
After Config.Passenger.BoardTimeout (30 seconds) the NPC is placed into the taxi automatically; the taxi needs free rear
seats for that. If the passenger does not appear at all, check the model in config/customers.lua and look at the F8
console with Config.Debug = true.
The payout is missing after a ride.
The ride was probably implausible – e.g. a teleport, too short (below Config.Security.MinTripSeconds = 25 seconds) or
less than 55 % of the planned distance. The reason is shown in the server console.
The admin section in the tablet is missing.
Your ESX group must be listed in Config.Admin.Groups or you need the ACE pepper_taxi.admin. Then reopen the tablet.
A pickup or destination point is badly placed.
Adjust the coordinates in config/locations.lua (preferably at the roadside) and restart the resource. In the current
resource you can also do it in the tablet under Admin → Locations: move a point to your position, block it for jobs
or reset it – without a restart (new after 1.0.1, listed under “Unreleased” in CHANGELOG.md).
Does every character have their own career?
Yes. Data is stored per ESX character identifier; with esx_multicharacter every character has their own taxi career.
Switching characters ends the shift cleanly.
Can I connect a phone app?
Yes – via the export CreatePlayerTaxiRequest and the events pepper_taxi:requestCreated, requestAccepted and requestClosed.
Does F6 clash with Pepper Bus or Pepper Trucking?
No – Bus uses F7 and Trucking F9. Every player can also rebind the key.
How do I change texts?
All texts are in locales/de.lua and locales/en.lua; pick the language with Config.Locale.
How much performance does the resource need?
Measured with resmon: 0.00 ms idle and 0.01 ms active.
Will an update delete careers or settings?
Careers and the company live in the database; AutoInstall creates new tables on start. Back up your changed files in
config/ and locales/ before updating and carry your changes over to the new version.
Support
Questions and bugs: open a ticket in our Discord: https://discord.gg/6NaFJWKDYu – link your purchase with /verify first.
Permanently tested on the Pepper Scripts dev server.
Changelog
Current version: 1.0.1 (26 Sep 2026) – fixed a crash in the company account of a player company and shifted texts
in the challenge popup. All changes are listed in the CHANGELOG.md file in the resource folder.
Found a mistake? Report it on Discord.