> 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/tools-ui/pepper-keys.md).

# Pepper Keys

Fahrzeugschlüssel als echte Items – wer den Schlüssel hat, fährt das Auto. Für ESX, QBCore und Qbox mit ox\_inventory.

{% hint style="success" %}
✅ **Pepper Keys holen:** <https://shop.pepperscripts.de/package/7797871>
{% endhint %}

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

## Überblick

Pepper Keys macht den Fahrzeugschlüssel zu einem **echten Item**. Wer den Schlüssel im Inventar hat, schließt auf und startet den Motor, auch wenn er ihn gestohlen hat. Der Besitzer ohne Schlüssel kommt dagegen nicht weiter. Gestohlen? Beim **Schlüsseldienst** das Schloss tauschen, dann sind alle alten Schlüssel wertlos. Ohne Schlüssel bleibt nur das **Kurzschließen** mit Mini-Spiel, Werkzeug und Alarm.

Gesperrt sind nur Spielerfahrzeuge. Fahrzeuge aus Job-Scripts bleiben frei fahrbar, du musst dort nichts anpassen.

* Schlüssel als ox\_inventory-Item mit Kennzeichen und Fahrzeugname
* Schloss tauschen macht alte Schlüssel wertlos, Ersatzschlüssel beim Schlüsseldienst
* Kurzschließen mit Mini-Spiel, Werkzeug, Alarm und Schwierigkeit je Fahrzeugklasse
* Läuft mit jedem Garagen-Script, das die Fahrzeugtabelle des Frameworks nutzt
* Team-Befehl `/pkeys`, vier Server-Exporte und ein Alarm-Event für dein Dispatch-Script

## Voraussetzungen

| Abhängigkeit                 | Pflicht/optional | Wofür                                                                    | Link                                                                                                                                         |
| ---------------------------- | ---------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| FiveM-Server ab Build 7290   | Pflicht          | Laut `fxmanifest.lua` (`/server:7290`)                                   | <https://runtime.fivem.net/artifacts/fivem/>                                                                                                 |
| OneSync                      | Pflicht          | Fahrzeuge und Statebags auf dem Server                                   | <https://docs.fivem.net/docs/scripting-reference/onesync/>                                                                                   |
| ESX Legacy, QBCore oder Qbox | Pflicht          | Besitzer, Geld, Polizei-Jobs (automatische Erkennung)                    | <https://github.com/esx-framework/esx\\_core> · <https://github.com/qbcore-framework/qb-core> · <https://github.com/Qbox-project/qbx\\_core> |
| ox\_inventory                | Pflicht          | Der Schlüssel ist ein ox\_inventory-Item                                 | <https://github.com/overextended/ox\\_inventory>                                                                                             |
| ox\_lib                      | Pflicht          | Hilfsfunktionen, Tastenbelegung                                          | <https://github.com/overextended/ox\\_lib>                                                                                                   |
| oxmysql                      | Pflicht          | Tabelle `pepper_keys_locks`                                              | <https://github.com/overextended/oxmysql>                                                                                                    |
| Garagen-Script               | optional         | Ausparken/Einparken, solange es die Fahrzeugtabelle des Frameworks nutzt | –                                                                                                                                            |
| Dispatch-Script              | optional         | Autoalarm an die Leitstelle melden (`bridge/server/dispatch.lua`)        | –                                                                                                                                            |

Ohne Framework oder ohne laufendes ox\_inventory bleibt Pepper Keys inaktiv und meldet das in der Server-Konsole.

## Installation

1. Ordner nach `resources/[pepper]/pepper_keys` kopieren.

   > **Ordnernamen nicht umbenennen.** Andere Scripts rufen `exports.pepper_keys` auf, das funktioniert nur mit dem Namen `pepper_keys`.
2. Den Eintrag aus `install/items/ox_inventory.txt` in `ox_inventory/data/items.lua` einfügen.
3. `install/images/pepper_carkey.png` nach `ox_inventory/web/images` kopieren.
4. In der `server.cfg` nach Framework, `oxmysql`, `ox_lib` und `ox_inventory`:

```cfg
ensure oxmysql
ensure ox_lib
ensure es_extended   # oder qb-core / qbx_core
ensure ox_inventory
ensure pepper_keys

add_ace group.admin pepper.keys.admin allow
```

5. Server starten. In der Konsole steht „Pepper Keys 1.0.0 gestartet (esx)“ (bzw. dein Framework).

