Tiendas en ox_inventory: data/shops.lua, RegisterShop y blips

Cómo crear una tienda en ox_inventory: la entrada en data/shops.lua, precios y moneda, ubicaciones y objetivos, tiendas bloqueadas por trabajo, RegisterShop desde otro recurso, y blips.

Una tienda en ox_inventory es una lista de items con precios, y uno o más lugares donde los jugadores pueden abrirla. Puedes editar un archivo, o registrar la tienda desde tu propio recurso. Este artículo cubre ambos, más precios, monedas, restricciones de trabajo, ox_target y blips.

La entrada de tienda en data/shops.lua

Abre ox_inventory/data/shops.lua. Cada tienda es una tabla con clave su tipo de tienda:

lua
return {
    General = {
        name = 'Shop',
        inventory = {
            { name = 'burger', price = 10 },
            { name = 'water', price = 5, count = 50 },
            { name = 'lockpick', price = 150 },
        },
        locations = {
            vec3(25.7, -1347.3, 29.5),
        },
    },
}

La clave (General) es el tipo de tienda. Los campos:

Campo Significado
name Título mostrado en la parte superior de la tienda
inventory Los items a la venta
locations Coordenadas donde los jugadores pueden abrir la tienda
targets Misma idea, pero con cajas de ox_target (véase a continuación)
groups Trabajos permitidos para usar la tienda
blip Configuración del blip del mapa

Verifica las entradas predeterminadas en tu copia del archivo: muestran los campos exactos que tu versión soporta, y la mejor manera de comenzar es copiar uno y cambiarlo.

Cuidado: cada nombre de item en inventory debe existir en data/items.lua. Una tienda que lista un item faltante puede no abrir o imprimir errores. Véase adding items to ox_inventory.

Items, precios y moneda

Cada línea de inventory es una pequeña tabla:

lua
inventory = {
    { name = 'water', price = 5 },
    { name = 'sandwich', price = 12, count = 20 },
    { name = 'lockpick', price = 150, currency = 'black_money' },
    { name = 'WEAPON_PISTOL', price = 2500, license = 'weapon' },
},
  • price es lo que cuesta una unidad.
  • count es el stock. Sin él el item es ilimitado, y con él el stock baja según los jugadores compran.
  • currency es el item que lo paga. Por defecto es dinero, y black_money es una alternativa común.
  • license pide un item de licencia antes de que el jugador pueda comprar.
  • grade restringe un item a un grado de trabajo mínimo, cuando la tienda usa groups.

Abriendo: ubicaciones y objetivos

Con locations, ox_inventory muestra una interacción en esas coordenadas. Con targets, crea cajas de ox_target en su lugar, que es mejor para un mostrador o una ventana:

lua
targets = {
    {
        loc = vec3(25.7, -1347.3, 29.5),
        length = 0.7,
        width = 0.5,
        heading = 0.0,
        minZ = 29.0,
        maxZ = 31.0,
        distance = 1.5,
    },
},

ox_target debe estar ejecutándose para que esto funcione, ya que la tienda depende de él. Si solo quieres una de las dos formas, elimina la otra tabla.

Tiendas bloqueadas por trabajo y blips

Restringe una tienda a un trabajo con groups, usando nombres de trabajo y grados mínimos:

lua
Police = {
    name = 'Police armory',
    groups = { police = 0 },
    inventory = {
        { name = 'WEAPON_STUNGUN', price = 0 },
        { name = 'ammo-9', price = 0, count = 200 },
    },
    locations = { vec3(480.2, -996.5, 30.7) },
},

Para un blip del mapa, añade una tabla blip a la tienda:

lua
blip = { id = 59, colour = 69, scale = 0.8 },

id es el número de sprite y colour el número de color. Los números vienen de las listas de blips de GTA, y la misma idea se explica en creating blips in FiveM. Reinicia ox_inventory para aplicar cambios de archivo.

Registra una tienda desde otro recurso

Cuando una tienda es creada por tu propio script, por ejemplo por un negocio o un recurso de trabajo, no edites data/shops.lua. Registrala en el servidor:

lua
-- server.lua of your resource
exports.ox_inventory:RegisterShop('Bakery', {
    name = 'Bakery',
    inventory = {
        { name = 'bread', price = 4 },
        { name = 'croissant', price = 6, count = 30 },
    },
    locations = {
        vec3(-1285.7, -1127.1, 6.8),
    },
})

RegisterShop(type, data) toma la cadena de tipo y la misma tabla que en el archivo. Registrala cuando se inicia el recurso. Si ox_inventory se reinicia, tu recurso debe registrar la tienda de nuevo, así que registra en onServerResourceStart también para ox_inventory:

lua
AddEventHandler('onServerResourceStart', function(resource)
    if resource == 'ox_inventory' then
        registerMyShops()
    end
end)

Abre una tienda desde el cliente

Si no quieres una ubicación o un objetivo en la tienda, o quieres abrirla desde tu propia interfaz, usa la exportación del cliente:

lua
exports.ox_inventory:openInventory('shop', { type = 'General', id = 1 })

type es la clave de tienda. id es la posición de la ubicación en la lista locations (o targets), comenzando en 1. Si una tienda tiene una ubicación, usa id = 1. Una tienda sin ubicaciones que fue registrada por código se abre con su tipo solamente, así que prueba tu versión si se necesita id.

Consejo: el servidor sigue verificando la tienda cuando la abres, así que un cliente no puede comprar desde una tienda de trabajo que no tiene trabajo para.

Crear tiendas sin editar código

Si configuras muchas tiendas, editar Lua se vuelve repetitivo. Shop Creator te permite crear tiendas en el juego.

Shop CreatorCrea una tienda en menos de un minuto — dueños, empleados, caja fuerte y atracos.desde 24,20 €Ver el script →

Lista de verificación

Síntoma Solución
La tienda no aparece Reinicia ox_inventory después de editar data/shops.lua
La tienda se abre vacía o con errores Un item en inventory falta en data/items.lua
No puedo interactuar con la tienda Verifica locations o targets, y que ox_target se está ejecutando
Moneda incorrecta Establece currency en la entrada del item
Tienda de trabajo abierta para todos Añade groups = { job = grade }
Tienda registrada perdida después del reinicio Llama a RegisterShop de nuevo cuando se inicia ox_inventory

Respuestas rápidas

¿Dónde añado una tienda en ox_inventory?

En ox_inventory/data/shops.lua, como una nueva entrada con un nombre, una lista de inventory y una o más locations o targets. Reinicia ox_inventory después.

¿Puede una tienda tomar dinero negro en lugar de efectivo?

Sí. Establece currency = 'black_money' en la entrada del item, y la tienda cobra ese item en lugar del dinero predeterminado.

¿Cómo creo una tienda desde mi propio script?

Llama a exports.ox_inventory:RegisterShop(type, data) en el servidor, luego abrela desde el cliente con exports.ox_inventory:openInventory('shop', { type = type }).

Scripts que evitan este problema

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

Sigue leyendo