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:

lua
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.lua existieren, beispielsweise car_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
lua
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:

lua
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)
end

Du kannst auch nach Metadaten filtern. Übergebe eine Tabelle als das vierte Argument:

lua
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
end

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

lua
local slot = exports.ox_inventory:GetSlot(source, 5)
if slot and slot.name == 'car_key' then
    print(slot.metadata.plate)
end

Wenn du nur den Gegenstand kennst, verwende GetSlotWithItem:

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

lua
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)
end

SetMetadata(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.

lua
-- data/items.lua
['id_card'] = {
    label = 'ID card',
    weight = 10,
    stack = false,
    close = true,
},
lua
-- 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:

lua
-- data/items.lua
['id_card'] = {
    label = 'ID card',
    weight = 10,
    stack = false,
    server = { export = 'my_script.id_card' },
},
lua
-- 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 AddItem und SetMetadata von 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.

Scripts ohne dieses Problem

Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →

Weiterlesen