X-SOLUTION
Dokumentation

X-Autohaus einrichten

Autohaus für ESX Legacy, QBCore und Qbox. Das Fahrzeug steht im Showroom unter Studio-Licht vor dem Kunden, die Kamera fährt bei jedem Wechsel um es herum, bezahlt wird per Bargeld, Karte, Firmenkonto, Finanzierung oder Leasing. Dazu Probefahrt mit Zeitmessung, Inzahlungnahme mit Fahrzeugakte, Verkäufer-Angebote mit Provision und ein Admin-Terminal, in dem du Standorte, Katalog, Verträge und Einstellungen ohne Neustart pflegst.

Diese Anleitung führt dich vom Download bis zum eingerichteten Server.

Voraussetzungen

  • FiveM Server mit aktuellem Artifact, OneSync aktiv
  • es_extended (ESX Legacy) oder qb-core oder qbx_core
  • oxmysql
  • MySQL oder MariaDB
  • Eine Fahrzeugtabelle, standardmäßig owned_vehicles

Optional, wird beim Start automatisch erkannt:

  • Garage: x-garage, sonst der ESX- und QB-Standard
  • Fahrzeugbilder: jg-vehiclestudio
  • Interaktion: ox_target, qb-target oder die eingebauten Marker
  • Firmenkonto: esx_addonaccount, qb-banking, qb-management, qbx_management

Installation

  1. Lade x-autohaus aus dem Cfx.re Portal herunter.
  2. Entpacke den Ordner nach resources/[x-solution]/x-autohaus.
  3. Trage die Resource in deiner server.cfg ein, nach dem Framework und nach oxmysql:
ensure oxmysql
ensure es_extended
ensure x-autohaus
  1. Server starten. Die Tabellen legt x-autohaus beim ersten Start selbst an. Willst du lieber von Hand importieren, liegt alles in sql/install.sql.

Läuft alles, bleibt die Konsole still. Beim Einrichten hilft Config.Debug = true: dann schreibt x-autohaus, welches Framework erkannt wurde, welche Garagen-Spalte gefunden wurde und wie viele Live-Einstellungen aus der Datenbank geladen sind.

Wichtig nach jedem Update: Führe in der Serverkonsole erst refresh und dann restart x-autohaus aus. Ohne refresh liest FiveM neu hinzugekommene Dateien nicht ein.

Die Fahrzeugtabelle

x-autohaus schreibt gekaufte Fahrzeuge in deine bestehende Tabelle, standardmäßig owned_vehicles. Welche Spalten benutzt werden, steht in Config.Database:

Einstellung Standard Bedeutung
vehicles owned_vehicles Name der Fahrzeugtabelle
columns.owner owner Besitzer, bei QBCore meist citizenid
columns.plate plate Kennzeichen
columns.props vehicle Fahrzeugdaten als JSON, bei QBCore mods
columns.type type Fahrzeugart (car, boat, plane, heli)
columns.job job Wird nur beschrieben, wenn die Spalte existiert
columns.stored stored Ob das Fahrzeug eingeparkt ist
columns.garage auto Garagen-Spalte, auto sucht selbst
columns.label label Anzeigename, nur wenn die Spalte existiert

Steht garage auf auto, prüft x-autohaus deine Tabelle und nimmt die erste vorhandene Spalte aus garage_id, garage oder parking. Läuft x-garage mit, wird dessen Reihenfolge bevorzugt. Zusätzliche Pflichtspalten anderer Garagen-Scripts (impound, impounded, state, depotprice, fuel, engine, body) füllt x-autohaus automatisch mit sinnvollen Werten, sofern sie existieren.

Willst du die Erkennung übergehen, trag die echten Namen fest ein. Was dort steht und in der Tabelle existiert, gewinnt immer.

Der Katalog

Beim allerersten Start passiert eines von drei Dingen:

  1. Existiert eine Tabelle rw_autohaus_vehicles (vom alten Autohaus), werden die Fahrzeuge daraus übernommen.
  2. Sonst legt x-autohaus 18 Beispielfahrzeuge an, damit du sofort testen kannst.
  3. Danach pflegst du den Katalog im Spiel, nicht in einer Datei.

Zum Füllen hast du drei Wege, alle im Admin-Terminal unter Fahrzeuge:

  • Alle Server-Fahrzeuge importieren: liest jedes Fahrzeugmodell deines Servers inklusive Addons, schätzt den Preis aus den Fahrwerten und trägt nur Modelle ein, die noch nicht im Katalog stehen. Der Fortschritt wird live angezeigt.
  • Aus meinem Fahrzeug übernehmen: setz dich in ein Fahrzeug, drück den Knopf, und Spawnname, Name, Marke, Klasse und ein Preisvorschlag stehen im Formular.
  • Von Hand anlegen: Spawnname eintragen, der Rest wird live geprüft. Gibt es das Modell auf dem Server nicht, sagt das Formular es sofort.

