QBOX Framework – Vollständiger Leitfaden
Überdehnt (Ox) ist die moderne Basis für FiveM-Server. Diese Anleitung zeigt Ihnen, wie Sie installieren, konfigurieren und sicher migrieren zu ox_inventory, ox_lib, ox_ziel, Und oxmysql. Sie erhalten kopier- und einfügbaren Code, eigenwillige Standardeinstellungen und praxiserprobte Muster für UI, Interaktionen und Daten. Enthält Playbooks für qb-inventory → ox_inventory Und mysql-async → oxmysql. Sichern Sie Ihren Server und Ihre Datenbank, bevor Sie Änderungen vornehmen.
TL;DR: Welche Ox-Komponente wofür?
| Komponente | Zweck | Kern-APIs | Typische Verwendung | Migrationspfad | Häufige Fallstricke |
|---|---|---|---|---|---|
| ox_inventory | Inventar & Gegenstände, Verstecke, Geschäfte | Artikel hinzufügen, RemoveItem, RegisterStash, RegistrierenShop | Spielergegenstände, Job-Vorräte, Händlerläden | qb-inventory → ox_inventory | Falsches Artikelschema, doppelte Invs laufen, fehlen sicherstellen Befehl |
| ox_lib | Dienstprogramme, Benutzeroberfläche, Helfer | Befehl hinzufügen, registerContext/Kontext anzeigen, Eingabedialog, Fortschrittsbalken, Zonen/Punkte | Menüs, Eingabeaufforderungen, Ratenbegrenzungen, Zonenlogik | N / A | Mischen von UI-Bibliotheken, nicht Warten auf Rückrufe |
| ox_ziel | Interaktions-Targeting | addBoxZone, addSphereZone, Entität hinzufügen, Modell hinzufügen | Zielobjekte auf Requisiten/Pedalen/Zonen im Auge behalten | qtarget → ox_target (optional) | Überlappende Zonen, fehlende Arbeitsbedingungen |
| oxmysql | MySQL-Treiber | Abfrage, einzel, Skalar, einfügen, vorbereiten, Transaktion | DB-Persistenz, Bestenlisten, Audits | mysql-async → oxmysql | Nicht indizierte Abfragen, unsichere Zeichenfolgenverkettung |
Tipp: Beginnen Sie mit oxmysql Und ox_lib, dann migrieren Inventar Und Ziel. Validieren Sie jeden Schritt auf einem Staging-Server.
Verwandt: https://fivemx.com/frameworks/ · https://fivemx.com/framework-conversion/
Holen Sie sich hier QBox-Skripte
Voraussetzungen und Baseline
- Aktuelles Server-Artefakt, txAdminund ein Rahmen (QBCore oder ESX).
- Node.js ist für Ox nicht erforderlich, wird aber möglicherweise von Ihrem NUI-Stack (sofern vorhanden) verwendet.
- Startreihenfolge der Ressourcen:
oxmysql→ox_lib→ox_inventory→ der Rest. Setzen ox_ziel früh unter UI/Interaktionsbibliotheken. - Checkliste:
- Die Firewall lässt DB-Verkehr zu; der DB-Benutzer hat die geringsten Berechtigungen.
- Legen Sie Produktions- vs. Entwicklungskonvertierungen fest; aktivieren Sie Warnungen vor langsamen Abfragen in der Staging-Umgebung.
- Backups für DB- und Ressourcenkonfigurationen.
Verwandt: https://fivemx.com/how-to-install-qbcore/ · https://fivemx.com/how-to-customize-qbcore-scripts/ · https://fivemx.com/qbcore-scripts/
Installieren und konfigurieren: ox_inventory
Installieren
Fügen Sie die Ressource hinzu und stellen Sie sicher, dass nach ox_lib.
-- resources/[ox]/ox_inventory/fxmanifest.lua (Ausschnitt) fx_version „cerulean“ Spiel „gta5“ lua54 „ja“ shared_scripts { „@ox_lib/init.lua“, „config.lua“ } client_scripts { „client/*.lua“ } server_scripts { „@oxmysql/lib/MySQL.lua“, „server/*.lua“ }
server.cfg:
Stellen Sie sicher, dass oxmysql ox_lib sicher ist, dass ox_inventory sicher ist
Kernkonfiguration
Definieren Sie Elemente (Gewicht, Stapel, Metadaten). Typischer Pfad: ox_inventory/data/items.lua.
return { water = { label = „Wasserflasche“, Gewicht = 200, Stapel = wahr, schließen = wahr, Beschreibung = „Bleiben Sie hydriert.“ }, sandwich = { label = „Sandwich“, Gewicht = 300, Stapel = wahr } }
Registrieren Sie ein Versteck und ein Geschäft beim Serverstart:
-- server/stash_shop.lua CreateThread(function() exports.ox_inventory:RegisterStash('pd_evidence', 'Police Evidence', 100, 100000, false, {police = 2}) exports.ox_inventory:RegisterShop('corner_store', { name = '24/7 Market', inventory = { { name = 'water', price = 8 }, { name = 'sandwich', price = 12 } } }) end)
UI-Grundlagen
- Drag & Drop, Teilen, Stapeln; konfigurierbare Hotkeys.
- Verwenden Metadaten für Seriennummern, Qualitäten, Ablaufdatum.
Schnelltest
Geben Sie sich einen Gegenstand und öffnen Sie das Inventar:
-- server/debug.lua RegisterCommand('giveme', function(src) exports.ox_inventory:AddItem(src, 'water', 1) end, true)
Häufige Fehler
Warnung: Tun nicht Führen Sie zwei Inventuren gleichzeitig aus. Deaktivieren Sie qb-inventory vollständig, bevor Sie ox_inventory aktivieren.
Tipp: Artikel abgleichen Namen genau über Jobs/Handwerk und Inventardaten.
Verwandt: https://fivemx.com/fivem-inventory-scripts/ · https://fivemx.com/qbcore-scripts/
Installieren und konfigurieren: ox_lib
Grundausstattung
Kern Hilfreiche Tools, die Sie überall verwenden werden:
-- Befehle lib.addCommand('healme', { help = 'Heile dich selbst (nur Admin).', restricted = 'group.admin' }, function(src) TriggerClientEvent('fivemx:heal', src) end) -- Kontextmenüs lib.registerContext({ id = 'shop_menu', title = '24/7 Markt', options = { { title = 'Wasser kaufen ($8)', event = 'fivemx:buy', args = { item = 'water', price = 8 } }, { title = 'Sandwich kaufen ($12)', event = 'fivemx:buy', args = { item = 'sandwich', price = 12 } } } }) -- später lib.showContext('shop_menu')
Mini-Kochbuch
- Eingabedialog und Fortschritt mit erwartbarem Fluss:
-- Client lokale Eingabe = lib.inputDialog('Craft Coffee', { { Typ = 'Zahl', Bezeichnung = 'Bohnen (g)', Standard = 18, min = 1, max = 60 } }) wenn Eingabe, dann lokales OK = lib.progressBar({ Dauer = 3500, Bezeichnung = 'Brauen…', useWhileDead = false, canCancel = true }) wenn ok, dann TriggerServerEvent('fivemx:craft:coffee', Eingabe[1]) Ende Ende
- Rückrufe (Server validiert, Client wartet):
-- Server lib.callback.register('fivemx:buyItem', Funktion(Quelle, Artikel, Preis) -- Job/Koordinaten/usw. validieren, dann berechnen + gewähren -- Wahr/Falsch zurückgeben und Nachricht zurückgeben exports.ox_inventory:AddItem(Quelle, Artikel, 1) Ende) -- Client lokal Erfolg = lib.callback.await('fivemx:buyItem', falsch, 'Wasser', 8)
Verwandt: https://fivemx.com/frameworks/ · https://fivemx.com/framework-conversion/
Installieren und konfigurieren: ox_target
Entitäten und Knochen
Verknüpfen Sie Aktionen mit bestimmten Fußgänger/Fahrzeuge/Objekte oder ihre Knochen.
-- Zielen Sie auf eine Entität nach Modell exports.ox_target:addModel(`prop_vend_soda_02`, { { name = 'vending_buy', icon = 'fa-solid fa-bottle-water', label = 'Getränk kaufen', onSelect = function(data) TriggerEvent('fivemx:openVending') end } })
Zonen
Erstellen Sie 3D-Boxen/Kugeln/Polys mit Jobbedingungen.
-- Boxzone vor der Kasse exports.ox_target:addBoxZone({ coords = vec3(25.7, -1347.3, 29.5), size = vec3(1.6, 1.2, 1.0), rotation = 0.0, debug = false, options = { { label = 'Open Shop', icon = 'fa-solid fa-store', groups = { police = 0, ambulance = 0 }, -- anyone; Beispiel für Gruppenfilter onSelect = function() lib.showContext('shop_menu') end } } })
Beispiele
- Stash-Ziel für polizeiliche Beweise.
- Job-Gated Crafting in einer Werkstatt.
Verwandt: https://fivemx.com/qbcore-scripts/ · https://fivemx.com/fivem-inventory-scripts/
Installieren und konfigurieren: oxmysql
Warum oxmysql
- Vorbereitete Anweisungen, Pooling, asynchrone/wartende API.
- Bessere Leistung und Sicherheit als String-Concat-SQL.
API-Spickzettel
-- viele lokale Zeilen lesen = MySQL.query.await('SELECT id, name FROM players WHERE job = ?', { 'police' }) -- einzelne Zeile lesen lokaler Spieler = MySQL.single.await('SELECT * FROM players WHERE identifier = ?', { identifier }) -- Skalarwert lokaler Zähler = MySQL.scalar.await('SELECT COUNT(*) FROM stash_items WHERE stash = ?', { 'pd_evidence' }) -- lokale ID einfügen = MySQL.insert.await('INSERT INTO logs (event, source) VALUES (?, ?)', { 'buy_water', src }) -- lokale Informationen vorbereitet und zwischengespeichert = MySQL.prepare.await('SELECT label, weight FROM items WHERE name = ?', { 'water' }) -- Transaktion MySQL.transaction.await(function() MySQL.query.await('UPDATE accounts SET money = money - ? WHERE identifier = ?', { 12, identifier }) MySQL.query.await('INSERT INTO purchases (identifier, item) VALUES (?, ?)', { identifier, 'sandwich' }) end)
Index- und Schemahygiene
ALTER TABLE players ADD INDEX idx_players_identifier (Kennung); ALTER TABLE purchases ADD INDEX idx_purchases_identifier_created (Kennung, erstellt am);
Fehlerbehandlung
Tipp: Aktivieren Sie Warnungen vor langsamen Abfragen in der Staging-Umgebung und fügen Sie vor dem Start die richtigen Indizes hinzu.
Verwandt: https://fivemx.com/mysql-async-to-oxmysql/ · https://fivemx.com/sql-identifiers-migration/ · https://fivemx.com/converting-fivem-scripts/
Migrations-Playbooks (kopieren und einfügen möglich)
qb-inventory → ox_inventory
Konzeptzuordnung
| Konzept | qb-inventar | ox_inventory |
|---|---|---|
| Artikel | qb-core/shared/items.lua | ox_inventory/data/items.lua |
| Verstecke | Job-/Player-Stash-Logik in Skripten | RegisterStash(ID, Label, Slots, Gewicht, Besitzer, Gruppen, Koordinaten) |
| Geschäfte | qb-shops oder custom | RegisterShop(id, { Bestand = {..} }) |
Vorgehensweise
- Deaktivieren Sie qb-inventory und alle inventarabhängigen Benutzeroberflächen.
- Installieren ox_lib, ox_inventory, oxmysql in dieser Reihenfolge.
- Hafenartikel →
Daten/Elemente.lua(Namen/Gewichte/Metadaten beibehalten). - Ersetzen Sie die Elemente „Aufrufe hinzufügen/entfernen“ durch
exports.ox_inventory:Artikel hinzufügen/Artikel entfernen. - Stashes/Shops serverseitig registrieren; Stash-Speicherdaten ggf. migrieren.
- Testen Sie auf der Bühne; überprüfen Sie Drag/Stack/Split und Job-Stashes.
Checkliste (Vorher/Nachher)
| Bereich | Vor | Nach | Risiko |
|---|---|---|---|
| Ressourcen | qb-inventory aktiviert | qb-inventory entfernt, ox_inventory sichergestellt | Niedrig |
| Artikel | Elemente in qb geteilt | Artikel in Daten/Elemente.lua | Medium (Benennung) |
| Verstecke | implizit | explizit RegisterStash | Niedrig |
| Geschäfte | qb‑shops | RegistrierenShop | Niedrig |
Beispiel: Hinzufügen/Entfernen, Ersetzen
– vorher (qb-inventory Pseudocode) – QBCore.Functions.AddItem(src, „water“, 1) – nachher (ox_inventory) exports.ox_inventory:AddItem(src, „water“, 1) exports.ox_inventory:RemoveItem(src, „sandwich“, 1)
Verwandt: https://fivemx.com/fivem-inventory-scripts/
mysql-async → oxmysql
Such-/Ersetzungsmuster
| MySQL-Async-Aufruf | Oxmysql-Äquivalent |
|---|---|
MySQL.Async.fetchAll(sql, params, cb) | MySQL.query(sql, params) / .erwarten |
MySQL.Async.fetchScalar(sql, params, cb) | MySQL.scalar(sql, params) / .erwarten |
MySQL.Async.execute(sql, params, cb) | MySQL.query(sql, params) oder MySQL.update/insert / .erwarten |
Zeichenfolgenverkettung "..var.." | ? Platzhalter mit Parameter-Array |
| manuelles BEGIN/COMMIT | MySQL.transaction.await(function() ... end) |
Beispiel-Refactoring
– vor MySQL.Async.fetchAll('SELECT * FROM users WHERE identifier = @id', { ['@id'] = identifier }, function(rows) – Zeilenende verwenden) – nach lokalen Zeilen = MySQL.query.await('SELECT * FROM users WHERE identifier = ?', { identifier })
Vorbereitete Aussagen
lokaler Benutzer = MySQL.prepare.await('SELECT id, job FROM users WHERE identifier = ?', { identifier })
Warnung: Vertrauen Sie niemals den Eingaben des Kunden. Validieren Sie immer auf Server und Platzhalter verwenden.
Verwandt: https://fivemx.com/mysql-async-to-oxmysql/ · https://fivemx.com/sql-identifiers-migration/ · https://fivemx.com/converting-fivem-scripts/
Muster, die sich verkaufen: Erstellen von Jobs und UI mit dem Ox-Stack
Ein minimaler Lieferauftrag, der verbindet ox_ziel (interagieren), ox_lib (Benutzeroberfläche), ox_inventory (Belohnungen) und oxmysql (Prüfung).
-- client/jobs_delivery.lua local drop = vec3(120.4, -1039.2, 29.2) exports.ox_target:addBoxZone({ coords = drop, size = vec3(1.4, 1.0, 1.0), rotation = 340.0, options = { { name = 'deliver_crate', label = 'Deliver Crate', icon = 'fa-solid fa-box', onSelect = function() local ok = lib.progressBar({ duration = 4000, label = 'Dropping off…' }) if ok then TriggerServerEvent('fivemx:job:deliverCrate') end end } } })
-- server/jobs_delivery.lua RegisterNetEvent('fivemx:job:deliverCrate', function() local src = Quelle -- Ratenbegrenzung pro Minute (sehr einfach) local ok = exports.ox_inventory:AddItem(src, 'water', 1) if ok then MySQL.insert.await('INSERT INTO job_logs (identifier, event) VALUES (?, ?)', { GetPlayerIdentifier(src, 0), 'deliver_crate' }) TriggerClientEvent('ox_lib:notify', src, { title = 'Lieferung', description = 'Sie haben 1 Wasser erhalten', type = 'success' }) end end)
Verwandt: https://fivemx.com/qbcore-scripts/ · https://fivemx.com/fivem-inventory-scripts/
Leistung und Sicherheit
- Entprellen Sie Zielinteraktionen; vermeiden Sie überlappende Zonen.
- Häufige Lesevorgänge im Cache speichern; Index in WHERE/JOIN verwendete Spalten.
- Halten Sie die Server-Ticks niedrig und verschieben Sie schwere Schleifen aus dem Hauptthread.
- Sicherheit: Serverseitige Validierung, Ratenbegrenzung wirtschaftlicher Aktionen, Protokollierung sensibler Ereignisse.
Tipp: Aktivieren Sie Warnungen vor langsamen Abfragen im Staging. Versenden Sie Indizes mit Migrationen.
Verwandt: https://fivemx.com/converting-fivem-scripts/ · https://fivemx.com/sql-identifiers-migration/
Debugging und Test-Harness
- Debug hinzufügen Befehle durch Berechtigungen geschützt.
- Protokollieren Sie DB-Fehler und schließen Sie bei Fehlern kurz.
- Testen Sie Hot‑Reload, indem Sie einzelne Ressourcen (nicht den gesamten Stapel) neu starten.
lib.addCommand('oxping', { help = 'Health check', restricted = 'group.admin' }, function(src) local ok = MySQL.scalar.await('SELECT 1') == 1 TriggerClientEvent('ox_lib:notify', src, { title = 'Ox Health', description = ok und 'DB OK' oder 'DB FAIL', type = ok und 'success' oder 'error' }) end)
Verwandt: https://fivemx.com/frameworks/ · https://fivemx.com/framework-conversion/
Interne Ressourcen und nächste Schritte
- Rahmenbedingungen: https://fivemx.com/frameworks/ · https://fivemx.com/framework-conversion/
- QBCore: https://fivemx.com/how-to-install-qbcore/ · https://fivemx.com/how-to-customize-qbcore-scripts/ · https://fivemx.com/qbcore-scripts/
- Migrationen: https://fivemx.com/mysql-async-to-oxmysql/ · https://fivemx.com/sql-identifiers-migration/ · https://fivemx.com/converting-fivem-scripts/
- Inventar-Hub: https://fivemx.com/fivem-inventory-scripts/
Durchsuchen Sie den Shop für getestete Skripte, die diesen Mustern folgen.
Häufig gestellte Fragen
Ist ox_inventory schneller als qb-inventory?
Im Allgemeinen ja. Der Schwerpunkt liegt auf einer effizienten Benutzeroberfläche und serverseitigen Vorgängen mit vernünftigen Standardeinstellungen für Stapel, Gewichte und Metadaten.
Kann ich qb-inventory und ox_inventory mischen?
Nicht empfohlen. Stoppen Sie qb-inventory vollständig, bevor Sie ox_inventory aktivieren, um doppelte Handler und eine Desynchronisierung der Elemente zu vermeiden.
Muss ich SQL für Oxmysql neu schreiben?
Meistens Suchen/Ersetzen. Ersetzen Sie String Concat durch Platzhalter, übernehmen *.erwarten APIs und fehlende Indizes hinzufügen.
Wie sichere ich ox_target-Interaktionen?
Verwenden Gruppen/job prüft clientseitig, führt aber vor der Vergabe von Belohnungen immer eine erneute Validierung auf dem Server durch (Entfernung, Job, Gegenstandsbesitz).
Wie steht es um die ESX-Kompatibilität?
Der Ox-Stack ist Framework-agnostisch. Ordnen Sie ESX-Ereignisse Server-Handlern zu und sorgen Sie für konsistente Inventarnamen.
Wie führe ich Benchmarking-Tests für DB-Aufrufe durch?
Verwenden Sie EXPLAIN, aktivieren Sie Warnungen bei langsamen Abfragen und vergleichen Sie die Zeitangaben vor/nach dem Hinzufügen von Indizes.
Wo definiere ich Artikel für ox_inventory?
In ox_inventory/data/items.lua. Halten Sie die Beschriftungen kurz und die Gewichte realistisch.
Kann ich qtarget behalten, während ich zu ox_target migriere?
Vorübergehend, aber vermeiden Sie überlappende Zonen. Migrieren Sie Feature für Feature und entfernen Sie qtarget, wenn die Parität erreicht ist.
Wie migriere ich Stash-Daten?
Äquivalent erstellen RegisterStash Einträge und führen Sie SQL aus, um alte Stash-IDs bei Bedarf in die neuen Schlüssel umzubenennen. Testen Sie auf der Staging-Plattform.
Wie lege ich Gewichte und Grenzen fest?
Gewichte leben in items.lua. Lager-/Shopkapazitäten sind Teil von RegisterStash/RegistrierenShop Argumente.
Wie kann ich die Rate von Käufen oder Aufträgen begrenzen?
Verwenden lib.addCommand/Callbacks mit einfachen In-Memory-Cooldowns und serverseitiger Validierung.
Unterstützt Oxmysql Transaktionen?
Ja – atomare Sequenzen einschließen in MySQL.transaction.await(function() ... end).
Wie gehe ich mit NUI bei Ox um?
Ox funktioniert problemlos mit jeder NUI. Behalten Sie einfach die umfangreiche UI-Logik auf der Clientseite und die Validierungen auf der Serverseite bei.
Welche Migrationsreihenfolge ist am sichersten?
oxmysql → ox_lib → ox_inventory → ox_target. Nach jedem Schritt validieren.
Änderungsprotokoll & Danksagungen
| Version | Datum | Hinweise |
|---|---|---|
| Version 1.0 | 2025-09-05 | Erstveröffentlichung mit Installations-, Konfigurations- und Migrations-Playbooks. |
Zuletzt aktualisiert: 2025-09-05
Credits & Quellen: Überdehnte Dokumentation (ox_inventory, ox_lib, ox_target), Oxmysql-Referenz, Cfx.re-Dokumente und bewährte Methoden der Community.
Fazit und nächste Schritte
Beide Konzepte eignen sich für die Verwaltung einer Stadt der Spitzenklasse. Der Unterschied liegt darin, wie viel Erbe Sie weiterführen möchten und wie standardisiert Ihre Zukunft sein soll.
Nächste Schritte:
- Erkunden QBOX-Skripte → https://fivemx.com/qbox-scripts/
- Erkunden QBCore-Skripte → https://fivemx.com/qbcore-scripts/
- Weiterlesen auf Framework-Konvertierung → https://fivemx.com/framework-conversion
Externe Referenzen (mehr erfahren)
- QBOX GitHub (qbx_core) → https://github.com/Qbox-project/qbx_core
- QBCore GitHub (qb-core) → https://github.com/qbcore-framework/qb-core
- FiveM Docs – Ressourcenmanifest (fxmanifest.lua) → https://docs.fivem.net/docs/scripting-reference/resource-manifest/resource-manifest/






