Dokumentation

Pepper Game Night

12 Gesellschaftsspiele mit Lobby und KI-Mitspielern an Spieltischen in der Welt, optional um Einsatz, für ESX, QBCore und Qbox.

Ü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:

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
  1. 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.

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)

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.

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 im Discord öffnen: https://discord.gg/6NaFJWKDYu (Kategorie „Script Support“) – den Kauf vorher mit /verify verknüpfen.

Permanent auf dem Dev-Server von Pepper Scripts getestet.

Changelog

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


Fehler gefunden? Melde ihn im Discord.