Jedes Fahrzeug hat einen Bestand. -1 bedeutet unbegrenzt, 0 ist ausverkauft und kann vorbestellt werden.

Bedienung für Spieler

Spieler gehen zum Marker am Autohaus und drücken E, oder klicken den Verkäufer-NPC per Target an. Alternativ öffnet /autohaus das nächstgelegene Autohaus, solange man nicht weiter als Config.Interaction.commandDistance entfernt ist.

Im Showroom steht das gewählte Fahrzeug wirklich im Spiel. Links stehen Marke, Modell, Preis und Rekordzeit, rechts Datenblatt und Konfigurator, unten die Fahrzeugleiste mit Suche und Filtern.

Taste Wirkung
Pfeil links / rechts Fahrzeug wechseln
1 bis 6 Kamera: Hero, Front, Seite, Heck, Felge, Innenraum
Q / E Kamera drehen
R Ansicht zurücksetzen
F Drehteller an oder aus
Enter Zur Kasse
T Probefahrt starten
M Auf die Merkliste
C Zum Vergleich
/ Suche öffnen
? Tastenkürzel anzeigen
Esc Fenster oder Autohaus schließen

Mit gedrückter Maustaste dreht man die Kamera frei, das Mausrad zoomt. Im Innenraum neigt die Maus zusätzlich den Blick.

Der Konfigurator ändert Lackierung, Perleffekt, Felgenfarbe, Felgendesign, Scheibentönung, Folierung und den Kennzeichen-Stil. Alles wird sofort am echten Fahrzeug gezeigt und beim Kauf übernommen.

Kaufen

An der Kasse wählt der Kunde Zahlungsart, Übergabe, Kennzeichen und optional ein Fahrzeug zur Inzahlungnahme.

Zahlungsart Beschreibung
Bargeld Direkt aus der Tasche
Karte Abbuchung vom Bankkonto, mit Kartenterminal zum Auflegen
Firmenkonto Läuft auf die Firma, das Fahrzeug landet in der Firmengarage
Finanzierung Anzahlung plus feste Raten mit Zinsen
Leasing Kleine Raten, Restwert am Ende, Rückgabe oder Übernahme

Bei Übergabe entscheidet der Kunde zwischen "Sofort mitnehmen" (das Fahrzeug steht am Ausgabepunkt und er sitzt direkt drin) und "In die Garage". Steht bei der Garagen-Lieferung eine Wartezeit in der Config, wird das Fahrzeug erst nach dieser Zeit eingebucht und taucht solange unter Aufträge auf.

Ein Wunschkennzeichen kostet extra und wird live als echtes San-Andreas-Schild angezeigt. Ist das Kennzeichen schon vergeben, sagt die Kasse es sofort; x-autohaus prüft dabei Fahrzeuge, laufende Verträge und noch nicht gelieferte Käufe.

Nach dem Kauf läuft die Übergabe: Kennzeichen-Reveal, Zusammenfassung und ein Funkschlüssel. Ein Klick darauf entriegelt das Fahrzeug und der Kunde ist wieder im Spiel. Abschalten lässt sich das über Config.Ceremony.enabled = false.

Firmenkauf

Der Firmenkauf ist standardmäßig der Chefetage vorbehalten (bossOnly). Das Fahrzeug wird auf den Job zugelassen, landet in der Firmengarage des Standorts (societyGarage) und bekommt die job-Spalte gesetzt, sofern deine Tabelle eine hat. Über allowedJobs und blockedJobs schränkst du ein, welche Jobs überhaupt dürfen.

Finanzierung und Leasing

Beide teilen sich dieselbe Mechanik, unterscheiden sich aber im Ziel:

  • Finanzierung: Anzahlung ab minDownPercent, dann feste Raten inklusive Zinsen. Nach der letzten Rate gehört das Fahrzeug dem Kunden.
  • Leasing: kleinere Anzahlung, ein Restwert bleibt am Ende offen. Nach der letzten Rate geht das Fahrzeug zurück ins Autohaus, außer der Kunde übernimmt es vorher.

Die Raten werden automatisch im Takt von intervalMinutes vom Bankkonto abgebucht. Reicht das Geld nicht, zählt x-autohaus eine Mahnung. Nach graceMissed Mahnungen wird das Fahrzeug eingezogen und der Vertrag steht auf "eingezogen".

