NullSect
Systems nominal

Docs / Taxi / Changelog

Changelog

0.13.1 — in development

Security

  • Admin check: on servers where the ACE check answers 1 / 0 instead of true / false, every player was treated as an admin (0 counts as yes in Lua). On Qbox the fallback admin ACE check had the opposite problem and refused real admins. Both now accept only true or 1 (Utils.AceAllowed).

0.13.0 — in development (taximeter, street hail)

Added

  • New on-screen taximeter with seven-segment digits (DSEG7, SIL OFL): classic LED device with FOR HIRE / HIRED / PAY lamps, waiting time, extras and tariff (day / night / late night), or a slim strip. The meter counts time between server updates, bumps and clicks when the fare goes up and shows PAY with the final fare after the ride.
  • Tablet Settings page: taximeter style (classic / strip / status bar), position, size and sound, with a live preview. Saved per player on the client (KVP).
  • Manual meter (G, rebindable): with a player in the back who did not call, he is offered a metered ride (tariff, maximum hold, accept / refuse card). Accepted rides are billed on distance and time with escrow like "tell the driver" rides; refused or empty-cab meters run for roleplay only (no money, no XP) and are mirrored to player passengers. U pauses the roleplay meter, O adds an extra charge (player rides only). G ends a metered player ride where the cab stands.
  • Street hail (NPC): now and then someone waves at the curb ahead of a free driver (Config.StreetHail). The client only finds the curb; the server checks the spot and assigns the ride. Missed hails cost no reputation.
  • /taksihedef (and the radial item on board): a "tell the driver" / street-hail passenger sends his map mark to the driver as a route; billing stays on the meter.
  • Config.Meter, Config.StreetHail, Config.Features.StreetHail / ManualMeter, new key bindings.
  • Discord log (server/nullsect.lua, Config.Logs): suspicious flags, admin audit rows and payouts from payoutMin are posted to a webhook. The URL is a server convar (set ns_taxi_webhook "...", optional ns_taxi_webhook_<category>), never config.lua, which is sent to the clients. Queued, rate limited, mentions disabled.
  • Update check on start against ns_version_url (fxmanifest) or the nullsect_version_url convar.
  • /nsstatus (admin / console): every running NullSect resource with version, newer version and state.
  • INSTALLATION.md / .tr.md and CONFIGURATION.md / .tr.md.

Changed

  • The server pushes the ride meter every 2 s (was 5 s), including waiting time, extras and tariff.
  • "Tell the driver" rides are billed on the whole ride time, as shown on the meter (the time cap used the 60 s placeholder estimate before).

Fixed

  • Player passengers could miss the PAY screen (and pause / extra changes) of the roleplay meter: a relay sent less than 900 ms after the previous one was refused by the server rate limit. The client now sends it once the gap has passed.
  • The router refuses payloads with NaN / infinite numbers or nesting deeper than 8 levels (NaN passes every range check); Utils.Clamp maps NaN to the minimum.

0.12.0 — in development (Phase 11: security hardening and optimisation)

Security

  • The NPC passenger reported as boarded must be the ped this driver's client spawned (network owner) and of a model of the passenger type; other resources' peds can no longer be tagged and deleted. Arriving at the destination fails when the passenger ped is gone.
  • Repairs are priced again when they finish: damage taken during the service is charged (never below the quote), and the service is bound to the cab it started on.
  • Character / player names are sanitised before they are stored or shown; ~ (GTA text tokens) is stripped from all player text. Company members see each other through opaque references, not framework identifiers.
  • Framework lifecycle events (unload, job change) are ignored when a client triggers them.
  • Soft security flags (expired offer, UI spam, denied admin command) never count towards dropAfterFlags.
  • Location tests (locations:test) are written to the admin audit log.

Economy

  • Player rides: fare escrow. The highest possible fare is held when the caller gets in; the final fare comes out of the hold and the rest is refunded. A caller who cannot cover it is not driven; emptying your accounts or disconnecting on board no longer dodges the fare (a disconnect completes the ride on the distance driven). Config.PlayerRides.escrow.
  • Money owed to an offline player (escrow rest, a driver payout interrupted by a disconnect) is stored and paid on the next login (ns_taxi_refunds).
  • Same caller + same driver again within Config.PlayerRides.pairCooldown (30 min): the fare still transfers, but the driver gets no XP, reputation or rating from it (no farming with a second account).
  • Forgotten item "return it": only counts after the cab has left the drop-off (returnArmDistance, 150 m); the owner waits there for the item.
  • Test rides give no event XP / reputation and do not count towards achievements (police report, event choices, follow-up tasks).
  • The tablet deposit is only refunded when it was paid at the dispatcher (per-character ledger).
  • Companies: disband waits for commissions / deposits still on their way to the database; maxCompanies / maxMembers hold under simultaneous requests; a membership written while the company was disbanded is removed. Optional Config.Fleet.serviceGrade for services paid from the company bank.
  • Achievement rewards go to the character that earned them when a character switch happens during the unlock.

