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
- Ressource im Cfx.re-Portal → Granted Assets herunterladen.
- Nach
resources/[pepper]/pepper_busentpacken. Den Ordnernamenpepper_busnicht umbenennen – andere Ressourcen rufen die Exports überexports.pepper_busauf. - In der
server.cfgnach den Abhängigkeiten eintragen:
ensure oxmysql
ensure es_extended
ensure pepper_bus
- Datenbank: Mit
Config.Database.AutoInstall = true(Standard) legt die Ressource fehlende Tabellen beim Start selbst an (14 Tabellen mit Präfixbus_). Manuell importierst dusql/install.sql– die Datei kann gefahrlos mehrfach importiert werden. Beim ersten Start werden die 14 Standardlinien ausconfig/routes.luaangelegt (Config.Database.SeedDefaultRoutes). - Adminrechte vergeben (Details unter „Befehle und Rechte“), z. B.:
add_ace group.admin pepper_bus.admin allow
- 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
- Server starten und in der Konsole prüfen, dass
pepper_busohne Fehler startet. - Zum Busbetriebshof fahren (Bus-Symbol auf der Karte, Los Santos Transit) und am Terminal
Edrücken. - Den Shuttlebus wählen, mit
F7das Tablet öffnen und eine freigeschaltete Linie wählen. - An der ersten Haltestelle im Radius anhalten, Fahrgäste ein- und aussteigen lassen und bis zur Endhaltestelle fahren – danach erscheinen Sterne, Auszahlung und XP.
- 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
- Schicht beginnen: am Betriebshof
Edrücken und einen freigeschalteten Bus wählen – er erscheint auf einem freien Parkplatz. - Linie wählen: im Tablet (
F7). Gesperrte Linien zeigen den Grund (Level, Reputation, Uhrzeit, falscher Bus). - Halten: im Haltestellenradius anhalten (unter ca. 5 km/h) – die Türen öffnen sich automatisch.
- Ein- und Aussteigen: Das HUD zeigt die Haltezeit („Türen offen“). Wer zu früh abfährt, lässt Fahrgäste stehen.
- Fahrplan: beginnt mit der ersten Abfahrt; die Pünktlichkeit siehst du live im HUD.
- 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:
- Neue Linie: Nummer, Name, Linientyp und optional ein Mindestlevel.
- Haltestellen: Strecke mit einem Bus abfahren und an jeder Haltestelle „Haltestelle an meiner Position“ drücken –
oder
/busstoptippen, ohne das Tablet zu öffnen (der offene Entwurf bleibt erhalten). - Feinschliff: umbenennen (der Straßenname wird vorgeschlagen), sortieren, Position neu erfassen, Radius, Fahrgastaufkommen (0,2–3,0) und zusätzliche Haltezeit festlegen.
- 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.