Dokumentation

Pepper Bus

Busfahrer-Karriere mit echtem Linienbetrieb, Fahrplan, 50 Leveln und Linien-Editor im Spiel – ESX Legacy.

Überblick

Pepper Bus ist eine langfristige Busfahrer-Karriere für ESX Legacy: echte Linien mit Haltestellen, NPC-Fahrgäste, die ein- und aussteigen, ein mitlaufender Fahrplan mit Pünktlichkeit, 50 Level, Reputation, Bewertungen, Challenges und ein optional spielergeführtes Busunternehmen. Admins bauen eigene Linien im Linien-Editor direkt im Spiel. Alles läuft über das Fahrer-Tablet (F7) am Busbetriebshof.

  • 14 Standardlinien, 10 Linientypen, 9 Fahrgasttypen mit eigenem Fahrpreis und Komfortansprüchen
  • Haltestellen mit Türen, Mindesthaltezeit und Fahrplan – pünktliche Haltestellen bringen Bonus
  • 6 Busse vom Shuttlebus bis zum Festival-Bus, freigeschaltet über die Karriere
  • 1–5 Sterne aus Pünktlichkeit, Fahrweise, Tempo, Kollisionen und Schaden, Reputation von Bronze bis Legende
  • Sonderfahrten mit echten Spielern, Busunternehmen (öffentlich oder Spielerfirma)
  • Linien-Editor und Adminpanel mit Audit-Log, Deutsch und Englisch

Voraussetzungen

Abhängigkeit Pflicht/optional Wofür Link
FiveM-Server-Build 7290+ mit OneSync Pflicht in fxmanifest.lua als /server:7290 und /onesync hinterlegt https://docs.fivem.net/docs/server-manual/setting-up-a-server/
ESX Legacy 1.9+ (es_extended) Pflicht Spieler, Geld, Admin-Gruppen, Charaktere https://github.com/esx-framework/esx_core
oxmysql Pflicht Datenbank (Karriere, Linien und Haltestellen, Unternehmen, Logs) https://github.com/overextended/oxmysql
Tank-Script optional Busse bekommen beim Ausparken den Statebag fuel gesetzt (Config.VehicleRules.Fuel) –

ox_lib, ox_target und ox_inventory werden nicht benötigt. Ein ESX-Job ist nicht nötig. Pepper Bus läuft nur mit ESX Legacy (kein QBCore/Qbox).

Installation

  1. Ressource im Cfx.re-Portal → Granted Assets herunterladen.
  2. Nach resources/[pepper]/pepper_bus entpacken. Den Ordnernamen pepper_bus nicht umbenennen – andere Ressourcen rufen die Exports über exports.pepper_bus auf.
  3. In der server.cfg nach den Abhängigkeiten eintragen:
ensure oxmysql
ensure es_extended
ensure pepper_bus
  1. Datenbank: Mit Config.Database.AutoInstall = true (Standard) legt die Ressource fehlende Tabellen beim Start selbst an (14 Tabellen mit Präfix bus_). Manuell importierst du sql/install.sql – die Datei kann gefahrlos mehrfach importiert werden. Beim ersten Start werden die 14 Standardlinien aus config/routes.lua angelegt (Config.Database.SeedDefaultRoutes).
  2. Adminrechte vergeben (Details unter „Befehle und Rechte“), z. B.:
add_ace group.admin pepper_bus.admin allow
  1. Die Standardlinien einmal abfahren und Haltestellen bei Bedarf im Linien-Editor korrigieren.

Pepper Bus nutzt keine Inventar-Items – es müssen keine Items oder Bilder angelegt werden.

Erster Test

  1. Server starten und in der Konsole prüfen, dass pepper_bus ohne Fehler startet.
  2. Zum Busbetriebshof fahren (Bus-Symbol auf der Karte, Los Santos Transit) und am Terminal E drücken.
  3. Den Shuttlebus wählen, mit F7 das Tablet öffnen und eine freigeschaltete Linie wählen.
  4. An der ersten Haltestelle im Radius anhalten, Fahrgäste ein- und aussteigen lassen und bis zur Endhaltestelle fahren – danach erscheinen Sterne, Auszahlung und XP.
  5. Als Admin im Tablet unter Admin → Linien-Editor prüfen, ob die Standardlinien angelegt sind.

Konfiguration

Alle Einstellungen liegen offen in config/ (per Asset Escrow lesbar und editierbar):

