Almacenes en ox_inventory: RegisterStash, openInventory y almacenes de trabajo

Cómo crear almacenes en ox_inventory: registra uno en el servidor, abrelo desde el cliente u ox_target, hazlo personal por jugador, o bloquéalo a un trabajo.

Necesitas un lugar para almacenar cosas: un casillero de pruebas de policía, un armario personal, una caja fuerte en una casa. Con ox_inventory esto es un almacén: un inventario nombrado con sus propios espacios y límite de peso, almacenado en la base de datos. Este artículo cubre registrar un almacén en el servidor, abrirlo desde el cliente, hacerlo personal, restringirlo a un trabajo, y adjuntarlo a una zona de ox_target.

Registra el almacén en el servidor

Un almacén debe existir en el servidor antes de que alguien lo abra. Regístralo una vez, cuando tu recurso se inicia:

lua
-- server.lua
exports.ox_inventory:RegisterStash('police_evidence', 'Evidence locker', 100, 500000, false)

Los argumentos, en orden:

Argumento Significado
id Cadena única. Se usa para abrir el almacén y como su clave en la base de datos
label Nombre mostrado en la parte superior del almacén
slots Número de espacios
maxWeight Límite de peso, en gramos (500000 es 500 kg)
owner false para un almacén compartido, true para uno por jugador, o un identificador fijo
groups Tabla opcional de trabajos permitidos para abrirlo
coords Posición opcional en la que el jugador debe estar cerca

Solo los primeros cuatro son requeridos. El contenido es guardado por ox_inventory, así que sobrevive reinicios de tu script y del servidor.

Cuidado: la id es la identidad del almacén. Si cambias 'police_evidence' a otra cadena más tarde, el contenido antiguo permanece en la base de datos bajo la id antigua y el nuevo almacén se inicia vacío.

Abrelo desde el cliente

En el cliente, abre el almacén con la exportación y la misma id:

lua
-- client.lua
exports.ox_inventory:openInventory('stash', 'police_evidence')

El servidor verifica groups y coords cuando la solicitud llega, así que el cliente no puede saltarlas. Si la id del almacén nunca fue registrada, nada se abre.

También puedes abrir un almacén para un jugador desde el servidor, por ejemplo desde un comando o un evento que ya validaste:

lua
exports.ox_inventory:forceOpenInventory(source, 'stash', 'police_evidence')

Almacenes personales: owner = true

Para un armario o un casillero donde cada jugador tiene su propio contenido, usa owner = true:

lua
exports.ox_inventory:RegisterStash('personal_locker', 'Personal locker', 50, 100000, true)

La id del almacén es la misma para todos, pero ox_inventory adjunta el identificador del jugador a ella, así que cada jugador obtiene un inventario separado. En ESX eso es la licencia o identificador del personaje, en QBox y QBCore la id del ciudadano.

También puedes pasar un propietario fijo, que es útil para una casa donde solo el propietario y las personas que decidas pueden verla:

lua
local identifier = 'char1:abc123'
exports.ox_inventory:RegisterStash('house_' .. identifier, 'House storage', 80, 200000, identifier)

Cuando el owner es una cadena, cualquiera que abra ese almacén está adjunto a ese propietario, así que la verificación de acceso debe ocurrir en tu propio código de servidor antes de que lo abras.

Almacenes de trabajo: groups

groups es una tabla de nombres de trabajo, cada uno con el grado mínimo:

lua
exports.ox_inventory:RegisterStash(
    'police_armory',
    'Police armory',
    80,
    300000,
    false,
    { police = 0, sheriff = 2 }
)

Un jugador con el trabajo de police en grado 0 o superior puede abrirlo, y un sheriff solo desde grado 2. Todos los demás son rechazados por el servidor. Esto funciona con trabajos de ESX, trabajos de QBCore y trabajos de QBox, porque ox_inventory los lee desde el framework.

Para también requerir que el jugador esté parado en el almacén, pasa coords como último argumento:

lua
exports.ox_inventory:RegisterStash(
    'police_armory', 'Police armory', 80, 300000, false,
    { police = 0 }, vec3(452.1, -980.2, 30.7)
)

Abrelo con ox_target

Un almacén generalmente se abre desde un lugar en el mundo. Con ox_target, añade una zona que llama la exportación:

lua
exports.ox_target:addSphereZone({
    coords = vec3(452.1, -980.2, 30.7),
    radius = 1.0,
    options = {
        {
            name = 'open_police_armory',
            icon = 'fa-solid fa-box-archive',
            label = 'Open armory',
            groups = { police = 0 },
            onSelect = function()
                exports.ox_inventory:openInventory('stash', 'police_armory')
            end,
        },
    },
})

El groups aquí solo oculta la opción, que es una conveniencia. La verificación real es la que está en RegisterStash. Para zonas en general, véase adding an ox_target zone.

Almacenes definidos en un archivo

Si no quieres escribir código, ox_inventory lee almacenes de data/stashes.lua. Cada entrada tiene un nombre, una etiqueta, espacios, peso, owner y groups opcionales, y una ubicación. Mira las entradas de ejemplo en ese archivo en tu versión, copia una, e reinicia ox_inventory. Usa el registro de código cuando un almacén es creado por otro recurso, como un script de vivienda.

Consejo: para verificar si un almacén funciona, ábrelo, pon un item dentro, reinicia tu recurso, y ábrelo de nuevo. Si el item sigue ahí, la id coincide y el contenido se guardó.

Lista de verificación

Síntoma Solución
El almacén no se abre Registralo en el servidor primero, con la id exacta
El almacén está vacío después de que lo renombres La id cambió; el contenido antiguo está bajo la id antigua
Todos comparten el mismo almacén personal Registra con owner = true
Un jugador sin el trabajo lo abre Añade groups = { jobname = grade } en RegisterStash
Se abre desde cualquier lugar Pasa coords como último argumento
Necesito items para añadir Véase adding items to ox_inventory

Respuestas rápidas

¿Cuál es la diferencia entre un almacén y un inventario de jugador en ox_inventory?

Un almacén es un almacenamiento separado con sus propios espacios y límite de peso, identificado por una id de cadena. Pertenece al mundo, a un trabajo o a un único jugador dependiendo del owner y groups que le des.

¿Cómo hago un almacén que sea privado para cada jugador?

Registralo con owner establecido en true. ox_inventory luego mantiene una copia separada del almacén por jugador, así que dos jugadores que abren la misma id de almacén ven contenidos diferentes.

¿Por qué mi almacén se abre vacío o no se abre en absoluto?

El almacén no fue registrado en el servidor, la id difiere entre la llamada de registro y la llamada de apertura, o el jugador carece del trabajo requerido o está muy lejos de coords.

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