**Datenbank:** Die Tabelle `pepper_keys_locks` legt das Script beim Start selbst an (`server/db.lua`). Die Datei `install/pepper_keys.sql` mit demselben Inhalt brauchst du nur, wenn dein Datenbank-Benutzer keine Tabellen anlegen darf. Dann importierst du sie einmal per HeidiSQL oder phpMyAdmin.

**Items je Inventar:**

| Inventar      | Item                                          | Datei                                                            | Bild                                                           |
| ------------- | --------------------------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------- |
| ox\_inventory | `pepper_carkey` (Gewicht 50, nicht stapelbar) | `install/items/ox_inventory.txt` → `ox_inventory/data/items.lua` | `install/images/pepper_carkey.png` → `ox_inventory/web/images` |

Andere Inventare werden nicht unterstützt. Der Item-Eintrag hat eine deutsche Bezeichnung. Auf englischen Servern `label` und `description` in `items.lua` anpassen.

### Erster Test

1. Als Admin `/pkeys give <Kennzeichen>` für ein eigenes Fahrzeug eingeben. Der Schlüssel liegt im Inventar.
2. Am Fahrzeug **U** drücken: Es schließt ab oder auf, mit Lichtsignal.
3. Einsteigen: Mit Schlüssel springt der Motor an. Schlüssel ablegen, aussteigen und wieder einsteigen: Der Motor bleibt aus.
4. Ohne Schlüssel und mit einem `lockpick` im Inventar **K** drücken und das Mini-Spiel spielen.
5. Zum Schlüsseldienst (Standard bei `-205.5, -1313.3`) fahren und mit **E** einen Ersatzschlüssel holen.

## Konfiguration

| Datei                                | Steuert                                                                                             |
| ------------------------------------ | --------------------------------------------------------------------------------------------------- |
| `config/config.lua`                  | Sprache, Framework, Admin-Gruppen, Item, Tasten, Reichweite, Konten, Kurzschließen, Schlüsseldienst |
| `config/server.lua`                  | Admin-ACE, Discord-Webhook für Team-Aktionen (wird nicht an Clients gesendet)                       |
| `locales/de.json`, `locales/en.json` | Alle Texte im Spiel                                                                                 |
| `bridge/server/dispatch.lua`         | Anbindung an dein Dispatch-Script                                                                   |

### Grundeinstellungen

```lua
Config.Locale = 'de'
Config.Framework = 'auto'
Config.Item = 'pepper_carkey'
Config.Range = 15.0
Config.PayAccounts = { 'bank', 'money' }
```

| Option                                          | Standard                           | Beschreibung                                          |
| ----------------------------------------------- | ---------------------------------- | ----------------------------------------------------- |
| `Config.Locale`                                 | `'de'`                             | `'de'` oder `'en'`                                    |
| `Config.Framework`                              | `'auto'`                           | `auto`, `esx`, `qbcore`, `qbox`                       |
| `Config.Debug`                                  | `false`                            | Zusätzliche Ausgaben in der Konsole                   |
| `Config.AdminGroups`                            | `{ 'admin', 'superadmin', 'god' }` | Framework-Gruppen mit Adminrecht (zusätzlich zur ACE) |
| `Config.AdminCommand`                           | `'pkeys'`                          | Name des Team-Befehls                                 |
| `Config.Item`                                   | `'pepper_carkey'`                  | Item-Name des Schlüssels                              |
| `Config.Range`                                  | `15.0`                             | Reichweite beim Abschließen in Metern                 |
| `Config.LockKey` / `HotwireKey` / `InteractKey` | `U` / `K` / `E`                    | Standardtasten                                        |
| `Config.PayAccounts`                            | `{ 'bank', 'money' }`              | Reihenfolge der Konten beim Bezahlen                  |

### Kurzschließen

```lua
Config.Hotwire = {
    Enabled = true,
    Item = 'lockpick',
    ItemBreakChance = 40,
    AlarmChance = 70,
    Cooldown = 30,
    MinPolice = 0,
    PoliceJobs = { 'police', 'sheriff' },
}
```

