ox_inventory Gegenstand-Metadaten: AddItem, Search, SetMetadata und einzigartige Gegenstände
Verwende Metadaten in ox_inventory: Gegenstände mit Daten hinzufügen, Slots suchen und lesen, mit SetMetadata aktualisieren, benutzerdefinierten Label und Beschreibung anzeigen und einzigartige Gegenstände wie IDs und Schlüssel machen.
Ein Gegenstand in ox_inventory ist ein Name und eine Anzahl. Wenn zwei Gegenstände mit dem gleichen Namen unterschiedlich sein müssen, wie ein Auto-Schlüssel für eine Platte und ein Schlüssel für eine andere, verwendest du Metadaten: eine Tabelle, die mit dem Gegenstand gespeichert wird. Dieser Artikel zeigt, wie man einen Gegenstand mit Metadaten hinzufügt, ihn wieder findet, liest und aktualisiert, anzeigt und einzigartige Gegenstände wie IDs und Schlüssel baut.
Füge einen Gegenstand mit Metadaten hinzu
Das vierte Argument von AddItem ist die Metadaten-Tabelle:
exports.ox_inventory:AddItem(source, 'car_key', 1, {
plate = 'ABC 123',
label = 'Key ABC 123',
description = 'Opens the car with plate ABC 123.',
})Die Signatur ist AddItem(inventory, item, count, metadata). inventory ist die Spieler-ID für ein Spieler-Inventar. Jeder Schlüssel, den du hinzufügst, wird mit dem Slot gespeichert und du kannst ihn später wieder lesen. Halte Metadaten klein und aus einfachen Daten gemacht: Strings, Zahlen, Booleans und einfache Tabellen.
Tipp: Der Gegenstand muss in
data/items.luaexistieren, beispielsweisecar_key. Siehe adding items to ox_inventory.
Zeige es dem Spieler
Ein paar Metadaten-Schlüssel ändern, was das Inventar anzeigt:
| Schlüssel | Effekt |
|---|---|
label |
Ersetzt den Gegenstandsnamen im Inventar |
description |
Ersetzt die Gegenstand-Beschreibung |
image |
Ersetzt das Symbol, unter Verwendung des Namens eines Bildes in web/images |
exports.ox_inventory:AddItem(source, 'id_card', 1, {
label = 'ID card: Jane Doe',
description = 'Born 1994-05-12',
image = 'id_card',
})Alles andere, das du in der Tabelle legst, wird gespeichert, aber nicht angezeigt, es sei denn, die Gegenstand-Definition zeigt es an. Verwende einen einzigartigen label, wenn du möchtest, dass Spieler Gegenstände auf einen Blick unterscheiden.
Suche nach Gegenständen
Search findet Gegenstände in einem Inventar. Mit 'count' gibt es zurück, wie viele, mit 'slots' gibt es die Slots zurück:
local count = exports.ox_inventory:Search(source, 'count', 'car_key')
local slots = exports.ox_inventory:Search(source, 'slots', 'car_key')
for _, slot in pairs(slots) do
print(slot.slot, slot.metadata and slot.metadata.plate)
endDu kannst auch nach Metadaten filtern. Übergebe eine Tabelle als das vierte Argument:
local keys = exports.ox_inventory:Search(source, 'slots', 'car_key', { plate = 'ABC 123' })
if #keys > 0 then
-- the player has the key for that plate
endDies ist die Standard-Art, um Eigentum zu prüfen: Tue es auf dem Server, mit den Daten, denen du vertraust, nie von einer Client-Nachricht.
Lese einen Slot
Wenn du die Slot-Nummer kennst, gibt GetSlot den Daten von diesem Slot zurück:
local slot = exports.ox_inventory:GetSlot(source, 5)
if slot and slot.name == 'car_key' then
print(slot.metadata.plate)
endWenn du nur den Gegenstand kennst, verwende GetSlotWithItem:
local slot = exports.ox_inventory:GetSlotWithItem(source, 'car_key', { plate = 'ABC 123' })Beide geben nil zurück, wenn nichts passt, also prüfe das Ergebnis, bevor du slot.metadata liest. Ein Slot hat auch slot.count und slot.weight.
Aktualisiere Metadaten mit SetMetadata
Um einen vorhandenen Slot zu ändern, beispielsweise einen Schlüssel als kopiert zu markieren, oder die verbleibenden Ladungen auf einem Gegenstand zu reduzieren, verwende SetMetadata:
local slot = exports.ox_inventory:GetSlotWithItem(source, 'battery')
if slot then
local metadata = slot.metadata or {}
metadata.charge = (metadata.charge or 100) - 10
exports.ox_inventory:SetMetadata(source, slot.slot, metadata)
endSetMetadata(inventory, slot, metadata) ersetzt die Metadaten des Slots mit der Tabelle, die du gibst. Kopiere die vorhandene Tabelle zuerst, ändere ein Feld und sende die ganze Tabelle zurück, andernfalls löschst du die anderen Schlüssel.
Einzigartige Gegenstände: IDs, Schlüssel, Lizenzen
Für einen einzigartigen Gegenstand möchtest du zwei Dinge: einen Gegenstand, der sich nicht stapelt, und Metadaten, die ihn identifizieren.
-- data/items.lua
['id_card'] = {
label = 'ID card',
weight = 10,
stack = false,
close = true,
},-- server: give it at character creation
exports.ox_inventory:AddItem(source, 'id_card', 1, {
firstname = 'Jane',
lastname = 'Doe',
dob = '1994-05-12',
label = 'ID card: Jane Doe',
})Gegenstände mit verschiedenen Metadaten stapeln sich nicht, also zwei Schlüssel für zwei Autos nehmen immer zwei Slots, und stack = false macht das explizit für Gegenstände, die sich nie sollten.
Um die Daten zu lesen, wenn der Gegenstand verwendet wird, registriere einen Server-Export auf dem Gegenstand:
-- data/items.lua
['id_card'] = {
label = 'ID card',
weight = 10,
stack = false,
server = { export = 'my_script.id_card' },
},-- my_script/server.lua
exports('id_card', function(event, item, inventory, slot, data)
if event == 'usingItem' then
local info = exports.ox_inventory:GetSlot(inventory.id, slot)
if info and info.metadata then
print(info.metadata.firstname, info.metadata.lastname)
end
end
end)Das event-Argument sagt dir die Phase der Verwendung. Die genauen Argumente hängen von deiner ox_inventory-Version ab, also prüfe die Dokumentation für deine Version, wenn der Export nicht aufgerufen wird.
Dinge zum Beobachten
- Metadaten leben auf dem Slot. Wenn der Spieler den Gegenstand fallen lässt oder handelt, bewegt er sich mit, und es ist der Gegenstand, der das Recht auf Zugriff beweist.
- Lege keine Geheimnisse in Metadaten. Spieler sehen nicht aufgelistete Schlüssel nicht, aber behandle sie als Daten, nicht als Schutz.
- Viele Gegenstände mit großen Metadaten-Tabellen macht das Inventar-Speichern langsamer. Speichere eine ID und halte die schwere Daten in deiner eigenen Datenbank-Tabelle.
- Metadaten, die auf dem Client gesetzt sind, werden nicht vertraut. Rufe immer
AddItemundSetMetadatavon Server-Code auf.
Checkliste
| Symptom | Behebung |
|---|---|
| Zwei Schlüssel fusionieren in einen Stapel | Sie haben identische Metadaten; Füge ein einzigartiges Feld wie plate hinzu |
| Label ändert sich nicht | Lege label in die Metadaten-Tabelle, nicht in items.lua |
Search findet nichts |
Übergebe den richtigen Gegenstandsnamen und den Metadaten-Filter als eine Tabelle |
SetMetadata löschte andere Felder |
Kopiere die vorhandenen Metadaten, ändere einen Schlüssel, sende die ganze Tabelle |
slot.metadata ist nil |
Prüfe, dass der Slot existiert und lese metadata nur nach der nil-Prüfung |
| Gegenstand-Daten von Spielern bearbeitet | Führe AddItem und SetMetadata nur auf dem Server aus |
Kurze Antworten
Was sind Metadaten in ox_inventory?
Eine Tabelle von zusätzlichen Daten, die auf einem Gegenstand-Slot gespeichert sind. Es lässt zwei Gegenstände mit dem gleichen Namen unterschiedlich sein, beispielsweise zwei Schlüssel für verschiedene Autos, oder ein ID-Karte für verschiedene Personen.
Wie zeige ich benutzerdefinierten Text auf einem Gegenstand?
Setze label, description oder image in den Metadaten, wenn du den Gegenstand hinzufügst. ox_inventory zeigt diese anstatt des Standard-Textes des Gegenstandes.
Gestapeln Gegenstände mit verschiedenen Metadaten?
Nein. Zwei Gegenstände gestapeln sich nur, wenn ihre Metadaten gleich sind, also Gegenstände mit einzigartigen Metadaten nehmen einen Slot je.

