QBCore items usáveis: CreateUseableItem, AddItem e RemoveItem

Torne um item usável em QBCore com CreateUseableItem, dê e remova com Player.Functions.AddItem e RemoveItem, mostre a caixa de item, e o que muda em QBox.

Em QBCore, um item usável é uma função de server registrada sob um nome de item. Quando o jogador usa o item no inventory, a função roda. Este artigo cobre o registro, as funções que dão, removem e checam items, a notificação de caixa de item, e o que é diferente em QBox.

O item deve existir primeiro

Items de QBCore são definidos em qb-core/shared/items.lua. Um item que é usável precisa de useable = true:

lua
['burger'] = {
    name = 'burger',
    label = 'Burger',
    weight = 200,
    type = 'item',
    image = 'burger.png',
    unique = false,
    useable = true,
    shouldClose = true,
    description = 'A warm burger.',
},

A chave e o name devem ser iguais. O image é um arquivo na pasta de imagens do seu inventory. Para o formato completo de item, veja adding items on QBCore.

Registre o item usável

No server, em seu script:

lua
local QBCore = exports['qb-core']:GetCoreObject()

QBCore.Functions.CreateUseableItem('burger', function(source, item)
    local Player = QBCore.Functions.GetPlayer(source)
    if not Player then return end

    if Player.Functions.RemoveItem('burger', 1) then
        TriggerClientEvent('my_script:eatBurger', source)
    end
end)

O callback recebe o id do jogador e os dados do item. Não remove o item, então você o remove você mesmo e apenas roda o efeito se a remoção funcionou. Se QBCore é nil aqui, veja the GetCoreObject fix.

O evento do cliente apenas toca o efeito:

lua
RegisterNetEvent('my_script:eatBurger', function()
    -- animation, progress bar, hunger update
end)

Adicione, remova e cheque items

Essas são as funções do jogador que você usa o tempo todo, no server:

lua
local Player = QBCore.Functions.GetPlayer(source)

-- give
Player.Functions.AddItem('burger', 2)

-- remove
Player.Functions.RemoveItem('burger', 1)

-- check
local item = Player.Functions.GetItemByName('burger')
if item and item.amount >= 1 then
    -- the player has at least one
end

AddItem e RemoveItem retornam true quando funcionam e false quando não, por exemplo porque o inventory está cheio ou o item está faltando. Sempre cheque o resultado antes de continuar:

lua
if Player.Functions.AddItem('lockpick', 1) then
    -- reward given
else
    TriggerClientEvent('QBCore:Notify', source, 'Your inventory is full', 'error')
end

AddItem também pega argumentos opcionais slot e info, onde info carrega dados extras no item, como um número de série.

A caixa de item

Quando o jogador ganha ou perde um item, o inventory usualmente mostra uma pequena caixa com a picture do item. Em qb-inventory você a dispara com um evento do cliente:

lua
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['burger'], 'add', 2)
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['burger'], 'remove', 1)

O nome do evento e argumentos podem diferir entre versões do inventory, e algumas versões mostram a caixa por conta própria dentro de AddItem. Olhe como um script existente em seu server a chama, e copie. Chamá-la em cima de uma caixa automática mostra a notificação duas vezes.

Dica: faça o efeito apenas após RemoveItem retornar true. Um script que toca a animação primeiro e remove o item depois dá hambúrgueres grátis aos jogadores quando a remoção falha.

Um exemplo: craft um item de outro

lua
RegisterNetEvent('my_script:makeBandage', function()
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

    local cloth = Player.Functions.GetItemByName('cloth')
    if not cloth or cloth.amount < 2 then
        return TriggerClientEvent('QBCore:Notify', src, 'You need 2 cloth', 'error')
    end

    if Player.Functions.RemoveItem('cloth', 2) then
        if not Player.Functions.AddItem('bandage', 1) then
            Player.Functions.AddItem('cloth', 2) -- give the cloth back
        end
    end
end)

Todos os checks rodam no server. Para mais sobre aquela ideia, veja securing server events.

Em QBox

O core de QBox é qbx_core. O registro de item usável tem seu próprio export:

lua
exports.qbx_core:CreateUseableItem('burger', function(source, item)
    -- same idea: remove the item, then trigger the effect
end)

Servers QBox usam ox_inventory, então você tem uma segunda opção: coloque o efeito no próprio item, em ox_inventory/data/items.lua, com um export client ou server. Aquele caminho é explicado em how to add items to ox_inventory. A compatibility layer para scripts qb-core também lida com QBCore.Functions.CreateUseableItem, então um script antigo continua funcionando. Items devem existir em items.lua do ox_inventory em QBox, não em shared/items.lua.

Checklist

Sintoma Solução
Nada acontece ao usar o item Registre com CreateUseableItem e defina useable = true
Item não é removido O callback deve chamar Player.Functions.RemoveItem
AddItem retorna false Item desconhecido, inventory cheio, ou muito pesado
Caixa de item mostra duas vezes Seu inventory já a mostra; remova o evento extra
GetItemByName é nil O jogador não tem o item; cheque antes de ler amount
QBox item usável ignorado Use exports.qbx_core:CreateUseableItem ou o export de item do ox_inventory

Respostas rápidas

Como faço um item usável em QBCore?

Registre-o no server com QBCore.Functions.CreateUseableItem('itemname', function(source, item) ... end), e defina useable = true no item em shared/items.lua.

Como checo se um jogador tem um item em QBCore?

Use Player.Functions.GetItemByName('itemname'). Retorna a tabela de item, com sua amount, ou nil quando o jogador não a tem.

O CreateUseableItem funciona em QBox?

Sim. QBox tem exports.qbx_core:CreateUseableItem, e com ox_inventory você também pode usar o export client ou server do próprio item.

Scripts sem esse problema

Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →

Continue lendo