Articles utilisables QBCore : CreateUseableItem, AddItem et RemoveItem

Rendre un article utilisable sur QBCore avec CreateUseableItem, le donner et le supprimer avec Player.Functions.AddItem et RemoveItem, afficher la boîte d'article, et ce qui change sur QBox.

Sur QBCore, un article utilisable est une fonction serveur enregistrée sous un nom d'article. Quand le joueur utilise l'article dans l'inventaire, la fonction s'exécute. Cet article couvre l'enregistrement, les fonctions qui donnent, suppriment et vérifient les articles, la notification de boîte d'article, et ce qui est différent sur QBox.

L'article doit d'abord exister

Les articles QBCore sont définis dans qb-core/shared/items.lua. Un article qui est utilisable a besoin 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.',
},

La clé et le name doivent être les mêmes. Le image est un fichier dans le dossier des images de votre inventaire. Pour le format d'article complet, consultez ajout d'articles sur QBCore.

Enregistrer l'article utilisable

Sur le serveur, dans votre 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)

Le callback reçoit l'ID du joueur et les données de l'article. Il ne supprime pas l'article, vous le supprimez donc vous-même et n'exécutez l'effet que si la suppression a fonctionné. Si QBCore est nil ici, consultez la correction GetCoreObject.

L'événement client joue uniquement l'effet :

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

Ajouter, supprimer et vérifier les articles

Ce sont les fonctions du joueur que vous utilisez tout le temps, sur le serveur :

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 et RemoveItem retournent true quand elles ont fonctionné et false quand elles n'ont pas, par exemple parce que l'inventaire est plein ou l'article est manquant. Vérifiez toujours le résultat avant de continuer :

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

AddItem prend aussi les arguments optionnels slot et info, où info transporte les données supplémentaires sur l'article, comme un numéro de série.

La boîte d'article

Quand le joueur obtient ou perd un article, l'inventaire affiche généralement une petite boîte avec l'image de l'article. Dans qb-inventory vous la déclenchez avec un événement client :

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

Le nom de l'événement et les arguments peuvent différer entre les versions d'inventaire, et certaines versions affichent la boîte d'elles-mêmes à l'intérieur de AddItem. Regardez comment un script existant sur votre serveur l'appelle, et copiez cela. L'appeler en plus d'une boîte automatique affiche la notification deux fois.

Conseil : ne jouez l'effet qu'après que RemoveItem retourne true. Un script qui joue l'animation d'abord et supprime l'article plus tard donne aux joueurs des burgers gratuits quand la suppression échoue.

Un exemple : fabriquer un article à partir d'un autre

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)

Toutes les vérifications s'exécutent sur le serveur. Pour plus sur cette idée, consultez sécuriser les événements serveur.

Sur QBox

Le noyau de QBox est qbx_core. L'enregistrement d'article utilisable a son propre export :

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

Les serveurs QBox utilisent ox_inventory, vous avez donc une deuxième option : mettez l'effet dans l'article lui-même, dans ox_inventory/data/items.lua, avec un export client ou server. Ce chemin est expliqué dans comment ajouter des articles à ox_inventory. La couche de compatibilité pour les scripts qb-core gère aussi QBCore.Functions.CreateUseableItem, ainsi un ancien script continue à fonctionner. Les articles doivent exister dans items.lua d'ox_inventory sur QBox, pas dans shared/items.lua.

Liste de contrôle

Symptôme Correction
Rien ne se passe quand on utilise l'article Enregistrez-le avec CreateUseableItem et définissez useable = true
L'article n'est pas supprimé Le callback doit appeler Player.Functions.RemoveItem
AddItem retourne false Article inconnu, inventaire plein, ou trop lourd
La boîte d'article s'affiche deux fois Votre inventaire l'affiche déjà ; supprimez l'événement supplémentaire
GetItemByName est nil Le joueur n'a pas l'article ; vérifiez avant de lire amount
Article utilisable QBox ignoré Utilisez exports.qbx_core:CreateUseableItem ou l'export d'article ox_inventory

Réponses rapides

Comment rendre un article utilisable dans QBCore ?

Enregistrez-le sur le serveur avec QBCore.Functions.CreateUseableItem('itemname', function(source, item) ... end), et définissez useable = true sur l'article dans shared/items.lua.

Comment vérifier si un joueur a un article dans QBCore ?

Utilisez Player.Functions.GetItemByName('itemname'). Il retourne la table d'article, avec sa amount, ou nil quand le joueur n'en a pas.

CreateUseableItem fonctionne-t-il sur QBox ?

Oui. QBox a exports.qbx_core:CreateUseableItem, et avec ox_inventory vous pouvez aussi utiliser l'export client ou server de l'article lui-même.

Des scripts sans ce problème

Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →Shop CreatorCréez un magasin en moins d’une minute — propriétaires, employés, coffres et braquages inclus.Voir le script →

À lire aussi