Datei Steuert
config/config.lua Sprache, Datenbank, Betriebshof, Tablet, Leitstelle, Haltestellen, Fahrplan, AFK, Sicherheit, Fahrgäste, Vergütung, Schäden, Bewertung, Reputation, Dienstbonus, Fahrzeugregeln, Sonderfahrten, Unternehmen, Admin
config/vehicles.lua Busklassen, 6 Busse mit Plätzen, Türen und Voraussetzungen
config/routetypes.lua 10 Linientypen
config/routes.lua 14 Standardlinien und Haltestellen (nur beim ersten Start übernommen)
config/passengers.lua 9 Fahrgasttypen
config/levels.lua XP-Kurve, Titel, Level-Belohnungen
config/challenges.lua Pools für tägliche und wöchentliche Challenges
config/server.lua optionaler Discord-Webhook für Logs (nur serverseitig geladen)
locales/de.lua, locales/en.lua alle Texte im Spiel und im Tablet

Allgemein

Config.Locale = 'de'
Config.TimeSource = 'game'
Config.Database = { AutoInstall = true, SeedDefaultRoutes = true, SaveInterval = 300 }
Option Standard Beschreibung
Config.Locale 'de' Sprache (de oder en)
Config.Debug false ausführliche Logs zur Fehlersuche
Config.TimeSource 'game' Tageszeit für Linien und Fahrgäste: 'game' oder 'server'
Config.Database.SeedDefaultRoutes true Standardlinien anlegen, wenn noch keine Linien existieren
Config.Center.MaxStartDistance 70.0 Dienstbeginn nur so nah am Betriebshof (serverseitig geprüft)

Tablet und Leitstelle

Standardmäßig wählen Fahrer ihre Linie selbst im Tablet. Mit Config.Dispatch.Enabled = true schickt die Leitstelle zusätzlich Linienangebote; Linien, die lange niemand gefahren ist, bringen dann bis zu +25 % Nachfragebonus.

Option Standard Beschreibung
Config.Tablet.DefaultKey 'F7' Taste für das Tablet
Config.Tablet.AcceptKey / DeclineKey 'Y' / 'N' Leitstellen-Angebot annehmen / ablehnen
Config.Dispatch.Enabled false Leitstelle schickt zusätzlich Angebote
Config.Dispatch.OfferTimeout 30 Sekunden zum Annehmen
Config.Dispatch.DemandBonusMax 0.25 maximaler Nachfragebonus

Haltestellen und Fahrplan

Config.Stops = { Radius = 14.0, MaxStopSpeed = 1.5, BaseDwell = 4, DwellPerPassenger = 1.2, MaxDwell = 25, ... }
Config.Schedule = { ExpectedSpeed = 12.0, OnTimeTolerance = 45, EarlyLimit = 60, ... }
Option Standard Beschreibung
Config.Stops.Radius 14.0 Standardradius einer Haltestelle (je Haltestelle im Editor änderbar)
Config.Stops.MaxStopSpeed 1.5 m/s (~5 km/h) – darunter steht der Bus an der Haltestelle
Config.Stops.BaseDwell 4 Sekunden Mindesthaltezeit …
Config.Stops.DwellPerPassenger 1.2 … plus Sekunden je Fahrgast (höchstens MaxDwell = 25)
Config.Schedule.OnTimeTolerance 45 Sekunden zu früh/zu spät, die noch als pünktlich gelten
Config.Schedule.EarlyLimit 60 mehr als 60 s zu früh = Fahrplan nicht eingehalten
Config.PassengerDoors { 1, 3 } Tür-Slots, die an Haltestellen öffnen (je Bus über doors änderbar)

Fahrgäste und Vergütung

Option Standard Beschreibung
Config.Passengers.RushHours { { 7, 9 }, { 16, 19 } } Stoßzeiten mit mehr Fahrgästen (RushFactor 1.6)
Config.Passengers.MaxBoardPerStop 8 höchstens so viele Einsteiger je Haltestelle
Config.Passengers.MaxVisible 12 sichtbare NPCs im Bus (der Rest wird mitgezählt)
Config.Economy.PayAccount 'bank' Konto für die Auszahlung
Config.Economy.GlobalMultiplier 1.0 Faktor auf alle Auszahlungen
Config.Economy.FarePerStop / FareBase 9 / 6 Fahrgeld je Fahrgast und Haltestelle / Grundbetrag
Config.Economy.PunctualBonus 10 Bonus je pünktlicher Haltestelle
Config.Economy.AbortPayout 0.4 bei Abbruch 40 % der bisherigen Fahrgelder
Config.Economy.MinPayout 50 Mindestauszahlung je abgeschlossener Linie

Unternehmen und Admin

Option Standard Beschreibung
Config.Company.AllowPurchase true Spieler können das Unternehmen übernehmen
Config.Company.PurchasePrice 900000 Kaufpreis
Config.Company.VehicleSpawnCost 250 Betriebskosten je ausgegebenem Bus
Config.Admin.EditorCommand 'busstop' Befehl für Haltestellen im Editor
Config.Admin.MaxRoutes 100 maximale Anzahl Linien
Config.Admin.MaxStopsPerRoute 40 Haltestellen je Linie
Config.Admin.AllowTeleport true Teleport zu Haltestellen im Editor

