> 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/activities/pepper-game-night.md).

# Pepper Game Night

12 Gesellschaftsspiele mit Lobby und KI-Mitspielern an Spieltischen in der Welt – Brett, Karten, Würfel und Party für ESX, QBCore und Qbox.

{% hint style="success" %}
✅ **Pepper Game Night holen:** <https://shop.pepperscripts.de/package/7783526>
{% 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 Game Night bringt **12 Gesellschaftsspiele** auf deinen Server: Brett-, Karten-, Würfel- und Party-Spiele mit einer gemeinsamen **Lobby** und **KI-Mitspielern**. Gespielt wird an Spieltischen in der Welt oder an einem Tisch aus der **Spielebox**. Die Spielfigur sitzt am Tisch, das Spiel läuft in einer Oberfläche.

### Die Spiele

| Spiel                | Art                              | Spieler | KI   |
| -------------------- | -------------------------------- | ------- | ---- |
| Heimweg              | Figurenrennen mit Rauswerfen     | 2–4     | ja   |
| Dame                 | Brett, mit Schlagzwang           | 2       | ja   |
| Mühle                | Brett                            | 2       | ja   |
| Viererreihe          | Steine einwerfen                 | 2       | ja   |
| Letzte Karte         | Ablegespiel mit Aktionskarten    | 2–6     | ja   |
| Schwimmen            | 31 sammeln, Leben verlieren      | 2–6     | ja   |
| Pfefferwurf          | 5 Würfel, Punkteblock            | 1–6     | ja   |
| Mäxchen              | Bluffen mit verdecktem Wurf      | 2–6     | ja   |
| Quizabend            | Wissensfragen, alle gleichzeitig | 1–8     | ja   |
| Wortjagd             | Wörter erraten                   | 2–6     | ja   |
| Stadt, Land, Pfeffer | Begriffe zum Buchstaben          | 2–8     | nein |
| Kritzelraten         | Zeichnen und raten               | 3–8     | nein |

## Voraussetzungen

| Abhängigkeit                                                 | Pflicht/optional     | Wofür                                                              | Link                                                                         |
| ------------------------------------------------------------ | -------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------- |
| FiveM-Server-Build ≥ 7290                                    | Pflicht              | in `fxmanifest.lua` als `/server:7290` hinterlegt                  | <https://runtime.fivem.net/artifacts/fivem/build\\_server\\_windows/master/> |
| OneSync                                                      | Pflicht              | Sitzplätze, Lobbys in der Nähe, Tisch-Props                        | <https://docs.fivem.net/docs/scripting-reference/onesync/>                   |
| ESX Legacy, QBCore oder Qbox                                 | Pflicht (eins davon) | Geld, Gruppen, Identifier – `Config.Framework = 'auto'` erkennt es | <https://github.com/esx-framework/esx\\_core>                                |
| ox\_lib                                                      | Pflicht              | UI-Bausteine, Callbacks                                            | <https://github.com/overextended/ox\\_lib>                                   |
| oxmysql                                                      | Pflicht              | Datenbank (Tische, Statistik, Einsätze)                            | <https://github.com/overextended/oxmysql>                                    |
| ox\_target                                                   | optional             | Interaktion am Tisch – ohne läuft es über Taste `E`                | <https://github.com/overextended/ox\\_target>                                |
| ox\_inventory, qb-inventory (auch ps-/lj-) oder ESX-Inventar | optional             | nur für die Spielebox (Item `gamenight_box`)                       | <https://github.com/overextended/ox\\_inventory>                             |
| esx\_addonaccount, Renewed-Banking oder qb-banking           | optional             | Hausanteil auf ein Firmenkonto (`ServerConfig.HouseAccount`)       | –                                                                            |

## Installation

1. Ressource im Cfx.re-Portal (Granted Assets) herunterladen
2. Nach `resources/[pepper]/pepper_gamenight` entpacken – **nicht umbenennen**, der Item-Export `pepper_gamenight.…` hängt am Ordnernamen
3. Für die Spielebox das Item eintragen (optional):

| Inventar                          | Datei                   | Wohin                                                                                   |
| --------------------------------- | ----------------------- | --------------------------------------------------------------------------------------- |
| ox\_inventory (ESX, QBCore, Qbox) | `install/ox_items.lua`  | Eintrag in `ox_inventory/data/items.lua` vor die letzte `}` – inklusive `server.export` |
| qb-inventory / ps- / lj-inventory | `install/qb_items.lua`  | Eintrag in `qb-core/shared/items.lua` (`QBShared.Items`)                                |
| ESX-Standardinventar              | `install/esx_items.sql` | in die Datenbank importieren                                                            |

Das Bild aus `install/images/` in den Bilderordner deines Inventars kopieren. 4. Datenbank: Die Tabellen legt das Script beim Start selbst an. Nur wenn dein DB-Benutzer kein CREATE-Recht hat, vorher `install/pepper_gamenight.sql` importieren 5. In der `server.cfg` nach den Abhängigkeiten eintragen und das Admin-Recht vergeben:

```cfg
ensure oxmysql
ensure ox_lib
ensure es_extended      # bzw. qb-core oder qbx_core
# ensure ox_target      # optional
# ensure ox_inventory   # optional, für die Spielebox
ensure pepper_gamenight

add_ace group.admin pepper_gamenight.admin allow
```

6. Server starten – in der Konsole steht `Pepper Game Night v1.0.0 gestartet (…, 0 Tische)`

### Erster Test

1. Als Admin an die Stelle stellen, an der die Tischmitte sein soll, `/spieleadmin` → **Neuer Tisch**, speichern
2. Am Tisch `E` drücken (oder ox\_target): die Spiele-Zentrale öffnet sich
3. **Lobby erstellen**, z. B. Viererreihe, im Warteraum eine KI hinzufügen und **Runde starten**
4. Runde zu Ende spielen – `/spielestats` zeigt danach deine Statistik

## Konfiguration

| Datei               | Inhalt                                                                                                         |
| ------------------- | -------------------------------------------------------------------------------------------------------------- |
| `config/config.lua` | Sprache, Befehle, Konten, Taste, Spiele, Zeiten, Lobby, KI, Einsätze, Statistik, Spielebox, Tische, Oberfläche |
| `config/server.lua` | Admin-ACE, Webhooks, Firmenkonto für den Hausanteil – wird **nie** an Clients gesendet                         |
| `data/*.json`       | Quizfragen und Wörter, von dir erweiterbar. Bleiben auf dem Server                                             |

Name, Plätze, Tischmodell, erlaubte Spiele, Jobs und Einsatz-Grenzen eines Tisches stehen nicht in der Config, sondern werden im Spiel mit `/spieleadmin` eingestellt.

### Grundlagen

| Option               | Standard                     | Bedeutung                                         |
| -------------------- | ---------------------------- | ------------------------------------------------- |
| `Config.Locale`      | `'de'`                       | Sprache (`de` / `en`) – Ordner in `locales/`      |
| `Config.Framework`   | `'auto'`                     | `auto`, `esx`, `qbcore`, `qbox`, `standalone`     |
| `Config.Accounts`    | `cash`, `bank`               | erlaubte Konten für Einsätze                      |
| `Config.AdminGroups` | `admin`, `superadmin`, `god` | Framework-Gruppen, die als Admin zählen           |
| `Config.Keys.Open`   | `''`                         | Vorbelegung für die Spiele-Zentrale, z. B. `'F6'` |

### Spiele und Zugzeit

Jedes Spiel lässt sich ausschalten; `turnTime` legt die Sekunden je Zug fest (10 bis 300). Fehlt ein Spiel in der Liste, ist es an.

```lua
Config.Games = {
    checkers = { enabled = true, turnTime = 60 },
    shed = { enabled = false },
}
```

IDs: `race` (Heimweg), `checkers`, `mill`, `four`, `shed` (Letzte Karte), `swim`, `dice5` (Pfefferwurf), `liar` (Mäxchen), `hangman` (Wortjagd), `quiz`, `categories`, `draw`. Für `quiz`, `categories` und `draw` gelten eigene Phasen-Zeiten.

### Lobby, Runde und KI

| Option                              | Standard       | Bedeutung                                                      |
| ----------------------------------- | -------------- | -------------------------------------------------------------- |
| `Config.Game.StartDelay`            | `4`            | Countdown vor der Runde in Sekunden                            |
| `Config.Game.TimeoutsToReplace`     | `3`            | Zeitüberschreitungen in Folge, bis eine KI den Platz übernimmt |
| `Config.Game.MaxDistance`           | `8.0`          | Meter vom Tisch; weiter weg = Platz verlassen                  |
| `Config.Lobby.ListDistance`         | `150.0`        | Reichweite der Lobby-Liste in Metern (`0` = alle Lobbys)       |
| `Config.Lobby.MaxSpectators`        | `6`            | Zuschauer je Lobby                                             |
| `Config.Bots.Enabled`               | `true`         | KI-Mitspieler an/aus                                           |
| `Config.Bots.DelayMin` / `DelayMax` | `800` / `2500` | Bedenkzeit der KI je Zug in Millisekunden                      |

### Einsätze

| Option                      | Standard        | Bedeutung                                                                |
| --------------------------- | --------------- | ------------------------------------------------------------------------ |
| `Config.Stakes.Enabled`     | `true`          | Einsätze an/aus                                                          |
| `Config.Stakes.Min` / `Max` | `100` / `50000` | Grenzen; je Tisch im Editor enger einstellbar                            |
| `Config.Stakes.HouseCut`    | `0`             | Prozent für das Haus (Konto: `ServerConfig.HouseAccount`)                |
| `Config.Stakes.Split`       | `{ 100 }`       | Topf nach Platz in Prozent, z. B. `{ 70, 30 }`; der Rest geht an Platz 1 |
| `Config.Stakes.DailyLimit`  | `0`             | höchster Verlust je Charakter und Tag (`0` = aus)                        |
| `Config.Stakes.AllowBox`    | `false`         | Einsätze auch an der Spielebox erlauben                                  |

### Spielebox, Tische, Anzeige

| Option                              | Standard                   | Bedeutung                                                                           |
| ----------------------------------- | -------------------------- | ----------------------------------------------------------------------------------- |
| `Config.Box.Enabled` / `Item`       | `true` / `'gamenight_box'` | Spielebox an/aus und Item-Name                                                      |
| `Config.Box.Seats`                  | `4`                        | Plätze am Box-Tisch                                                                 |
| `Config.Box.IdleMinutes`            | `5`                        | ohne Lobby wird der Tisch nach dieser Zeit eingepackt                               |
| `Config.Box.NoGoZones`              | leer                       | Sperrzonen, z. B. `{ coords = { x = 440.0, y = -982.0, z = 30.0 }, radius = 60.0 }` |
| `Config.Table.Models`               | 4 Modelle                  | Tischmodelle mit `model` und `chair` für den Editor                                 |
| `Config.Table.SeatRadius` / `SeatZ` | `1.35` / `0.5`             | Abstand Sitz ↔ Tischmitte, Sitzhöhe                                                 |
| `Config.Table.ChairHeadingOffset`   | `180.0`                    | falls Stühle verkehrt herum stehen: `0.0`                                           |
| `Config.Interact.Mode` / `Key`      | `'auto'` / `38`            | `auto` (ox\_target, sonst Taste), `target`, `key`; 38 = `E`                         |
| `Config.Text.Blocklist`             | leer                       | gesperrte Wortteile für Freitext, klein geschrieben                                 |

### Webhooks

In `config/server.lua` (`''` = aus): `admin` (Tisch angelegt, geändert, gelöscht), `rounds` (jede gewertete Runde), `money` (nur Runden mit Einsatz). Webhooks enthalten nur Namen, nie Spieler-Identifier.

## Tische anlegen

Stell dich an den Ort, an dem die Tischmitte sein soll. Deine Blickrichtung wird Platz 1. `/spieleadmin` → **Neuer Tisch**, Name und Plätze wählen, speichern. Steht schon passendes Mobiliar dort, schalte **Tisch erzeugen** und **Stühle erzeugen** aus. Je Tisch lassen sich Spiele beschränken und Einsätze mit Mindest- und Höchstwert einstellen.

Unter **Nur für Jobs** trägst du Jobnamen getrennt durch Komma ein – leer bedeutet: für alle.

## So wird gespielt

1. Am Tisch **E** drücken oder per ox\_target öffnen. Die Zentrale zeigt Lobbys in der Nähe.
2. **Lobby erstellen**: Spiel wählen, optional private Lobby mit PIN.
3. Im **Warteraum** Plätze, Regeln und Einsatz einstellen, KI hinzufügen oder Spieler einladen.
4. **Runde starten**. Nach dem Ergebnis geht es mit „Nochmal“ oder „Anderes Spiel“ weiter.

**Ausblenden** schließt die Oberfläche, die Figur bleibt sitzen. Zurück per Taste am Tisch oder `/spiele`. Eine Einladung nimmt man in der Zentrale an (`/spiele`).

## Spielen um Einsatz

Der Ersteller wählt im Warteraum **Um Geld** und den Betrag. Regeln:

* Mindestens 2 Menschen, keine KI. Gegen KI lässt sich kein Geld gewinnen.
* Abgebucht wird direkt vor dem Start. Kann jemand nicht zahlen, startet die Runde nicht und alle behalten ihr Geld.
* Wer während der Runde geht, verliert seinen Einsatz. Die Ersatz-KI gewinnt nichts, ihr Anteil geht an den nächsten Menschen.
* Bricht die Runde ab (Fehler, Admin, Neustart, letzter Mensch geht), gehen alle Einsätze zurück.
* Wer offline ist, bekommt sein Geld beim nächsten Laden des Charakters.

An der Spielebox sind Einsätze standardmäßig aus (`Config.Stakes.AllowBox`).

## Eigene Fragen und Wörter

`data/quiz.<sprache>.json`: Einträge mit `id`, `cat` (`geo`, `hist`, `sci`, `cult`, `sport`, `life`), `q` und `a`. **Die erste Antwort ist die richtige**, das Spiel mischt selbst. `data/words.<sprache>.json`: `hangman` (nur A–Z), `draw`, `categories`.

## Befehle und Rechte

### Befehle

| Befehl         | Wer    | Was                                                          |
| -------------- | ------ | ------------------------------------------------------------ |
| `/spiele`      | alle   | Spiele-Zentrale öffnen oder zurück ins Spiel                 |
| `/spielestats` | alle   | Statistik und Bestenliste                                    |
| `/spieleraus`  | alle   | Notfall: Lobby verlassen, falls die Oberfläche hängt         |
| `/spieleadmin` | Admins | Tische, offene Lobbys und aufgestellte Spieleboxen verwalten |
| `/spieledebug` | alle   | Diagnose in der F8-Konsole                                   |

Die Namen der ersten vier stehen in `Config.Commands` – `''` schaltet einen Befehl aus.

### Rechte

Es gibt genau ein Recht: Admin = ACE `pepper_gamenight.admin` oder eine Gruppe aus `Config.AdminGroups` (`admin`, `superadmin`, `god`). Der Server prüft es bei jedem Admin-Aufruf neu.

### Tasten

| Wo         | Taste             | Aktion                                                                                |
| ---------- | ----------------- | ------------------------------------------------------------------------------------- |
| Am Tisch   | `E`               | Zentrale öffnen (ohne ox\_target) – ändern mit `Config.Interact.Key`                  |
| Überall    | keine Vorbelegung | `Config.Keys.Open` legt eine Taste fest, Spieler ändern sie in den GTA-Tastenoptionen |
| Oberfläche | `ESC`             | Dialog schließen, danach die offene Ansicht                                           |

## Exports und Events

### Exports (Server, nur lesend)

```lua
exports.pepper_gamenight:isPlaying(src)   -- sitzt der Spieler in einer Lobby oder Runde?
exports.pepper_gamenight:getTables()      -- Liste der Tische (leer, solange das Script startet)
```

### Server-Ereignis `pepper_gamenight:roundFinished`

Wird nach jeder beendeten Runde auf dem Server ausgelöst – z. B. für eigene XP- oder Erfolgs-Scripts. Clients können es weder sehen noch auslösen.

```lua
AddEventHandler('pepper_gamenight:roundFinished', function(data)
    if not data.ranked then return end -- nur Runden mit mindestens 2 Menschen
    for _, p in ipairs(data.players) do
        if not p.bot and p.place == 1 then
            print(p.name .. ' hat ' .. data.game .. ' gewonnen')
        end
    end
end)
```

| Feld                                  | Inhalt                                                                   |
| ------------------------------------- | ------------------------------------------------------------------------ |
| `roundId`, `game`                     | ID der Runde, Spiel-ID (z. B. `checkers`)                                |
| `tableId`, `tableName`                | Tisch                                                                    |
| `stake`, `account`, `pot`, `houseCut` | Einsatz je Spieler, Konto, Topf, Hausanteil                              |
| `ranked`                              | `true` bei mindestens 2 Menschen                                         |
| `players`                             | Liste mit `name`, `place`, `score`, `won`, `bot`, `source`, `identifier` |

### Framework-Anbindung

Die Bridges in `bridge/` (offen) erkennen ESX, QBCore und Qbox automatisch. Der Hausanteil geht an esx\_addonaccount, Renewed-Banking oder qb-banking, wenn `ServerConfig.HouseAccount` gesetzt ist; sonst verlässt er den Umlauf.

## Fehlerbehebung

| Problem                                        | Lösung                                                                                         |
| ---------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| „Dafür fehlt dir das Recht“ bei `/spieleadmin` | ACE aus der Installation setzen oder Gruppe in `Config.AdminGroups` eintragen                  |
| Tisch oder Stühle fehlen                       | `/spieledebug` in F8 prüfen; Modelle in `Config.Table.Models`                                  |
| Stühle stehen verkehrt                         | `Config.Table.ChairHeadingOffset`                                                              |
| Spielebox tut nichts                           | Item eingetragen? Mit ox\_inventory muss `server.export` aus `install/ox_items.lua` dabei sein |
| Keine Einsätze wählbar                         | `Config.Stakes.Enabled`, am Tisch „Einsätze erlauben“; an der Box `AllowBox`                   |
| Spiel fehlt in der Auswahl                     | `Config.Games` und Spiele-Auswahl am Tisch prüfen                                              |
| Oberfläche hängt                               | `/spieleraus`                                                                                  |

## FAQ

### Sind Tische dabei?

Nein. Ein Admin stellt sie im Spiel mit `/spieleadmin` auf. Tisch und Stühle erzeugt das Script, oder du nutzt vorhandenes Mobiliar.

### Kann man allein spielen?

Ja, mit KI-Mitspielern in 10 der 12 Spiele. Pfefferwurf und Quizabend lassen sich auch von einem Spieler starten. Stadt, Land, Pfeffer und Kritzelraten brauchen Menschen.

### Kann man gegen die KI Geld farmen?

Nein. Einsätze brauchen mindestens 2 Menschen und keine KI. Geht ein Spieler während einer Runde mit Einsatz, gewinnt die Ersatz-KI nichts.

### Was passiert mit Einsätzen nach einem Absturz oder Neustart?

Einsätze stehen vor dem Start in der Datenbank. Nach Abbruch, Absturz oder Neustart werden sie erstattet; wer offline ist, bekommt das Geld beim nächsten Laden des Charakters.

### Können Spieler verdeckte Karten oder Quizlösungen auslesen?

Würfel, Karten, Züge und Geld entscheidet der Server. Verdeckte Karten und Quizlösungen erreichen keinen Client vorzeitig, die Quizdateien in `data/` bleiben auf dem Server.

### `/spieleadmin` sagt „Dafür fehlt dir das Recht“.

Die ACE-Zeile `add_ace group.admin pepper_gamenight.admin allow` in die `server.cfg` eintragen oder deine Gruppe in `Config.AdminGroups` aufnehmen.

### Die Spielebox tut nichts.

Das Item `gamenight_box` muss in deinem Inventar eingetragen sein – bei ox\_inventory mit dem `server.export` aus `install/ox_items.lua`. Außerdem muss `Config.Box.Enabled = true` sein; in Sperrzonen (`Config.Box.NoGoZones`) lässt sich keine Box aufstellen.

### Kann ich vorhandene Möbel oder eine MLO nutzen?

Ja. Stell dich beim Anlegen in die Tischmitte und schalte **Tisch erzeugen** und **Stühle erzeugen** aus. Stehen Stühle verkehrt herum, hilft `Config.Table.ChairHeadingOffset`.

### Kann ich einen Tisch auf bestimmte Jobs beschränken?

Ja. Trag die Jobnamen unter **Nur für Jobs** in `/spieleadmin` ein, getrennt durch Komma. Leer bedeutet: für alle.

### Kann ich die Zugzeit ändern?

Ja, je Spiel mit `turnTime` in `Config.Games` (10 bis 300 Sekunden). Quizabend, Stadt, Land, Pfeffer und Kritzelraten nutzen eigene Phasen-Zeiten.

### Kann ich eine Taste für die Zentrale festlegen?

Ja. `Config.Keys.Open` legt eine Vorbelegung fest, z. B. `'F6'`. Mit `''` setzt jeder Spieler seine Taste in den GTA-Tastenoptionen selbst.

### Kann ich für Siege XP vergeben?

Ja, mit dem Server-Ereignis `pepper_gamenight:roundFinished` (siehe „Exports und Events“). `data.ranked` ist nur bei Runden mit mindestens 2 Menschen `true`.

### Kann ich eigene Quizfragen ergänzen oder übersetzen?

Fragen und Wörter stehen in `data/quiz.<sprache>.json` und `data/words.<sprache>.json` – im Quiz ist die erste Antwort die richtige. Für eine neue Sprache kopierst du `locales/en/`, übersetzt es, legst die passenden Dateien in `data/` an und setzt `Config.Locale`.

### Wie spiele ich ein Update ein?

Neue Version im Cfx.re-Portal (<https://portal.cfx.re/assets/granted-assets>) herunterladen und den Ordner ersetzen – vorher `config/`, `data/` und angepasste `locales/` sichern. Tische und Statistik liegen in der Datenbank und bleiben erhalten.

## Support

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

## Changelog

Aktuelle Version: **1.0.0** (2026-11-01). Alle Änderungen stehen auf der Updates-Seite und in `CHANGELOG.md` in der Ressource.
