Metadatos de items en ox_inventory: AddItem, Search, SetMetadata e items únicos

Usa metadatos en ox_inventory: añade items con datos, busca y lee espacios, actualiza con SetMetadata, muestra una etiqueta y descripción personalizadas, y haz items únicos como IDs y llaves.

Un item en ox_inventory es un nombre y una cantidad. Cuando dos items del mismo nombre necesitan ser diferentes, como una llave de auto para una placa y una llave para otra, usas metadatos: una tabla almacenada con el item. Este artículo muestra cómo añadir un item con metadatos, encontrarlo de nuevo, leerlo y actualizarlo, mostrarlo, y construir items únicos como IDs y llaves.

Añade un item con metadatos

El cuarto argumento de AddItem es la tabla de metadatos:

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 es AddItem(inventory, item, count, metadata). inventory es el id del jugador para un inventario de jugador. Cualquier clave que añadas se almacena con el espacio, y puedes leerla de nuevo más tarde. Mantén los metadatos pequeños y hechos de datos simples: strings, números, booleans y tablas simples.

Consejo: el item debe existir en data/items.lua, por ejemplo car_key. Véase adding items to ox_inventory.

Muéstraselo al jugador

Algunas claves de metadatos cambian lo que muestra el inventario:

Clave Efecto
label Reemplaza el nombre del item en el inventario
description Reemplaza la descripción del item
image Reemplaza el ícono, usando el nombre de una imagen en web/images
lua
exports.ox_inventory:AddItem(source, 'id_card', 1, {
    label = 'ID card: Jane Doe',
    description = 'Born 1994-05-12',
    image = 'id_card',
})

Todo lo demás que pongas en la tabla se almacena, pero no se muestra, a menos que la definición del item lo muestre. Usa una label única cuando necesites que los jugadores distingan items de un vistazo.

Busca items

Search encuentra items en un inventario. Con 'count' devuelve cuántos, con 'slots' devuelve los espacios:

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

También puedes filtrar por metadatos. Pasa una tabla como el cuarto argumento:

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

Esta es la forma estándar de verificar la propiedad: hazlo en el servidor, con los datos en los que confías, nunca desde un mensaje del cliente.

Lee un espacio

Si conoces el número de espacio, GetSlot devuelve los datos de ese espacio:

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

Cuando solo conoces el item, usa GetSlotWithItem:

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

Ambos devuelven nil cuando nada coincide, así que verifica el resultado antes de leer slot.metadata. Un espacio también tiene slot.count y slot.weight.

Actualiza metadatos con SetMetadata

Para cambiar un espacio existente, por ejemplo marcar una llave como copiada, o reducir la carga restante en un item, 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) reemplaza los metadatos del espacio con la tabla que das. Copia la tabla existente primero, cambia un campo, y envía la tabla completa de nuevo, de lo contrario borras las otras claves.

Items únicos: IDs, llaves, licencias

Para un item único quieres dos cosas: un item que no se apile, y metadatos que lo identifiquen.

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

Los items con metadatos diferentes no se apilan, así que dos llaves para dos autos siempre toman dos espacios, y stack = false lo hace explícito para items que nunca deberían.

Para leer los datos cuando se usa el item, registra una exportación de servidor en el item:

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)

El argumento event te dice la fase del uso. Los argumentos exactos dependen de tu versión de ox_inventory, así que verifica la documentación para tu versión si la exportación no se llama.

Cosas a tener en cuenta

  • Los metadatos viven en el espacio. Cuando el jugador deja caer o intercambia el item, se mueve con él, y es el item que prueba el derecho a acceder a algo.
  • No pongas secretos en metadatos. Los jugadores no ven claves no listadas, pero las tratan como datos, no como protección.
  • Muchos items con tablas de metadatos grandes hacen que el guardado del inventario sea más lento. Almacena una id y mantén los datos pesados en tu propia tabla de base de datos.
  • Los metadatos establecidos en el cliente no son confiables. Siempre llama a AddItem y SetMetadata desde código del servidor.

Lista de verificación

Síntoma Solución
Dos llaves se fusionan en una pila Tienen metadatos idénticos; añade un campo único como plate
La etiqueta no cambia Pon label dentro de la tabla de metadatos, no en items.lua
Search no encuentra nada Pasa el nombre correcto del item, y el filtro de metadatos como una tabla
SetMetadata borró otros campos Copia los metadatos existentes, cambia una clave, envía la tabla completa
slot.metadata es nil Verifica que el espacio exista y lee metadata solo después de la verificación nil
El jugador editó datos del item Ejecuta AddItem y SetMetadata en el servidor solamente

Respuestas rápidas

¿Qué son los metadatos en ox_inventory?

Una tabla de datos extra almacenada en un espacio de item. Permite que dos items con el mismo nombre difieran, por ejemplo dos llaves para autos diferentes, o una tarjeta de ID para personas diferentes.

¿Cómo muestro texto personalizado en un item?

Establece label, description o image dentro de los metadatos cuando añades el item. ox_inventory muestra eso en lugar del texto predeterminado del item.

¿Los items con metadatos diferentes se apilan?

No. Dos items se apilan solo cuando sus metadatos son iguales, así que los items con metadatos únicos toman un espacio cada uno.

Scripts que evitan este problema

Item Creator V2Crea items usables con animaciones, props, efectos y más — sin escribir código.Ver script →Shop CreatorCrea una tienda en menos de un minuto — dueños, empleados, caja fuerte y atracos.Ver script →

Sigue leyendo