Discord-Webhook

In config/server.lua (wird nie an Clients gesendet):

ServerConfig = {
    LogWebhook = '',               -- leer = aus
    LogWebhookName = 'Pepper Bus',
}

Spielablauf

  1. Schicht beginnen: am Betriebshof E drücken und einen freigeschalteten Bus wählen – er erscheint auf einem freien Parkplatz.
  2. Linie wählen: im Tablet (F7). Gesperrte Linien zeigen den Grund (Level, Reputation, Uhrzeit, falscher Bus).
  3. Halten: im Haltestellenradius anhalten (unter ca. 5 km/h) – die Türen öffnen sich automatisch.
  4. Ein- und Aussteigen: Das HUD zeigt die Haltezeit („Türen offen“). Wer zu früh abfährt, lässt Fahrgäste stehen.
  5. Fahrplan: beginnt mit der ersten Abfahrt; die Pünktlichkeit siehst du live im HUD.
  6. Endhaltestelle: Sterne, Auszahlung, XP und Reputation.
Bus Klasse Plätze
Shuttlebus (rentalbus) Shuttle 9
Stadtbus (bus) Stadtbus 16
Airport Bus (airbus) Flughafen 16
Sightseeing-Bus (tourbus) Rundfahrt 10
Reisebus (coach) Reisebus 16
Festival-Bus (pbus2) Party 12

Linientypen: Shuttle, Stadtlinie, Schulbus, Flughafen, Nachtlinie, Stadtrundfahrt, Express, Überland, Event-Shuttle, Party-Charter. Busunternehmen: öffentlich (alle fahren, volle Auszahlung) oder Spielerfirma (nur Inhaber und Mitarbeiter; Auszahlung an die Firma, Fahrer erhalten ihren Anteil, Gehälter vom Firmenkonto).

Linien-Editor

Tablet (F7) → Admin → Linien-Editor:

  1. Neue Linie: Nummer, Name, Linientyp und optional ein Mindestlevel.
  2. Haltestellen: Strecke mit einem Bus abfahren und an jeder Haltestelle „Haltestelle an meiner Position“ drücken – oder /busstop tippen, ohne das Tablet zu öffnen (der offene Entwurf bleibt erhalten).
  3. Feinschliff: umbenennen (der Straßenname wird vorgeschlagen), sortieren, Position neu erfassen, Radius, Fahrgastaufkommen (0,2–3,0) und zusätzliche Haltezeit festlegen.
  4. Vorschau und Speichern: „Vorschau auf Karte“ zeigt die Haltestellen nummeriert, „Speichern“ macht die Linie sofort verfügbar (wenn aktiv), „Testfahrt“ fährt sie ohne Voraussetzungen und Belohnungen, „Kopie“/„Gegenrichtung“ legt eine inaktive Kopie an.

Eine Linie braucht mindestens 2 und höchstens Config.Admin.MaxStopsPerRoute Haltestellen, mindestens 40 m auseinander (Config.Stops.MinStopDistance). Laufende Fahrten nutzen eine Kopie der Linie – Änderungen gelten ab der nächsten Fahrt. „Standardlinien“ legt fehlende Linien aus config/routes.lua neu an, ohne bestehende zu verändern. Linien liegen in der Datenbank – Updates der Ressource überschreiben sie nie.

Befehle und Rechte

Befehl / Taste Wer Was
F7 / /bustablet alle Tablet öffnen (im Dienst oder als Admin überall, sonst am Betriebshof)
Y / /busaccept Fahrer im Dienst Angebot der Leitstelle annehmen
N / /busdecline Fahrer im Dienst Angebot der Leitstelle ablehnen
/busstop Admins aktuelle Position als Haltestelle an den offenen Editor-Entwurf anhängen
E alle Terminal am Betriebshof

Tasten kann jeder Spieler in den GTA-Einstellungen → Tastenbelegung → FiveM ändern.

Adminrechte (immer serverseitig geprüft): ESX-Gruppe aus Config.Admin.Groups (Standard superadmin, admin) oder ACE pepper_bus.admin:

add_ace group.admin pepper_bus.admin allow

Config.Admin.RequireReason = true verlangt bei Spieler- und Firmenänderungen eine Begründung (der Linien-Editor protokolliert ohne Grund); alles landet im Audit-Log. Rechte innerhalb der Spielerfirma hängen am Rang in Config.Company.DefaultRanks.

Exports und Events

Alle Exports sind serverseitig:

