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:
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 esempiocar_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 |
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:
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)
endPuoi anche filtrare per metadati. Passa una tabella come quarto argomento:
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
endQuesto è 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:
local slot = exports.ox_inventory:GetSlot(source, 5)
if slot and slot.name == 'car_key' then
print(slot.metadata.plate)
endQuando conosci solo l'elemento, usa GetSlotWithItem:
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:
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) 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.
-- 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',
})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:
-- 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)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
AddItemeSetMetadatadal 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.

