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