Unter Finanzen sieht der Kunde jeden Vertrag mit Fortschritt, nächster Fälligkeit und Restschuld. Dort kann er:

  • eine Rate sofort per Karte oder bar zahlen,
  • eine Finanzierung ablösen (alle offenen Raten auf einmal),
  • ein Leasing übernehmen (offene Raten plus Restwert).

/raten zeigt die laufenden Verträge auch ohne Autohaus in der Nähe.

Probefahrt und Hausstrecke

Die Probefahrt kostet eine Kaution in Prozent vom Fahrzeugpreis, die nach der Rückgabe automatisch zurückkommt. Trennt der Spieler die Verbindung, wird die Kaution beim nächsten Login gutgeschrieben.

Während der Fahrt zeigt ein HUD Tempo, Gang und Restzeit. Steigt der Spieler aus oder läuft die Zeit ab, endet die Probefahrt und er steht wieder am Autohaus.

Hat ein Standort eine track mit Kontrollpunkten, läuft zusätzlich eine Zeitmessung: Kontrollpunkte werden markiert, die Rundenzeit läuft mit, und am Ende steht die Zeit im Datenblatt des Fahrzeugs, inklusive Streckenrekord und Name. Gespeichert wird nur die persönliche Bestzeit je Fahrzeug und Standort. Die Zeiten prüft der Server: nur wer die Runde wirklich während einer Probefahrt fährt, kommt in die Liste.

Vorbestellung, Lieferung und Aufträge

Ist ein Fahrzeug ausverkauft, kann der Kunde es vorbestellen und hinterlegt dabei eine Anzahlung. Kommt beim nächsten Nachschub wieder eines rein, bekommt der älteste Wartende eine Nachricht und sein Fahrzeug wird für holdMinutes reserviert. Beim Kauf wird die Anzahlung gegengerechnet, bei einer Stornierung zurückgezahlt.

Unter Aufträge sammeln sich drei Dinge: persönliche Angebote von Verkäufern, laufende Lieferungen in die Garage und Vorbestellungen.

Verkäufer, Angebote und Provision

Mitarbeiter mit dem Job aus Config.Permissions.managerJobs und passendem Rang sehen im Autohaus den Punkt Verwaltung:

  • Angebote & Team: Dienst an- und abmelden, persönliche Angebote für Kunden erstellen, eigene Provision und Rangliste sehen.
  • Katalog: Fahrzeuge anlegen, bearbeiten und aus dem Verkauf nehmen.
  • Auswertung: Umsatz, Zahlungsarten, Bestseller, Finanzierungen und knapper Bestand.

Ein Angebot ist ein persönlicher Preis für einen bestimmten Kunden, höchstens maxDiscountPercent unter dem Listenpreis und gültig für validMinutes. Der Kunde findet es im Autohaus unter Aufträge und im Datenblatt des Fahrzeugs. Kauft er, bekommt der Verkäufer seine Provision.

Die Provision ist ein Prozentsatz vom Fahrzeugpreis. Sie wird zwischen Verkäufer (sellerPercent) und Firma aufgeteilt. Ist requireDuty aktiv, gibt es nur im Dienst Provision, sonst geht alles an die Firma. Der Dienststatus lässt sich im Verwaltungs-Tab oder mit /autohausdienst umschalten. Ist der Verkäufer offline, wird seine Provision beim nächsten Login gutgeschrieben.

Admin-Terminal

/autohausadmin öffnet das Terminal. Zugriff haben nur Gruppen aus Config.Permissions.adminGroups.

Bereich Inhalt
Übersicht Katalog- und Verkaufszahlen, Umsatz der letzten 14 Tage, Zahlungsarten, Bestseller, Werkzeuge, Systeminfos, Admin-Protokoll
Fahrzeuge Katalog pflegen, aus dem eigenen Fahrzeug übernehmen, alle Server-Fahrzeuge importieren
Standorte Alle Punkte eines Autohauses im Spiel setzen
Spieler Fahrzeuge eines Spielers sehen, vergeben, löschen, übertragen, Kennzeichen ändern
Finanzierungen Verträge suchen, Frist verlängern, Mahnungen löschen, erlassen, einziehen, löschen
Verkäufe Vollständiges Verkaufsprotokoll mit Suche
Einstellungen Live-Einstellungen, die sofort für alle gelten

Die Werkzeuge in der Übersicht würfeln die Aktionen neu aus, füllen den Bestand auf, setzen ihn auf unbegrenzt oder laden Katalog, Einstellungen und Standorte neu.