| Option            | Standard                          | Beschreibung                                                      |
| ----------------- | --------------------------------- | ----------------------------------------------------------------- |
| `Enabled`         | `true`                            | Kurzschließen an/aus                                              |
| `Item`            | `'lockpick'`                      | Werkzeug, `false` = keines nötig                                  |
| `ItemBreakChance` | `40`                              | Prozent, dass das Werkzeug bei Misserfolg bricht                  |
| `AlarmChance`     | `70`                              | Prozent für den Autoalarm                                         |
| `Cooldown`        | `30`                              | Sekunden Wartezeit nach einem Fehlversuch                         |
| `MinPolice`       | `0`                               | So viele Personen aus `PoliceJobs` müssen im Dienst sein          |
| `Range`           | `3.0`                             | Abstand zum Fahrzeug                                              |
| `AlarmSeconds`    | `30`                              | Dauer der Sirene                                                  |
| `Levels`          | easy 3/22, medium 4/16, hard 5/11 | Treffer (`rounds`) und Größe der Trefferzone in Prozent (`width`) |
| `Classes`         | Klassen 2–5 medium, 6–7 hard      | GTA-Fahrzeugklasse → Stufe, sonst easy                            |

### Schlüsseldienst

```lua
Config.Locksmith = {
    CopyFee = 500,
    LockFee = 2500,
    FirstFree = true,
    Places = {
        { label = 'Schlüsseldienst', coords = vec3(-205.5, -1313.3, 31.3), radius = 3.0, blip = true },
    },
}
```

| Option      | Standard | Beschreibung                                       |
| ----------- | -------- | -------------------------------------------------- |
| `CopyFee`   | `500`    | Ersatzschlüssel                                    |
| `LockFee`   | `2500`   | Schloss tauschen inkl. neuem Schlüssel             |
| `FirstFree` | `true`   | Erster Schlüssel für Bestandsfahrzeuge kostenlos   |
| `Places`    | 1 Ort    | Orte mit Bezeichnung, Koordinaten, Radius und Blip |

### Server

| Option                     | Standard              | Beschreibung                                   |
| -------------------------- | --------------------- | ---------------------------------------------- |
| `ServerConfig.AdminAce`    | `'pepper.keys.admin'` | ACE für den Team-Befehl                        |
| `ServerConfig.Webhook`     | `''`                  | Discord-Webhook für Team-Aktionen (`''` = aus) |
| `ServerConfig.WebhookName` | `'Pepper Keys'`       | Absendername im Webhook                        |

## So funktioniert es

| Eingabe | Zweck                                                               |
| ------- | ------------------------------------------------------------------- |
| **U**   | Nächstes Fahrzeug ab- oder aufschließen (Reichweite `Config.Range`) |
| **K**   | Kurzschließen, am Fahrersitz oder an der Tür                        |
| **E**   | Schlüsseldienst öffnen                                              |

* **Einsteigen:** Als Fahrer fragt das Script einmal beim Server nach. Mit passendem Schlüssel springt der Motor an, sonst bleibt er aus.
* **Schlüssel weitergeben:** Einfach das Item übergeben. Wer es hält, darf fahren.
* **Läuft der Motor schon**, läuft er weiter, auch wenn der Schlüssel abgenommen wird.
* Ein Schlüssel zeigt im Inventar Kennzeichen und Fahrzeugname.

## Schlüsseldienst

Der Schlüsseldienst hilft nur dem Besitzer laut Fahrzeugtabelle des Frameworks.

* **Ersatzschlüssel:** gegen Gebühr (`Config.Locksmith.CopyFee`), passt zum aktuellen Schloss.
* **Schloss tauschen:** gegen Gebühr (`Config.Locksmith.LockFee`), du bekommst einen neuen Schlüssel. Alle alten Schlüssel passen nicht mehr.
* **Bestandsfahrzeuge:** Fahrzeuge aus der Zeit vor Pepper Keys haben noch keinen Schlüssel. Der erste ist kostenlos (`Config.Locksmith.FirstFree`).

Passt der Schlüssel nicht mehr ins Inventar, bekommt der Spieler sein Geld zurück.

## Kurzschließen

* Nur ohne passenden Schlüssel, mit Werkzeug `Config.Hotwire.Item` (Standard `lockpick`, `false` = keines nötig).
* Mini-Spiel: Leertaste drücken, wenn die Nadel in der Zone ist. Die Schwierigkeit hängt von der Fahrzeugklasse ab (`Config.Hotwire.Levels`, `Classes`).
* Erfolg: Fahrzeug offen, Motor startet, bis es eingeparkt oder gelöscht wird.
* Misserfolg: Wartezeit (`Cooldown`) und Chance, dass das Werkzeug bricht (`ItemBreakChance`).
* Alarm mit Chance `AlarmChance`: Sirene am Fahrzeug und Server-Event `pepper_keys:alarm`.
* Mindestzahl Polizei im Dienst: `MinPolice` mit den Jobs aus `PoliceJobs`.

