QBCore используемые предметы: CreateUseableItem, AddItem и RemoveItem
Сделайте предмет используемым на QBCore с CreateUseableItem, выдавайте и удаляйте его с помощью Player.Functions.AddItem и RemoveItem, покажите поле предмета и что изменяется на QBox.
На QBCore используемый предмет — это функция сервера, зарегистрированная под именем предмета. Когда игрок использует предмет в инвентаре, функция выполняется. Эта статья охватывает регистрацию, функции, которые выдают, удаляют и проверяют предметы, уведомление поля предмета и что отличается на QBox.
Предмет должен существовать в первую очередь
Предметы QBCore определены в qb-core/shared/items.lua. Предмет, который используемый, нуждается в useable = true:
['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.
Зарегистрируйте используемый предмет
На сервере в вашем скрипте:
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.
Событие клиента только воспроизводит эффект:
RegisterNetEvent('my_script:eatBurger', function()
-- animation, progress bar, hunger update
end)Добавление, удаление и проверка предметов
Это функции игрока, которые вы используете все время, на сервере:
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 и RemoveItem возвращают true, когда они сработали, и false, когда они не сработали, например, потому что инвентарь полон или предмет отсутствует. Всегда проверяйте результат, прежде чем продолжать:
if Player.Functions.AddItem('lockpick', 1) then
-- reward given
else
TriggerClientEvent('QBCore:Notify', source, 'Your inventory is full', 'error')
endAddItem также принимает необязательные аргументы slot и info, где info несет дополнительные данные на предмете, такие как серийный номер.
Поле предмета
Когда игрок получает или теряет предмет, инвентарь обычно показывает небольшую коробку с изображением предмета. В qb-inventory вы инициируете её событием клиента:
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['burger'], 'add', 2)
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['burger'], 'remove', 1)Имя события и аргументы могут отличаться между версиями инвентаря, и некоторые версии показывают коробку самостоятельно внутри AddItem. Посмотрите, как существующий скрипт на вашем сервере вызывает её, и скопируйте это. Вызов её поверх автоматической коробки показывает уведомление дважды.
Совет: выполняйте эффект только после возврата
RemoveItemtrue. Скрипт, который сначала воспроизводит анимацию и удаляет предмет позже, дает игрокам бесплатные бургеры, когда удаление не выполняется.
Пример: создайте один предмет из другого
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. Регистрация используемого предмета имеет свой собственный экспорт:
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.

