# 🍽️ dv_menucard — Restaurant Speisekarten System mit NUI Clipboard | ESX | FiveM
Gib deinen Restaurantmitarbeitern die Möglichkeit, ihre eigene Speisekarte direkt im Spiel zu verwalten – mit schickem Klemmbrett-UI, Kategorie-Tabs, Bild-Upload und serverseitiger Sicherheit.
---
## 💡 Was ist dv_menucard?
dv_menucard ist ein vollständiges Speisekarten-System für ESX-Server. Restaurantmitarbeiter laden Speisekarten-Bilder über ein ingame Staff-Panel hoch, aktivieren oder deaktivieren einzelne Kategorien und geben Kunden das passende Item. Kunden öffnen die Speisekarte per Item-Nutzung und sehen sie als realistisches Klemmbrett im Spiel. Alles läuft serverseitig abgesichert – nur Mitarbeiter des jeweiligen Restaurants können ihre eigene Karte bearbeiten.
---
## ⚙️ Features auf einen Blick
-
📋 **Klemmbrett-NUI** – Speisekarte wird als realistisches Clipboard angezeigt, inklusive Clipboard-Animation
-
🗂️ **Kategorie-Tabs** – mehrere Kategorien pro Restaurant (Speisen, Getränke, Desserts, Tagesangebot etc.)
-
🖼️ **Bild-Upload per Link** – Mitarbeiter laden Speisekarten-Bilder via Direkt-Link hoch (imgur, Discord, ibb.co, ...)
-
✅ **Link-Validierung** – Links werden client- und serverseitig auf Format und erlaubte Domain geprüft
-
👁️ **Vorschau-Funktion** – Bild vor dem Speichern direkt im Staff-Panel prüfen
-
🔛 **Aktivieren / Deaktivieren** – jede Kategorie einzeln ein- oder ausschaltbar
-
🔒 **Serverseitige Absicherung** – nur Mitarbeiter mit dem passenden Job können ihre Karte bearbeiten
-
🏪 **Unbegrenzt viele Restaurants** – alle frei konfigurierbar mit eigenem Job, Item und Kategorien
-
👤 **NPC-Modus** – Staff- und Pickup-NPC statt klassischer Marker, inkl. Blickrichtung pro Restaurant
-
📍 **Marker-Modus** – alternativ klassische farbige Marker (Orange = Staff, Weiß = Kunden)
-
🎭 **Clipboard-Animation** – wird automatisch beim Öffnen abgespielt
-
🎁 **Item-System** – Kunden erhalten das Speisekarten-Item am Pickup-NPC/Marker
-
💾 **Automatische Datenbank** – Tabelle `dv_menucard` wird beim ersten Start automatisch angelegt
-
🐛 **Upload-Log** – jeder Speisekarten-Upload wird in der Serverkonsole protokolliert
-
⚡ **Performance-schonend** – Marker/NPC-Loops laufen nur in Reichweite der konfigurierten Standorte
---
## 🖥️ NUI Panel
Das System nutzt zwei separate NUI-Ansichten:
**Kunden-Ansicht (Clipboard)** – Öffnet sich beim Benutzen des Speisekarten-Items. Die Karte erscheint als realistisches Klemmbrett mit Kategorie-Tabs. Nicht aktive oder leere Kategorien werden automatisch ausgeblendet.
**Staff-Panel** – Öffnet sich am Staff-NPC oder -Marker per `[E]`. Mitarbeiter sehen alle Kategorien ihres Restaurants, können pro Kategorie einen Bild-Link einfügen, eine Vorschau laden und die Karte speichern oder deaktivieren.
---
## 🔒 Serverseitige Sicherheit
Alle kritischen Aktionen – Speichern, Aktivieren, Deaktivieren – werden serverseitig geprüft. Jeder eingehende Link wird auf HTTPS, `.png`-Endung und erlaubte Domain validiert. Zusätzlich wird der Job des Spielers gegengeprüft – nur Mitarbeiter des jeweiligen Restaurants können ihre eigene Karte bearbeiten. Manipulationen durch gefälschte Client-Events werden damit effektiv unterbunden.
---
## 🖼️ Unterstützte Bild-Plattformen
Nur Bilder von konfigurierten Domains werden akzeptiert. Standardmäßig vorbereitete Plattformen:
| Plattform | Kostenlos | Registrierung | Dauerhaft |
|---|---|---|---|
| imgur.com | ✅ | Nicht nötig | ✅ |
| ibb.co | ✅ | Nicht nötig | ✅ |
| Discord CDN | ✅ | Discord-Account | ⚠️ Links können ablaufen |
| s1.directupload.eu | ✅ | Nicht nötig | ✅ |
Weitere Domains lassen sich jederzeit in der `config.lua` hinzufügen.
---
## 🔔 Notify-System
Das Benachrichtigungssystem ist vollständig framework-unabhängig. Einfach den eigenen Notify-Aufruf als einzeilige Funktion in der Config eintragen – fertig.
```lua
-- ESX Standard:
ESX.ShowNotification(message)
-- ox_lib:
lib.notify({ title = "Speisekarte", description = message, type = "inform" })
-- okokNotify:
exports["okokNotify"]:Alert("Speisekarte", message, 5000, "info")
-- QBCore:
QBCore.Functions.Notify(message, "primary")
```
---
## 📦 Abhängigkeiten
| Pflicht | Optional |
|---|---|
| es_extended (ESX Legacy) | Emote-Script (z.B. dpemotes) für Clipboard-Animation |
| oxmysql | – |
---
## 🚀 Installation in 4 Schritten
1. Ordner in `resources/` legen
2. `ensure dv_menucard` in die `server.cfg` eintragen
- Server starten – die Datenbanktabelle wird **automatisch** angelegt
4. Items für jedes Restaurant in der `items`-Tabelle registrieren & `config.lua` anpassen – fertig!
### Item registrieren (Beispiel)
```sql
INSERT INTO items (name, label, weight, rare, can_remove)
VALUES ('cat_cafe', 'Speisekarte Cat Cafe', 100, 0, 1);
```
---
## ⚙️ Konfiguration auf einen Blick
| Option | Beschreibung |
|---|---|
| `Config.Restaurants` | Alle Restaurants mit Job, Label, Koordinaten, Item und Kategorien |
| `Config.InteractMode` | Interaktionsmodus: `'npc'` oder `'marker'` |
| `Config.NPC` | NPC-Modelle, Interaktionsdistanz und Idle-Szenario |
| `Config.Marker` | Marker-Typ, Größe, Farben und Distanzen |
| `Config.AllowedDomains` | Erlaubte Bild-Domains für den Upload |
| `Config.Text` | Alle Texte und Benachrichtigungen frei anpassbar |
Alle Einstellungen befinden sich in einer einzigen zentralen `config.lua`. Neue Restaurants lassen sich in wenigen Sekunden hinzufügen.
---
## 💬 Support
Bei Fragen, Problemen oder Feature-Wünschen erreichst du uns jederzeit über unseren Discord:
👉
*Powered by DV_Development 🚀*