Sichern Sie sich heute 20%. Verwenden Sie beim Bezahlvorgang den Code WELCOME. WILLKOMMEN

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?

KomponenteZweckKern-APIsTypische VerwendungMigrationspfadHäufige Fallstricke
ox_inventoryInventar & Gegenstände, Verstecke, GeschäfteArtikel hinzufügen, RemoveItem, RegisterStash, RegistrierenShopSpielergegenstände, Job-Vorräte, Händlerlädenqb-inventory → ox_inventoryFalsches Artikelschema, doppelte Invs laufen, fehlen sicherstellen Befehl
ox_libDienstprogramme, Benutzeroberfläche, HelferBefehl hinzufügen, registerContext/Kontext anzeigen, Eingabedialog, Fortschrittsbalken, Zonen/PunkteMenüs, Eingabeaufforderungen, Ratenbegrenzungen, ZonenlogikN / AMischen von UI-Bibliotheken, nicht Warten auf Rückrufe
ox_zielInteraktions-TargetingaddBoxZone, addSphereZone, Entität hinzufügen, Modell hinzufügenZielobjekte auf Requisiten/Pedalen/Zonen im Auge behaltenqtarget → ox_target (optional)Überlappende Zonen, fehlende Arbeitsbedingungen
oxmysqlMySQL-TreiberAbfrage, einzel, Skalar, einfügen, vorbereiten, TransaktionDB-Persistenz, Bestenlisten, Auditsmysql-async → oxmysqlNicht 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: oxmysqlox_libox_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.
ox_inventory – Einkaufen und Lagern

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.
ox_target – addBoxZone-Beispiel

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

Konzeptqb-inventarox_inventory
Artikelqb-core/shared/items.luaox_inventory/data/items.lua
VersteckeJob-/Player-Stash-Logik in SkriptenRegisterStash(ID, Label, Slots, Gewicht, Besitzer, Gruppen, Koordinaten)
Geschäfteqb-shops oder customRegisterShop(id, { Bestand = {..} })

Vorgehensweise

  1. Deaktivieren Sie qb-inventory und alle inventarabhängigen Benutzeroberflächen.
  2. Installieren ox_lib, ox_inventory, oxmysql in dieser Reihenfolge.
  3. Hafenartikel → Daten/Elemente.lua (Namen/Gewichte/Metadaten beibehalten).
  4. Ersetzen Sie die Elemente „Aufrufe hinzufügen/entfernen“ durch exports.ox_inventory:Artikel hinzufügen/Artikel entfernen.
  5. Stashes/Shops serverseitig registrieren; Stash-Speicherdaten ggf. migrieren.
  6. Testen Sie auf der Bühne; überprüfen Sie Drag/Stack/Split und Job-Stashes.

Checkliste (Vorher/Nachher)

BereichVorNachRisiko
Ressourcenqb-inventory aktiviertqb-inventory entfernt, ox_inventory sichergestelltNiedrig
ArtikelElemente in qb geteiltArtikel in Daten/Elemente.luaMedium (Benennung)
Versteckeimplizitexplizit RegisterStashNiedrig
Geschäfteqb‑shopsRegistrierenShopNiedrig

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-AufrufOxmysql-Ä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/COMMITMySQL.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

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

VersionDatumHinweise
Version 1.02025-09-05Erstverö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:


Externe Referenzen (mehr erfahren)

Lukas
Lukas

Ich bin Luke, ein Gamer und schreibe gerne über FiveM, GTA und Rollenspiele. Ich betreibe eine Rollenspiel-Community und habe etwa 10 Jahre Erfahrung in der Verwaltung von Servern.

Artikel570

Schreibe einen Kommentar