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:

lua
['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:

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)

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:

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

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

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

AddItem 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:

lua
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 RemoveItem zwró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

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)

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:

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

Skrypty bez tego problemu

Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →

Czytaj dalej