Performance

  • Dashboard refresh no longer runs achievement counters (3 SQL queries every 5 s per open tablet); counter values are cached per character and invalidated by rides / events.
  • Database schema v4 (automatic migration): covering indexes for achievement counters and leaderboards, company log purge index, regulars list rewritten as two index range scans; recent rides / company log order by time.
  • Tablet: unchanged refreshes are not redrawn, pages that do not use the refresh only update the header, fields you are typing in are never reset. The stop countdown reaches the NUI once per second instead of 4x.
  • Luggage props and passengers still getting out are removed on shift end / resource stop.
  • Cooldown tables keyed by character are pruned (no growth over uptime).

0.11.4 — in development

Added

  • /taxitest admin test tools (Config.Debug only): dialogue [id] opens a passenger dialogue now, remark [speed|brake|crash] triggers a passenger remark, luggage / regular [normal|favorite|grudge] shape the next /taxiride passenger, skip jumps to the pickup / destination on a test ride (no teleport flag, no reward).
  • The luggage scene also runs on test rides (without tip / XP).

0.11.3 — in development

Added

  • Luggage at the pickup: the passenger waits at the open trunk; get out and load the bags (E, progress bar) for a rating and tip-chance bonus on that ride. Without help the passenger loads them alone after loadSeconds.
  • Taxi roof sign: lit while you are available on shift, off with a passenger on board (Config.Vehicle.taxiLight).
  • Rankings app on the tablet: earnings, rides, rating (last 7 days), level (all time) and companies, with a podium, your own row and your value when you are outside the list (Config.Leaderboard, cached).
  • Player rating card: custom tip amount (up to maxTip) and an optional note to the driver (noteLength); the driver sees the note as a subtitle and in his trip log. Database schema v3 (ns_taxi_rides.note, automatic migration).

Changed

  • Fonts are bundled with the resource (nui/fonts, SIL OFL) instead of loaded from Google Fonts.
  • Text from players is cut on character boundaries (Turkish letters stay intact).

0.11.2 — in development

Fixed

  • The passenger vanished inside the cab at the drop-off: the session update (ride cleared) could reach the client before the drop-off result and deleted the ped. A passenger sitting in the cab is never deleted any more; he gets out and walks away (also when a ride ends early).
  • The luggage tag never showed on the call ticket.

Added

  • Luggage at the drop-off: the passenger waits at the open trunk; get out, stand at the trunk and press E to unload the bags (progress bar + animation) for a small server-validated extra tip, XP and reputation (Config.Rides.luggage). Without help the passenger takes the bags himself after helpSeconds.

0.11.1 — in development

Added

  • Taxi tablet item (Config.Tablet, item taxi_tablet): a dispatcher NPC at the HQ hands out the tablet (optional deposit) and takes it back. The driver terminal only opens with the tablet on you (item use, /taxi, F6).
  • Shift on the tablet: start / end the shift with the button in the terminal header (anywhere, or only at the dispatcher with shiftAnywhere = false). Ending the shift keeps the terminal open.
  • Losing the tablet (dropped, given away, stored) ends the shift automatically after a short grace period; handing it back ends the shift and refunds the deposit.
  • Tablet prop + animation while the terminal is open on foot (Config.Tablet.animation).
  • Inventory bridge (bridge/inventory.lua: ox_inventory, qb-core / ESX fallback); without an inventory the item checks are skipped.

Changed

  • Terminal side menu and pages scroll like a touch screen: no scrollbars, drag with the cursor, momentum and soft fading edges.

0.11.0 — in development

