Metadati degli elementi di ox_inventory: AddItem, Search, SetMetadata e elementi unici

Usa i metadati in ox_inventory: aggiungi elementi con dati, cerca e leggi gli slot, aggiorna con SetMetadata, mostra un'etichetta personalizzata e descrizione, e crea elementi unici come ID e chiavi.

Un elemento in ox_inventory è un nome e un conteggio. Quando due elementi con lo stesso nome hanno bisogno di essere diversi, come una chiave dell'auto per una targa e una chiave per un'altra, usi i metadati: una tabella archiviata con l'elemento. Questo articolo mostra come aggiungere un elemento con metadati, trovarlo di nuovo, leggere e aggiornarlo, visualizzarlo, e costruire elementi unici come ID e chiavi.

Aggiungi un elemento con metadati

Il quarto argomento di AddItem è la tabella dei metadati:

lua
exports.ox_inventory:AddItem(source, 'car_key', 1, {
    plate = 'ABC 123',
    label = 'Key ABC 123',
    description = 'Opens the car with plate ABC 123.',
})

La firma è AddItem(inventory, item, count, metadata). inventory è l'id del giocatore per un inventario del giocatore. Qualsiasi chiave che aggiungi viene archiviata con lo slot, e puoi leggerla di nuovo in seguito. Mantieni i metadati piccoli e fatti di dati semplici: stringhe, numeri, booleani e tabelle semplici.

Consiglio: l'elemento deve esistere in data/items.lua, ad esempio car_key. Vedi aggiungere elementi a ox_inventory.

Mostralo al giocatore

Poche chiavi di metadati cambiano quello che l'inventario visualizza:

Chiave Effetto
label Sostituisce il nome dell'elemento nell'inventario
description Sostituisce la descrizione dell'elemento
image Sostituisce l'icona, usando il nome di un'immagine 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',
})

Tutto il resto che metti nella tabella viene archiviato, ma non mostrato, a meno che la definizione dell'elemento stesso non lo visualizzi. Usa un label unico quando hai bisogno che i giocatori distinguano gli elementi a prima vista.

Cerca elementi

Search trova elementi in un inventario. Con 'count' restituisce quanti, con 'slots' restituisce gli slot:

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

Puoi anche filtrare per metadati. Passa una tabella come quarto argomento:

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

Questo è il modo standard per controllare la proprietà: fallo sul server, con i dati che sfiduci, mai da un messaggio del client.

Leggi uno slot

Se conosci il numero dello slot, GetSlot restituisce i dati di quello slot:

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

Quando conosci solo l'elemento, usa GetSlotWithItem:

lua
local slot = exports.ox_inventory:GetSlotWithItem(source, 'car_key', { plate = 'ABC 123' })

Entrambi restituiscono nil quando nulla corrisponde, quindi controlla il risultato prima di leggere slot.metadata. Uno slot ha anche slot.count e slot.weight.

Aggiorna metadati con SetMetadata

Per cambiare uno slot esistente, ad esempio contrassegnare una chiave come copiata, o ridurre le cariche rimaste su un elemento, usa 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) sostituisce i metadati dello slot con la tabella che dai. Copia la tabella esistente prima, cambia un campo, e invia la tabella intera di nuovo, altrimenti cancelli gli altri tasti.

Elementi unici: ID, chiavi, licenze

Per un elemento unico vuoi due cose: un elemento che non si impila, e metadati che lo identifichino.

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',
})

Gli elementi con metadati diversi non si impilano, quindi due chiavi per due auto occupano sempre due slot, e stack = false lo rende esplicito per gli elementi che non dovrebbero mai.

Per leggere i dati quando l'elemento viene utilizzato, registra un export del server sull'elemento:

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)

L'argomento event ti dice la fase dell'uso. Gli argomenti esatti dipendono dalla tua versione di ox_inventory, quindi controlla la documentazione per la tua versione se l'export non viene chiamato.

Cose da fare attenzione

  • I metadati vivono sullo slot. Quando il giocatore scarta o scambia l'elemento, si muove con esso, ed è l'elemento che prova il diritto di accedere a qualcosa.
  • Non mettere segreti nei metadati. I giocatori non vedono le chiavi non elencate, ma trattali come dati, non come protezione.
  • Molti elementi con grandi tabelle di metadati rendono il salvataggio dell'inventario più lento. Archivia un id e mantieni i dati pesanti nella tua tabella di database.
  • I metadati impostati sul client non sono affidabili. Chiama sempre AddItem e SetMetadata dal codice del server.

Checklist

Sintomo Soluzione
Due chiavi si uniscono in uno stack Hanno metadati identici; aggiungi un campo unico come plate
L'etichetta non cambia Metti label all'interno della tabella dei metadati, non in items.lua
Search non trova nulla Passa il nome corretto dell'elemento, e il filtro dei metadati come tabella
SetMetadata ha cancellato altri campi Copia i metadati esistenti, cambia una chiave, invia la tabella intera
slot.metadata è nil Controlla che lo slot esista e leggi metadata solo dopo il controllo nil
I dati dell'elemento sono stati modificati dai giocatori Esegui AddItem e SetMetadata solo sul server

Risposte rapide

Cosa sono i metadati in ox_inventory?

Una tabella di dati extra archiviati su uno slot di elemento. Ti permette di differenziare due elementi con lo stesso nome, ad esempio due chiavi per auto diverse, o una carta d'identità per persone diverse.

Come mostro il testo personalizzato su un elemento?

Imposta label, description o image all'interno dei metadati quando aggiungi l'elemento. ox_inventory mostra quelli invece del testo predefinito dell'elemento.

Gli elementi con metadati diversi si impilano?

No. Due elementi si impilano solo quando i loro metadati sono gli stessi, quindi gli elementi con metadati unici occupano ogni slot.

Script senza questo problema

Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →Shop CreatorCrea un negozio in meno di un minuto — proprietari, dipendenti, casseforti e rapine inclusi.Vedi script →

Continua a leggere