NullSect
Systems nominal

Docs / Bus / Changelog

Changelog

1.1.3

Fixed

  • Utils.Clamp returned NaN unchanged; it now maps NaN to the minimum (the router already refuses NaN payloads).

Development

  • ARCHITECTURE.md: start-up order, state machines, request contract, data ownership, database, lifecycle.
  • Offline tests (lua5.4 tests/run_tests.lua): router validation order and payload limits, rate limit, admin permission, lock release, career load, route state machine, database whitelist guards. Not shipped.

1.1.2

Fixed

  • Pull-over: the police car stopped behind the bus but the officer never got out. The officer started walking before the exit was over, which cancelled it and left them seated (more likely now that the car is networked). The officer now gets out first (control of the ped is taken back if needed, the escort task is cleared, the door is unlocked), and a stuck exit ends with them stepping out at once; only then do they walk to the driver

1.1.1 (field test fixes)

Fixed

  • Other players could not see police inspections: the officer and the police car were created on the driver's game only. They are now networked (Config.Inspection.Networked, on by default) and stay with the driver's game, so riders and everyone around see the officer walk up and the pull-over
  • Players riding the bus were not counted on the driver console and could be missed by police checks: the server copy of a passenger lags behind on server-created buses. The rider's game now tells the server when they sit down in a bus on a route and when they get off (tm:ride), believed only while the player is next to the bus; a stale "still in the bus" after getting off no longer counts. The console's passenger load and capacity include player riders and update as they get on and off

Added

  • Player riders get a notice when a police inspection starts and when their ticket was checked; the inspection report counts the players checked and those without a ticket

1.1.0 (ticket machine on board)

