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) oderqb-coreoderqbx_coreoxmysql- 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-targetoder die eingebauten Marker - Firmenkonto:
esx_addonaccount,qb-banking,qb-management,qbx_management
Installation
- Lade
x-autohausaus dem Cfx.re Portal herunter. - Entpacke den Ordner nach
resources/[x-solution]/x-autohaus. - Trage die Resource in deiner
server.cfgein, nach dem Framework und nach oxmysql:
ensure oxmysql
ensure es_extended
ensure x-autohaus
- 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
refreshund dannrestart x-autohausaus. Ohnerefreshliest 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:
- Existiert eine Tabelle
rw_autohaus_vehicles(vom alten Autohaus), werden die Fahrzeuge daraus übernommen. - Sonst legt x-autohaus 18 Beispielfahrzeuge an, damit du sofort testen kannst.
- 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.