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

lua
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

lua
-- 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
Test

¿Con qué función le das 1 unidad de 'water' a un jugador en QBCore clásico?

Rellena los huecos

Completa para hacer que el item 'water' sea usable desde el inventario.

1QBCore.Functions.('water', function(source, item)
2 local Player = QBCore.Functions.GetPlayer(source)
3 if not Player then return end
4 Player.Functions.RemoveItem('water', 1)
5end)
Pista

Registra qué pasa al USAR el item; el item debe existir en shared/items.lua con useable = true.

Corrige el error

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:

1local Player = QBCore.Functions.GetPlayer(source)
2if not Player then return end
3Player.Functions.AddItem('water', 1)
4-- falta avisar al cliente

Reescrí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:

¿Qué tal esta lección?