## Garagen-Scripts

Pepper Keys liest nur die Fahrzeugtabelle des Frameworks (`owned_vehicles` bei ESX, `player_vehicles` bei QBCore und Qbox) und schreibt dort nichts. Damit läuft es mit jedem Garagen-Script, das diese Tabelle nutzt. Beim Ausparken entsteht kein neuer Schlüssel, der Spieler nimmt seinen vorhandenen Schlüssel mit.

| Garagen-Script              | Framework         | Tabelle                                    |
| --------------------------- | ----------------- | ------------------------------------------ |
| esx\_garage                 | ESX               | `owned_vehicles`                           |
| qb-garages                  | QBCore            | `player_vehicles`                          |
| qbx\_garages                | Qbox              | `player_vehicles`                          |
| JG Advanced Garages         | ESX, QBCore, Qbox | Fahrzeugtabelle des Frameworks             |
| cd\_garage                  | ESX, QBCore       | Fahrzeugtabelle des Frameworks             |
| okokGarage                  | ESX, QBCore       | Fahrzeugtabelle des Frameworks             |
| loaf\_garage, renzu\_garage | ESX               | `owned_vehicles`                           |
| OP Garages v3 (OTHERPLANET) | ESX, QBCore, Qbox | Fahrzeugtabelle des Frameworks (laut Doku) |

Die Liste folgt aus der genutzten Tabelle. Mit den fremden Scripts haben wir Pepper Keys nicht einzeln getestet. Nutzt dein Garagen-Script eine eigene Tabelle, sind seine Fahrzeuge nicht gesperrt.

**Nur ein Schlüssel-Script:** Entferne andere Schlüssel-Scripts (z. B. qb-vehiclekeys, qbx\_vehiclekeys, wasabi\_carlock). Hat dein Garagen-Script eine Einstellung für das Schlüssel-System, stell sie auf „keins“ oder trag dort die Exporte von Pepper Keys ein.

**OP Garages v3:** Ausparken und Einparken laufen ohne Anpassung, OP Garages vergibt dabei keinen Schlüssel (`Config.KeysDependency` fällt auf `none`). Kaufverträge, Fake-Kennzeichen sowie Job- und Gang-Fahrzeuge brauchen eine eigene Anbindung in den „editable“-Dateien von OP Garages: Nach einem Vertrag `ChangeLock` + `CreateKey` für den neuen Besitzer aufrufen, damit der alte Schlüssel nicht mehr passt.

Andere Scripts, die selbst Schlüssel vergeben sollen (Autohaus, Vermietung, Fuhrpark), rufen die Exporte unten auf.

## Befehle und Rechte

| Befehl                      | Wer   | Was                                       |
| --------------------------- | ----- | ----------------------------------------- |
| `/pkeys give <Kennzeichen>` | Admin | Schlüssel erzeugen                        |
| `/pkeys lock <Kennzeichen>` | Admin | Schloss tauschen (alte Schlüssel wertlos) |
| `/pkeys open <Kennzeichen>` | Admin | Fahrzeug aufschließen                     |

**Rechte:** Admin = ACE `pepper.keys.admin` (`ServerConfig.AdminAce`) oder eine Gruppe aus `Config.AdminGroups`. Der Befehl funktioniert nur im Spiel, nicht in der Server-Konsole. Jede Aktion geht ins Log, auf Wunsch auch an einen Discord-Webhook (`ServerConfig.Webhook`). Der Befehlsname steht in `Config.AdminCommand`.

**Tasten:** **U** abschließen, **K** kurzschließen, **E** Schlüsseldienst. Spieler können sie in den FiveM-Einstellungen (Tastenbelegung → FiveM) ändern, die Standardwerte stehen in `Config.LockKey`, `HotwireKey` und `InteractKey`.

## Exports und Events

**Server-Exporte:**

```lua
exports.pepper_keys:CreateKey(src, plate, label) -- Schlüssel ins Inventar legen
exports.pepper_keys:HasKey(src, plate)           -- hat der Spieler einen passenden Schlüssel?
exports.pepper_keys:ChangeLock(plate)            -- neues Schloss, alte Schlüssel wertlos
exports.pepper_keys:RemoveKeys(src, plate)       -- Schlüssel zu diesem Kennzeichen abnehmen
```

**Events:**