Added

  • Customer memory: NPC customers remember their drivers. Regulars call again (often to the same place), greet you by ride count, favourites rate and tip better, customers you cancelled on hold a grudge. Offer tags (regular / favourite / remembers you) and a regular customers list on the tablet statistics page.
  • Player taxi requests: /taksicagir (or the radial menu) opens a call card: recorded places near you, your GPS mark, or "tell the driver" (taximeter, capped). Nearby drivers get the request first; the caller sees the driver, plate, ETA, cab blip and live taximeter, pays at the end (bank, then cash, capped) and rates the driver with 1-5 stars and an optional tip. /taksiiptal cancels. Drivers see a "Player" ticket and get the rating + tip.
  • Taxi companies: buy a license at the HQ (fee, level, city limit) or let an admin create one (/taxicompany list | create | delete). Boss / manager / driver grades, invitations, firing, promotions, company bank (deposit / withdraw), commission per fare (0-40%, tips excluded) and a ledger.
  • Company fleet: the boss buys cabs from the company bank, assigns them to drivers or leaves them for everyone; drivers take them at the garage. Services and upgrades of company cabs are paid by the company; mileage is tracked.
  • Tablet Company app (overview, crew, fleet, ledger; license and invitations for non-members).
  • 5 new cab models (Asterope, Washington, Tailgater, Oracle XS, Stretch) and fleet prices for every model.
  • 3 new random events: road rage, paparazzi (premium / VIP passengers), no wallet.
  • 7 new achievements (player rides, 5-star player rides, regular customers, company founder, company rides) and a new achievement type counter.
  • Config.CustomerMemory, Config.PlayerRides, Config.Companies, Config.Fleet; database schema v2 (automatic migration). Exports GetCompany(source); hooks ns-taxi:hook:playerRideRated, ns-taxi:hook:companyCreated, ns-taxi:hook:companyDeleted.

Fixed

  • The tablet card could stay hidden when one focus card was closed and another opened right away.

0.10.1 — in development

Added

  • Ride location tool /taxilocations (admin, like the locksmith /lslocations): record exact pickup / drop-off spots in game (stand where the customer waits, face the street, press E), with name, role (pickup + drop-off / pickup only / drop-off only), tags and airport flag. Stored in data/locations.json, live without restart. Coordinates come from the server-side ped position.
  • Panel with survey map (zoom, focus on selection), search and filters; GPS, teleport, test as pickup / drop-off, edit, move here, delete; default spots can be disabled / enabled one by one.
  • World view (/taxilocations view): ghost customers, coloured markers and labels for nearby spots, optional blips.
  • Config.Locations (useDefaults, file, view range, ghosts, preview ped). Location roles in data/locations.lua.

Changed

  • Recorded spots are used exactly where they were recorded (no sidewalk snapping); drop-off-only spots are never used as pickups, disabled spots are never used at all (dispatch, events, dialogues).

0.10.0 — in development

Added

  • 22 achievements (data/achievements.lua, editable): rides, distance, earnings, quality, specialist and career categories in bronze / silver / gold, with XP and capped money rewards. Unlocks are server-side and guarded by the database (a reward is never paid twice); checks run after rides, after resolved events and on character load.
  • Unlock toast on screen (medal, tier, reward) and an Achievements app on the driver terminal (progress bars, category filters, unlock dates, tier counters).
  • Persistent daily statistics from the ride log: "today" now survives relogs; earnings history chart (last 7 days, configurable), trip log with the latest rides, logbook with today / shift / career columns.
  • Config.Achievements, Config.Statistics; RPCs achievements:list, stats:data; hook ns-taxi:hook:achievementUnlocked (src, id); export GetAchievements(source).

Fixed

  • HUD cards (status bar, call ticket, dialogue, subtitles, toasts) showed a black box around them in game: backdrop-filter has no game pixels to sample in the NUI layer. Removed it; surfaces are opaque slate now.

0.9.1 — in development

Changed

  • Driver dashboard redesigned as an in-cab tablet ("driver terminal"): device frame, status bar with the in-game clock, launcher dock, taxi driver license card, shift meter (LCD), dispatch radio + trip sheet with progress steps, vehicle diagnostics with gauges and warnings, logbook table, workshop catalog.
  • Ride offer is now a dispatch ticket: ticket number, pickup distance and ETA, trip tags (airport, VIP, luggage, night, urgent), passenger likes/dislikes, taximeter-style fare and a countdown ring.
  • Status bar shows a taxi roof sign (for hire / en route / at pickup / hired) and a live taximeter (fare, distance, time) while the passenger is onboard.
  • Ride summary is a printed taxi receipt (company, receipt no., driver, cab, route, fare lines, rating, stamps).
  • Lighter slate/glass surfaces instead of near-black panels.

Added

  • Display-only taximeter fare in ns-taxi:cl:rideMeter (fare, estimate); the payout is still calculated at completion.

0.9.0 — in development

Added

  • NUI driver dashboard (/taxi or F6, ESC to close): home (level, XP, rating, reputation, today), dispatch (offer accept/decline, active ride, cancel, event task, demand per zone), vehicle (condition bars, plate, upgrades, GPS to services), statistics (shift + career), upgrades (buy at the garage).
  • NUI ride HUD: ride offer card with countdown, status bar with passenger, dialogue/event card with key hints, subtitles and an animated ride summary with level progress.
  • Config.UI (accent colour, dashboard key/command, refresh interval, HUD scale, summary duration).