Added

  • Ticket machine for real players (Config.TicketMachine): riding a bus that is on a route, K opens the machine. Riders buy a single ticket (60 minutes on every bus), a discount ticket (this ride only) or a day pass; the ticket is printed in the character's name, paid from cash (bank if cash is short) and kept in the new ns_bus_tickets table (migration 8), so it survives a relog. One valid ticket at a time
  • The driver opens the same machine: the players on board with their ticket, an offer button per product, what was sold on this route. An offer shows up on the rider's screen with a countdown; Y pays, N declines (rebindable, Config.TicketMachine.Keys). The driver gets DriverCommission (15%) of every sale on their bus at once, tickets_sold and ticket_commission career counters
  • Police inspections check player riders: one without a valid ticket pays PassengerFine themselves and gets off the bus once it stands still; the driver is never blamed for them
  • The route report shows the tickets sold on board and the commission
  • A hint names the key when a player gets on a bus that is on a route; buses on a route carry the line in a state bag (nsBusRun)
  • Router actions tm:open, tm:buy, tm:offer, tm:answer (rate limited, the rider's seat in the bus is checked on the server); test suite tests/test_phase15.lua (buying, offers, commission, money accounts, ride-only tickets, relog, inspections, races, input fuzz)

1.0.0 (Phases 14 to 16)

Security (Phase 14)

  • Request payloads: numbers must be finite (NaN and infinity slipped through range checks), keys at most 64 bytes, on top of the existing size and depth limits
  • Teleporting from stop to stop: a stop reached faster than Config.Security.MaxAverageSpeed (40 m/s, straight line from where the bus left) is refused and flagged, so a teleporting bus earns nothing faster than a driving one
  • Two drivers taking a bus at the same moment could get the same parking spot; a spot is now reserved until its bus exists
  • Asking for the same ticket again and again no longer holds a stop open: the decision time grows at most twice
  • New exploit and race test suite (tests/test_phase14.lua): every action fuzzed by a stranger, a driver on a route and an admin; players acting on each other's passengers, door, conversation and bus; simultaneous bus takes, two officers on one bus, double upgrade and service; request floods; leaving during a service, a pull-over, a talking inspection and at the door

Performance (Phase 15)

  • The damage reader looks the bus up once a second and reads less often while the bus stands
  • Every client and server loop documented with when it runs and how often (ARCHITECTURE.md, performance model); none runs while idle

Documentation (Phase 16)

  • README: features of 1.0, troubleshooting table; INSTALLATION: start order note for keys and fuel resources, first steps, the keys players should know; CONFIGURATION: every option documented (checked against config.lua)

0.13.1 (field test fixes)

Fixed

  • Collisions and damage were not counted in game: the server copy of the bus health lags under OneSync, and a bus loses little body health in a crash. The driver's game now reports engine and body health while driving (fleet:damage), plus the impact it felt (a sudden velocity change of SafeDriving.ImpactKmh). The server still only takes health downwards, so a forged report cannot repair a bus. Scraping along a wall counts as one collision (SafeDriving.CollisionGapMs). With Config.Debug.Enabled every damage report is logged to the server console
  • No stop request chime: the bell is now a bundled sound file (nui/sounds/stop.ogg) played through an HTML5 audio element, with the generated tone as a fallback. This also removes the "could not find file nui/sounds/*.ogg" warning
  • Passengers at the door boarded without the driver's decision: Config.Tickets.DriverDecides (on by default) keeps everyone at the door until you let them in or refuse them, and the stop waits for it (DriverDecideSeconds, default 30)
  • Target options on passengers never showed: ox_target looks networked peds up by network id. They are now registered with both handle and network id
  • Police inspections almost never came (5% per stop on city lines, then a 20 minute break). Config.Inspection.Chance is now the chance per route (city 35%, night 60%), spread evenly over the stops; the break is 10 minutes
  • /busassignments picked the same assignments again (the pick is seeded per driver and period). A reroll now picks new ones right away, avoids the previous pick when there are enough to choose from, and refreshes the HUD task line
  • The driver console moved off the right edge of the screen with a long line name; the LED sign now cuts the name with an ellipsis
  • No keys for the bus when the keys resource starts after ns-bus in server.cfg: the keys provider (and ox_inventory, and the fuel mode) is detected again when it is needed; the ready line names the keys resource, and a missing one is warned about once. qbx_vehiclekeys now shows its own "keys received" notice

Changed

  • Passenger conversations and events: every one has two answers, 1 positive and 2 neutral or refusing; 3 is not answering (counted like letting the time run out). The passenger's line and the answers show on a card above the console (in the same hardware look) with the time left; keys Config.Social.AnswerKeys, rebindable. While the card is up, 1 - 3 do not select weapons or use the ox_inventory hotbar. F6 no longer opens the answers. A hint at the start of a route names the keys

Changed (inspections and the door)

  • Routine inspections are planned one leg ahead: the officer already waits at the coming stop (its inspection point, else the waiting area) before the bus gets there, and walks to the front door when the doors close. No more officer appearing next to the bus

  • New: pull-overs. Some routine inspections (Config.Inspection.Pullover.Share) happen on the road: a police car with its siren on comes up behind the bus; stand still and the officer gets out and checks the bus. Not stopping within TimeoutSeconds counts as fleeing: fine, reputation and a failed inspection. /businspection pullover starts one

  • The door check: every passenger at the door shows their ticket and ID card on a panel (opened by itself in the driver seat); compare the names. New ticket type BORROWED_TICKET: someone else's card, which the validator accepts, only the names differ. Keys: Y let in, N refuse (only active while someone is at the door). The check key is gone; Tickets.XP.Check is 0 by default since every passenger is checked

  • The officer talks: a routine inspection is a conversation on the same card as passengers (1 / 2 / 3). The officer walks to the bus first (12 seconds for a pull-over, so they no longer check and leave as soon as you stop), greets you, checks the bus, then tells you the result. Polite answers lower the driver fine, silence raises it (Config.Inspection.Dialogue)

  • Bus garage and service bay screens in the duty terminal look: the garage shows a painted parking bay per model with the driver's own bus (side view, condition, odometer, upgrades, level lock) and takes it with Enter; the service bay shows the bus on the lift and the refuel / clean / repair jobs with what is missing, time and cost (keys 1 - 3); the job runs on a work card without focus (X cancels). With Config.UI.Dashboard = 'menu' the ox_lib menus stay

  • Turkish: a bus tier now reads "Sınıf" instead of "Seviye", so it is not mixed up with the career level

Removed

  • The driver no longer starts conversations: the "Talk" target option, dialogue:talk and the talk conversation are gone, with Config.Social.TalkCooldownSeconds / TalkDistance. Passengers still start them

Added

  • /bustalk [id] developer command: a seated rider starts a conversation now
  • /businspection tells how many seconds until the officer checks the bus, or why it cannot start, and logs to the server console

0.13.0 (Phase 13, development build)

Added

  • Every driver has their own bus of each model: fuel, engine, body, cleanliness, interior and the distance driven carry over between shifts (ns_bus_fleet, migration 7)
  • Fuel: used by distance (internal mode), or owned by a running fuel resource that the bus reports (external mode, detected automatically); warnings at 25% and 10%; an empty tank stops the engine
  • Damage from the game (engine and body health), only going down during a shift; a destroyed bus comes back from the yard patched up
  • Cleanliness drops with distance and passengers, the interior wears with passengers; a dirty, worn or damaged bus upsets passengers (one complaint per route)
  • Service bay at the depot (its own point or the return point, key G or the dashboard): refuel, clean, repair, timed and checked on the server; repairs cost the driver
  • Safe driving: collisions during a route cost route score, reputation (capped) and the perfect route; a route without a collision gives an XP bonus; safe_routes counter
  • A route needs enough fuel and a working engine to start
  • Vehicle progression: upgrades per bus (comfort, economy engine tune, easy-clean interior, heavy-duty seats) bought at the desk, with career level and distance requirements; brakes, engine, suspension, doors and safety prepared for later
  • Driver console: fuel gauge, engine and cleanliness lamps; dashboard Vehicle tab: gauges, odometer, service buttons, upgrades, condition of every bus; admin vehicles: fuel, engine, cleanliness of the buses out; trip slip: collisions
  • Exports GetBusCondition and RepairBus (mechanic scripts)

Testing notes

  • Phase 13 server logic tested with the emulated server (24 tests); mutation check 29/29. Not yet tested in game (entity health and fuel on a real bus, progress bars, service prompts).

0.12.1 (interface redesign, development build)

Changed

  • The interface is now built from the objects of the job instead of generic panels:
    • Driver console next to the steering wheel: dot-matrix LED sign with line code and final stop, schedule deviation (due in / due now / late), stop line, red "Stopping" lamp for stop requests, front and rear door lamps, departure countdown, seat load bar, score, shift time and earnings, the current assignment
    • Depot duty terminal: driver card (staff number, licence, hire date, barcode), shift sheet, soft keys 1-7 (number keys work too), departure board for routes, duty orders on paper with punch holes and stamps, rank insignia, a side drawing of the shift bus, 7 day earnings chart and logbook, enamel medals
    • Printed paper: thermal trip slip with dotted leaders, barcode and a PERFECT stamp; inspection form with checks, signature line and stamp; passenger tickets with a stamp and magnetic stripe
    • Control room (/busadmin): network map with every active line, the stops and the buses out right now, the drivers on the radio, status lamps, soft keys
  • IBM Plex Mono added for printed paper (local font, SIL Open Font License)

Added

  • Dashboard data: hire date, staff number (derived, the identifier itself is never sent), last 7 days per day
  • Route state: time until the current stop is due; admin overview: bus positions and their line
  • The NUI screenshot check also fails on untranslated keys on screen, checks the number keys and the late schedule

0.12.0 (Phase 12, development build)

Added

  • City Transit interface (NUI) with its own look: an amber LED destination sign, transit line diagrams, local Barlow fonts; English and Turkish from the locale files, no fixed text in the page
  • Driver dashboard (depot desk, the route key between routes, /busprofile): routes with their first and last stop and lock reasons, career with the rank line, daily and weekly assignments with collect buttons, the bus and the fleet, statistics (today, last 7 days, recent routes, most driven lines, all-time numbers), achievements, police inspections; start and end the shift and take a bus from the panel at the desk
  • Route panel while driving: previous, current and coming stops on a line, doors countdown, getting on and off, stop requests, passengers, route score, shift time and earnings, the current assignment, ticket / conversation / inspection prompts
  • Route report, police inspection report and ticket card as cards on screen
  • Admin dashboard (/busadmin): overview (drivers on shift, buses out, today and 7 days, inspections and fines, most driven lines, recent admin actions), drivers with their career and recent routes, stop editor with capture buttons and "hide panel" to walk to the next point, route editor with drag and drop ordering, a schematic map (click a grey stop to add it), per-stop settings and route settings, vehicles, inspections, test drives
  • Route score: punctuality of the stops decided so far
  • Shift earnings and routes, sent to the client after every completed route
  • Config.UI (dashboard, route panel, reports and admin panel each nui or the ox_lib version, panel position, size, report time) and Config.Statistics
  • Server actions dashboard:open, admin:overview, admin:driver

Changed

  • /busadmin opens the admin dashboard; Config.UI.Admin = 'menu' keeps the ox_lib menus
  • The route key between routes opens the dashboard on the Routes tab (Config.UI.Dashboard = 'menu': the old route list)
  • Route runs keep perfect, evaded and the inspection result in their statistics

Testing notes

  • Phases 7 to 11 not yet tested in game (postponed); Phase 12 builds on them.
  • Phase 12 server logic tested with the emulated server (12 tests). The NUI was rendered in headless Chromium with sample data: every view in English at 1920x1080 and 1280x720 and the main views in Turkish, with no page errors; ESC closing and HTML escaping are checked there too. Not yet tested in game (FiveM CEF, focus, keys, drag and drop in game).

0.11.0 (Phase 11, development build)

Added

  • Career menu at the depot desk, in the route menu and with /busprofile: level, rank and XP bar, reputation, daily and weekly assignments, achievements, statistics
  • More XP: per km (long routes), per requested stop served, bonus for no missed stop and for a perfect route, friendly conversations (capped per route), passed police inspections
  • Perfect route: no missed stop, every stop on time, no fare dodger through, no requested stop driven past, at least 4 stops and (with passengers) 75% satisfaction; shown in the route report
  • Daily and weekly assignments (data/assignments.lua): picked per driver by level and by the route types on the server, saved for the whole period, reset at ResetHour (weeks on Monday); rewards money, XP, reputation or an unlock, paid exactly once, automatically or from the menu
  • Achievements (data/achievements.lua): career statistics, counters, levels or single events; checked on load, so drivers who already reached one get it too; hidden achievements; rewards paid exactly once
  • New counters (ns_bus_counters): stops served, clean and perfect routes, requested stops served, inspections passed
  • Notices for completed assignments and unlocked achievements
  • Route report: fare dodgers who got through, police inspection result, reputation change, perfect route
  • Exports GetReputation, HasAchievement, HasUnlock; server events ns-bus:sv:achievementUnlocked, ns-bus:sv:assignmentCompleted, ns-bus:sv:rewardUnlocked
  • Assignment and counter tables (migration 6)
  • /busassignments [id] developer command

Changed

  • Missed stops cost reputation (1 per stop, at most 3 per route)

Testing notes

  • Phases 7, 8, 9 and 10 not yet tested in game (postponed); Phase 11 builds on them.
  • Phase 11 server logic tested with the emulated server (16 tests). The career menu, the notices and the depot / F6 entries are not yet tested in game.
  • The test database layer now counts matched rows for updates like oxmysql does, so every "exactly once" gate is tested under real conditions; every earlier test still passes.

0.10.0 (Phase 10, development build)

Added

  • Routine police inspections at stops: chance by route type (city 5%, airport 10%, night 20%, event 15%), at most one per route, a break per driver; an officer waits at the door, the route waits and goes on afterwards
  • Checks: the driver (job, when required), the bus (the driver's shift bus) and the riders' tickets; fare dodgers are taken off the bus
  • Driver fine only for dodgers the driver let on (none for one who slipped past unnoticed, half when "Ticket required" was ignored, full when checked and let in anyway); halved when tickets were checked on the route, higher for repeat offenders, capped; charged exactly once
  • Real police players: "Inspect bus" on any bus on a route (police job, on duty, close, bus standing still); they see driver, route, inspection history and the ticket list (each configurable), then issue or waive the fine the server calculated
  • Inspection report for driver and officer (passengers, valid / invalid tickets, violations, fine, passed / failed); reputation and career statistics
  • Inspections are dropped when the officer leaves or the driver cancels; open inspections after a restart never fine anyone
  • Inspection records (ns_bus_inspections, migration 5)
  • /businspection [id] developer command

Testing notes

  • Phases 7, 8 and 9 not yet tested in game (postponed); Phase 10 builds on them.
  • Phase 10 server logic tested with the emulated server (14 tests). Police menus, the target option on buses and the officer at the door are not yet tested in game.

0.9.0 (Phase 9, development build)

Added

  • Passenger personalities (commuter, student, tourist, elderly, business, quiet, social, impatient, friendly, angry, drunk, confused, VIP): starting mood, chattiness, patience with delays, fare dodging, refusing the first ticket check, walking speed, greeting
  • Passenger satisfaction (mood 0-100): late arrivals, missed stop requests, conversations and events change it; the average of delivered passengers shows in the route report and moves reputation on completion
  • Conversations from data/dialogues.lua (route questions, small talk, complaints about delays, compliments and more); answer with F6 from the HUD prompt; unanswered ones expire
  • Random passenger events, each in its own module (server/events/): argument, lost item, wrong line, emergency stop request, sick passenger (onboard emergency: the route waits, stop the bus / call EMS / drive on), blocked door, suspicious passenger (police alert)
  • Passenger lines as subtitles: greeting at the door, excuses of refused fare dodgers, refusing to show a ticket, goodbyes
  • On foot near a passenger: "Talk" and "Ask destination" target options
  • /busevent [event] [id] developer command

Changed

  • Fare dodger excuses now come from the passenger's personality (server side)

Testing notes

  • Phases 7 and 8 not yet tested in game (postponed); Phase 9 builds on them.
  • Phase 9 server logic tested with the emulated server (18 tests). Subtitles, the F6 answer menu, target options and dispatch alerts are not yet tested in game.

0.8.0 (Phase 8, development build)

Added

  • Stop requests: riders press the stop button 120-320 m before their stop; the server measures the distance from the bus position, the client cannot press it
  • Chime when a rider presses the button (built in, adjustable volume; or your own file, a GTA sound, or none) and a notice for the first request of a stop; repeat requests do not spam
  • HUD line for the coming stop: STOP REQUEST with the number of riders and a bell, people waiting, or "Nobody waiting, no request"
  • Empty stops (nobody waiting, nobody wants off) can be driven past without penalty and without pay; the final stop is always served
  • Driving past a requested stop: the riders sit down unhappy and get off at the next stop; reputation loss per missed requested stop, capped per route, settled on completion
  • A rider may change their mind and get off at the next stop
  • F6 menu: passengers on board, where each gets off and who requested the stop
  • Route report shows missed requested stops
  • /busstoprequest [id] developer command
  • NUI page (sound only for now; the UI arrives in Phase 12)

Changed

  • Config.Passengers.PerStop default minimum is now 0, so some stops are empty

Testing notes

  • Phase 7 not yet tested in game (postponed); Phase 8 builds on it.
  • Phase 8 server logic tested with the emulated server (12 tests). The chime, HUD line and F6 passenger list are not yet tested in game.

0.7.0 (Phase 7, development build)

Added

  • Tickets: every passenger carries a standard, discount or special ticket, an expired one or none; the ticket stays on the server until you check it
  • The door: while passengers get on, one stands at the door at a time. Validator beep: they have a ticket. "Ticket required": they don't. Silence: a fare dodger slipping past
  • Three keys while someone is at the door: Y check ticket, U let in, J refuse (rebindable); the prompt shows in the HUD
  • Ticket card after a check: name, ticket, destination, valid or not
  • Refused fare dodgers may try once more; refusing a passenger with a valid ticket counts against you
  • Settled when the route is completed: XP for checks and stopped fare dodgers, reputation for good or bad ticket control (capped per route), profile statistics (tickets checked, fare dodgers stopped and missed); nothing for cancelled routes
  • Route report shows tickets checked and fare dodgers stopped
  • Passengers keep what happened at the door (checked, boarding mode, evaded) for police inspections in Phase 10
  • Passenger names (data/passengers.lua)
  • /busticket [id] developer command

Fixed

  • Total earnings in the career profile now grow with every paid route

Testing notes

  • Phase 6 verified in game on Qbox.
  • Phase 7 server logic tested with the emulated server (16 tests). The door prompt, keys and card are not yet tested in game.
  • The test scheduler no longer lets periodic loops push time forward inside a request, which made timing tests stricter; every earlier test still passes.

0.6.0 (Phase 6, development build)

Added

  • NPC passengers wait at the stops (waiting area, spawn points, or the nearest pavement), with idle animations, and turn towards the bus as it arrives
  • At a stop: people get off first, then the queue boards one by one into its reserved seat; the doors open and close with the stop
  • Every passenger has a destination further down the line and gets off there; if you miss their stop they get off at the next one
  • Bus capacity: the smaller of the model's capacity and its real seats; seats taken by players are never assigned; extra passengers stay at the stop with a "no available seats" notice
  • The stop lasts until everyone is on and off (at least the stop's waiting time, at most MaxServiceSeconds more); stuck passengers are placed in the seat or outside, never at your cost
  • Pay and XP per passenger taken to their stop; passenger totals in the route report, the run record and the career statistics
  • Passengers are networked by default, bound to the route on the server and removed on route end, cancel, disconnect, character change and resource stop
  • HUD shows passengers on board and whether people are getting on or off
  • Passengers in admin test drives, using your own vehicle's seats
  • /buspassenger [id] developer command
  • Vehicle models can list their passenger seats and the doors opened at stops

Changed

  • The server checks a bus at a stop every few seconds instead of only at the end of the waiting time, so driving off early is noticed sooner

Testing notes

  • Phase 5 verified in game on Qbox.
  • Phase 6 server logic tested with the emulated server (19 tests). Ped behaviour (walking, boarding, seats per bus model) is not yet tested in game.

0.5.0 (Phase 5, development build)

Added

  • Driving routes: press F6 (rebindable) in the driver seat of your bus to pick a route; routes show why they are locked (level, bus tier, closed stop)
  • Navigation: the next stop gets a GPS route, the following stops numbered blips; a small HUD shows the next stop and the doors-open countdown
  • Stop arrival checked by the server: bus position, near-zero speed and heading; doors-open time kept on the server
  • Missed stops: driving past a stop, leaving before the doors close, or skipping ahead; the final stop must always be served
  • Schedule and punctuality: expected arrival from distance, late only after a grace period, early is never punished
  • Pay and XP on completion, with on-time bonus, difficulty and route multipliers; small reputation gain for clean routes
  • Every run is recorded (ns_bus_runs, migration 4) and paid exactly once; unfinished runs after a restart are cancelled and never paid
  • Route cancelled automatically when the bus is lost, the driver disconnects or the shift ends
  • Admin test drive from /busadmin in your own vehicle: skip or teleport to stops, no pay, XP or records

Fixed

  • Routes loaded from the database treated every stop as skipped (oxmysql returns in_service as true/false), so starting a route failed with "needs more stops in service" and saved routes could not be edited
  • The test emulator now returns TINYINT(1) columns as booleans like oxmysql

Testing notes

  • Phase 4 verified in game on Qbox.
  • Phase 5 server logic tested with the emulated server (23 tests). Not yet tested in game.

0.4.0 (Phase 4, development build)

Added

  • Route builder in /busadmin: create routes from existing stops, reorder them, remove them
  • Per route: code, name, type (city, airport, express, night, tourist, event, long distance), difficulty, one way or round trip, required career level, minimum bus tier, payout multiplier, map color
  • Express routes: mark stops as skipped; first and last stops always stay in service
  • Optional waiting time per stop
  • Duplicate a route, or generate its return route (stops reversed, linked to the original)
  • Map preview: the route is drawn along real roads with the game GPS, stops as numbered blips (start green, end red, skipped grey); shown automatically while editing
  • Deleting a route needs its code typed in; unsaved changes ask before being discarded
  • Routes stored in the database (ns_bus_routes, ns_bus_route_stops, migration 3); a stop used by a route cannot be deleted
  • Example route from the 5 example stops, created once on first start (data/routes.lua)

Testing notes

  • Phase 3 verified in game on Qbox.
  • Phase 4 server logic tested with the emulated server (22 tests).

0.3.0 (Phase 3, development build)

Added

  • /busadmin stop manager for admins: create, edit, enable/disable, delete, teleport
  • Stop editor captures positions from where the admin stands or parks (the server reads the position; clients never send coordinates): bus stopping position with heading, passenger waiting area, NPC spawn points, boarding and exit points, ticket inspection area
  • Stop radius, door side, blip and display name per stop
  • Stops stored in the database (ns_bus_stops, migration 2) with optimistic locking for two admins editing at once
  • 5 example stops created once on the first start (data/stops.lua); never re-created after admins delete them
  • Optional public stop blips (Config.Stops.ShowBlips)
  • Markers for the stop being edited and a "show stop markers" toggle for admins

Testing notes

  • Phase 2 verified in game on Qbox.
  • Phase 3 server logic tested with the emulated server (21 tests).

0.2.0 (Phase 2, development build)

Added

  • Bus depot with blip and desk NPC (spawned only when a player is nearby)
  • Shifts: start and end at the depot desk, optional job requirement
  • Bus garage: 5 bus models with career level locks, server-side spawn on a free bay, unique plates, vehicle keys (qbx_vehiclekeys, qb-vehiclekeys or custom)
  • Return point at the depot
  • Automatic cleanup of the bus on shift end, disconnect, character change and resource stop
  • Destroyed or removed buses are detected; buses left far away are taken back after a warning
  • /buscoords dev command copies your position as a vector4
  • busperms [id] console command shows a player's ns-bus permissions and identifiers

Fixed

  • Permission checks now work on runtimes where IsPlayerAceAllowed returns 1 instead of true
  • The denied dev command log now names the missing ACE

Testing notes

  • Phase 1 verified in game on Qbox.
  • Phase 2 server logic tested with the emulated server (28 tests). Default depot coordinates are examples.

0.1.0 (Phase 1, development build)

Added

  • Driver career profile per character: XP, derived level, 9 ranks, reputation, lifetime statistics
  • Automatic, non-destructive database migrations and sql/bus.sql for manual installs
  • Server request router with rate limiting, per-player busy lock, payload validation and suspicious-behaviour logging
  • Route, stop, passenger, seat and inspection state machines (used by upcoming phases)
  • Framework bridge for Qbox, QBCore and ESX
  • Target, inventory, fuel, dispatch and notification bridges
  • English and Turkish locales
  • Developer commands /busdebug, /buscareer, /busxp, /busreputation with audit log
  • Server exports GetDriverState, GetActiveRoute, GetPassengerCount, GetCareerLevel

Testing notes

  • Server logic tested against MariaDB 10.11 with a Qbox emulation (see tests/).
  • Not yet tested in a live FiveM server. QBCore, ESX, target, fuel and dispatch bridges are not verified in game.

Cart

Your cart is empty.