| Event               | Seite  | Daten               | Zweck                                                        |
| ------------------- | ------ | ------------------- | ------------------------------------------------------------ |
| `pepper_keys:alarm` | Server | `{ plate, coords }` | Autoalarm beim Kurzschließen, z. B. für dein Dispatch-Script |

```lua
AddEventHandler('pepper_keys:alarm', function(data)
    print(('Autoalarm: %s bei %.1f, %.1f'):format(data.plate, data.coords.x, data.coords.y))
end)
```

Eine eigene Dispatch-Anbindung trägst du alternativ in `bridge/server/dispatch.lua` ein (offene Datei).

## FAQ

### Pepper Keys startet nicht oder bleibt inaktiv – was tun?

ox\_inventory, ox\_lib, oxmysql und dein Framework müssen vor `pepper_keys` starten. Ohne ESX, QBCore oder Qbox oder ohne laufendes ox\_inventory meldet das Script „bleibt inaktiv“ in der Konsole.

### Der Schlüssel hat kein Bild im Inventar.

`install/images/pepper_carkey.png` nach `ox_inventory/web/images` kopieren und den Server neu starten.

### Mein eigenes Auto lässt sich nicht starten.

Fahrzeuge aus der Zeit vor Pepper Keys haben noch keinen Schlüssel. Hol ihn beim Schlüsseldienst, der erste ist kostenlos (`Config.Locksmith.FirstFree`).

### Ein Job-Fahrzeug ist gesperrt.

Gesperrt ist nur, was in der Fahrzeugtabelle des Frameworks oder in `pepper_keys_locks` steht. Prüfe, ob das Kennzeichen dort eingetragen ist.

### „Dir fehlt das passende Werkzeug“ beim Kurzschließen.

Das Item aus `Config.Hotwire.Item` (Standard `lockpick`) muss im Inventar liegen. Mit `Item = false` geht es ohne Werkzeug.

### `/pkeys` tut nichts.

Setze die ACE aus der Installation (`add_ace group.admin pepper.keys.admin allow`) oder trag deine Gruppe in `Config.AdminGroups` ein. In der Server-Konsole ist der Befehl ohne Wirkung.

### Muss ich die SQL-Datei importieren?

Nein. Die Tabelle `pepper_keys_locks` entsteht beim Start automatisch. `install/pepper_keys.sql` ist nur für Datenbank-Benutzer ohne Recht zum Anlegen von Tabellen.

### Läuft Pepper Keys mit qs-inventory oder qb-inventory?

Nein, der Schlüssel ist ein ox\_inventory-Item mit Metadaten. Ohne ox\_inventory bleibt das Script inaktiv.

### Kann ich Pepper Keys zusammen mit qb-vehiclekeys nutzen?

Nein, nutze nur ein Schlüssel-Script. Entferne andere (qb-vehiclekeys, qbx\_vehiclekeys, wasabi\_carlock), sonst sperren oder entsperren sie sich gegenseitig.

### Wie gibt mein Autohaus- oder Vermietungs-Script einen Schlüssel aus?

Über den Server-Export `exports.pepper_keys:CreateKey(src, plate, label)`. Beim Weiterverkauf erst `ChangeLock(plate)`, dann `CreateKey` für den neuen Besitzer.

### Wie ändere ich Texte oder die Sprache?

Sprache über `Config.Locale` (`'de'` oder `'en'`), Texte in `locales/de.json` bzw. `locales/en.json`. Den Namen des Items änderst du in `ox_inventory/data/items.lua`.

### Wie verschiebe ich den Schlüsseldienst oder lege weitere an?

In `Config.Locksmith.Places` die `coords` ändern oder weitere Einträge mit `label`, `coords`, `radius` und `blip` ergänzen.

### Können Cheater die Motorsperre umgehen?

Die Motorsperre läuft im Client und ist für Cheater umgehbar. Abschließen, Besitz, Item-Prüfung, Gebühren und Kurzschließen prüft der Server.

### Wie melde ich den Autoalarm an mein Dispatch-Script?

Hör auf das Server-Event `pepper_keys:alarm` oder trag den Aufruf deines Dispatch-Scripts in `bridge/server/dispatch.lua` ein.

## Support

Ticket in unserem [Discord](https://discord.gg/6NaFJWKDYu) (Kategorie „Script Support“) öffnen und den Kauf vorher mit `/verify` verknüpfen.

## Changelog

Aktuell: **1.0.0** (08.11.2026), erste Veröffentlichung. Alle Änderungen stehen in `CHANGELOG.md` in der Ressource.