Standorte im Spiel setzen

Unter Standorte wählst du ein Autohaus und dann den Punkt, den du verschieben willst. Das Terminal schließt sich kurz, du stellst dich an die gewünschte Stelle, drehst die Ausrichtung mit Q und E und speicherst mit Enter. Backspace bricht ab.

Diese Punkte gibt es je Standort:

Punkt Wofür
Eingang Marker, an dem Spieler das Autohaus öffnen
Verkäufer Position und Blickrichtung des NPC
Showroom-Bühne Wo das Fahrzeug im Showroom steht
Ausgabe Wo gekaufte Fahrzeuge erscheinen
Probefahrt-Start Wo die Probefahrt beginnt
Rückkehr Wohin es nach der Probefahrt geht
Ankauf Wo Fahrzeuge zur Inzahlungnahme bewertet werden

Gespeicherte Positionen landen in der Tabelle x_autohaus_locations und überschreiben die config.lua sofort, ohne Neustart. Der Knopf mit dem Pfeil teleportiert dich zur gespeicherten Position, der Knopf mit dem Kreis setzt sie wieder auf die config.lua zurück.

Live-Einstellungen

Alles unter Einstellungen wirkt sofort auf allen Clients und wird in x_autohaus_settings gespeichert. Ein angepasster Wert ist mit "Angepasst" markiert und zeigt den Standard aus der config.lua. Zurücksetzen stellt genau diesen Wert wieder her.

Konfiguration

Alles Folgende steht in config.lua, außer dem Discord-Webhook: der liegt in config_server.lua, weil diese Datei nur auf dem Server geladen wird und die URL damit nie an Spieler geht.

Allgemein

Einstellung Standard Bedeutung
Config.Debug false Ausführliche Meldungen beim Einrichten
Config.Locale 'de' Sprache für Meldungen und Oberfläche, de oder en
Config.Brand 'X Solution Motors' Name über der Oberfläche
Config.BrandShort 'XSM' Kürzel im Logo, auf dem Funkschlüssel und dem Showroom-Kennzeichen

Providers

Einstellung Standard Bedeutung
framework 'auto' auto, esx, qbcore oder qbox
garage 'auto' auto, x-garage oder esx
target 'none' none (Marker), ox_target oder qb-target

Fahrzeugbilder

Einstellung Standard Bedeutung
enabled true Bilder in Listen, Kasse und Aufträgen
resource 'jg-vehiclestudio' Resource, die die Bilder liefert
imageId 'default' Bild-Set aus JG Vehicle Studio
cacheMinutes 10 Wie lange Bilder zwischengespeichert werden
fallbacks docs.fivem.net Ersatz-URLs, Platzhalter {model}, {MODEL}, {hash}, {HASH}

Läuft JG Vehicle Studio nicht, werden nur die Fallback-URLs benutzt. Fehlt auch dort ein Bild, zeigt die Oberfläche ein Symbol statt eines kaputten Bildes.

Währung

symbol, prefix (Symbol vorne oder hinten), thousands und decimal bestimmen, wie Beträge geschrieben werden.

Zahlung

Jede Zahlungsart hat enabled und order (Reihenfolge in der Kasse).

Bank (Config.Payment.bank)

Einstellung Standard Bedeutung
account 'bank' Konto, von dem abgebucht wird
cardReader true Kartenterminal beim Bezahlen zeigen
holdTime 1400 Millisekunden, die die Karte aufliegen muss

Firmenkonto (Config.Payment.society)

Einstellung Standard Bedeutung
bossOnly true Nur Chefs dürfen über die Firma kaufen
bossGrades {} Zusätzliche Ränge, die als Chef gelten
allowedJobs {} Leer = alle Jobs erlaubt
blockedJobs { 'unemployed' } Jobs ohne Firmenkauf
garage 'firma' Garage, falls der Standort keine eigene hat
keepOwner true Käufer bleibt zusätzlich als Besitzer eingetragen

Finanzierung (Config.Payment.finance) und Leasing (Config.Payment.lease)

Einstellung Finanzierung Leasing Bedeutung
minDownPercent 20 10 Mindest-Anzahlung in Prozent
rateOptions {4, 8, 12} {4, 8, 12} Auswählbare Laufzeiten
maxRates 12 12 Obergrenze für Raten
interestPercent 9.5 6.0 Zinsen auf den finanzierten Teil
intervalMinutes 10080 10080 Abstand zwischen zwei Raten, 10080 = eine Woche
graceMissed 3 2 Mahnungen bis zum Einzug
maxOpenContracts 2 1 Verträge gleichzeitig je Spieler
repossessOnDefault true – Fahrzeug beim Einzug löschen
downPaymentAccounts { 'cash', 'bank' } – Womit die Anzahlung bezahlt werden darf
residualPercent – 45 Restwert am Ende der Laufzeit
allowBuyout – true Übernahme vor Ablauf erlauben