Changed

  • The native text overlay was replaced by the NUI HUD (no per-frame draw loop while riding).

0.8.0 — in development

Added

  • 8 random events: forgotten item (post-ride delivery task), fare dispute, medical emergency, drunk passenger, wrong address, extra stop, vehicle issue (flat tyre / engine warning), suspicious passenger / police request.
  • Event cards with up to 4 options (new 4th answer key K), stop-the-vehicle countdown, task blip and route.
  • EMS / police / mechanic integration (ps-dispatch, cd_dispatch, custom function, server hook ns-taxi:hook:alert); options only appear when responders are on duty.
  • /taxievent [id] admin test command (Config.Debug only). /nstaxi_canceltask to drop an event task.
  • Server hook ns-taxi:hook:eventResolved (src, eventId, choiceId); eventsResolved driver statistic.

0.7.0 — in development

Added

  • 15 passenger dialogues with personality-dependent effects on rating, tips, XP and preferences (EN/TR).
  • Tourist sightseeing detour: optional extra stop that is billed and rewarded; skipping a promised stop hurts.
  • Student discount, VIP discretion, phone-call silence, radio on/off and other conversation outcomes.
  • Passenger remarks on collisions, hard braking and speeding; greeting when boarding; subtitles + ped speech.
  • Quiet passengers now reward silent rides, chatty ones reward conversation.

0.6.0 — in development

Added

  • Cab condition (fuel, cleanliness, exterior, interior, engine) with wear per ride, persisted per cab model.
  • Dirty / damaged cabs: passenger complaints, lower rating, fewer premium/VIP requests; condition warnings.
  • Cleaning station and maintenance station at the company (animation + progress, paid on completion).
  • 11 cab upgrade categories with levels, prices, level requirements and real effects (vehicle mods, comfort, GPS, brakes, suspension, safety, interior, coating, fuel economy, luggage rack).
  • Garage options: check cab condition, upgrades menu. Low fuel warning during rides.

0.5.0 — in development

Added

  • XP per ride with itemised sources (distance, rating, tip, passenger type, long distance, airport, VIP, perfect ride, clean driving, night, events) and a per-ride cap; no XP loss.
  • Reputation gains/losses from passenger ratings with diminishing returns near the top.
  • Reputation tiers now change dispatch frequency and tip chance.
  • Level-up notifications with new title, unlocked features and newly available cabs.
  • Ride summary shows XP, reputation change and level progress.
  • Integration hooks ns-taxi:hook:levelUp, ns-taxi:hook:reputationTier.

0.4.0 — in development

Added

  • Driving score from server-side metrics: safety, comfort, route and timeliness (0-100 each).
  • Passenger rating 1.0–5.0 with personality-aware preferences, dislikes, vehicle condition and incidents, plus 30 passenger comments (3 variants per situation, EN/TR).
  • Tip system based on passenger tip chance, rating, perfect rides and event bonuses.
  • Ride summary card: rating, comment, scores, fare breakdown, tip and total.
  • Profile counters: driver rating, safety average, perfect rides, no-crash rides.

0.3.0 — in development

Added

  • Passenger peds streamed near the pickup with personality-based waiting scenarios, waving, boarding into a free rear seat (trunk opens for luggage) and walking away after drop-off.
  • Server-validated pickup, boarding and drop-off; live meter (distance / time) during the trip.
  • Server-side cab tracker: odometer, speeding, hard braking/acceleration, collisions, idle time, teleport and impossible-trip detection, pickup / boarding / passenger-left timeouts.
  • Final fare from the measured trip and a restart-safe payout pipeline (ride log before money, payout ceiling).
  • Integration hook ns-taxi:hook:rideCompleted.

0.2.0 — in development

Added

  • Shift system at the taxi HQ (start / end with active-ride confirmation).
  • Server-spawned cabs with statebag ownership, vehicle tiers and level-gated models, key and fuel bridges.
  • Dispatch: periodic NPC ride requests, multi-driver offers, atomic first-accept-wins, expiry and revocation.
  • Passenger generation for 15 personality types, destination preferences, dynamic demand zones, time-of-day periods and full fare calculation (estimate shown on the offer).
  • Target bridge (ox_target, qb-target, built-in prompt), UI bridge (ox_lib or native fallback).
  • Admin test command /taxiride (requires Config.Debug, never pays).

0.1.0 — in development

Added

  • Core architecture (Phase 1): framework bridge (Qbox, QBCore, ESX, standalone), notification bridge, single RPC router with flood/rate-limit/lock protection, versioned database migrations, write-through driver profiles, shift/ride state machines, admin commands with audit log, English and Turkish locales.

Cart

Your cart is empty.