QBCore используемые предметы: CreateUseableItem, AddItem и RemoveItem

Сделайте предмет используемым на QBCore с CreateUseableItem, выдавайте и удаляйте его с помощью Player.Functions.AddItem и RemoveItem, покажите поле предмета и что изменяется на QBox.

На QBCore используемый предмет — это функция сервера, зарегистрированная под именем предмета. Когда игрок использует предмет в инвентаре, функция выполняется. Эта статья охватывает регистрацию, функции, которые выдают, удаляют и проверяют предметы, уведомление поля предмета и что отличается на QBox.

Предмет должен существовать в первую очередь

Предметы QBCore определены в qb-core/shared/items.lua. Предмет, который используемый, нуждается в 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.',
},

Ключ и name должны быть одинаковыми. image — это файл в папке изображений вашего инвентаря. Для полного формата предмета смотрите добавление предметов на QBCore.

Зарегистрируйте используемый предмет

На сервере в вашем скрипте:

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)

Обратный вызов получает id игрока и данные предмета. Он не удаляет предмет, поэтому вы удаляете его сами и только запускаете эффект, если удаление сработало. Если QBCore равен nil здесь, смотрите исправление GetCoreObject.

Событие клиента только воспроизводит эффект:

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

Добавление, удаление и проверка предметов

Это функции игрока, которые вы используете все время, на сервере:

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 и RemoveItem возвращают true, когда они сработали, и false, когда они не сработали, например, потому что инвентарь полон или предмет отсутствует. Всегда проверяйте результат, прежде чем продолжать:

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

AddItem также принимает необязательные аргументы slot и info, где info несет дополнительные данные на предмете, такие как серийный номер.

Поле предмета

Когда игрок получает или теряет предмет, инвентарь обычно показывает небольшую коробку с изображением предмета. В qb-inventory вы инициируете её событием клиента:

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

Имя события и аргументы могут отличаться между версиями инвентаря, и некоторые версии показывают коробку самостоятельно внутри AddItem. Посмотрите, как существующий скрипт на вашем сервере вызывает её, и скопируйте это. Вызов её поверх автоматической коробки показывает уведомление дважды.

Совет: выполняйте эффект только после возврата RemoveItem true. Скрипт, который сначала воспроизводит анимацию и удаляет предмет позже, дает игрокам бесплатные бургеры, когда удаление не выполняется.

Пример: создайте один предмет из другого

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)

Все проверки запускаются на сервере. Для получения дополнительной информации об этой идее смотрите защита событий сервера.

На QBox

Ядро QBox — это qbx_core. Регистрация используемого предмета имеет свой собственный экспорт:

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

Серверы QBox используют ox_inventory, поэтому у вас есть второй вариант: поместите эффект в сам предмет, в ox_inventory/data/items.lua, с экспортом client или server. Этот путь объясняется в как добавить предметы в ox_inventory. Слой совместимости для скриптов qb-core также обрабатывает QBCore.Functions.CreateUseableItem, поэтому старый скрипт продолжает работать. Предметы должны существовать в items.lua ox_inventory на QBox, а не в shared/items.lua.

Контрольный список

Симптом Исправление
Ничего не происходит при использовании предмета Зарегистрируйте его с CreateUseableItem и установите useable = true
Предмет не удален Обратный вызов должен вызвать Player.Functions.RemoveItem
AddItem возвращает false Неизвестный предмет, инвентарь полон или слишком тяжелый
Поле предмета показывается дважды Ваш инвентарь уже его показывает; удалите дополнительное событие
GetItemByName равен nil У игрока нет предмета; проверьте перед чтением amount
QBox используемый предмет игнорируется Используйте exports.qbx_core:CreateUseableItem или экспорт предмета ox_inventory

Короткие ответы

Как сделать предмет используемым в QBCore?

Зарегистрируйте его на сервере с QBCore.Functions.CreateUseableItem('itemname', function(source, item) ... end) и установите useable = true на предмет в shared/items.lua.

Как я проверю, есть ли у игрока предмет в QBCore?

Используйте Player.Functions.GetItemByName('itemname'). Он возвращает таблицу предмета, с его amount или nil, когда у игрока нет его.

Работает ли CreateUseableItem на QBox?

Да. QBox имеет exports.qbx_core:CreateUseableItem, и с ox_inventory вы также можете использовать собственный экспорт предмета client или server.

Скрипты без этой проблемы

Item Creator V2Создавайте используемые предметы с анимациями, пропами, эффектами и не только — без кода.Смотреть скрипт →Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →

Читайте также

QBCoreQBoxРуководстваКак добавить предметы на QBCore: items.lua, изображения, CreateUseableItemДобавьте пользовательский предмет в QBCore: запись qb-core/shared/items.lua и её поля, изображение в qb-inventory, выдачу и сделайте его используемым с CreateUseableItem.1 октября 2026 г. · 3 мин чтенияЧитать →ox_libESXQBoxКак добавлять элементы в ox_inventory: items.lua, изображения и используемые элементыДобавьте пользовательский элемент в ox_inventory: запись data/items.lua, изображение в web/images, предоставление его с AddItem и делание его используемым с экспортом клиента.1 октября 2026 г. · 3 мин чтенияЧитать →ox_libESXQBoxМетаданные элементов ox_inventory: AddItem, Search, SetMetadata и уникальные элементыИспользуйте метаданные в ox_inventory: добавляйте элементы с данными, ищите и читайте слоты, обновляйте с помощью SetMetadata, показывайте пользовательскую метку и описание, и создавайте уникальные элементы, такие как ID и ключи.1 октября 2026 г. · 3 мин чтенияЧитать →