Kauf

Einstellung Standard Bedeutung
plateFormat 'XS#####' Vorlage für Kennzeichen, # wird zufällig ersetzt
plateAllowCustom true Wunschkennzeichen erlauben
plateCustomPrice 2500 Preis dafür
plateMinLength / plateMaxLength 2 / 8 Länge des Wunschkennzeichens
taxPercent 0.0 Steuer auf den Fahrzeugpreis
deliveryOptions.spawn aktiv, 0, 0 Sofort mitnehmen: enabled, price, minutes
deliveryOptions.garage aktiv, 0, 15 In die Garage, minutes ist die Lieferzeit

Inzahlungnahme

Einstellung Standard Bedeutung
enabled true Ankauf aktiv
percent 55 Anteil vom Listenpreis
onlyCatalogVehicles true Nur Fahrzeuge ankaufen, die im Katalog stehen
unknownVehiclePrice 0 Festpreis für unbekannte Modelle, wenn oben false
conditionAffectsPrice true Zustand senkt den Preis, höchstens auf 30 Prozent
payoutAccount 'bank' Wohin das Geld geht
allowOffsetAgainstPurchase true Direkt beim Kauf gegenrechnen

Probefahrt

Einstellung Standard Bedeutung
enabled true Probefahrt anbieten
seconds 90 Dauer
depositPercent 5 Kaution in Prozent vom Preis
depositAccount 'bank' Woher die Kaution kommt
maxSpeedLimiter 0 Tempolimit in km/h, 0 = aus
godMode true Fahrzeug und Fahrer unverwundbar
returnOnExit true Aussteigen beendet die Probefahrt
showHud true HUD anzeigen
plate 'PROBE' Kennzeichen des Probefahrzeugs

Lager und Aktionen

Einstellung Standard Bedeutung
Stock.enabled true Bestand überhaupt benutzen
Stock.restockMinutes 180 Abstand zwischen zwei Nachschub-Läufen
Stock.restockAmount 1 Wie viel je Fahrzeug nachkommt
Stock.hideSoldOut false Ausverkaufte Fahrzeuge ausblenden
Offers.enabled true Aktionen aktiv
Offers.count 10 Fahrzeuge je Aktionsrunde
Offers.discountPercent 50 Rabatt in Prozent
Offers.rotationMinutes 30 Wie oft neu ausgelost wird
Offers.perShop true Je Standort eigene Aktionen

Vorbestellung und Angebote

Einstellung Standard Bedeutung
Reservations.enabled true Vorbestellungen erlauben
Reservations.depositPercent 15 Anzahlung in Prozent
Reservations.account 'bank' Konto für die Anzahlung
Reservations.maxPerPlayer 3 Offene Vorbestellungen je Spieler
Reservations.holdMinutes 2880 Wie lange reserviert bleibt, 2880 = zwei Tage
Reservations.refundOnCancel true Anzahlung bei Storno zurück
Quotes.enabled true Verkäufer-Angebote aktiv
Quotes.validMinutes 120 Gültigkeit eines Angebots
Quotes.maxDiscountPercent 40 Höchstrabatt
Quotes.maxOpenPerSeller 10 Offene Angebote je Verkäufer
Quotes.allowSelfQuote false Angebot an sich selbst

Provision

Einstellung Standard Bedeutung
enabled true Provision auszahlen
job 'cardealer' Firma, die die Provision bekommt
percent 5 Prozent vom Fahrzeugpreis
toSociety true Firmenanteil aufs Firmenkonto buchen
requireDuty true Nur im Dienst gibt es Provision
sellerPercent 60 Anteil des Verkäufers an der Provision
sellerAccount 'bank' Wohin der Verkäufer sein Geld bekommt

Fahrzeugakte

Einstellung Standard Bedeutung
enabled true Kilometer und Unfälle mitschreiben
affectsTradeIn true Akte bestimmt den Zustand beim Ankauf
kmPricePercent 35 Höchster Abzug durch Laufleistung
accidentPricePercent 30 Höchster Abzug durch Unfälle
ownerPricePercent 12 Höchster Abzug durch Vorbesitzer
maxMetersPerPush 3000 Obergrenze je Meldung, schützt vor Manipulation

