Cómo funcionan las integraciones#
El inventario nunca da por hecho qué framework o script usas. Al arrancar, mira qué está iniciado y se comunica con ello mediante pequeños archivos puente editables en client/custom/ y server/custom/:
Capa | Compatible | Sin ello |
|---|---|---|
Framework |
| Obligatorio: el inventario no puede cargar. |
Target |
| Los puntos se abren con un aviso [E]. |
Apariencia |
| El inventario sigue guardando la ropa puesta. |
Interfaz |
| Barras de progreso y notificaciones de ox_lib, texto 3D nativo. |
Teléfono |
| Con él, las teclas de la hotbar y la rueda rápida se bloquean mientras el teléfono está abierto. |
DNI |
| El inventario rellena los DNI y las licencias con los datos del personaje. |
Muerte (ESX) |
| El inventario sigue sin abrirse para los jugadores muertos, según el estado del jugador. |
Trabajos |
| Sus stashes de trabajo, cajas fuertes y armerías se abren en qs-inventory, y su registro de jugadores usa el del inventario. |
Lanzar · colocar |
| Se usan el lanzamiento y la colocación integrados. Cámbialos en Settings → Interaction. |
Dinero de society |
| Las tiendas no se pueden pagar con Society. Se usa el primero que esté iniciado. |
Cada integración opcional se desactiva sin avisar. Si falta un resource, su función recurre a la del propio inventario, nunca a un error.
Frameworks#
Tema | ESX | QBCore | Qbox |
|---|---|---|---|
Inventarios de jugadores |
|
|
|
Ítems leídos de |
|
|
|
Efectivo | El ítem | El ítem | El ítem |
Dinero negro | El ítem | En su lugar se muestra la cuenta crypto | En su lugar se muestra la cuenta crypto |
Ítems iniciales | Del inventario (más abajo) | Los propios de qb-core | Los propios de qbx_core |
Cuando hay más de un core iniciado — Qbox con su puente de qb-core, por ejemplo — el inventario elige qbx_core primero, luego qb-core, y después es_extended.
En ESX, las cuentas money y black_money siguen a los ítems, así que el efectivo se puede tirar, guardar y robar. En QBCore y Qbox, AddItem, RemoveItem, GetItemBySlot, GetItemByName, GetItemsByName, ClearInventory y SetInventory del objeto del jugador se delegan en el inventario, así que los scripts que los llaman siguen funcionando. qb-inventory y qb-weapons se detienen cuando arrancan.
Cada añadido y retirada también dispara los eventos que escuchan los scripts escritos para otros inventarios: esx:onAddInventoryItem, esx:onRemoveInventoryItem, qb-inventory:server:itemAdded y qb-inventory:server:itemRemoved, con sus versiones de cliente.
Compatibilidad con qb-inventory y ox_inventory#
Muchos scripts llaman directamente a otro inventario. qs-inventory responde esas llamadas por sí mismo, así que siguen funcionando sin cambios:
exports['qb-inventory']: AddItem, RemoveItem, HasItem, CanCarryItem, GetItemBySlot, GetItemByName, GetItemsByName, GetItemTotalAmount, GetSlotsByItem, GetFirstSlotByItem, GetTotalWeight, GetTotalUsedSlots, GetItemLabel, ClearInventory, SetInventory, SetItemData, CreateUsableItem, UseItem, LoadInventory, SaveInventory, OpenInventory (abre un stash), OpenInventoryById (abre otro jugador), RegisterStash, GetStashItems, AddItemIntoStash, RemoveItemIntoStash, CreateShop, OpenShop y las funciones de maletero, guantera y botín. En el cliente, HasItem.
exports.ox_inventory en el servidor: AddItem, RemoveItem, CanCarryItem, GetItem, GetSlot, GetSlotWithItem, GetSlotsWithItem, SetItem, SetMetadata, Search, Items, ClearInventory, GetCurrentWeapon, RegisterStash y RegisterShop, además de GetInventoryItems e Inventory para el propio inventario de un jugador (no para stashes). En el cliente: Search, Items, getCurrentWeapon y openInventory para tiendas y stashes.
Un script que solo comprueba GetResourceState('ox_inventory') no lo verá iniciado. La mejor solución es quitar la dependencia de ox_inventory de ese script; en Qbox, se puede descomentar en su lugar la línea provide 'ox_inventory' de fxmanifest.lua.
Scripts de ropa y apariencia#
El inventario vigila lo que lleva puesto el personaje y convierte cada prenda distinta del atuendo por defecto en su ítem de ropa, así que la ropa comprada en cualquier tienda se convierte en ítems por sí sola. Cuando el inventario se cierra después de que cambie el atuendo, el script de apariencia detectado lo guarda:
Resource | Se guarda con |
|---|---|
|
|
| La skin del jugador en |
|
|
Los menús de ropa deberían pausar esa vigilancia mientras están abiertos, para que probarse ropa no cree ítems:
-- when your clothing menu opens
exports['qs-inventory']:setInClothing(true)
-- when it closes
exports['qs-inventory']:setInClothing(false)La mayoría de los scripts de ropa hechos para qs-inventory ya incluyen estas dos llamadas. Las funciones de guardado están en client/custom/clothing/, un archivo por script.
Vaciar el inventario al morir#
ClearInventory vacía el inventario de un jugador y puede conservar una lista de ítems. Llámalo desde tu script de ambulancia o de muerte, donde se quitan los ítems tras una muerte:
-- server side
local keep = { 'id_card', 'phone' } -- items that are NOT removed
exports['qs-inventory']:ClearInventory(source, keep)Stashes desde otros scripts#
Cualquier resource puede abrir un stash por id; el stash se crea la primera vez que se abre. Desde un script de cliente, RegisterStash abre Stash_<id> al instante:
-- client: id, slots, max weight in grams, label
exports['qs-inventory']:RegisterStash('locker_' .. lockerId, 50, 100000, 'Locker')La forma con evento te da control total sobre el id:
local stashId = 'locker_' .. lockerId
TriggerServerEvent('inventory:server:OpenInventory', 'stash', stashId, { maxweight = 100000, slots = 50 })
TriggerEvent('inventory:client:SetCurrentStash', stashId)Para un stash personal, incluye el identificador del jugador en el id. El servidor puede meter o sacar ítems sin abrirlo con AddItemIntoStash y RemoveItemIntoStash — consulta Comandos y exports.
Tiendas desde otros scripts#
Registra una tienda en el servidor y luego ábrela para un jugador que esté a menos de 5 m de ella:
exports['qs-inventory']:CreateShop({
name = 'police_armory',
label = 'LSPD Armory',
coords = vector3(452.3, -980.0, 30.6),
account = 'bank', -- 'money', 'bank', or 'black_money' / 'crypto'
restock = 30, -- minutes to refill limited items (optional)
items = {
{ name = 'weapon_pistol', price = 2500, amount = 1, stock = 10 }, -- stock: sells out after 10
{ name = 'pistol_ammo', price = 50, amount = 50 },
},
})
exports['qs-inventory']:OpenShop(source, 'police_armory')Un cliente también puede pedir una tienda registrada con TriggerServerEvent('inventory:openShop', 'police_armory'). Las tiendas creadas en el cliente con precios enviados desde el cliente siguen funcionando, salvo que Server-only shops esté activado en Settings → General (avanzado), que solo acepta tiendas creadas con estos exports o en el creador.
Registros policiales#
Abre el inventario de otro jugador desde un script de policía o MDT:
-- client
TriggerServerEvent('inventory:server:OpenInventory', 'otherplayer', targetServerId)El servidor lo permite a los administradores, a los trabajos de Settings → Robbery & police → Police jobs, y a cualquier otro solo bajo las reglas de robo (manos arriba o muerto, cerca). La policía ve la ranura protegida salvo que se desactive.
Ítems iniciales (ESX)#
QBCore y Qbox dan los ítems iniciales por sí mismos. En ESX, lístalos en server/custom/framework/esx.lua:
StarterItems = {
['id_card'] = 1,
['water_bottle'] = 5,
['tosti'] = 5,
['phone'] = 1,
}Después, dispara el evento del inventario una vez creado el personaje — por ejemplo en esx_identity, en el cliente, justo después del registro:
TriggerEvent('inventory:client:GiveStarterItems')Dispáralo solo una vez por personaje nuevo: el DNI y las licencias se rellenan con el nombre, la fecha de nacimiento y el sexo del personaje.
Bidones de gasolina#
El estado del bidón de gasolina sigue el combustible que le queda. Para mantenerlo sincronizado con LegacyFuel o un script similar, busca en ese script la línea que vacía el bidón:
SetPedAmmo(ped, 883325847, math.floor(GetAmmoInPedWeapon(ped, 883325847) - fuelToAdd * 100))y añade esto justo debajo:
TriggerEvent('inventory:client:LegacyFuel', math.floor(GetAmmoInPedWeapon(ped, 883325847)))Logs de Discord#
Pega una URL de webhook para cada canal que quieras en server/custom/webhook/webhook.lua. Uno vacío simplemente no registra nada:
Canal | Qué se envía |
|---|---|
| /giveitem, /giveweapon, la pestaña Give del creador, las importaciones y cada alerta antiduplicación. |
| Intentos bloqueados de hacer trampas en el inventario. |
| Compras en tiendas y ventas a compradores. |
| Ítems metidos o sacados, con el id del inventario. |
| Ítems quitados a un jugador robado o entregados a él. |
| El botón Give, los intercambios de posición dentro del inventario de un jugador y los ítems crafteados en mesas. |
Ejecuta testwebhooks en la consola del servidor para enviar un mensaje de prueba a cada canal configurado; la consola indica cuáles aceptó Discord. Los mensajes se ponen en cola y se envían al ritmo de Discord.
Hooks#
Los hooks permiten que tu resource reaccione a lo que hace el inventario, sin editarlo. Son notificaciones: no pueden cancelar la acción.
Hook | Se dispara | Payload |
|---|---|---|
| Después de cada compra correcta en una tienda. |
|
| Cuando se mueve un ítem dentro de un inventario o entre inventarios, antes de comprobar el movimiento. |
|
exports['qs-inventory']:registerHook('swapItems', function(p)
if p.toType == 'stash' then
print(('%s put something in %s (%s)'):format(p.source, p.toInventory, p.action))
end
end)swapItems se dispara mientras se procesa el movimiento, así que trátalo como "un jugador está moviendo esto" y no como "se ha movido". Un error dentro de tu hook hace que ese movimiento falle, así que mantén los hooks pequeños.
Add-ons incluidos en el paquete#
La descarga incluye seis resources opcionales. Inicia cada uno después de qs-inventory y no les cambies el nombre.
Resource | Qué hace |
|---|---|
| 45 tiendas clásicas en el mapa — 24/7, LTD, Rob's Liquor, ferreterías, Ammu-Nation y tiendas de trabajo — con productos limitados por trabajo, rango, banda o licencia, stashes de trabajo y de banda, y un trabajo de reparto que repone las tiendas. Todo está en su |
| Ítems utilizables |
| Bolsas con su propio almacenamiento: |
| Mostradores donde los jugadores compran su |
| Animaciones de desenfundar y enfundar al sacar o guardar un arma: un desenfundado rápido cuando el personaje lleva una funda, y uno más lento sin ella. Añade tus armas add-on a su lista para que también se animen. |
| Los rifles, SMG y escopetas del inventario se muestran en la espalda del personaje mientras no están en la mano, visibles para todos los jugadores, con sus accesorios y tintes. Diecisiete armas están posicionadas en su config. |
Añadir compatibilidad con otro script#
Todo lo que se comunica con otro resource está en archivos sin cifrar que puedes editar:
Para conectar | Edita |
|---|---|
Notificaciones, barras de progreso, texto 3D, HUD, comprobaciones de muerte, hambre y sed |
|
Cuentas, trabajos, administradores, nombres de jugadores, propiedad de vehículos |
|
Un resource de core o de apariencia renombrado | Las listas de detección de |
Otro script de ropa | Añádelo a la lista de apariencia de |
Otro target |
|
Metadatos de ítems al entregarlos, compras, stashes de otros scripts |
|
Idiomas#
Se incluyen 41 traducciones completas en locales/, que cubren el inventario, sus notificaciones y ambos paneles de administración: ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, he, hi, hr, hu, id, it, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, sw, th, tr, uk, ur, vi y zh. Elige uno en Settings → General → Language, o configura setr qs:locale "es" en server.cfg para todos los resources de Quasar a la vez. Un texto que falte en una traducción recurre al inglés, y todos los archivos se pueden editar.