Export Rückgabe / Beschreibung
GetBusPlayerData(source) Karriere und Statistiken
IsBusDriverOnDuty(source) boolean
GetBusDriverStatus(source) Status, z. B. 'OFF_DUTY', 'AVAILABLE', 'AT_STOP', 'ON_ROUTE'
GetBusDriverLine(source) aktuelle Linie (Nummer, Bezeichnung, Abschnitt, Haltestellen, Fahrgäste an Bord) oder nil
SetPlayerCharterActive(source, active) Sonderfahrt ein-/ausschalten – gibt ok, reason zurück
GetOnDutyDrivers() Fahrer im Dienst mit ihrer Linie
GetBusRoutes() alle Linien inkl. Haltestellen (z. B. für eine Fahrplan-App)
GetBusCompany() Unternehmensinfos (Bezeichnung, Modus, Kontostand, Mitarbeiter, Inhaber)
IsBusCompanyEmployee(sourceOrIdentifier) Prüfung auf Mitarbeiter
local line = exports.pepper_bus:GetBusDriverLine(source)

Es gibt bewusst keinen Export, mit dem andere Ressourcen Geld, XP oder Reputation erzeugen können. Öffentliche Events für andere Ressourcen bietet Pepper Bus nicht.

FAQ

Die Ressource startet nicht oder meldet fehlende Abhängigkeiten.

oxmysql und es_extended müssen in der server.cfg vor pepper_bus stehen. Das Manifest verlangt Server-Build 7290+ und OneSync – ohne OneSync startet die Ressource nicht.

Die Tabellen fehlen in der Datenbank.

Lass Config.Database.AutoInstall = true oder importiere sql/install.sql. Alle Tabellen beginnen mit bus_.

Läuft Pepper Bus mit QBCore oder Qbox?

Nein. Die Ressource nutzt es_extended direkt und ist nur für ESX Legacy 1.9+ gebaut.

Brauchen Spieler einen ESX-Job?

Nein. Jeder kann am Betriebshof in den Dienst gehen.

Im Tablet stehen keine Linien.

Admin → Linien-Editor → „Standardlinien“ legt die 14 Linien aus config/routes.lua an. Alternativ eine eigene Linie anlegen und aktiv setzen.

Eine Linie ist gesperrt.

Der Grund steht im Tablet: Level, Reputation, Tageszeit oder der falsche Bus für den Linientyp.

Die Haltestelle wird nicht erkannt.

Im Radius anhalten (unter ca. 5 km/h, Config.Stops.MaxStopSpeed). Vergrößere den Radius im Editor oder setze die Haltestelle neu.

Fahrgäste bleiben an der Haltestelle stehen.

Du bist zu früh abgefahren – das HUD zeigt die Haltezeit („Türen offen“). Jede zu früh verlassene Haltestelle kostet Bewertung (Config.Rating.EarlyDeparturePenalty).

Die Meldung „Die Fahrt war nicht plausibel“ erscheint.

Zwischen zwei Haltestellen wurde ein Teleport oder eine Abkürzung erkannt (weniger als 60 % der Luftlinie gefahren oder schneller als Config.Security.MaxPlausibleSpeed). Details stehen in der Server-Konsole.

Warum bekomme ich keine Linienangebote von der Leitstelle?

Standardmäßig wählen Fahrer ihre Linien selbst (Config.Dispatch.Enabled = false). Setz den Wert auf true, um zusätzlich Angebote zu bekommen.

Der Admin-Bereich im Tablet fehlt.

Deine ESX-Gruppe muss in Config.Admin.Groups stehen oder du brauchst die ACE pepper_bus.admin.

Kollidiert F7 mit Pepper Taxi oder Pepper Trucking?

Nein – Taxi nutzt F6 und Trucking F9. Jeder Spieler kann die Taste außerdem neu belegen.

Kann ich Add-on-Busse nutzen?

Ja. Trag sie in config/vehicles.lua mit Spawnnamen, Klasse und Plätzen ein; mit doors legst du fest, welche Türen an Haltestellen öffnen.

Wie ändere ich Texte?

Alle Texte stehen in locales/de.lua und locales/en.lua; die Sprache wählst du mit Config.Locale.

Wie viel Leistung braucht die Ressource?

Gemessen mit resmon: 0,01 ms aktiv.

Überschreibt ein Update meine Linien?

Nein. Linien liegen in der Datenbank und werden von Updates nie überschrieben. Sichere vor dem Update deine geänderten Dateien in config/ und locales/ und übertrage die Anpassungen in die neue Version.

Support

Fragen und Fehler: Öffne ein Ticket in unserem Discord: https://discord.gg/6NaFJWKDYu – verknüpfe deinen Kauf vorher mit /verify.

Permanent auf dem Dev-Server von Pepper Scripts getestet.

Changelog

Aktuelle Version: 1.0.0 (26.09.2026) – erste Veröffentlichung. Alle Änderungen stehen in der Datei CHANGELOG.md im Ressourcenordner.


Fehler gefunden? Melde ihn im Discord.