Przedmioty użyteczne QBCore: CreateUseableItem, AddItem i RemoveItem
Uczyń przedmiot użytecznym na QBCore za pomocą CreateUseableItem, daj i usuń go za pomocą Player.Functions.AddItem i RemoveItem, pokaż pole elementu i co się zmienia na QBox.
Na QBCore, element użyteczny to funkcja serwerowa zarejestrowana pod nazwą elementu. Gdy gracz używa elementu w inventoriu, funkcja się uruchamia. Ten artykuł obejmuje rejestrację, funkcje, które dają, usuwają i sprawdzają elementy, pole elementu powiadomienia i co się różni na QBox.
Element musi najpierw istnieć
Elementy QBCore są zdefiniowane w qb-core/shared/items.lua. Element, który jest użyteczny, potrzebuje useable = true:
['burger'] = {
name = 'burger',
label = 'Burger',
weight = 200,
type = 'item',
image = 'burger.png',
unique = false,
useable = true,
shouldClose = true,
description = 'A warm burger.',
},Klucz i name muszą być takie same. image jest plikiem w folderze obrazów twojego inventorium. Aby uzyskać pełny format elementu, zobacz dodawanie elementów na QBCore.
Zarejestruj element użyteczny
Na serwerze, w twoim skrypcie:
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)Callback otrzymuje id gracza i dane elementu. Nie usuwa elementu, więc usuwasz go sam i uruchamiasz efekt tylko, jeśli usunięcie zadziałało. Jeśli QBCore to nil tutaj, zobacz GetCoreObject fix.
Zdarzenie klienta tylko gra efekt:
RegisterNetEvent('my_script:eatBurger', function()
-- animation, progress bar, hunger update
end)Dodaj, usuń i sprawdź elementy
Oto funkcje gracza, których używasz cały czas, na serwerze:
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 i RemoveItem zwracają true, gdy zadziałały i false, gdy nie, na przykład dlatego, że inventorz jest pełny lub element brakuje. Zawsze sprawdzaj wynik, zanim kontynuujesz:
if Player.Functions.AddItem('lockpick', 1) then
-- reward given
else
TriggerClientEvent('QBCore:Notify', source, 'Your inventory is full', 'error')
endAddItem również przyjmuje opcjonalne argumenty slot i info, gdzie info nosi dodatkowe dane na elemencie, takie jak numer seryjny.
Pole elementu
Gdy gracz dostaje lub traci element, inventorz zwykle pokazuje małe pudło z obrazem elementu. W qb-inventory wyzwolisz go ze zdarzeniem klienta:
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['burger'], 'add', 2)
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['burger'], 'remove', 1)Nazwa zdarzenia i argumenty mogą się różnić między wersjami inventorium, a niektóre wersje pokazują pole samodzielnie wewnątrz AddItem. Spójrz, jak istniejący skrypt na twoim serwerze go wezwał, i skopiuj to. Wezwanie go na górze pola automatycznego pokazuje powiadomienie dwa razy.
Wskazówka: zrób efekt tylko po tym, gdy
RemoveItemzwróci true. Skrypt, który gra animację najpierw i usuwa element później, daje graczom darmowe burgery, gdy usunięcie się nie powiedzie.
Przykład: stwórz jeden element z drugiego
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)Wszystkie sprawdzenia działają na serwerze. Aby dowiedzieć się więcej na ten temat, zobacz zabezpieczanie zdarzeń serwerowych.
Na QBox
Core QBox to qbx_core. Rejestracja elementu użytecznego ma własny export:
exports.qbx_core:CreateUseableItem('burger', function(source, item)
-- same idea: remove the item, then trigger the effect
end)Serwery QBox używają ox_inventory, więc masz drugą opcję: umieść efekt w samym elemencie, w ox_inventory/data/items.lua, z eksportem client lub server. Ta ścieżka jest wyjaśniona w jak dodać elementy do ox_inventory. Warstwa kompatybilności dla skryptów qb-core obsługuje również QBCore.Functions.CreateUseableItem, więc starszy skrypt ciągle pracuje. Elementy muszą istnieć w items.lua ox_inventory na QBox, nie w shared/items.lua.
Lista kontrolna
| Symptom | Naprawa |
|---|---|
| Nic się nie dzieje podczas używania elementu | Zarejestruj go za pomocą CreateUseableItem i ustaw useable = true |
| Element nie usunięty | Callback musi wezwać Player.Functions.RemoveItem |
AddItem zwraca false |
Nieznany element, inventorz pełny, lub zbyt ciężki |
| Pole elementu pokazuje się dwa razy | Twój inventorz już go pokazuje; usuń dodatkowe zdarzenie |
GetItemByName jest nil |
Gracz nie ma elementu; sprawdź przed przeczytaniem amount |
| Element użyteczny QBox ignorowany | Użyj exports.qbx_core:CreateUseableItem lub eksportu elementu ox_inventory |
Szybkie odpowiedzi
Jak uczyniłem przedmiot użytecznym w QBCore?
Zarejestruj go na serwerze za pomocą QBCore.Functions.CreateUseableItem('itemname', function(source, item) ... end) i ustaw useable = true na elemencie w shared/items.lua.
Jak sprawdzę, czy gracz ma element w QBCore?
Użyj Player.Functions.GetItemByName('itemname'). Zwraca tabelę elementu, z jego amount, lub nil, gdy gracz go nie ma.
Czy CreateUseableItem działa na QBox?
Tak. QBox ma exports.qbx_core:CreateUseableItem, a z ox_inventory możesz również użyć wewnętrznego eksportu client lub server elementu.

