Trabajos, bandas e items · Lección 3/3 · 10 min
Items: dar, quitar y hacerlos usables
Los items se definen en shared/items, se mueven en el servidor y se hacen usables con CreateUseableItem.
En QBCore los items existen primero como definición (en qb-core/shared/items.lua) y luego se mueven entre inventarios. Como todo lo sensible, dar y quitar items se hace en el SERVIDOR.
Dar y quitar items
local Player = QBCore.Functions.GetPlayer(source)
-- Dar 1 'water_bottle' (QBCore clásico)
Player.Functions.AddItem('water_bottle', 1)
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['water_bottle'], 'add')
-- Quitar 1
Player.Functions.RemoveItem('water_bottle', 1)
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['water_bottle'], 'remove')Dar / quitar items
Si tu servidor usa qb-inventory moderno o ox_inventory, se hace con exports (exports['qb-inventory']:AddItem(src, item, amount) o exports.ox_inventory:AddItem(src, item, amount)). Mira qué inventario monta tu servidor; el concepto (servidor decide) es el mismo.
Hacer un item usable
-- Cuando el jugador USA el item desde el inventario
QBCore.Functions.CreateUseableItem('water_bottle', function(source, item)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
Player.Functions.RemoveItem('water_bottle', 1)
Player.Functions.SetMetaData('thirst', math.min(100, Player.PlayerData.metadata['thirst'] + 25))
QBCore.Functions.Notify(source, 'Te has bebido el agua', 'success')
end)CreateUseableItem
CreateUseableItem registra qué pasa al USAR el item. El item debe existir en shared/items.lua y tener useable = true. La lógica (consumir, dar efecto) va en el servidor.
Practica lo aprendido
0/3¿Con qué función le das 1 unidad de 'water' a un jugador en QBCore clásico?
Completa para hacer que el item 'water' sea usable desde el inventario.
QBCore.Functions.('water', function(source, item) local Player = QBCore.Functions.GetPlayer(source) if not Player then return end Player.Functions.RemoveItem('water', 1)end)Pista
Registra qué pasa al USAR el item; el item debe existir en shared/items.lua con useable = true.
Al dar el item no se avisa al inventario del cliente, así que no aparece la cajita (ItemBox). Añade el TriggerClientEvent que la muestra.
Este código tiene un fallo:
local Player = QBCore.Functions.GetPlayer(source)if not Player then return endPlayer.Functions.AddItem('water', 1)-- falta avisar al clienteReescríbelo corregido:
Pista
El evento es 'inventory:client:ItemBox' y le pasas source, la info del item de QBCore.Shared.Items y 'add'.
Reto: prográmalo tú
Haz que un item 'sandwich' al usarse suba el hambre 30 puntos y se consuma (RemoveItem).
Escríbelo tú en tu editor (VS Code) y pruébalo en tu servidor. Aquí se aprende haciéndolo, no copiando.
Ver pista
RemoveItem('sandwich',1) + SetMetaData('hunger', math.min(100, actual+30)).
Escribe aquí tu solución:
