Comandos de jugador#
Cada comando de jugador es una asignación de teclas de FiveM, así que los jugadores pueden cambiarlas en GTA, en Settings → Key Bindings → FiveM o en el propio inventario, en Settings → Keys. Las teclas iniciales se configuran en /inventoryconfig → Key binds.
Comando | Tecla | Descripción |
|---|---|---|
|
| Abre o cierra el inventario, junto con la guantera, el maletero, la bolsa, el contenedor o la máquina expendedora donde estés. |
|
| Muestra u oculta la barra de ranuras rápidas. En modo rueda, mantener la misma tecla ( |
|
| Usa la ranura rápida 1–5; |
|
| Recarga el arma que tienes en la mano con un ítem de munición compatible. |
|
| Levanta o baja las manos, lo que permite que jugadores armados te roben. Solo con Hands up activado. |
|
| Lanza el arma que tienes en la mano. Solo con el lanzamiento activado. |
|
| Abre el menú de pausa del inventario. ESC solo se asigna mientras Replace the GTA pause menu esté activado. |
| — | Registra al jugador más cercano a menos de 2.5 m que tenga las manos arriba o esté muerto. Los trabajos de policía omiten la regla de las manos arriba. |
|
| Detiene y guarda, guarda o descarta un clip de Rockstar Editor iniciado desde el menú de pausa. |
| — | Se escribe en F8. Indica si el mapa de pausa está leyendo los nombres de lugares del juego y, si no, por qué; |
Comandos de administración y de consola#
Los comandos de administración están disponibles para ESX admin / superadmin, QBCore y Qbox god / admin y la consola del servidor. Los dos paneles también aceptan su propio ace — consulta Obtener acceso de administrador.
Comando | Descripción |
|---|---|
| Abre el creador. Ace |
| Abre la configuración. Ace |
| Da un ítem a un jugador. Los documentos de identidad y las licencias se rellenan con los datos de ese jugador. Para armas usa |
| Da un arma con número de serie y hasta 1,000 balas. |
| Vacía el inventario de un jugador — el tuyo si no indicas un id. |
| Abre el inventario de otro jugador, esté donde esté. |
| Establece la calidad (0–100) del arma que tienes en tus manos. También requiere el ace |
| Desbloquea un contenedor que se quedó marcado como en uso. Sus ítems se conservan. |
| Da XP a un jugador y le sube de nivel si es suficiente. |
| Da a un personaje peso de carga extra además del peso base y del árbol de habilidades, guardado por personaje. Sin kg muestra el valor actual; 0 lo elimina. |
| Pruebas: diez ítems aleatorios, o una ganzúa con metadatos de ejemplo, para ti. |
| Solo consola. Envía una prueba a cada webhook de Discord e indica cuáles respondieron. |
Exports de cliente#
Para tus propios scripts de cliente — un HUD que se oculta mientras el inventario está abierto, un trabajo que abre un stash, un minijuego que necesita un ítem.
La ventana del inventario
local open = exports['qs-inventory']:inInventory() -- is it open?
exports['qs-inventory']:closeInventory()
-- Block the inventory, the hotbar and the slot keys (a cutscene, handcuffs...)
exports['qs-inventory']:setInventoryDisabled(true)
local blocked = exports['qs-inventory']:CheckIfInventoryBlocked()
-- Give GTA's weapon wheel back while your script needs it
exports['qs-inventory']:WeaponWheel(true)
-- Open the pause menu on its Information page
exports['qs-inventory']:OpenPauseMenu()
-- Fired on every open (true) and close (false)
AddEventHandler('inventory:setFocus', function(focused) end)Ítems que lleva el jugador
-- A name, a list of names, or { name = amount }
local hasKit = exports['qs-inventory']:HasItem('weapon_repairkit')
local hasAll = exports['qs-inventory']:HasItem({ lockpick = 1, screwdriver = 1 })
local items = exports['qs-inventory']:getUserInventory() -- slot -> item
local itemList = exports['qs-inventory']:GetItemList()
-- ox_inventory style: a count, or the slots holding it
local count = exports['qs-inventory']:Search('count', 'water_bottle')
local slots = exports['qs-inventory']:Search('slots', 'water_bottle')
-- Refreshed after every change
AddEventHandler('inventory:client:inventoryCacheUpdated', function() end)La misma tabla de ranuras se refleja en LocalPlayer.state.inventory.
Abrir un stash desde el cliente
-- Opens the stash 'Stash_police_locker' with 50 slots and 100 kg
exports['qs-inventory']:RegisterStash('police_locker', 50, 100000, 'Police locker')
-- Or any id, with the server event
TriggerServerEvent('inventory:server:OpenInventory', 'stash', 'gang_safe', { maxweight = 200000, slots = 60 })
TriggerEvent('inventory:client:SetCurrentStash', 'gang_safe') -- so closing saves itLos pesos van en gramos. Los stashes colocados en el juego conviene crearlos en el creador, que también gestiona el acceso por trabajo y banda.
Armas, blips y apariencia
local weapon = exports['qs-inventory']:GetCurrentWeapon() -- the item in hand: name, info (serie, ammo, quality, attachments)
local name = exports['qs-inventory']:getCurrentWeapon() -- just the name, lowercase
-- Name your blips on the pause-menu map
exports['qs-inventory']:SetBlipName(blip, 'Weed farm')
local colors = exports['qs-inventory']:getColors() -- the player's interface coloursExports de servidor#
Cómo otro recurso controla el inventario — una recompensa de trabajo, un atraco, un script de crafteo, una tienda propia.
Añadir y quitar ítems
-- AddItem(source, item, amount, slot, info)
local ok = exports['qs-inventory']:AddItem(source, 'water_bottle', 5)
if ok == true then
-- added
end
-- With metadata: whatever you put in info travels with the item
exports['qs-inventory']:AddItem(source, 'id_card', 1, nil, {
firstname = 'John',
lastname = 'Doe',
})
-- RemoveItem(source, item, amount, slot)
exports['qs-inventory']:RemoveItem(source, 'lockpick', 1)
-- Check before you give
local canCarry = exports['qs-inventory']:CanCarryItem(source, 'goldbar', 10)
local fits, reason = exports['qs-inventory']:CanCarryItems(source, { { name = 'goldbar', amount = 10 } })Compara el resultado de AddItem con == true: un rechazo por peso o por un límite de carga no devuelve nada en lugar de false. Las armas reciben un número de serie y calidad completa por sí solas, y cada ítem recibe una calidad de 100 salvo que pases una. Cada adición se registra en la pestaña Stats del creador con el nombre de tu recurso.
Leer los ítems de un jugador
local has = exports['qs-inventory']:HasItem(source, 'lockpick') -- or a list, or { name = amount }
local total = exports['qs-inventory']:GetItemTotalAmount(source, 'water_bottle')
local item = exports['qs-inventory']:GetItemByName(source, 'phone') -- first match
local list = exports['qs-inventory']:GetItemsByName(source, 'phone') -- every match
local inSlot = exports['qs-inventory']:GetItemBySlot(source, 3)
local all = exports['qs-inventory']:GetInventory(source) -- slot -> item
local used, weight = exports['qs-inventory']:GetTotalUsedSlots(source)
local maxWeight = exports['qs-inventory']:GetPlayerMaxWeight(source) -- carry skills included
local label = exports['qs-inventory']:GetItemLabel('water_bottle')
local items = exports['qs-inventory']:GetItemList()Cambiar ítems e inventarios
-- Replace the metadata of the item in a slot
exports['qs-inventory']:SetItemMetadata(source, slot, { quality = 50, label = 'Old phone' })
-- Empty an inventory, keeping some items or whole sections
exports['qs-inventory']:ClearInventory(source, { 'id_card', 'phone' })
exports['qs-inventory']:ClearInventoryKeepSections(source, { 'wallet', 'hotbar' })
-- Change an item definition live, for every player
exports['qs-inventory']:UpdateItem('water_bottle', newDefinition)
local serial = exports['qs-inventory']:CreateSerialNumber()
local plate = exports['qs-inventory']:GeneratePlate()Ítems usables
exports['qs-inventory']:CreateUsableItem('energy_drink', function(source, item)
-- item.name, item.slot, item.info...
exports['qs-inventory']:RemoveItem(source, 'energy_drink', 1, item.slot)
end)
-- Fired whenever any item is used
AddEventHandler('inventory:usedItem', function(itemName, source, itemData) end)En QBCore se registra mediante los ítems usables propios de QBCore; en ESX también se detectan los ítems que tus otros scripts registraron con ESX. El ítem debe estar marcado como useable.
Abrir inventarios y tiendas
-- OpenInventory(name, id, other, source)
exports['qs-inventory']:OpenInventory('stash', 'gang_safe', { maxweight = 200000, slots = 60, label = 'Gang safe' }, source)
exports['qs-inventory']:OpenInventory('otherplayer', targetId, nil, source)
-- A shop of your own, opened as the inventory's Shop page
exports['qs-inventory']:CreateShop({
name = 'mechanic_parts',
label = 'Mechanic Parts',
coords = vector3(-347.0, -133.0, 39.0), -- the player must be within 5 m
account = 'money', -- money, bank, black_money / crypto
restock = 60, -- minutes, for items with stock
items = {
{ name = 'repairkit', price = 250, amount = 1, stock = 20, category = 'Tools' },
{ name = 'tirekit', price = 120 },
},
})
exports['qs-inventory']:OpenShop(source, 'mechanic_parts')OpenInventory es de confianza: omite las comprobaciones de distancia y de robo, así que llámalo solo después de las tuyas. Una tienda también puede llevar locations, un ítem license, categories y groups (los trabajos permitidos, cada uno con el rango que un jugador debe superar); cada producto puede llevar jobs, license y attachments. Los scripts también pueden disparar inventory:openShop con el nombre de la tienda desde el cliente.
Stashes, maleteros y guanteras
local items = exports['qs-inventory']:GetStashItems('gang_safe')
exports['qs-inventory']:AddItemIntoStash('gang_safe', 'goldbar', 5)
exports['qs-inventory']:RemoveItemIntoStash('gang_safe', 'goldbar', 2)
local fits = exports['qs-inventory']:StashCanCarryItem('gang_safe', 'goldbar', 5, 60, 200000)
-- 'stash', 'trunk' or 'glovebox'
local trunk = exports['qs-inventory']:GetOtherInventoryItems('trunk', plate)
exports['qs-inventory']:ClearOtherInventory('glovebox', plate)
-- A plate change keeps the trunk and glovebox
exports['qs-inventory']:UpdateVehiclePlate(oldPlate, newPlate)Los stashes abiertos con RegisterStash se guardan como Stash_<id> — usa ese id completo con estos exports.
XP, niveles y misiones
local skill = exports['qs-inventory']:GetSkill(source) -- { level = 4, xp = 120 }
exports['qs-inventory']:AddExperience(source, 250) -- call it from a thread
-- Progress a mission of type From another script (adds, capped at 100)
exports['qs-inventory']:UpdateQuestProgress(source, 'deliver_packages', 20)
AddEventHandler('inventory:updateLevel', function(source, level) end)
AddEventHandler('inventory:questFinished', function(source, questName) end)El formulario de misiones del creador muestra la línea UpdateQuestProgress exacta de cada misión por script, lista para copiar.
Armas, registros del creador y datos del jugador
local weapon = exports['qs-inventory']:GetCurrentWeapon(source) -- the weapon item in that player's hands
local shops = exports['qs-inventory']:GetCreatorRecords('shop') -- stash, shop, crafting, seller, item, weapon
local trading = exports['qs-inventory']:IsPlayerTrading(source)
-- A small key/value store per player, kept by the inventory
local data = exports['qs-inventory']:GetMetaData(identifier)
exports['qs-inventory']:SetMetaData(identifier, { armor = 50 })
AddEventHandler('inventory:addAttachment', function(source, item, component, kind, tint) end)
AddEventHandler('weapons:weaponRepaired', function(source, weaponName, label, ammotype) end)Peso de carga extra
-- Grams, by server id or identifier. Added on top of the base weight and the skill tree.
exports['qs-inventory']:SetPlayerExtraWeight(source, 20000) -- 20 kg more (0 removes it)
exports['qs-inventory']:AddPlayerExtraWeight(source, 5000) -- 5 kg more than now (negative takes away)
local grams = exports['qs-inventory']:GetPlayerExtraWeight(source)Set y Add devuelven ok, total. El valor se guarda en qs_inventory_extra_weight (se crea automáticamente) y llega al instante a un jugador conectado.
Ítems contenedor
-- Opens a container item the player carries, as using it would (item = the item from their inventory)
exports['qs-inventory']:OpenContainer(source, item)
-- Saves and closes the one they have open; true also tells their interface
exports['qs-inventory']:CloseContainer(source, true)Qué ítems son contenedores, sus ranuras, peso y contenido inicial se configuran en /inventoryconfig → Item rules → Containers, y cada uno de ellos se puede usar por sí solo: estos exports son solo para scripts que abren o cierran uno por su cuenta.
Tiendas pagadas por una society
-- The buyer's job society pays, and only that job can buy here
exports['qs-inventory']:CreateShop({
name = 'mechanic_parts',
label = 'Mechanic Parts',
coords = vector3(-347.0, -133.0, 39.0),
account = 'society',
society = 'mechanic',
-- or several jobs, each from a minimum grade:
-- jobs = { { name = 'mechanic', grade = 0 }, { name = 'tuner', grade = 2 } },
items = {
{ name = 'repairkit', price = 250 },
},
})El dinero sale de la cuenta del trabajo en esx_society, qb-banking, Renewed-Banking o qb-management, el que esté en ejecución. Nadie puede pagar en una tienda de society sin trabajo configurado.
Hooks#
Un hook ejecuta tu función cuando ocurre algo en el inventario. El que se dispara hoy es buyItem, tras cada compra correcta en una tienda — dinero cobrado, ítem entregado:
exports['qs-inventory']:registerHook('buyItem', function(payload)
-- payload.source, payload.itemName, payload.amount
-- payload.info / payload.metadata (the item's metadata)
-- payload.externalMeta.shopType (the shop it came from)
end)
-- When your resource stops, remove it yourself
AddEventHandler('onResourceStop', function(res)
if res == GetCurrentResourceName() then
exports['qs-inventory']:unregisterHook('buyItem')
end
end)Cada recurso tiene una función por hook; registrarla de nuevo la reemplaza. La compra ya se ha realizado cuando se ejecuta el hook, así que no puede cancelarla — mantenla breve y sin errores.
Definiciones de ítems#
Los ítems creados en el creador no necesitan código. Para listas guardadas en shared/items.lua (ESX y Qbox) o qb-core/shared/items.lua (QBCore), este es el formato, tomado del sándwich de queso a la plancha incluido:
['tosti'] = {
['name'] = 'tosti',
['label'] = 'Grilled Cheese Sandwich',
['weight'] = 200, -- grams
['type'] = 'item', -- or 'weapon'
['image'] = 'tosti.png',
['unique'] = false, -- true: one per slot
['useable'] = true,
['shouldClose'] = true, -- close the inventory on use
['description'] = 'Nice to eat',
['decay'] = 0.07, -- days from 100% to 0%
['delete'] = false, -- remove it when broken
['object'] = 'prop_sandwich_01', -- prop on the ground and when thrown
['disableThrow'] = true,
['client'] = {
status = { hunger = 200000 },
usetime = 2500,
anim = { dict = 'mp_player_inteat@burger', clip = 'mp_player_int_eat_burger_fp' },
prop = { model = 'prop_cs_burger_01', pos = vec3(0.02, 0.02, -0.02), rot = vec3(0.0, 0.0, 0.0) },
disable = { move = true, car = true, mouse = false, combat = true },
removeAfterUse = true,
},
},Campo opcional | Qué hace |
|---|---|
|
|
|
|
| Una lista de trabajos que pueden usarlo. |
|
|
| El nivel de jugador necesario para usarlo (con la página Missions activada). |
|
|
|
|
Un arma necesita un ítem de type = 'weapon' con su ammotype (AMMO_PISTOL, AMMO_RIFLE…), y una entrada en la lista de armas:
-- shared/weapons.lua
[`weapon_pistol`] = {
['name'] = 'weapon_pistol',
['label'] = 'Pistol',
['weapontype'] = 'Pistol',
['ammotype'] = 'AMMO_PISTOL',
['damagereason'] = 'Pistoled / Blasted / Plugged / Bust a cap in',
},El prefijo de los eventos. Los eventos escritos aquí como
inventory:…usan el prefijo por defecto. Si un desarrollador cambió Event prefix en la configuración avanzada, los eventosinventory:server:…yinventory:client:…cambian con él — por eso debería quedarse eninventory.