Teststrecke

Einstellung Standard Bedeutung
enabled true Zeitmessung aktiv
checkpointRadius 7.0 Radius eines Kontrollpunkts
markerHeight 2.4 Höhe der Markierung
minCheckpoints 2 Ab wie vielen Punkten eine Strecke zählt
maxAverageKmh 330 Plausibilitätsgrenze für Rundenzeiten

Showroom und Studio-Licht

Einstellung Standard Bedeutung
instanceEnabled true Eigener Routing-Bucket, damit niemand stört
baseBucket 51000 Basiswert für die Instanz
hidePlayerPed true Spieler wird unsichtbar
freezePlayer true Spieler wird festgesetzt
disableCollision true Keine Kollision im Showroom
hideHud true HUD und Radar ausblenden
turntable true Drehteller beim Öffnen an
turntableSpeed 5.0 Tempo des Drehtellers
plateText 'XSM' Kennzeichen am Ausstellungsfahrzeug
weather / time EXTRASUNNY, 20:30 Wetter und Uhrzeit im Showroom
syncEvents qb-weathersync, cd_easytime Events, die beim Betreten und Verlassen ausgelöst werden
studio.enabled true Studio-Licht
studio.headlights true Scheinwerfer des Fahrzeugs an
studio.interiorLight true Innenraumlicht an
studio.timecycle false Optionaler Timecycle-Modifier
studio.lights 4 Lichter Position, Farbe, Reichweite und Helligkeit je Licht
studio.floorGlow aktiv Schein auf dem Boden unter dem Fahrzeug

Nutzt du ein anderes Wetter-Script, trag dessen Events in syncEvents ein. Ohne passenden Eintrag setzt x-autohaus Wetter und Uhrzeit trotzdem jede Sekunde neu, solange der Showroom offen ist.

Kamera

Einstellung Standard Bedeutung
fov 42.0 Standard-Blickwinkel
fitPadding 1.08 Abstand zum Fahrzeug, größer = mehr Luft
sensitivity 0.22 Empfindlichkeit beim Ziehen
zoomStep 0.08 Schrittweite beim Zoomen
minDistance / maxDistance 0.3 / 2.2 Zoomgrenzen als Faktor der Fahrzeuggröße
minHeight / maxHeight -0.4 / 3.5 Höhengrenzen
smoothing 0.12 Wie weich die Kamera folgt
screenOffset 0.1 Verschiebt das Fahrzeug nach rechts, damit links Platz für Name und Preis bleibt
startPreset 'hero' Ansicht beim Öffnen
presetOrder Hero bis Innenraum Reihenfolge und Auswahl der Ansichten
presets siehe Config Winkel, Abstand, Höhe und Blickwinkel je Ansicht
intro aktiv Kamerafahrt beim Fahrzeugwechsel

Die Ansichten passen sich automatisch an die Fahrzeuggröße an, ein Jet wird also genauso sauber gezeigt wie ein Motorrad. Felge und Innenraum werden nur angeboten, wenn das Modell die passenden Punkte hat.

Konfigurator

Config.Customization schaltet einzeln frei: primaryColor, secondaryColor, pearlescent, wheelColor, windowTint, wheelTypes, liveries, plateIndex. Mit priceMultiplier verlangst du einen Aufschlag für konfigurierte Fahrzeuge, zum Beispiel 0.05 für fünf Prozent.

Import

Einstellung Standard Bedeutung
excludeClasses {13, 18, 19, 21} Fahrräder, Einsatz, Militär, Züge überspringen
excludeModels {} Einzelne Spawnnamen überspringen
defaultStock -1 Bestand für importierte Fahrzeuge
priceBase / priceFactor 15000 / 9000 Grundpreis und Aufschlag nach Fahrwerten
roundTo 500 Preise runden
minPrice / maxPrice 5000 / 5000000 Preisgrenzen
chunkSize 100 Wie viele Fahrzeuge pro Schritt gespeichert werden

Rechte, Interaktion und Befehle

Einstellung Standard Bedeutung
Permissions.adminGroups {'admin', 'superadmin'} Gruppen fürs Admin-Terminal
Permissions.managerJobs {'cardealer'} Jobs mit Verwaltungszugriff
Permissions.managerMinGrade 3 Ab welchem Rang, Chefs immer
Interaction.key 38 (E) Taste zum Öffnen
Interaction.markerDistance 25.0 Ab wann der Marker gezeichnet wird
Interaction.openDistance 2.2 Wie nah man stehen muss
Interaction.usePeds true Verkäufer-NPC platzieren
Interaction.useTarget false Target statt Marker benutzen
Interaction.commandDistance 60.0 Reichweite von /autohaus
Commands.open autohaus Autohaus öffnen
Commands.admin autohausadmin Admin-Terminal
Commands.finance raten Eigene Verträge anzeigen
Commands.duty autohausdienst Dienst umschalten
Commands.history fahrzeugakte Akte des aktuellen Fahrzeugs

