QBCore usable Items: CreateUseableItem, AddItem und RemoveItem
Mache ein Item usable auf QBCore mit CreateUseableItem, gib es mit Player.Functions.AddItem und RemoveItem, zeige die Item-Box, und was ändert sich auf QBox.
Auf QBCore ist ein usables Item eine Server-Funktion, die unter einem Item-Namen registriert ist. Wenn der Spieler das Item im Inventar verwendet, läuft die Funktion. Dieser Artikel behandelt die Registrierung, die Funktionen, die Items geben, entfernen und überprüfen, die Item-Box-Benachrichtigung, und was auf QBox anders ist.
Das Item muss zuerst existieren
QBCore Items sind in qb-core/shared/items.lua definiert. Ein Item, das usable ist, benötigt useable = true:
['burger'] = {
name = 'burger',
label = 'Burger',
weight = 200,
type = 'item',
image = 'burger.png',
unique = false,
useable = true,
shouldClose = true,
description = 'A warm burger.',
},Der Schlüssel und das name müssen gleich sein. Das image ist eine Datei in deinem Inventory's Images-Ordner. Für das vollständige Item-Format, siehe Items in QBCore hinzufügen.
Registriere das usable Item
Auf dem Server, in deinem Script:
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)Der Callback erhält die Spieler-ID und die Item-Daten. Es entfernt das Item nicht, also entfernst du es selbst und führst die Aktion nur aus, wenn das Entfernen funktioniert. Wenn QBCore hier nil ist, siehe die GetCoreObject Behebung.
Das Client-Event spielt nur die Aktion ab:
RegisterNetEvent('my_script:eatBurger', function()
-- animation, progress bar, hunger update
end)Items hinzufügen, entfernen und überprüfen
Dies sind die Spieler-Funktionen, die du die ganze Zeit verwendest, auf dem Server:
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
endAddItem und RemoveItem geben true zurück, wenn sie funktioniert haben, und false, wenn nicht, zum Beispiel, weil das Inventar voll ist oder das Item fehlt. Überprüfe immer das Ergebnis, bevor du fortsetzt:
if Player.Functions.AddItem('lockpick', 1) then
-- reward given
else
TriggerClientEvent('QBCore:Notify', source, 'Your inventory is full', 'error')
endAddItem nimmt auch optionale slot und info Argumente, wobei info zusätzliche Daten auf dem Item trägt, wie eine Seriennummer.
Die Item-Box
Wenn der Spieler ein Item erhält oder verliert, zeigt das Inventar normalerweise eine kleine Box mit dem Item-Bild. In qb-inventory triggert du es mit einem Client-Event:
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['burger'], 'add', 2)
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['burger'], 'remove', 1)Der Event-Name und die Argumente können sich zwischen Inventory-Versionen unterscheiden, und einige Versionen zeigen die Box von selbst in AddItem. Schaue, wie ein bestehendes Script in deinem Server es aufruft, und kopiere das. Wenn du es auf eine automatische Box aufrufst, zeigt sich die Benachrichtigung zweimal.
Tipp: Mache die Aktion nur, nachdem
RemoveItemtrue zurückgibt. Ein Script, das die Animation zuerst abspielt und das Item später entfernt, gibt Spieler kostenlose Burger, wenn das Entfernen fehlschlägt.
Ein Beispiel: erstelle ein Item aus einem anderen
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)Alle Überprüfungen laufen auf dem Server. Für mehr zu dieser Idee, siehe sichere Server-Events.
In QBox
Der Core von QBox ist qbx_core. Die usable Item-Registrierung hat ihren eigenen Export:
exports.qbx_core:CreateUseableItem('burger', function(source, item)
-- same idea: remove the item, then trigger the effect
end)QBox-Server verwenden ox_inventory, also hast du eine zweite Option: Lege die Aktion in das Item selbst, in ox_inventory/data/items.lua, mit einem client oder server Export. Dieser Weg wird erklär in wie man Items zu ox_inventory hinzufügt. Die Kompatibilitätsebene für qb-core Scripts handhabt auch QBCore.Functions.CreateUseableItem, also funktioniert ein älteres Script weiterhin. Items müssen in ox_inventory's items.lua auf QBox existieren, nicht in shared/items.lua.
Checkliste
| Symptom | Behebung |
|---|---|
| Nichts passiert bei Verwendung des Items | Registriere es mit CreateUseableItem und setze useable = true |
| Item nicht entfernt | Der Callback muss Player.Functions.RemoveItem aufrufen |
AddItem gibt false zurück |
Unbekanntes Item, Inventar voll, oder zu schwer |
| Item-Box wird zweimal angezeigt | Dein Inventar zeigt es bereits; entferne das zusätzliche Event |
GetItemByName ist nil |
Der Spieler hat das Item nicht; überprüfe, bevor du amount liest |
| QBox usables Item ignoriert | Verwende exports.qbx_core:CreateUseableItem oder den ox_inventory Item-Export |
Kurze Antworten
Wie mache ich ein Item usable in QBCore?
Registriere es auf dem Server mit QBCore.Functions.CreateUseableItem('itemname', function(source, item) ... end), und setze useable = true auf das Item in shared/items.lua.
Wie überprüfe ich, ob ein Spieler ein Item in QBCore hat?
Verwende Player.Functions.GetItemByName('itemname'). Es gibt die Item-Tabelle mit ihrer amount zurück, oder nil wenn der Spieler sie nicht hat.
Funktioniert CreateUseableItem auf QBox?
Ja. QBox hat exports.qbx_core:CreateUseableItem, und mit ox_inventory kannst du auch den client oder server Export des Items selbst verwenden.

