> For the complete documentation index, see [llms.txt](https://pepper-scripts.gitbook.io/pepper-scripts-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pepper-scripts.gitbook.io/pepper-scripts-docs/docs/de/jobs/pepper-carwash.md).

# Pepper Carwash

Auf den meisten Servern ist eine Waschanlage ein Marker: reinfahren, bezahlen, sauber. Mit **Pepper Carwash** bauen Admins Waschanlagen direkt im Spiel auf – per **geführtem Aufbau**, als **Fertiganlage**, frei im **Baumodus** oder als **Zonen** in einem vorhandenen Gebäude – und Spieler besitzen und betreiben sie. Alles besteht aus Props, die zum Spiel gehören: kein MLO, keine Addon-Modelle.

Kunden fahren an die Einfahrt, wählen eines von **6 Waschprogrammen** und werden gewaschen: In der Waschstraße wird das Fahrzeug durch die Stationen geführt, in der Portalanlage steht das Fahrzeug und das Portal fährt darüber. Eine Anlage ohne Besitzer läuft als Staatsanlage für alle. Steht sie zum Verkauf, kauft ein Spieler sie und führt sie über das **Tablet des Betriebs**: Firmenkonto, eigene Preise, Lager, Stationen, Personal, Level 1–100 mit Upgrades und NPC-Kunden, solange Personal im Dienst ist.

{% embed url="<https://youtu.be/mC8xyK_hTTY>" %}
Pepper Carwash – Trailer
{% endembed %}

{% hint style="success" %}
**Pepper Carwash holen:** [pepper-scripts.tebex.store](https://pepper-scripts.tebex.store)
{% endhint %}

{% hint style="info" %}
🧪 **Getestet auf unserem Dev-Server:** Wir testen alle Skripte selbstverständlich permanent auf unserem eigenen Dev-Server „Pepper Scripts“.
{% endhint %}

{% hint style="warning" %}
**Koordinaten prüfen:** Der Reiter **Standard-Waschanlagen** in `/carwashadmin` legt auf Wunsch fünf bekannte Standorte an (`config/presets.lua`). Die Koordinaten sind Näherungen – jede Anlage vor Ort prüfen und mit *Zonen neu setzen* korrigieren.
{% endhint %}

### Funktionen

* **Vier Wege zu einer Anlage**, alles im Spiel und ohne Restart: geführter Aufbau, Fertiganlage, Baumodus (Katalog mit 49 Teilen), Zonen in vorhandenen Gebäuden
* **Schnell-Aufbau** (seit 1.1.0): nur die Spur setzen – Stationen, Schranke, Terminal, Wände, Technik und Schilder stellt das Script selbst auf, wo Platz ist
* **Selbst-Vermessung** (seit 1.1.0): das Script liest die Maße der Modelle einmalig aus dem Spiel und stellt jedes Teil mittig und auf den Boden – auch eigene Props
* **Eigenes Logo auf dem großen Werbeschild** (seit 1.1.0): Bild in den Ordner legen, in der Config eintragen, je Anlage wählbar oder abschaltbar
* **3 Anlagentypen:** SB-Waschbox, Portalanlage, Waschstraße – nur aus GTA-eigenen Props
* **6 Waschprogramme** (Basis, Schaum, Unterboden, Wachs, Premium, Showroom-Finish) und **6 Extras** (Felgenreinigung, Insektenlöser, Scheibenversiegelung, Heißwachs, Nano-Versiegelung, Motorraumwäsche) mit Partikeln, Ton und Fortschrittsanzeige
* **Wachs-Schutz** hält ein Fahrzeug für die gekaufte Zeit sauber – liegt in der Datenbank, übersteht Garage und Neustart
* **SB-Waschbox:** 1 bis 5 Minuten kaufen, Spritzpistole nehmen, selbst abspritzen
* **Staubsaugerplatz** zum Selbersaugen und mit den Services Innenreinigung und Politur von Hand
* **Kaufbarer Betrieb:** Kauf am Verkaufsschild, jeder Spieler höchstens eine Anlage (je Charakter oder je Lizenz), zurückverkaufen oder an einen Spieler übertragen
* **Tablet des Betriebs** mit 14 Seiten: Übersicht, Aufgaben, Level & Upgrades, Prüfung, Finanzen, Preise, Lager, Stationen, Personal, Kundenkarten, Flotten, Statistik, Einstellungen, Hilfe
* **Lager und Verschleiß:** Wasser, Shampoo und Wachs werden verbraucht, Stationen nutzen sich ab, Störungen stoppen die Spur, ein Techniker lässt sich rufen
* **Mitarbeiter:** Spieler vor Ort einstellen, 5 Ränge mit Rechten, Dienst, Provision, Aufgaben- und Schichtlohn aus dem Firmenkonto – ohne Framework-Job
* **8 Aufgaben**, 7 davon als Minispiel: Störung beheben, Vorwäsche von Hand, Trocknen von Hand, Innenreinigung, Politur von Hand, Chemie nachfüllen, Walzen warten, Lieferung abholen – mit Leistungswertung von 80 bis 120 % für Lohn und XP
* **Betriebs-Level 1–100** mit 90 Upgrades (Stationen, Spuren, Tanks, Tempo, Werbung und mehr), Baumodus für Besitzer und **Betriebsprüfungen** auf Level 30, 60 und 90
* **NPC-Kunden**, solange Personal im Dienst ist, **Kundenkarten**, **Firmenkarten** und **Flottenverträge**
* **Inaktivitäts-Regel:** Wer 30 Tage nicht online war, verliert die Anlage (Vorwarnungen, Admin-Schutz, Wiederherstellen innerhalb von 14 Tagen – alles in der Config)
* **Admin-Werkzeuge im Spiel:** Anlagen anlegen, ändern, verschieben, entfernen, Besitz, Protokoll, Diagnose
* **Eigene Oberfläche** für Hinweistexte, Fortschrittsbalken, Benachrichtigungen, Dialoge und Menüs – einzige Abhängigkeit ist oxmysql
* **Optionale Inventar-Items** (Kanister, Ersatzteile, Tablet, Kundenkarte) mit 5 fertigen Bildern
* Anleitung im Spiel für Mitarbeiter, Besitzer und Kunden, dazu eine Spieler-Anleitung auf Deutsch und Englisch zum Kopieren ins Wiki
* 6 Discord-Webhooks, Server- und Client-Exports
* Deutsch & Englisch, Config, Sprachdateien, Bridges und Install-Dateien offen

### Auf einen Blick

|                              |                                                                                                                              |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| **Version**                  | 1.0.0                                                                                                                        |
| **Framework**                | ESX Legacy (`es_extended`), QBCore (`qb-core`) oder Qbox (`qbx_core`) – automatische Erkennung                               |
| **FiveM-Server**             | Build 7290 oder neuer, **OneSync** erforderlich                                                                              |
| **Abhängigkeiten (Pflicht)** | [oxmysql](https://github.com/overextended/oxmysql) – sonst nichts. **Kein ox\_lib**, kein Target-Script, kein Inventar nötig |
| **Interaktion**              | eigener Hinweistext + Taste · ox\_target oder qb-target optional für die SB-Waschbox zu Fuß (`Config.Interact.Mode`)         |
| **Optional**                 | Inventar-Items für ox\_inventory, qb-inventory, ps-inventory, qs-inventory oder das ESX-Inventar                             |
| **Datenbank**                | MySQL 8 oder MariaDB 10.x – Tabellen werden automatisch angelegt                                                             |
| **Modelle**                  | nur GTA-eigene Props – kein MLO, keine Addon-Modelle                                                                         |
| **Im Spiel getestet**        | ESX Legacy mit ox\_inventory                                                                                                 |
| **Sprachen**                 | Deutsch, Englisch                                                                                                            |
| **Auslieferung**             | Cfx.re Asset Escrow (`config/`, `locales/`, `bridge/`, `install/` offen)                                                     |

### Installation

Arbeite die Schritte in der angegebenen Reihenfolge ab – nach jedem Schritt gibt es einen **Kontrollpunkt**.

{% hint style="warning" %}
**Dateien immer mit einem Text-Editor öffnen**, zum Beispiel [Visual Studio Code](https://code.visualstudio.com/) oder [Notepad++](https://notepad-plus-plus.org/) – niemals mit Word oder WordPad.
{% endhint %}

#### Schritt 1 – Voraussetzungen prüfen

Kurz: ein FiveM-Server mit OneSync und oxmysql. Hinweistexte, Fortschrittsbalken, Benachrichtigungen, Dialoge, Menüs und Tastenbelegung bringt die Ressource selbst mit.

| Was                                                                                     | Wozu                                                                                          | Pflicht?   |
| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ---------- |
| FiveM-Server **Build 7290 oder neuer**                                                  | ältere Server starten das Script nicht                                                        | ja         |
| **OneSync** eingeschaltet                                                               | der Server prüft Positionen, Fahrzeuge und Sitzplätze selbst                                  | ja         |
| **MySQL 8 / MariaDB 10.x** + **oxmysql**                                                | Anlagen, Firmenkonto, Lager, Level, Wachs-Schutz                                              | ja         |
| **ESX Legacy**, **QBCore** oder **Qbox**                                                | Charaktere, Geld, Gruppen – wird automatisch erkannt                                          | genau eins |
| ox\_lib                                                                                 | wird nicht benutzt und nicht geladen – läuft es für andere Scripts, stört das nicht           | nein       |
| **ox\_target** oder **qb-target**                                                       | nur für die SB-Waschbox zu Fuß – ohne Target steht dort ein Hinweistext mit Taste             | nein       |
| Inventar: ox\_inventory, qb-inventory, ps-inventory, qs-inventory oder das ESX-Inventar | nur für die optionalen Items (Schritt 8) – ohne sind Kanister und Ersatzteile Zähler im Lager | nein       |

**OneSync:** in txAdmin unter **Settings → FXServer** auf **On** – ohne txAdmin `set onesync on` ganz oben in die `server.cfg`.

{% hint style="info" %}
**Im Spiel getestet auf ESX Legacy mit ox\_inventory.** Die Anbindungen für QBCore, Qbox und die anderen Inventare sind nach deren Quelltext bzw. Doku gebaut.
{% endhint %}

{% hint style="success" %}
**Kontrollpunkt:** Beim Serverstart steht für `oxmysql` und dein Framework jeweils `Started resource <name>` in der Konsole.
{% endhint %}

#### Schritt 2 – Herunterladen und entpacken

1. [Cfx.re-Portal → Granted Assets](https://portal.cfx.re/assets/granted-assets) öffnen und **pepper\_carwash** herunterladen.
2. Den Ordner `pepper_carwash` nach `resources/[pepper]/` kopieren (der Unterordner `[pepper]` ist frei wählbar).

```
resources/
└── [pepper]/
    └── pepper_carwash/
        ├── bridge/
        ├── client/
        ├── config/
        │   ├── blueprints.lua
        │   ├── config.lua
        │   ├── exams.lua
        │   ├── levels.lua
        │   ├── parts.lua
        │   ├── presets.lua
        │   ├── programs.lua
        │   ├── server.lua
        │   └── staff.lua
        ├── html/
        ├── install/
        │   ├── items/
        │   └── pepper_carwash.sql
        ├── locales/
        ├── server/
        ├── shared/
        ├── INSTALL.md
        ├── PLAYER-GUIDE.md
        ├── SPIELER-ANLEITUNG.md
        └── fxmanifest.lua
```

{% hint style="danger" %}
**Den Ordner `pepper_carwash` niemals umbenennen.** Ereignisse und die Oberfläche benutzen den Ressourcennamen.
{% endhint %}

{% hint style="warning" %}
**Asset Escrow:** Das Script startet nur auf einem Server, dessen Lizenzschlüssel (`sv_licenseKey`) zum selben Cfx.re-Konto gehört, mit dem du gekauft hast. Mehr: **Asset Escrow**.
{% endhint %}

#### Schritt 3 – server.cfg

Pepper Carwash **nach** oxmysql und deinem Framework starten:

```cfg
ensure oxmysql
ensure es_extended        # bzw. qb-core / qbx_core
# ensure ox_inventory     # optional (Items) – bzw. qb-inventory / ps-inventory / qs-inventory
# ensure ox_target        # optional (SB-Waschbox zu Fuß) – bzw. qb-target
ensure pepper_carwash
```

Eine Zeile für ox\_lib brauchst du für Pepper Carwash nicht. Inventar und Target sollten davor stehen; starten sie später, erkennt Pepper Carwash das Inventar nachträglich.

{% hint style="warning" %}
**Reihenfolge beachten:** Läuft beim Start von `pepper_carwash` kein Framework, fällt die Ressource auf den Standalone-Modus zurück und meldet das mit einem roten Kasten in der Konsole. Identität ist dann die Rockstar-Lizenz, Geld das ox\_inventory-Item `money`. Dein Framework muss deshalb **vor** `pepper_carwash` stehen.
{% endhint %}

{% hint style="warning" %}
**Andere Waschanlagen-Scripts:** Scripts wie `esx_carwash` oder `qbx_carwash` benutzen ebenfalls `/carwash` und dieselben Standorte. Das andere Script stoppen (empfohlen) oder den Befehl mit `Config.Commands.Main` umbenennen.
{% endhint %}

#### Schritt 4 – Admin-Recht

Admin ist, wer **eine** dieser Bedingungen erfüllt – geprüft wird bei jedem einzelnen Aufruf am Server:

* **ACE-Recht `pepper_carwash.admin`** – der verlässliche Weg auf jedem Framework
* **eine Gruppe aus `Config.AdminGroups`** (Standard `admin`, `superadmin`, `god`)

```cfg
add_ace group.admin pepper_carwash.admin allow                        # alle in der Gruppe group.admin
add_ace identifier.license:DEINE_LIZENZ pepper_carwash.admin allow    # oder ein einzelner Spieler
```

Wie die Gruppe geprüft wird, hängt vom Framework ab:

| Framework        | Prüfung                                                 |
| ---------------- | ------------------------------------------------------- |
| ESX Legacy       | `xPlayer.getGroup()` ist genau einer der Namen          |
| QBCore           | `QBCore.Functions.HasPermission(src, name)`             |
| Qbox, Standalone | ACE-Recht `group.<name>` – nimm hier die ACE-Zeile oben |

{% hint style="success" %}
**Kontrollpunkt:** Nach einem Server-Neustart öffnet `/carwashadmin` die Admin-Oberfläche statt „Dafür fehlt dir die Berechtigung“.
{% endhint %}

#### Schritt 5 – Datenbank

Nichts zu tun: Die Ressource legt beim ersten Start elf Tabellen an (`pepper_carwash_*`). Der Datenbank-Benutzer braucht dafür die Rechte CREATE und ALTER. Hat dein Benutzer **kein CREATE-Recht**, importiere vorher `install/pepper_carwash.sql`.

#### Schritt 6 – Config prüfen

Öffne `config/config.lua` und prüfe mindestens:

* `Config.Locale = 'de'` (oder `'en'`) – gilt für alle Spieler
* `Config.Framework = 'auto'` – erkennt ESX, QBCore und Qbox
* `Config.Currency` und die Preise
* `Config.Economy.IncomeMultiplier` – der Hauptregler für alles Geld von NPC-Kunden
* `Config.Ownership.Scope` – eine Anlage je Charakter (`'character'`) oder je Spieler (`'license'`)
* `Config.Commands` – `/carwash` umbenennen, falls ein anderes Script den Befehl benutzt

Webhooks stehen in `config/server.lua`. Alle Schlüssel mit Standardwert: **Konfiguration**.

#### Schritt 7 – Erster Start und erste Anlage

1. Server starten. In der Konsole erscheint eine grüne Zeile `Pepper Carwash 1.1.0 gestartet (…)` mit Framework, Anlagen, Teilen und Fahrzeugen mit Wachs-Schutz.
2. Im Spiel `/carwashadmin` → Reiter **Neu** öffnen und die erste Anlage anlegen – empfohlen ist der **geführte Aufbau** mit dem Schnell-Aufbau (du setzt nur die Spur).
3. Zustand wählen: *Zu verkaufen* (ein Verkaufsschild erscheint, dort kauft ein Spieler die Anlage), *Staatsanlage* (für alle nutzbar) oder *Gesperrt*.
4. An die Einfahrt fahren, `E` drücken, Programm wählen und die Wäsche starten.

Die vier Wege zu einer Anlage stehen unter **Spielablauf**.

{% hint style="success" %}
**Kontrollpunkt:** In der Konsole steht die grüne Startzeile mit dem richtigen Framework, `/carwashadmin` öffnet sich, und an deiner ersten Anlage läuft eine Wäsche durch.
{% endhint %}

#### Schritt 8 – Items (optional)

Ohne diesen Schritt läuft alles: Kanister und Ersatzteile sind dann Zähler im Lager der Anlage. **Mit** Items gibt der Großhandel die Ware beim Abholen ins Inventar, und ein Mitarbeiter räumt sie am Lager-Punkt ein.

| Item                                                        | Zweck                                             | Schalter                                |
| ----------------------------------------------------------- | ------------------------------------------------- | --------------------------------------- |
| `carwash_cans_shampoo`, `carwash_cans_wax`, `carwash_parts` | Kanister Shampoo / Wachs, Ersatzteile             | `Config.Supply.UseItems` (`'auto'`)     |
| `carwash_tablet`                                            | Benutzen = öffnet das Tablet der eigenen Anlage   | `Config.Items.Tablet.Enabled` (`false`) |
| `carwash_card`                                              | Kundenkarte: Benutzen = zeigt die eigenen Stempel | `Config.Items.Card.Enabled` (`false`)   |

Vorlagen und die 5 Bilder liegen in `install/items/`. Immer: Items eintragen → Bilder kopieren → Server neu starten.

{% tabs %}
{% tab title="ox\_inventory" %}
Für ESX, QBCore und Qbox.

1. `install/items/ox_inventory.lua` (deutsche Namen) oder `ox_inventory_en.lua` (englische Namen) öffnen.
2. **Nur die Einträge** zwischen `return {` und der letzten `}` kopieren.
3. In `ox_inventory/data/items.lua` **innerhalb** der Tabelle `return { … }` einfügen (vor der letzten `}`).
4. Alle Dateien aus `install/items/images/*.png` nach `ox_inventory/web/images/` kopieren.

Tablet und Kundenkarte enthalten die Zeile `client = { export = 'pepper_carwash.useTablet' }` bzw. `'pepper_carwash.useCard'` – sie macht das Item benutzbar und muss stehen bleiben.
{% endtab %}

{% tab title="qb-inventory / ps-inventory" %}
Für QBCore.

1. `qb-core/shared/items.lua` öffnen und nachsehen, welche Schreibweise dort steht: `name = '…'` = neues Format, `['name'] = '…'` = altes Format.
2. Die passende Vorlage öffnen – neues Format `install/items/qb-core_items.lua`, altes Format `qb-core_items_old.lua` (englische Namen: `qb-core_items_en.lua` und `qb-core_items_old_en.lua`) – und ihre fünf Einträge in die Items-Tabelle einfügen.
3. Bilder aus `install/items/images/*.png` nach `qb-inventory/html/images/` bzw. `ps-inventory/html/images/` kopieren.
4. Nur ps-inventory mit Haltbarkeit: den `decay`-Wert so ergänzen, wie er bei deinen vorhandenen Items steht.

Die Benutzung von Tablet und Kundenkarte meldet Pepper Carwash selbst an.
{% endtab %}

{% tab title="qs-inventory" %}

1. **ESX:** Einträge aus `install/items/qs-inventory.lua` (englische Namen: `qs-inventory_en.lua`) in `qs-inventory/shared/items.lua` einfügen. **QBCore:** stattdessen die qb-core-Vorlagen in `qb-core/shared/items.lua` übernehmen.
2. Bilder aus `install/items/images/*.png` nach `qs-inventory/html/images/` kopieren.

Die Benutzung von Tablet und Kundenkarte meldet Pepper Carwash selbst an.
{% endtab %}

{% tab title="ESX-Inventar" %}

1. `install/items/esx_items.sql` in der Datenbank des Servers ausführen (nur `INSERT IGNORE` – vorhandene Einträge bleiben).
2. Gewicht dort in ESX-Einheiten, nicht in Gramm – bei Bedarf anpassen.
3. Bilder in den Bilderordner deines Inventars kopieren.

Die Benutzung von Tablet und Kundenkarte meldet Pepper Carwash selbst an.
{% endtab %}
{% endtabs %}

{% hint style="danger" %}
**Inventar nach dem Einfügen prüfen:** Ein Fehler in der Item-Datei deines Inventars (z. B. eine fehlende Klammer) legt das ganze Inventar lahm – dann scheitern auch Bezahlungen mit Bargeld. Sieh in der Konsole nach, ob dein Inventar ohne Fehlermeldung startet.
{% endhint %}

{% hint style="success" %}
**Kontrollpunkt:** Nach dem Neustart steht in der Konsole eine Zeile, die mit `[pepper_carwash] Items:` beginnt und das benutzte Inventar nennt. Fehlt ein Item, nennt die Zeile es beim Namen und der Betrieb läuft ohne Items weiter – ein Fehler entsteht daraus nie.
{% endhint %}

So läuft es mit Items:

1. Im Tablet (**Lager**) Kanister oder Ersatzteile mit „selbst abholen“ bestellen – bezahlt wird sofort vom Firmenkonto.
2. Ein Mitarbeiter mit dem Recht „Lieferungen abholen“ lädt am Großhandel (Blip) auf: so viele Stück, wie er tragen kann, höchstens 10 je Fuhre (`Config.Supply.Items.MaxCarry`).
3. Am Lager-Punkt der Anlage: `E` räumt die Ware ein – Item weg, Bestand hoch.
4. Lohn und XP gibt es einmal, sobald eine bezahlte Bestellung **dieser** Anlage vollständig im Lager ist.

Erkannt wird in der Reihenfolge ox\_inventory → qs-inventory → ps-inventory → qb-inventory → ESX; mit `Config.Inventory` stellst du eines fest ein.

#### Update

1. Eigene Änderungen in `config/`, `locales/` und `bridge/` sichern.
2. Server stoppen (oder `stop pepper_carwash`).
3. Den alten Ordner `pepper_carwash` **löschen** und den neuen an dieselbe Stelle kopieren – nicht in den alten Ordner hineinkopieren.
4. Eigene Werte in die **neuen** Dateien übertragen – nicht die alten Dateien zurückkopieren, neue Fassungen bringen neue Schalter und Texte mit.
5. Server neu starten und in der Konsole auf die grüne Startzeile achten.

Laufende Wäschen werden beim Stoppen beendet und nach der Regel der Anlage erstattet. Die Tastenbelegung der Spieler bleibt erhalten.

**Von 1.0.0 auf 1.1.0**

* Keine Datenbank-Änderung. Deine `config.lua` aus 1.0.0 funktioniert unverändert – alle neuen Schalter (`Config.Signs`, `Config.Measure`, `Config.Guide`, `Config.World.AutoRebuild`) haben Vorgaben.
* Nach dem ersten Start vermisst das Script seine Modelle einmalig im Hintergrund, sobald ein Admin online ist (Konsole: `Vermessung gestartet …` / `Vermessung abgeschlossen …`).
* Die Baupläne haben sich an zwei Stellen geändert (Staubsauger-Säule, Einfahrt-Schild). An bestehenden Fertiganlagen zeigt `/carwashadmin` oben den gelben Hinweis – einmal **„Alle betroffenen Anlagen neu aufstellen“** drücken. Von selbst wird nichts umgebaut (`Config.World.AutoRebuild = 'ask'`). Dabei gehen Bauplan-Teile, die du im Baumodus verschoben hast, zurück an ihren Platz; zusätzlich gesetzte Teile bleiben.
* Das große Werbeschild zeigt jetzt in der Vorgabe das Pepper-Scripts-Logo. Eigenes Bild oder abschalten: **Konfiguration**.
* Verwende die neue `config/parts.lua` und `config/blueprints.lua` und übertrage nur deine eigenen Änderungen. Mit den Dateien aus 1.0.0 läuft alles weiter wie bisher, aber ohne Bild auf dem Werbeschild und ohne die Korrekturen an Trockner-Gebläse, Pflanzkübel, Staubsauger-Säule und Einfahrt-Schild.

{% hint style="info" %}
Probleme? Siehe **FAQ**. Die vollständige Anleitung auf Deutsch und Englisch ist `INSTALL.md` in der Ressource.
{% endhint %}

### Konfiguration

| Datei                      | Inhalt                                                                                                                                                                                                                             |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `config/config.lua`        | Sprache, Währung, Befehle, Admin-Gruppen, Tasten, Blips, Wäsche, SB-Waschbox, Wachs, Besitz, Wirtschaft, Level, NPC-Kunden, Trinkgeld, Kundenkarten, Flotten, Tablet, Inaktivität, Lager, Nachschub, Verschleiß, Baumodus, Grenzen |
| `config/programs.lua`      | Programme, Extras, Stationen mit Effekt- und Ton-Kandidaten, Spritzpistole (`Config.LanceSpray`)                                                                                                                                   |
| `config/parts.lua`         | Teilekatalog mit Modell-Kandidaten und Maßen, Schwenk der Schranke                                                                                                                                                                 |
| `config/blueprints.lua`    | die drei Baupläne (SB-Waschbox, Portalanlage, Waschstraße)                                                                                                                                                                         |
| `config/presets.lua`       | fünf bekannte Standorte für den Reiter **Standard-Waschanlagen**                                                                                                                                                                   |
| `config/staff.lua`         | Ränge und Rechte, Löhne, Dienst, Aufgaben, Leistungswertung und Regeln der Minispiele                                                                                                                                              |
| `config/levels.lua`        | Freischaltliste Level 1–100 mit Upgrade-Preisen                                                                                                                                                                                    |
| `config/exams.lua`         | Betriebsprüfungen                                                                                                                                                                                                                  |
| `config/server.lua`        | Webhooks, Admin-ACE – wird **nie** an Clients gesendet                                                                                                                                                                             |
| `locales/de`, `locales/en` | alle Texte                                                                                                                                                                                                                         |

Nach jeder Änderung die Ressource neu starten (`restart pepper_carwash`).

{% hint style="warning" %}
Die Koordinaten in `config/presets.lua` sind **Näherungen**. Prüfe jede Standard-Waschanlage vor Ort und korrigiere sie mit *Zonen neu setzen*.
{% endhint %}

{% hint style="danger" %}
In `config/levels.lua` den `key` eines Upgrades nach dem ersten Start nicht mehr ändern – unter diesem Namen steht der Kauf in der Datenbank.
{% endhint %}

#### Grundlagen

| Option                  | Standard                                          | Bedeutung                                                                                       |
| ----------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| `Config.Locale`         | `'de'`                                            | Sprache (`de` / `en`) – gilt für alle Spieler, eine Auswahl je Spieler gibt es nicht            |
| `Config.Framework`      | `'auto'`                                          | `auto`, `esx`, `qbcore`, `qbox`, `standalone` – fest einstellen, wenn die Erkennung nicht passt |
| `Config.Commands`       | `carwash`, `carwashduty`, `carwashadmin`, `cwdev` | Namen der Befehle – siehe **Befehle & Exports**; leerer Text schaltet einen Befehl ab           |
| `Config.AdminGroups`    | `admin`, `superadmin`, `god`                      | Framework-Gruppen mit Admin-Recht (zusätzlich zum ACE)                                          |
| `Config.Notify.Mode`    | `'pepper'`                                        | eigene Benachrichtigungen · `'framework'` = Benachrichtigung von ESX / QBCore / Qbox            |
| `Config.Effects.Sounds` | `'auto'`                                          | `'nui'` erzwingt die Töne der Oberfläche, `'off'` schaltet Ton ab                               |
| `Config.Dirt.Mode`      | `'native'`                                        | `'custom'` = eigenes Schmutz-System über `bridge/client/dirt.lua`                               |
| `Config.Debug`          | `false`                                           | zusätzliche Ausgaben in Server-Konsole und F8 – danach wieder ausschalten                       |

Eigene Sprache: Ordner `locales/en` kopieren (z. B. nach `locales/fr`), die vier Dateien übersetzen und den Ordnernamen in `Config.Locale` eintragen. Fehlt ein Text, erscheint der englische.

#### Wirtschaft und Besitz

| Option                             | Standard                  | Bedeutung                                                                                   |
| ---------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------- |
| `Config.Economy.IncomeMultiplier`  | `1.0`                     | **der Hauptregler**: skaliert alles Geld von NPC-Kunden. Preise für Spieler ändert er nicht |
| `Config.Economy.UpgradeMultiplier` | `1.0`                     | skaliert alle Upgrade- und Deko-Preise                                                      |
| `Config.Ownership.Scope`           | `'character'`             | eine Anlage je Charakter oder (`'license'`) je Spieler                                      |
| `Config.Ownership.DefaultPrice`    | 40.000 / 80.000 / 150.000 | Kaufpreis-Vorschlag für SB-Waschbox / Portalanlage / Waschstraße                            |
| `Config.Inactivity.Enabled`        | `true`                    | Besitzer, die zu lange nicht online waren, verlieren die Anlage; das Firmenkonto verfällt   |
| `Config.Inactivity.Days`           | `30`                      | Tage ohne Anmeldung bis zur Freigabe der Anlage – mit Vorwarnungen 7, 3 und 1 Tag vorher    |

Im Betrieb legt der Besitzer jeden Preis zwischen 50 % und 130 % des Startpreises fest (Upgrades heben die Obergrenze), die Provision zwischen 0 und 30 % und den Lohn je Aufgabe zwischen 50 und 150 % des Standardwerts.

#### Wäsche und SB-Waschbox

| Option                              | Standard | Bedeutung                                                                                        |
| ----------------------------------- | -------- | ------------------------------------------------------------------------------------------------ |
| `Config.Wash.StaffRequired`         | `false`  | `true`: Spieler können an Anlagen mit Besitzer nur waschen, wenn Personal im Dienst ist          |
| `Config.Wash.Guide`                 | `'auto'` | Führung des Fahrzeugs in der Waschstraße: `'task'`, `'speed'`, `'conveyor'`                      |
| `Config.Wash.MaxVehicle`            | –        | größtes Fahrzeug, das angenommen wird – anpassen, wenn ein Fahrzeug als „zu groß“ abgelehnt wird |
| `Config.Wash.AbortDefaultKey`       | `'X'`    | Vorgabe der Tastenbelegung „Wäsche abbrechen“                                                    |
| `Config.SelfService.PricePerMinute` | `15`     | Preis einer Minute in der SB-Waschbox                                                            |
| `Config.SelfService.MaxMinutes`     | `5`      | so viele Minuten lassen sich höchstens auf einmal kaufen                                         |

Programme und Extras stehen in `config/programs.lua` (`Config.Programs`, `Config.Extras`):

| Programm        | Ab Level | Startpreis | Dauer | Wachs-Schutz |
| --------------- | -------- | ---------- | ----- | ------------ |
| Basis           | 1        | 40 $       | 40 s  | –            |
| Schaum          | 3        | 70 $       | 55 s  | –            |
| Unterboden      | 8        | 90 $       | 60 s  | –            |
| Wachs           | 15       | 110 $      | 75 s  | 60 min       |
| Premium         | 25       | 180 $      | 100 s | 120 min      |
| Showroom-Finish | 75       | 260 $      | 120 s | 180 min      |

| Extra                | Ab Level | Startpreis | Hinweis                                                            |
| -------------------- | -------- | ---------- | ------------------------------------------------------------------ |
| Felgenreinigung      | 12       | 15 $       |                                                                    |
| Insektenlöser        | 18       | 10 $       |                                                                    |
| Scheibenversiegelung | 33       | 20 $       |                                                                    |
| Heißwachs            | 35       | 25 $       | nur mit einem Wachs-Programm – verlängert den Wachs-Schutz um 50 % |
| Nano-Versiegelung    | 50       | 60 $       | Wachs-Schutz von mindestens 240 min                                |
| Motorraumwäsche      | 87       | 30 $       |                                                                    |

{% hint style="info" %}
Das Level ist das **Betriebs-Level** der Anlage. Ein Programm braucht außerdem seine Stationen und genug Wasser, Shampoo und Wachs im Lager – bei gesperrten Programmen steht der Grund in der Programmwahl.
{% endhint %}

#### Interaktion und Tasten

| Option                          | Standard | Bedeutung                                                                                                  |
| ------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------- |
| `Config.Interact.Mode`          | `'auto'` | SB-Waschbox: ox\_target, sonst qb-target, sonst Hinweistext + Taste · `'textui'` = nie ein Target benutzen |
| `Config.Interact.KeyWithTarget` | `true`   | auch mit Target bleibt an der SB-Waschbox Hinweistext + Taste aktiv · `false` = dort nur das Target        |
| `Config.Interact.KeyMapping`    | `true`   | Tasten über die FiveM-Tastenbelegung (umbelegbar) statt fester Tasten                                      |
| `Config.Interact.DefaultKey`    | `'E'`    | Vorgabe der Tastenbelegung „Interagieren“                                                                  |

Alle anderen Punkte (Einfahrt, Büro, Dienst, Lager, Aufgaben) laufen immer über Hinweistext + Taste.

{% hint style="info" %}
`DefaultKey` und `AbortDefaultKey` sind nur die Vorgabe für Spieler, die die Ressource **noch nie geladen hatten** – FiveM merkt sich die Belegung je Spieler. Wer schon einmal verbunden war, behält seine Taste und belegt sie selbst um.
{% endhint %}

#### Items

| Option                         | Standard | Bedeutung                                                                                                    |
| ------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------ |
| `Config.Inventory`             | `'auto'` | Inventar für die optionalen Items erkennen oder fest einstellen · `'none'` = nie eines benutzen              |
| `Config.Supply.UseItems`       | `'auto'` | Kanister / Ersatzteile als Items, sobald Inventar und Items vorhanden sind · `false` = immer Zähler im Lager |
| `Config.Supply.Items.MaxCarry` | `10`     | so viele Stück gibt der Großhandel je Fuhre höchstens aus                                                    |
| `Config.Supply.PickupMinCost`  | `200`    | Abhol-Bestellungen unter diesem Listenwert bringen dem Abholer keinen Lohn                                   |
| `Config.Items.Tablet.Enabled`  | `false`  | Tablet-Item `carwash_tablet` – Benutzen öffnet das Tablet der eigenen Anlage                                 |
| `Config.Items.Tablet.Give`     | `true`   | Besitzer und neu eingestellte Mitarbeiter bekommen ein Tablet-Item, wenn sie keines haben                    |
| `Config.Items.Card.Enabled`    | `false`  | Kundenkarten-Item `carwash_card` – gibt es mit dem ersten Stempel                                            |

Items einrichten: **Installation**.

#### Personal und Aufgaben

Ränge, Rechte, Löhne und Aufgaben stehen in `config/staff.lua`.

| Option                     | Standard                                   | Bedeutung                                                                                                                                                        |
| -------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Config.Tasks.Performance` | `{ Min = 0.8, Max = 1.2, Enabled = true }` | Leistungswertung: Lohn und XP jeder Aufgabe mit Minispiel liegen zwischen 80 % und 120 %. `Enabled = false`: immer genau der eingestellte Lohn und die festen XP |
| `Config.Tasks.Games`       | je Minispiel eine Zeile                    | Regeln der Minispiele an einer Stelle (Zonen, Sekunden, grüner Bereich, Treffer) – gilt für Server und Oberfläche zugleich                                       |
| `Config.Tasks.DryWindow`   | `120`                                      | so viele Sekunden wird „Trocknen von Hand“ nach einer Wäsche ohne Trockner angeboten – genau so lange wartet ein NPC-Kunde an der Ausfahrt                       |
| `Config.Tasks.DryEffect`   | `{ Reduce = 1.0, Fresh = true }`           | sichtbare Wirkung des Trocknens: so viel Rest-Schmutz verschwindet (Skala 0–15) · Lack „frisch“                                                                  |

Die Standard-Ränge, Löhne und Grenzen jeder Aufgabe stehen unter **Spielablauf**.

#### Level und Betriebsprüfungen

| Option                       | Standard | Bedeutung                                |
| ---------------------------- | -------- | ---------------------------------------- |
| `Config.Level.XpMultiplier`  | `1.0`    | Tempo des Aufstiegs (2.0 ≈ halbe Dauer)  |
| `Config.Level.Exams.Enabled` | `true`   | Betriebsprüfungen auf Level 30 / 60 / 90 |

Die Freischaltliste mit allen 90 Upgrades und ihren Preisen steht in `config/levels.lua`, die Prüfungsaufgaben in `config/exams.lua`.

#### NPC-Kunden

| Option               | Standard | Bedeutung                                                                                               |
| -------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
| `Config.Npc.Enabled` | `true`   | NPC-Kunden an oder aus                                                                                  |
| `Config.Npc.Visible` | `true`   | `false`: Kunden nur als Buchung, ohne Fahrzeuge – der Betrieb läuft dann vollständig ohne NPC-Fahrzeuge |

NPC-Kunden kommen nur, solange jemand im Dienst ist (Standard). Geld und XP rechnet der Server; das sichtbare Fahrzeug ist nur Darstellung.

#### Werbeschild, Vermessung und Schnell-Aufbau (seit 1.1.0)

| Feld                                                                | Vorgabe                                           | Bedeutung                                                                                                                                                                           |
| ------------------------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Config.Signs.Enabled`                                              | `true`                                            | Bild auf dem großen Werbeschild. `false` = das Schild bleibt leer wie in 1.0.0                                                                                                      |
| `Config.Signs.Image`                                                | `'pepper'`                                        | Vorgabe für alle Anlagen: ein Schlüssel aus `Images`. `false` = leer, bis ein Admin je Anlage ein Bild wählt                                                                        |
| `Config.Signs.Images`                                               | `pepper = { file = 'html/img/sign-logo.png', … }` | Liste der Bilder. Eigene Bilder in `html/img/` legen und hier eintragen                                                                                                             |
| `Config.Signs.PerWash`                                              | `true`                                            | je Anlage lässt sich im Admin-Menü ein anderes Bild der Liste wählen (oder „kein Bild“)                                                                                             |
| `Config.Signs.Backplate` · `Margin` · `DrawDistance` · `Brightness` | dunkel, deckend · `0.15` · `120.0` · `255`        | dunkle Platte hinter dem Bild · Rand in Metern · Sichtweite · Helligkeit                                                                                                            |
| `Config.Measure.Enabled`                                            | `true`                                            | Selbst-Vermessung der Modelle. `false` = nie messen, es gelten nur die mitgelieferten Maße                                                                                          |
| `Config.Measure.WaitAdminMinutes`                                   | `5`                                               | so lange wartet der Server auf einen Admin, bevor er einen beliebigen Spieler bittet                                                                                                |
| `Config.World.AutoRebuild`                                          | `'ask'`                                           | nach einem Update mit geändertem Bauplan: `'ask'` = melden, ein Admin stellt mit einem Knopf alle betroffenen Anlagen neu auf · `'auto'` = beim Start von selbst · `'off'` = nichts |
| `Config.Guide.MaxStep`                                              | `0.6`                                             | Schnell-Aufbau: so viele Meter darf der Boden unter einem Platz uneben sein, sonst gilt „kein Platz“                                                                                |
| `Config.Guide.AvoidRoads`                                           | `true`                                            | Schnell-Aufbau: nichts neben der Spur auf eine Straße stellen                                                                                                                       |

**Eigenes Logo auf dem Werbeschild**

Das große Werbeschild (ab Level 70) ist im Spiel ein leerer Rahmen. Das Script zeichnet ein Bild hinein, von beiden Seiten lesbar. Vorgabe ist das Pepper-Scripts-Logo.

1. Bild vorbereiten: PNG (mit Transparenz) oder JPG, am besten quadratisch, 512 bis 1024 Pixel.
2. Datei in den Ordner `pepper_carwash/html/img/` legen, z. B. `mein-logo.png`.
3. In `config/config.lua` unter `Config.Signs` eintragen:

```lua
Image = 'meinlogo',
Images = {
    pepper = { file = 'html/img/sign-logo.png', label = 'Pepper Scripts' },
    meinlogo = { file = 'html/img/mein-logo.png', label = 'Mein Server' },
},
```

4. `ensure pepper_carwash` neu starten.

**Abschalten:** `Config.Signs.Enabled = false` (nirgends ein Bild) oder `Image = false` (keine Vorgabe). Nur an einer Anlage: `/carwashadmin` → Anlage → *Allgemein* → **Bild auf dem Werbeschild** → „kein Bild (leer)“.

Es gehen nur Dateien aus der Ressource – keine Links. Weitere Hinweise (Seitenverhältnis, Helligkeit, gespiegeltes Bild): `INSTALL.md` Abschnitt 8.

**Selbst-Vermessung**

Das Script liest die Maße aller Modelle einmalig selbst aus dem Spiel – im Hintergrund, sobald ein Admin online ist – und stellt damit jedes Teil mittig und auf den Boden. Für mitgelieferte Modelle gelten immer die mitgelieferten Maße (`config/model-dims.lua`); eine abweichende Messung steht unter `/carwashadmin` → **Diagnose** und gilt erst, wenn du dort **Messung übernehmen** klickst (nur sinnvoll, wenn du ein Prop ersetzt hast). Eigene Modelle trägst du einfach als Kandidat in `config/parts.lua` ein – sie werden beim nächsten Start vermessen.

#### Feineinstellung

Alle Felder haben eine Vorgabe – nur anfassen, wenn im Spiel etwas nicht passt.

| Feld                                                | Vorgabe                                      | Wann anfassen                                                                                                                                                                          |
| --------------------------------------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Config.LanceSpray.FromNozzle` / `.Nozzle`          | `true` / `{ x = 0.0, y = 0.16, z = 0.02 }`   | Spritzpistole: der Strahl beginnt an der Düse des Props. Beginnt er neben der Pistole, `Nozzle` anpassen                                                                               |
| `Config.LanceSpray.Hand`                            | `bone = 28422`, Versatz und Drehung          | Lage der Spritzpistole in der Hand – sitzt sie schief: `/cwdev` → *Spritzpistole ausrichten*                                                                                           |
| `Config.LanceSpray.TurnToCamera` / `.TurnSpeed`     | `true` / `420.0`                             | beim Sprühen dreht sich die Figur zur Blickrichtung der Kamera, mit so vielen Grad je Sekunde                                                                                          |
| `Config.LanceSpray.Pitch`                           | `{ Follow = true, Min = -35.0, Max = 25.0 }` | der Strahl folgt der Neigung der Kamera in diesen Grenzen (Grad)                                                                                                                       |
| `Config.Effects.Anchor`                             | `'prop_ld_test_01'`                          | unsichtbares Prop auf der Spurachse, an dem die Düsen einer Station hängen – ändern, falls das Prop bei dir sichtbar ist                                                               |
| `Config.Effects.GantryTurn`                         | `0.85`                                       | Portalanlage: hinterer Umkehrpunkt des Portals auf der Spur (0 = Anfang, 1 = Ende)                                                                                                     |
| `config/programs.lua` – Effekt-Kandidat `rot`       | `{ x = 0.0, y = 0.0, z = 0.0 }`              | eigene Drehung dieses einen Effekts – sprüht ein Effekt falsch: `/cwdev` → *Effekt-Richtung einstellen*                                                                                |
| `config/parts.lua` – `openTurn` / `openSeconds`     | Schranke `90.0` / `1.0`                      | um so viele Grad schwenkt die Schranke um den Pfosten, in so vielen Sekunden. Schwenkt sie zur falschen Seite: `openTurn = -90.0`                                                      |
| `config/parts.lua` – `offset`, `hOffset`, `zOffset` | je Modell                                    | optionale Feinkorrektur: seitlicher Versatz, Drehung und Höhe eines Modells. Seit 1.1.0 rechnet das Script die Lage aus den Modellmaßen – ein eingetragener Wert geht der Rechnung vor |

Für jedes Teil steht in `config/parts.lua` eine Liste mit Modell-Kandidaten: Der Client nimmt das erste Modell, das dein Spiel kennt. Lädt keins, arbeitet die Station trotzdem – mit Effekten, Ton und Licht. `/carwashadmin` → **Diagnose** zeigt, welche Modelle gewählt wurden.

#### Nur Server (`config/server.lua`)

| Option                         | Standard                       | Bedeutung                                                                                                                                                 |
| ------------------------------ | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ServerConfig.Webhooks`        | alle `''`                      | `admin`, `ownership`, `inactivity`, `milestones`, `washes`, `security` – siehe **Befehle & Exports**                                                      |
| `ServerConfig.WebhookName`     | `'Pepper Carwash'`             | Absendername der Webhook-Meldungen                                                                                                                        |
| `ServerConfig.AdminAce`        | `'pepper_carwash.admin'`       | ACE-Recht für Admins                                                                                                                                      |
| `ServerConfig.VersionCheck`    | `true`                         | Update-Hinweis in der Konsole (lädt keinen Code)                                                                                                          |
| `ServerConfig.PidSalt`         | `true`                         | öffentliche Kurz-ID der Spieler in Listen: `true` = zufälliges Server-Geheimnis, `'text'` = eigenes Geheimnis, `false` = ohne Geheimnis (nicht empfohlen) |
| `ServerConfig.SavePlayerAbove` | `5000`                         | nach Buchungen ab diesem Betrag wird der Spieler im Framework gespeichert · `-1` = nie                                                                    |
| `ServerConfig.LongCallSeconds` | `30`                           | Zeitlimit für Admin-Aufrufe, die viel schreiben (anlegen, umbauen, verschieben, löschen) – nur erhöhen, wenn die Datenbank langsam ist                    |
| `ServerConfig.Paging`          | `{ Washes = 10, Parts = 120 }` | große Listen gehen in Seiten an die Spieler – verkleinern, wenn die Konsole vor zu großen Ereignissen warnt                                               |

### Spielablauf

#### Eine Anlage anlegen

`/carwashadmin` → Reiter **Neu**. Jeder Weg fragt zuerst nach Name, Kaufpreis und Zustand; danach blendet die Oberfläche aus, bis du gesetzt oder abgebrochen hast.

{% tabs %}
{% tab title="Geführter Aufbau" %}
**Für jedes Grundstück** – freie Fläche, Hinterhof, Durchfahrt in einem Gebäude. Empfohlen.

Art (SB-Waschbox, Portalanlage, Waschstraße) und Ausbaustufe wählen → *Im Spiel platzieren*.

**Schnell-Aufbau (Vorgabe, seit 1.1.0):** Du setzt nur die Spur – bei der Waschstraße Einfahrt (mit Fahrtrichtung), Anfang und Ende der Waschstrecke und Ausfahrt, bei der Portalanlage Einfahrt und Anfang des Stellplatzes, bei der SB-Waschbox nur den Standort. Alles andere stellt das Script selbst auf: Stationen, Schranke, Terminal, Wände, Technik, Büro, Dienst, Lager, Schilder und weitere Spuren – auf Bodenhöhe und nur dort, wo Platz ist. Was nicht passt, wandert auf die andere Seite der Spur oder entfällt. Vor dem Speichern zeigt eine Zusammenfassung alles als Vorschau und nennt, was gesetzt und was ausgelassen wurde.

**Genau einstellen:** Oben am Bildschirm fragt ein Assistent Schritt für Schritt jeden Platz ab: Einfahrt, Anfang und Ende der Waschstrecke, Ausfahrt, Warteplätze, Schranke und Terminal, jede Station, Büro, Dienst, Lager, Verkaufsschild, Namensschild, Außenanlagen, weitere Spuren.

Je Schritt steht eine Vorschau am Vorschlag: **Eingabe** bestätigen · `H` selbst zielen · `Q`/`E` oder Mausrad drehen (Umschalt fein) · Bild↑/↓ Höhe · `G` Schritt zurück · `X` auslassen · **Rücktaste zweimal** = alles verwerfen.

Gebaut wird erst mit dem Speichern am Ende.
{% endtab %}

{% tab title="Fertiganlage" %}
**Für freie Flächen.**

Bauplan (SB-Waschbox, Portalanlage, Waschstraße) und Ausbaustufe wählen, unter **Standort** festlegen, wohin weitere Spuren wachsen (**automatisch** = nach dem Platzieren im Spiel geprüft: rechts, sonst links, sonst keine · oder fest rechts / links / keine) und welche Plätze neben der ersten Spur hier nie gebaut werden → *Im Spiel platzieren*.

Die Vorschau folgt dem Fadenkreuz: `Q`/`E` oder Mausrad drehen (Umschalt 1°, Alt 45°), Bild↑/↓ heben, **Eingabe** setzen, **Rücktaste oder ESC** abbrechen. Blauer Rahmen = wird sofort gebaut, oranger Rahmen = Endausbau.
{% endtab %}

{% tab title="Zonen" %}
**Für ein vorhandenes Gebäude** – die Waschanlagen des Spiels oder dein MLO. Props werden dabei nicht gesetzt.

Nacheinander an Einfahrt, Anfang und Ende der Waschstrecke und Ausfahrt gehen oder fahren und jeweils `E` drücken – die Blickrichtung ist die Fahrtrichtung. Mausrad = Spurbreite, `Q` = Warteplatz, `G` = SB-Platz, `H` = Schild, Rücktaste = Schritt zurück, Eingabe = fertig.
{% endtab %}

{% tab title="Baumodus" %}
**Eigenbau aus Einzelteilen.**

Zuerst den Ursprung setzen, dann öffnet sich der Baumodus: `TAB` Katalog (49 Teile), Teil wählen, setzen; `F` aufnehmen, `Entf` entfernen, Rücktaste verlassen. Die Spur setzt du danach in den Details mit *Zonen neu setzen*.
{% endtab %}
{% endtabs %}

| Zustand        | Bedeutung                                                               |
| -------------- | ----------------------------------------------------------------------- |
| *Zu verkaufen* | an der Anlage erscheint ein Verkaufsschild – dort kauft ein Spieler sie |
| *Staatsanlage* | für alle nutzbar, nicht käuflich, das Geld verschwindet                 |
| *Gesperrt*     | geschlossen                                                             |

Der Name der Anlage ist zugleich der Name des Karten-Blips. Erlaubt sind Buchstaben, Ziffern, Leerzeichen und `- ' & . ! +`.

**Betriebs-Punkte:** Büro (Tablet), Dienst, Lager und Verkaufsschild bringt ein Bauplan mit. Bei Zonen- und Baumodus-Anlagen liegen sie zunächst links neben der Einfahrt; mit *Punkte setzen* in den Details legst du sie – und Staubsaugerplätze – dorthin, wo sie hingehören.

**Nachträglich anpassen:** In den Details einer Fertiganlage oder einer geführt aufgebauten Anlage stehen drei Abschnitte. *Ausbaustufe* baut alle Plätze bis zu einem Level. *Standort* legt fest, was an dieser Anlage nie gebaut wird; *Teile neu aufstellen* stellt alle Teile wieder so auf, wie der Bauplan sie vorsieht. *Plätze neu setzen* versetzt einen einzelnen Platz im Spiel.

{% hint style="warning" %}
Der Reiter **Standard-Waschanlagen** legt auf Wunsch fünf bekannte Standorte an. Die Koordinaten sind Näherungen – jede Anlage vor Ort prüfen und mit *Zonen neu setzen* korrigieren.
{% endhint %}

#### Eine Wäsche in fünf Schritten

{% stepper %}
{% step %}
**Vorfahren**

An der Einfahrt halten, `E` drücken, Programm und Extras wählen. Jede Karte zeigt Preis, Dauer, Stationen und den Wachs-Schutz. Bei gesperrten Programmen steht der Grund (Level, fehlende Station, leeres Lager).
{% endstep %}

{% step %}
**Bezahlen**

Mit *Wäsche starten* wird das Geld sofort abgebucht. Bleib im Fahrzeug – steigst du aus, bricht die Wäsche ab.
{% endstep %}

{% step %}
**Wäsche**

In der Waschstraße wird das Fahrzeug durch die Stationen geführt, in der Portalanlage fährt das Portal über das stehende Fahrzeug. Die Anzeige zeigt Programm, Station und Restzeit.
{% endstep %}

{% step %}
**Fertig**

Der Schmutz ist weg; ein Wachs-Programm hält das Fahrzeug für die angezeigte Zeit sauber – in echter Zeit, auch in der Garage und nach einem Server-Neustart.
{% endstep %}

{% step %}
**Abbrechen**

`X` zweimal drücken – ohne Erstattung. Bricht die Anlage selbst wegen einer Störung ab, bekommt der Kunde Geld zurück: alles, wenn weniger als die Hälfte gelaufen war, sonst die Hälfte.
{% endstep %}
{% endstepper %}

Preise, Dauer, Abschluss, Wachs und Rechte entscheidet der Server; jeder Aufruf wird geprüft (Ort, Zustand, Zeit, Rate-Limit).

| Programm        | Ab Betriebs-Level | Startpreis | Wachs-Schutz |
| --------------- | ----------------- | ---------- | ------------ |
| Basis           | 1                 | 40 $       | –            |
| Schaum          | 3                 | 70 $       | –            |
| Unterboden      | 8                 | 90 $       | –            |
| Wachs           | 15                | 110 $      | 60 min       |
| Premium         | 25                | 180 $      | 120 min      |
| Showroom-Finish | 75                | 260 $      | 180 min      |

**Extras** buchst du zum Programm dazu: Felgenreinigung, Insektenlöser, Scheibenversiegelung, Heißwachs (nur mit einem Wachs-Programm), Nano-Versiegelung und Motorraumwäsche.

**Kundenkarte:** Führt der Betrieb Kundenkarten, gibt es für jede bezahlte Wäsche ab 20 $ einen Stempel. Ist die Karte voll, löst der Kunde in der Programmwahl eine Gratis-Wäsche ein – gratis bis zum Durchschnittspreis der gestempelten Wäschen.

#### SB-Waschbox und Staubsaugerplatz

**SB-Waschbox**

* 1 bis 5 Minuten wählen und bezahlen (15 $ je Minute). Die Zeit läuft sofort – du musst dafür zu Fuß sein.
* Du hältst dann die Spritzpistole: linke Maustaste halten spritzt. Dabei dreht sich deine Figur zur Kamera, und der Strahl geht dahin, wohin du zielst.
* Sauberer wird das Fahrzeug nur, solange der Strahl es trifft – er reicht 6 Meter. Ein völlig verdrecktes Fahrzeug braucht etwa 40 Sekunden.
* `X` hängt die Spritzpistole zurück. Restzeit wird nicht erstattet. Gehst du weiter als 14 Meter weg, endet deine Zeit.

**Staubsaugerplatz**

* Stell dein Fahrzeug am Platz ab, steig aus und drücke `E`.
* Selbst saugen kostet 10 $ und dauert 20 Sekunden.
* Innenreinigung (60 $) und Politur von Hand (120 $) erledigt ein Mitarbeiter. Du bezahlst sofort; übernimmt es niemand rechtzeitig, bekommst du das Geld automatisch zurück.

#### Einen Betrieb kaufen und führen

Ein Spieler kauft eine Anlage an ihrem **Verkaufsschild** – jeder höchstens eine (`Config.Ownership.Scope`: je Charakter oder je Lizenz). Der Besitzer kann sie zurückverkaufen, an einen Spieler übertragen oder umbenennen.

Das **Tablet des Betriebs** öffnet sich mit `/carwash` oder mit `E` am Büro-Punkt. Lesen geht von überall, ändern nur vor Ort.

| Seite                | Inhalt                                                                                             |
| -------------------- | -------------------------------------------------------------------------------------------------- |
| **Übersicht**        | Stand des Betriebs, Warnungen (zum Beispiel ein Tank unter 20 %), Countdown der Inaktivitäts-Regel |
| **Aufgaben**         | offene Aufgaben mit Stecknadel für den Wegpunkt, dein Stand zum Tageslimit                         |
| **Level & Upgrades** | XP-Leiste, nächste Freischaltungen, Upgrades kaufen, Schaumfarbe                                   |
| **Prüfung**          | Stand der Betriebsprüfung mit einem Balken je Prüfungsaufgabe                                      |
| **Finanzen**         | Firmenkonto, Tagesabrechnung, Buchungen                                                            |
| **Preise**           | jeder Preis zwischen 50 % und 130 % des Startpreises                                               |
| **Lager**            | Bestand, Wasser, Kanister und Ersatzteile bestellen                                                |
| **Stationen**        | Zustand jeder Station, Techniker rufen                                                             |
| **Personal**         | Mitarbeiter, Ränge, Schichtlohn je Person                                                          |
| **Kundenkarten**     | Kundenkarten des Betriebs                                                                          |
| **Flotten**          | Firmenkarten und Flottenverträge                                                                   |
| **Statistik**        | Statistik der letzten 30 Tage                                                                      |
| **Einstellungen**    | Löhne (Provision, Lohn je Aufgabe) und Einstellungen des Betriebs                                  |
| **Hilfe**            | die Spieler-Anleitung mit den Werten deines Servers                                                |

* **Firmenkonto:** Jede Wäsche, SB-Minute, Staubsauger-Nutzung und jeder Service wird darauf gebucht; Löhne, Nachschub und Techniker werden davon bezahlt.
* **Preise:** NPC-Kunden reagieren darauf – je teurer, desto weniger kommen.
* **NPC-Kunden** kommen nur, solange jemand im Dienst ist. Mehr Leute im Dienst bringen mehr Kunden (bis +15 %).
* **Inaktivität:** Wer 30 Tage nicht online ist, verliert die Anlage, und das Firmenkonto verfällt. Gewarnt wird 7, 3 und 1 Tag vorher.

#### Personal

Der Besitzer stellt Spieler vor Ort ein – ohne Framework-Job. Am Anfang hat ein Betrieb 2 Personalplätze, mit Upgrades bis zu 12.

| Rang           | Ab Betriebs-Level | Darf zusätzlich                                                  |
| -------------- | ----------------- | ---------------------------------------------------------------- |
| Aushilfe       | 1                 | Dienst und Aufgaben                                              |
| Mitarbeiter    | 1                 | Lieferungen abholen, nachfüllen                                  |
| Schichtleiter  | 10                | Nachschub bestellen, Techniker rufen, Deko setzen                |
| Betriebsleiter | 25                | Preise, Einstellen, Upgrades, Baumodus, Finanzen                 |
| Stellvertreter | 60                | Personal verwalten, ein- und auszahlen, Buchungen, Einstellungen |

Die Rangnamen sind Standardnamen und je Anlage umbenennbar. Verkaufen, übertragen und umbenennen kann nur der Besitzer.

**Dienst beginnen:** Geh zum Dienst-Punkt deiner Anlage und drücke `E` – dort geht auch `/carwashduty`. Aufgaben gibt es nur im Dienst. Verlässt du das Gelände (60 m um die Anlage) länger als 90 Sekunden, endet dein Dienst von selbst.

| Dein Verdienst | Wann                                                                  | Standard                                          |
| -------------- | --------------------------------------------------------------------- | ------------------------------------------------- |
| Aufgabenlohn   | je erledigter Aufgabe, je nach Leistung 80–120 %                      | siehe Tabelle unten, höchstens 6.000 $ am Tag     |
| Provision      | an jeder abgeschlossenen Kundenwäsche, geteilt durch alle im Dienst   | 15 % (Besitzer stellt 0–30 % ein)                 |
| Schichtlohn    | alle 15 Minuten Dienst – nur wenn du in der Zeit etwas geleistet hast | legt der Besitzer je Person fest, höchstens 150 $ |
| Trinkgeld      | manchmal nach Handarbeit am Kundenfahrzeug                            | 5–25 $, höchstens 1.500 $ am Tag                  |

Alle Löhne zahlt das Firmenkonto des Betriebs. Reicht es nicht, entfällt der Lohn für diese Aufgabe. Nur Trinkgeld kommt direkt vom Kunden.

#### Aufgaben

Offene Aufgaben stehen im Tablet unter **Aufgaben** und schweben als farbige Markierung über ihrem Ort. Geh zu Fuß hin und drücke `E`. Vor dem ersten Mal zeigt jede Aufgabe eine Einweisung – die Zeit läuft erst nach **Los**. `ESC` bricht ein Minispiel ab; die Aufgabe bleibt dann offen.

| Aufgabe            | Ab Level | Wer         | Wo                                    | Minispiel                           | Lohn                    | XP |
| ------------------ | -------- | ----------- | ------------------------------------- | ----------------------------------- | ----------------------- | -- |
| Störung beheben    | 1        | Aushilfe    | Schaltschrank (rot)                   | Sicherungen merken und nachschalten | 50 $                    | 50 |
| Vorwäsche von Hand | 1        | Aushilfe    | Kundenfahrzeug an der Einfahrt (blau) | Kreis verfolgen, 5 Zonen            | 30 $                    | 30 |
| Trocknen von Hand  | 2        | Aushilfe    | Kundenfahrzeug an der Ausfahrt (blau) | Kreis verfolgen, 4 Bahnen           | 25 $                    | 25 |
| Innenreinigung     | 10       | Aushilfe    | Fahrzeug am Staubsaugerplatz (gelb)   | Flecken absaugen, Scheibe wischen   | 40 $ + 50 % vom Service | 60 |
| Politur von Hand   | 55       | Aushilfe    | Fahrzeug am Staubsaugerplatz (gelb)   | Kreis verfolgen, 4 Flächen          | 60 $ + 50 % vom Service | 60 |
| Chemie nachfüllen  | 1        | Mitarbeiter | Lager-Punkt (grün)                    | Ventil im grünen Bereich loslassen  | 20 $                    | 25 |
| Walzen warten      | 4        | Aushilfe    | neben der Station (grün)              | Tasten, Regler, Timing              | 45 $                    | 45 |
| Lieferung abholen  | 1        | Mitarbeiter | Großhandel → Lager-Punkt              | keins (aufladen, fahren, abladen)   | 80 $                    | 80 |

Lohn und XP sind die Werte bei 100 %. Bei jeder Aufgabe mit Minispiel zählt, wie zügig und fehlerfrei du arbeitest: Lohn **und** XP liegen zwischen **80 %** und **120 %**. Für „Lieferung abholen“ gilt immer der volle Wert.

{% hint style="info" %}
Alle Zahlen auf dieser Seite sind **Standardwerte** der Config. Die Tablet-Seite **Hilfe** und die Dateien `SPIELER-ANLEITUNG.md` (Deutsch) und `PLAYER-GUIDE.md` (Englisch) in der Ressource erklären jede Aufgabe im Einzelnen – kopiere sie in dein Wiki oder deinen Discord und passe sie an.
{% endhint %}

#### Lager, Verschleiß und Störungen

* **Tanks:** Der Wassertank und die Maschinentanks (Shampoo, Wachs) leeren sich mit jeder Wäsche. Ist einer leer, fallen die Programme aus, die ihn brauchen.
* **Wasser** kommt immer per Tankwagen: mindestens 500 Liter, Wartezeit 5 Minuten.
* **Kanister und Ersatzteile:** beim Großhandel selbst abholen (bezahlte Aufgabe) – oder ab Level 7 liefern lassen: 20 % teurer, Wartezeit 10 Minuten.
* **Automatische Nachbestellung** ist ein Upgrade ab Level 36.

| Zustand der Station | Was passiert                                                                                                  |
| ------------------- | ------------------------------------------------------------------------------------------------------------- |
| 60 % oder weniger   | die Aufgabe „Walzen warten“ erscheint (+40 Punkte, ein Ersatzteil)                                            |
| unter 50 %          | eine Wäsche kann mit einer Störung abbrechen – die Spur steht, bis jemand die Störung am Schaltschrank behebt |
| unter 5 %           | die Station ist außer Betrieb – Programme, die sie brauchen, lassen sich nicht mehr wählen                    |

Der **Techniker** (Schichtleiter oder höher, Seite **Stationen**) kostet 400 $ vom Firmenkonto. Die Spur steht 3 Minuten, danach ist die Station wie neu und eine Störung behoben.

#### Level, Upgrades und Betriebsprüfungen

Jede Wäsche und jede Aufgabe bringt dem **Betrieb** XP – nicht dem Spieler. Manche Level gelten sofort, andere sind Upgrades aus dem Firmenkonto; Stationen, Plätze und Spuren müssen danach vor Ort noch **angebaut** werden.

Bei **Level 30, 60 und 90** reicht die volle XP-Leiste nicht: Der Betrieb muss zusätzlich eine **Betriebsprüfung** bestehen. Sie beginnt von selbst, und das ganze Team füllt dieselben Zähler.

|                              | Betriebsprüfung I (Level 30)               | Betriebsprüfung II (Level 60)       | Meisterprüfung (Level 90)                           |
| ---------------------------- | ------------------------------------------ | ----------------------------------- | --------------------------------------------------- |
| Gewertete Kundenwäschen      | 120                                        | 600                                 | 1.200                                               |
| Bessere Programme            | 30 × „Wachs“ oder höher                    | 100 × „Premium“ oder höher          | 100 × „Showroom-Finish“                             |
| Handarbeit am Kundenfahrzeug | 40                                         | 80, davon 20 Innenreinigung/Politur | –                                                   |
| Lager                        | 12 × nachfüllen, 2 × Lieferung abholen     | –                                   | –                                                   |
| Flottenfahrzeuge             | –                                          | 80                                  | 280                                                 |
| Störungen selbst behoben     | 2, je in unter 6 min                       | 4, je in unter 4 min                | 6, je in unter 3 min                                |
| Betriebstage                 | 3 Tage mit je 45 min Dienst und 10 Wäschen | –                                   | 7 Tage in Folge mit je 90 min Dienst und 40 Wäschen |
| Zufriedenheit                | –                                          | 90 % über die letzten 300 Kunden    | 95 % über die letzten 500 Kunden                    |

Gezählt werden nur echte Kunden: keine Fahrzeuge des eigenen Teams, dasselbe Kennzeichen höchstens einmal je Stunde, derselbe Spielerkunde höchstens dreimal am Tag.

### Befehle & Exports

#### Befehle

| Befehl          | Wer         | Funktion                                                                                                                  |
| --------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- |
| `/carwash`      | alle        | Besitzer und Mitarbeiter: Tablet der eigenen Anlage · alle anderen: Wegpunkt zur nächsten geöffneten Waschanlage          |
| `/carwashduty`  | Mitarbeiter | Dienst beginnen oder beenden (nur am Dienst-Punkt der eigenen Anlage)                                                     |
| `/carwashadmin` | Admin       | Anlagen anlegen, ändern, verschieben, entfernen; Baumodus; Zonen-Editor; Besitz und Inaktivität; Protokoll; Diagnose      |
| `/cwdev`        | Admin       | Prüfwerkzeug: einzelne Teile, Effekte und Töne ansehen, Modellmaße ausgeben, Effekt-Richtung und Spritzpistole einstellen |

Alle Namen sind in `Config.Commands` änderbar (`Main`, `Duty`, `Admin`, `Dev`) – leerer Text schaltet einen Befehl ab. Konsolen-Befehle gibt es nicht.

{% hint style="warning" %}
Scripts wie `esx_carwash` oder `qbx_carwash` benutzen ebenfalls `/carwash`. Das andere Script stoppen oder den Befehl umbenennen, zum Beispiel `Config.Commands.Main = 'waschanlage'`.
{% endhint %}

Die Werkzeuge in `/cwdev` sind lokal und ändern nichts an Anlagen: *Teil ansehen*, *Effekt testen*, *Ton testen*, *Diagnose*, *Modellmaße ausgeben*, *Effekt-Richtung einstellen* und *Spritzpistole ausrichten*. Die beiden letzten notieren ihre Werte mit **Eingabe** in der F8-Konsole und in `fx-values.txt` im Ressourcenordner.

#### Tasten

| Taste                      | Funktion                                                                                     |
| -------------------------- | -------------------------------------------------------------------------------------------- |
| `E`                        | Interagieren: Programm wählen, SB-Waschbox, Punkte des Betriebs, Aufgabe beginnen            |
| `X`                        | Wäsche abbrechen (zweimal drücken), Fortschrittsbalken abbrechen, Spritzpistole zurückhängen |
| Linke Maustaste            | sprühen (SB-Waschbox), halten in den Minispielen                                             |
| `W` `A` `S` `D`, Leertaste | Minispiele „Walzen warten“ und „Chemie nachfüllen“                                           |
| `ESC`                      | Minispiel abbrechen – die Aufgabe bleibt offen                                               |

„Interagieren“ und „Wäsche abbrechen“ sind FiveM-Tastenbelegungen: Jeder Spieler kann sie in den GTA-Einstellungen unter **Tastenbelegung → FiveM** umlegen, die Hinweise zeigen seine Taste. `Config.Interact.DefaultKey` und `Config.Wash.AbortDefaultKey` sind nur die Vorgabe für Spieler, die die Ressource noch nie geladen hatten.

#### Rechte (ACE)

```cfg
add_ace group.admin pepper_carwash.admin allow                        # /carwashadmin und /cwdev
add_ace identifier.license:DEINE_LIZENZ pepper_carwash.admin allow    # oder ein einzelner Spieler
```

Alternativ über eine Gruppe aus `Config.AdminGroups` (Standard `admin`, `superadmin`, `god`). Der Name des ACE-Rechts steht in `config/server.lua` (`ServerConfig.AdminAce`). Alle Rechte werden bei jedem einzelnen Aufruf am Server geprüft.

Im Betrieb vergibt der Besitzer 5 Ränge mit Rechten – siehe **Spielablauf**.

#### Exports (Server)

| Export                                                    | Rückgabe / Wirkung                                                                                                                                        |
| --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `exports.pepper_carwash:getWashes()`                      | alle Anlagen in der öffentlichen Form                                                                                                                     |
| `exports.pepper_carwash:getWash(id)`                      | eine Anlage oder `nil`                                                                                                                                    |
| `exports.pepper_carwash:getWashOf(src)`                   | Anlage, in der der Spieler Besitzer oder Mitarbeiter ist: `{ id, label, owner, grade }` oder `nil`                                                        |
| `exports.pepper_carwash:isOnDuty(src)`                    | `true`, wenn der Spieler an seiner Anlage im Dienst ist                                                                                                   |
| `exports.pepper_carwash:addBalance(washId, amount, info)` | ändert das Firmenkonto einer Anlage mit Besitzer (plus oder minus, z. B. Rechnungen oder Steuern, nie unter 0) – liefert `true` / `false`                 |
| `exports.pepper_carwash:addXp(washId, amount, reason)`    | schreibt Betriebs-XP gut (mit `Config.Level.XpMultiplier`) – liefert die gutgeschriebenen XP. Solche XP zählen nie für die Aufgaben einer Betriebsprüfung |
| `exports.pepper_carwash:hasWax(plate)`                    | Ablaufzeit des Wachs-Schutzes (Unix-Sekunden) oder `false`                                                                                                |
| `exports.pepper_carwash:setWax(plate, minutes)`           | setzt Wachs-Schutz für ein Kennzeichen – liefert die Ablaufzeit oder `nil`                                                                                |
| `exports.pepper_carwash:removeWax(plate)`                 | entfernt den Wachs-Schutz – liefert `true` / `false`                                                                                                      |

#### Exports (Client)

| Export                                 | Rückgabe / Wirkung                                |
| -------------------------------------- | ------------------------------------------------- |
| `exports.pepper_carwash:isWashing()`   | `true`, solange für den Spieler eine Wäsche läuft |
| `exports.pepper_carwash:nearestWash()` | ID der nächsten Anlage und die Entfernung dorthin |
| `exports.pepper_carwash:openTablet()`  | öffnet das Tablet der eigenen Anlage              |

Beispiel – einem Fahrzeug aus einem anderen Script zwei Stunden Wachs-Schutz geben:

```lua
exports.pepper_carwash:setWax(plate, 120)
```

#### Server-Ereignisse

Mit `AddEventHandler` zuhören – **nicht** mit `RegisterNetEvent`:

| Ereignis                      | Argumente                            | Wann                                                                              |
| ----------------------------- | ------------------------------------ | --------------------------------------------------------------------------------- |
| `pepper_carwash:washed`       | `src, washId, program, plate, price` | eine Wäsche wurde abgeschlossen (NPC-Kunde: `src = nil`)                          |
| `pepper_carwash:renamed`      | `washId, label`                      | eine Anlage wurde umbenannt                                                       |
| `pepper_carwash:ownerChanged` | `washId, reason`                     | `reason` ist `bought`, `sold`, `transferred`, `inactive`, `admin` oder `restored` |
| `pepper_carwash:levelUp`      | `washId, level`                      | je erreichtem Level                                                               |
| `pepper_carwash:examPassed`   | `washId, stage`                      | Betriebsprüfung bestanden (`stage` = 30, 60 oder 90)                              |

#### Webhooks

In `config/server.lua` (`''` = aus):

```lua
ServerConfig.Webhooks = {
    admin = '',      -- Anlagen angelegt, geändert, verschoben, entfernt; Eingriffe in Besitz und Firmenkonto
    ownership = '',  -- Kauf, Verkauf, Übertragung, Umbenennung durch den Besitzer
    inactivity = '', -- Vorwarnungen und Freigaben wegen Inaktivität
    milestones = '', -- Level 10, 20, … 100 und bestandene Betriebsprüfungen
    washes = '',     -- abgeschlossene Wäschen (optional, kann viel sein)
    security = '',   -- Verdachtsfälle der Plausibilitätsprüfung
}
ServerConfig.WebhookName = 'Pepper Carwash'
```

Webhook-URLs nie öffentlich teilen.

#### Bridges (offen)

| Datei                                             | Zweck                                                                                                                    |
| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `bridge/detect.lua`                               | Framework-Erkennung                                                                                                      |
| `bridge/server/esx.lua`, `qbcore.lua`, `qbox.lua` | Geld, Name und Gruppen je Framework                                                                                      |
| `bridge/server/standalone.lua`                    | Standalone-Modus ohne Framework (Identität = Lizenz, Geld = ox\_inventory-Item `money`) – nur, wenn kein Framework läuft |
| `bridge/server/inventory.lua`                     | Inventare für die optionalen Items: ox\_inventory, qb-inventory, ps-inventory, qs-inventory, ESX                         |
| `bridge/client/target.lua`                        | ox\_target / qb-target für die SB-Waschbox                                                                               |
| `bridge/client/frameworks.lua`                    | Benachrichtigung des Frameworks am Client (`Config.Notify.Mode = 'framework'`)                                           |
| `bridge/client/dirt.lua`                          | eigenes Schmutz-System (`Config.Dirt.Mode = 'custom'`)                                                                   |

### FAQ

#### Fehlerbehebung

| Problem                                                                               | Lösung                                                                                                                                                                                                                                              |
| ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Ressource startet nicht, die Konsole nennt eine fehlende Abhängigkeit                 | `oxmysql` muss vor `pepper_carwash` starten, OneSync muss an sein, Server-Build 7290 oder neuer.                                                                                                                                                    |
| Roter Kasten „standalone-Modus“ in der Konsole                                        | Kein Framework erkannt – `es_extended`, `qb-core` oder `qbx_core` **vor** `pepper_carwash` starten oder `Config.Framework` fest setzen.                                                                                                             |
| Keine grüne Zeile `Pepper Carwash 1.1.0 gestartet (…)`                                | Konsole nach roten Zeilen mit `pepper_carwash` durchsehen.                                                                                                                                                                                          |
| „Pepper Carwash startet noch“ bleibt stehen                                           | Der Server-Start ist nicht durchgelaufen – Datenbank nicht erreichbar (`mysql_connection_string` prüfen) oder der Benutzer darf keine Tabellen anlegen: `install/pepper_carwash.sql` importieren.                                                   |
| Direkt nach einem Neustart: „Pepper Carwash ist noch nicht bereit.“                   | Die Oberfläche lädt noch – ein paar Sekunden warten und noch einmal versuchen. Bleibt es dabei, F8 nach Fehlern mit `pepper_carwash` durchsehen.                                                                                                    |
| `/carwashadmin`: „Dafür fehlt dir die Berechtigung“                                   | `add_ace group.admin pepper_carwash.admin allow` in die `server.cfg` eintragen und den Server neu starten.                                                                                                                                          |
| `/carwash` tut etwas anderes als erwartet                                             | Ein zweites Script benutzt den Befehl – stoppen oder `Config.Commands.Main` ändern.                                                                                                                                                                 |
| Kein Hinweistext an einem Punkt, kein Fortschrittsbalken                              | Die Oberfläche der Ressource ist nicht geladen – F8 nach Fehlern mit `pepper_carwash` durchsehen.                                                                                                                                                   |
| Ein Teil sieht falsch aus, steht falsch herum, schwebt oder versinkt                  | Zuerst `/carwashadmin` → **Diagnose** → Vermessung: steht dort „vermessen“? Sonst **Neu vermessen**. Danach Modell bzw. `zOffset` in `config/parts.lua` tauschen oder das Teil im Baumodus drehen. `/cwdev` → *Teil ansehen* zeigt Modell und Maße. |
| Die Schranke schwenkt zur falschen Seite                                              | In `config/parts.lua` bei `entry_gate` `openTurn = -90.0` setzen.                                                                                                                                                                                   |
| Ein Effekt ist nicht zu sehen                                                         | `/cwdev` → *Effekt testen*; Reihenfolge der Kandidaten in `config/programs.lua` ändern.                                                                                                                                                             |
| Ein Effekt sprüht in die falsche Richtung                                             | `/cwdev` → *Effekt-Richtung einstellen*, danach die notierten Werte in `config/programs.lua` beim Kandidaten als `rot = { x, y, z }` eintragen.                                                                                                     |
| Die Spritzpistole sitzt schief in der Hand                                            | `/cwdev` → *Spritzpistole ausrichten*, danach die notierten Werte bei `Config.LanceSpray.Hand` bzw. `.Nozzle` eintragen.                                                                                                                            |
| Kein Ton                                                                              | `Config.Effects.Sounds = 'nui'`                                                                                                                                                                                                                     |
| Fahrzeug fährt unsauber durch die Waschstraße                                         | `Config.Wash.Guide` auf `'speed'` oder `'conveyor'` stellen.                                                                                                                                                                                        |
| Ein Fahrzeug wird als „zu groß“ abgelehnt                                             | `Config.Wash.MaxVehicle` anpassen (mit `Config.Debug = true` steht der Messwert in F8).                                                                                                                                                             |
| NPC-Fahrzeuge bleiben hängen                                                          | `Config.Npc.Visible = false` – der Betrieb läuft dann vollständig ohne Fahrzeuge.                                                                                                                                                                   |
| Büro-, Dienst- oder Lager-Punkt liegt in einer Wand                                   | `/carwashadmin` → Anlage → *Punkte setzen*.                                                                                                                                                                                                         |
| Ein Admin-Aufruf meldet „Der Server antwortet nicht“, die Änderung ist danach aber da | Die Datenbank ist langsam – `ServerConfig.LongCallSeconds` in `config/server.lua` erhöhen.                                                                                                                                                          |
| Die Konsole warnt vor zu großen Netz-Ereignissen                                      | `ServerConfig.Paging` in `config/server.lua` verkleinern.                                                                                                                                                                                           |
| Konsole: `Items: … Lagerbetrieb ohne Items`                                           | Kein Fehler: Es läuft kein unterstütztes Inventar oder die Items sind nicht eingerichtet – der Betrieb läuft mit Zählern im Lager.                                                                                                                  |
| Mitarbeiter hat für eine Aufgabe keinen Lohn bekommen                                 | Die Meldung nennt den Grund: Tageslimit erreicht oder Firmenkonto reicht nicht.                                                                                                                                                                     |
| Ein Programm lässt sich nicht wählen                                                  | Auf der Karte steht der Grund: Betriebs-Level, eine fehlende oder verschlissene Station oder ein leerer Tank.                                                                                                                                       |

{% hint style="info" %}
`/carwashadmin` → Reiter **Diagnose** zeigt Version, Framework und welches Modell je Teil gewählt wurde. Für mehr Ausgaben `Config.Debug = true` setzen und danach wieder ausschalten.
{% endhint %}

#### Fragen

<details>

<summary>Brauche ich ein MLO oder Addon-Modelle?</summary>

Nein. Jedes Bauteil ist ein Prop, das zum Spiel gehört. Du kannst jedes Modell in `config/parts.lua` tauschen, z. B. gegen Props eines Karten-Pakets auf deinem Server.

</details>

<details>

<summary>Braucht es ox_lib, ein Target-Script oder ein Inventar?</summary>

Nein. Einzige Abhängigkeit ist oxmysql. ox\_target / qb-target und ein Inventar sind optional und werden automatisch erkannt.

</details>

<details>

<summary>Welche Frameworks und Inventare werden unterstützt?</summary>

ESX Legacy, QBCore und Qbox. Die optionalen Items laufen mit ox\_inventory, qb-inventory, ps-inventory, qs-inventory und dem ESX-Inventar. Im Spiel getestet auf ESX Legacy mit ox\_inventory.

</details>

<details>

<summary>Läuft es mit den Waschanlagen des Spiels oder mit meinem MLO?</summary>

Ja – über *Zonen*: Du markierst Einfahrt, Waschstrecke und Ausfahrt, Props werden dabei nicht gesetzt.

</details>

<details>

<summary>Ist das ein Framework-Job?</summary>

Nein. Der Besitzer stellt Spieler an der Anlage ein; Ränge, Dienst und Löhne gehören zum Script.

</details>

<details>

<summary>Gibt es passives Einkommen?</summary>

In der Standardeinstellung nicht: NPC-Kunden kommen nur, solange jemand im Dienst ist.

</details>

<details>

<summary>Kann ich das Geld an meine Server-Wirtschaft anpassen?</summary>

Ja. `Config.Economy.IncomeMultiplier` skaliert alles Geld von NPC-Kunden, `Config.Economy.UpgradeMultiplier` alle Upgrade- und Deko-Preise. Programmpreise stehen in `config/programs.lua`, Löhne in `config/staff.lua`.

</details>

<details>

<summary>Wie stelle ich ein, wie schnell ein Betrieb aufsteigt?</summary>

Mit `Config.Level.XpMultiplier`: `2.0` ist etwa die halbe Dauer. `Config.Level.Exams.Enabled = false` schaltet die Betriebsprüfungen auf Level 30, 60 und 90 ab.

</details>

<details>

<summary>Kann ein Spieler mehrere Anlagen besitzen?</summary>

Nein, jeder höchstens eine. `Config.Ownership.Scope` bestimmt, ob das je Charakter (`'character'`) oder je Lizenz (`'license'`) gilt.

</details>

<details>

<summary>Was passiert mit Anlagen inaktiver Besitzer?</summary>

Wer 30 Tage nicht online war, verliert die Anlage, und das Firmenkonto verfällt. Gewarnt wird 7, 3 und 1 Tag vorher, Admins können eine Anlage schützen und danach wiederherstellen. Mit `Config.Inactivity.Enabled = false` schaltest du die Regel ab.

</details>

<details>

<summary>Kann ich Anlagen ohne Besitzer betreiben?</summary>

Ja. Stell den Zustand auf *Staatsanlage*: Die Anlage ist für alle nutzbar und nicht käuflich.

</details>

<details>

<summary>Was passiert bei einem Server-Neustart?</summary>

Laufende Wäschen enden und werden nach der Regel der Anlage erstattet. Anlagen, Firmenkonto, Lager, Level und Wachs-Schutz liegen in der Datenbank.

</details>

<details>

<summary>Kann ich mein eigenes Logo auf das Werbeschild setzen – oder es abschalten?</summary>

Ja, seit 1.1.0. Vorgabe ist das Pepper-Scripts-Logo. Eigenes Bild in `html/img/` legen und in `Config.Signs` eintragen, `Config.Signs.Enabled = false` schaltet das Bild ab. Schritt für Schritt: **Konfiguration**.

</details>

<details>

<summary>Nach dem Update steht in /carwashadmin „Bauplan wurde aktualisiert“ – was tun?</summary>

Ein Update hat einen Bauplan geändert, die Teile deiner Fertiganlagen stehen noch an der alten Stelle. Einmal **„Alle betroffenen Anlagen neu aufstellen“** drücken. Von selbst baut das Script nichts um. Bauplan-Teile, die du im Baumodus verschoben hast, gehen dabei zurück an ihren Platz; zusätzlich gesetzte Teile bleiben.

</details>

<details>

<summary>Wie stelle ich auf Englisch um?</summary>

`Config.Locale = 'en'` in `config/config.lua`. Die Sprache gilt für alle Spieler.

</details>

#### Support

Eröffne ein Ticket in unserem [Discord](https://discord.gg/6NaFJWKDYu) und verknüpfe deinen Kauf vorher mit `/verify`. Mehr: **Support**.

### Changelog

#### 1.1.0 – 2026-10-11

{% hint style="info" %}
**Update von 1.0.0:** Ordner tauschen, Server starten – keine Datenbank-Änderung, deine `config.lua` funktioniert weiter. Danach in `/carwashadmin` einmal **„Alle betroffenen Anlagen neu aufstellen“** drücken. Alle Schritte stehen unter **Installation → Update**.
{% endhint %}

**Neu**

* Schnell-Aufbau als Vorgabe im geführten Aufbau: nur die Spur setzen – Stationen, Schranke, Terminal, Wände, Technik, Schilder und weitere Spuren stellt das Script selbst auf, nur dort, wo Platz ist; Zusammenfassung vor dem Bauen
* Selbst-Vermessung: das Script liest die Maße aller Modelle einmalig selbst aus dem Spiel und stellt jedes Teil mittig und auf den Boden – auch eigene Props (`Config.Measure`)
* Bild auf dem großen Werbeschild, von beiden Seiten lesbar – Vorgabe ist das Pepper-Scripts-Logo, eigenes Bild oder abschalten über `Config.Signs`
* Knopf „Alle betroffenen Anlagen neu aufstellen“ nach Bauplan-Änderungen (`Config.World.AutoRebuild`)
* Fertiganlage: „Weitere Spuren: automatisch“
* Staubsaugerplatz: Vorschau zeigt den Stellplatz des Fahrzeugs als Umriss
* Diagnose: abweichende Messungen einzeln übernehmen oder verwerfen

**Geändert**

* Der Stellplatz am Staubsauger liegt auf der Bedienseite der Säule; das Einfahrt-Schild in den Bauplänen ist gedreht
* `config/parts.lua`: `zOffset` / `offset` nur noch als Feinkorrektur – ein eingetragener Wert geht der Rechnung vor
* Zurückhaltendere Vorgaben für Ersatz-Effekte in `config/programs.lua`

**Behoben**

* Trockner-Gebläse und Pflanzkübel schwebten 26 bzw. 14 cm über dem Boden
* Das Einfahrt-Schild der Baupläne stand verkehrt herum
* Der Stellplatz am Staubsauger konnte hinter der Säule oder in einem Gebäude liegen

#### 1.0.0 – 2026-10-11

**Erste Version**

* Waschanlagen im Spiel erstellen mit `/carwashadmin`: geführter Aufbau, Fertiganlage, Baumodus mit 49 Teilen oder Zonen in vorhandenen Gebäuden
* 3 Anlagentypen (SB-Waschbox, Portalanlage, Waschstraße) aus GTA-eigenen Props – kein MLO, keine Addon-Modelle
* 6 Waschprogramme und 6 Extras mit Partikeln, Ton und Fortschrittsanzeige; Wachs-Schutz, der Garage und Neustart übersteht
* SB-Waschbox mit Spritzpistole, Staubsaugerplatz mit Innenreinigung und Politur als Services
* Kaufbare Betriebe (jeder Spieler höchstens eine Anlage), Verkauf und Übertragung, Staatsanlagen ohne Besitzer
* Tablet mit Firmenkonto, Tagesabrechnung, eigenen Preisen, Lager, Stationen, Personal, Statistik und Hilfe
* Lager und Verschleiß: Wasser, Shampoo, Wachs und Ersatzteile, Störungen, Techniker
* Mitarbeiter mit 5 Rängen, Dienst, Provision, Aufgaben- und Schichtlohn; 8 Aufgaben, 7 davon als Minispiel
* Betriebs-Level 1–100 mit 90 Upgrades, Baumodus für Besitzer und Betriebsprüfungen auf Level 30, 60 und 90
* NPC-Kunden, Kundenkarten, Firmenkarten und Flottenverträge
* Inaktivitäts-Regel (Standard 30 Tage) mit Vorwarnungen, Admin-Schutz und Wiederherstellen
* Admin-Werkzeuge mit Protokoll und Diagnose, 6 Discord-Webhooks, Server- und Client-Exports
* Eigene Oberfläche für Hinweistexte, Fortschrittsbalken, Benachrichtigungen, Dialoge und Menüs – einzige Abhängigkeit ist oxmysql
* Optionale Items für ox\_inventory, qb-inventory, ps-inventory, qs-inventory und das ESX-Inventar mit 5 Item-Bildern
* ESX Legacy, QBCore und Qbox · Deutsch und Englisch, Spieler-Anleitung in beiden Sprachen (`SPIELER-ANLEITUNG.md`, `PLAYER-GUIDE.md`)