Oberfläche, Sounds und Sicherheit

Einstellung Standard Bedeutung
Sounds.enabled true UI-Sounds
Sounds.volume 0.35 Lautstärke zwischen 0 und 1
Sounds.hover true Leiser Ton beim Überfahren von Knöpfen
Ceremony.enabled true Übergabe nach dem Kauf
Ceremony.preset 'hero' Kameraansicht während der Übergabe
Ceremony.turntable true Drehteller während der Übergabe
Keyboard.enabled true Tastenkürzel im Showroom
UI.scale 'auto' Skalierung, auto oder eine feste Zahl
UI.minScale / UI.maxScale 0.7 / 2.0 Grenzen der automatischen Skalierung
Security.maxShopDistance 90.0 Wie weit man höchstens vom Autohaus weg sein darf, um zu kaufen
Security.maxSellDistance 12.0 Abstand zum Ankaufpunkt beim Verkauf

Config.Keys bestimmt, welches Schlüssel-Script nach dem Kauf informiert wird. Standard ist das Event vehiclekeys:client:SetOwner. Für Scripts mit Export trägst du zusätzlich ein:

Config.Keys = {
    events = {},
    export = { resource = 'wasabi_carlock', name = 'GiveKey' }
}

Standorte

Jeder Eintrag in Config.Shops ist ein eigenes Autohaus:

{
    id = 'cars',
    label = 'X Solution Motors',
    subtitle = 'Premium Showroom',
    type = 'car',
    categories = {},
    blip = { enabled = true, sprite = 326, color = 3, scale = 0.85 },
    ped = { enabled = true, model = 's_m_y_dealer_01', coords = vector4(-56.15, -1098.20, 25.42, 25.0) },
    entrance = vector3(-56.96, -1096.82, 26.42),
    marker = { type = 1, size = vector3(1.6, 1.6, 0.6), color = { r = 91, g = 91, b = 247, a = 150 } },
    preview = vector4(-47.65, -1097.21, 26.42, 28.0),
    spawn = vector4(-30.54, -1089.63, 26.42, 339.62),
    testDrive = vector4(-11.34, -1080.52, 26.67, 69.0),
    returnPoint = vector4(-56.96, -1096.82, 26.42, 70.0),
    garage = 'autohaus',
    societyGarage = 'firma',
    track = { label = 'Stadtrunde Vespucci', laps = 1, checkpoints = { vector3(...), vector3(...) } }
}

type entscheidet, was hier verkauft wird: car, plane (auch Helikopter) oder boat. Mit categories legst du fest, welche Kategorien an diesen Standort gehören; bleibt die Liste leer, sortiert x-autohaus automatisch nach Fahrzeugart. Ein Fahrzeug mit gesetztem shop im Katalog wird nur dort verkauft.

Config.SellPoints sind die Ankaufpunkte für die Inzahlungnahme. Dorthin fährt der Kunde mit dem Fahrzeug, drückt E für ein Angebot und noch einmal E zum Verkaufen.

Config.VehicleTypeByCategory ordnet Kategorien einer Fahrzeugart zu, Config.ClassLabels benennt die GTA-Fahrzeugklassen für die Anzeige.

Discord-Webhook

In config_server.lua:

ConfigServer.Webhook = {
    enabled = true,
    url = 'https://discord.com/api/webhooks/...',
    name = 'X Solution Motors',
    color = 5986295,
    events = { purchase = true, finance = true, tradein = true, catalog = true, testdrive = false }
}

Diese Datei wird ausschließlich auf dem Server geladen, die URL erreicht also keinen Spieler.

Sprache

Config.Locale setzt die Sprache für Systemmeldungen und für die Oberfläche, mitgeliefert sind Deutsch und Englisch. Eigene Texte änderst du in locales/de.lua und locales/en.lua.

Exporte und Events

Serverseitig:

exports['x-autohaus']:GetCatalog()                -- alle aktiven Fahrzeuge
exports['x-autohaus']:GetCatalogSlim()            -- schlanke Liste für Dropdowns
exports['x-autohaus']:GetOpenContracts(identifier) -- laufende Verträge eines Spielers
exports['x-autohaus']:IsFinanced(plate)           -- läuft auf dieses Kennzeichen ein Vertrag?

