Documentation

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/N without 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
  • /taxi requests 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

  1. Download the resource from the Cfx.re portal → Granted Assets.
  2. Extract it to resources/[pepper]/pepper_taxi. Do not rename the pepper_taxi folder – other resources call the exports via exports.pepper_taxi, and the server events use the resource name as prefix.
  3. Add it to your server.cfg after its dependencies:
ensure oxmysql
ensure es_extended
ensure pepper_taxi
  1. Database: with Config.Database.AutoInstall = true (default) the resource creates missing tables on start (13 tables prefixed taxi_). The manual way is importing sql/install.sql – it can safely be imported more than once.
  2. 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

  1. Start the server and check the console that pepper_taxi starts without errors.
  2. Drive to the taxi centre (yellow taxi icon, Downtown Cab Co.) and press E at the terminal.
  3. Pick the standard taxi and get in – the first job arrives after 15–45 seconds.
  4. Accept with Y, pick up the passenger and stop at the destination – stars, pay and XP appear.
  5. 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

  1. Start a shift: press E at the centre and pick an unlocked taxi – it spawns on a free parking spot.
  2. 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. Y accepts, N declines.
  3. Pickup: drive to the marked point – the passenger waves, walks to the taxi and gets in.
  4. Ride: take them to the destination, some missions have stops on the way. The HUD shows route and status.
  5. 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.