Clientseitig:

exports['x-autohaus']:getVehicleImage('zentorno')  -- Bild-URL für ein Modell

IsFinanced ist praktisch für Garagen- oder Verkaufsscripts, damit niemand ein laufend finanziertes Fahrzeug weiterverkauft.

Datenbanktabellen

x-autohaus legt diese Tabellen selbst an:

Tabelle Inhalt
x_autohaus_vehicles Der Katalog
x_autohaus_favorites Merkliste der Spieler
x_autohaus_sales Verkaufsprotokoll
x_autohaus_finance Finanzierungen und Leasingverträge
x_autohaus_locations Im Spiel gesetzte Positionen
x_autohaus_settings Live-Einstellungen
x_autohaus_laptimes Bestzeiten der Hausstrecke
x_autohaus_reservations Vorbestellungen
x_autohaus_quotes Verkäufer-Angebote
x_autohaus_commissions Ausgezahlte Provisionen
x_autohaus_payouts Offene Erstattungen für Offline-Spieler
x_autohaus_history Fahrzeugakte
x_autohaus_odometer Kilometer, Halter und Unfälle je Kennzeichen
x_autohaus_deliveries Laufende Lieferungen
x_autohaus_admin_log Admin-Protokoll

Sicherheit

Alles Wichtige entscheidet der Server:

  • Preise, Rabatte, Angebote und Anzahlungen kommen nie vom Client.
  • Beim Kauf werden nur die im Konfigurator wählbaren Optionen übernommen. Motor, Getriebe, Turbo, Panzerung und Neon werden entfernt, der Zustand auf neu gesetzt.
  • Kauf, Probefahrt und Vorbestellung gehen nur in der Nähe des Autohauses, Verkauf nur am Ankaufpunkt.
  • Rundenzeiten zählen nur während einer laufenden Probefahrt und werden gegen die Streckenlänge geprüft.
  • Die Inzahlungnahme bewertet immer das Fahrzeug aus der Datenbank, nicht die Angaben des Clients.
  • Kilometerstände sind pro Meldung gedeckelt, Unfälle zählen nur für das Fahrzeug, in dem der Spieler wirklich sitzt.
  • Admin- und Verwaltungsfunktionen prüfen die Rechte bei jedem Aufruf erneut.

Häufige Fragen

Der Showroom ist leer, es steht kein Fahrzeug da. Der Spawnname im Katalog existiert auf dem Server nicht. Im Datenblatt steht dann "Modell fehlt auf dem Server". Prüf den Namen im Admin-Terminal unter Fahrzeuge, dort wird er live geprüft.

Gekaufte Fahrzeuge tauchen nicht in der Garage auf. Das liegt fast immer an der Garagen-Spalte. Setz Config.Debug = true und schau, welche Spalte erkannt wurde. Passt sie nicht, trag den echten Namen in Config.Database.columns.garage ein.

Das Firmenkonto zeigt 0 oder der Kauf schlägt fehl. Bei ESX braucht es esx_addonaccount mit einem Konto society_<job>, bei QBCore qb-banking oder qb-management, bei Qbox qbx_management. Ohne eines davon gibt es kein Firmenkonto.

Das Wetter im Showroom springt zurück. Dein Wetter-Script überschreibt es. Trag dessen Pause-Events in Config.Showroom.syncEvents ein.

Die Kamera steht bei großen Fahrzeugen zu nah oder zu weit weg. Dreh an Config.Camera.fitPadding. Größer heißt mehr Abstand, die Fahrzeuggröße wird weiterhin automatisch berücksichtigt.

Die Oberfläche ist mir zu groß oder zu klein. Config.UI.scale auf eine feste Zahl setzen, zum Beispiel 0.9. Mit auto richtet sie sich nach der Auflösung.

Ein Spieler war offline, als seine Provision oder Kaution fällig wurde. Das Geld liegt in x_autohaus_payouts und wird beim nächsten Login automatisch gutgeschrieben.

Nach einem Update fehlen Funktionen oder die Konsole meldet fehlende Module. In der Serverkonsole refresh ausführen, danach restart x-autohaus.

Support

Kommst du nicht weiter, melde dich auf Discord. Halte bitte die Serverkonsole vom Start mit Config.Debug = true bereit, dort stehen Framework, Fahrzeugtabelle und Garagen-Spalte, dazu deine Resource-Version.

Etwas unklar geblieben?

Schreib uns auf Discord, wir ergänzen die Anleitung.

Discord
X-Autohaus einrichten — Dokumentation · X-Solution