Перейти к содержимому

API предметов и инвентаря

Всё это серверная часть bs_inventory. Полный список с файлом и строкой - на странице API bs_inventory.

Добавьте его в Items.Definitions в bs_inventory/config/config_items.lua:

radio_part = { label = 'Radio part', category = 'material', weight = 0.3, w = 1, h = 1,
stack = 10, usable = false, value = 20 },
Поле
labelотображаемое имя
categorymedical, food, drink, weapon, ammo, material, tool, booster, gadget, drug, gear… определяет вкладки F10 и часть поведения
weight, w, hкг и размер в сетке
stackмаксимум на слот
usableможно использовать из инвентаря
valueбазовая цена для торговцев
dataповедение: heal, hunger, thirst, armour, weapon, ammo, drug, handled, defaultMeta, craftingStation…

Определения синхронизируются в bs_item_definitions при запуске.

local inv = exports.bs_inventory
inv:GiveItem(src, 'bandage', 2) -- metadata optional
inv:GiveItem(src, 'booster_drone', 1, { battery = 50, capacity = 'medium' })
inv:RemoveItem(src, 'bandage', 1)
local n = inv:CountItem(src, 'bandage')
local def = inv:GetItem('bandage') -- runtime definition
local list = inv:ItemMetaList(src, 'booster_drone') -- metadata of every stack
inv:SetItemMeta(src, slot, 'booster_drone', meta, true)
inv:Refresh(src) -- push state to the client

Проверяйте возвращаемое значение GiveItem. Полная сумка - реальный случай.

Как заставить предмет что-то делать при использовании

Заголовок раздела «Как заставить предмет что-то делать при использовании»

Два способа:

  1. Используйте встроенные поля data (heal, hunger…), и инвентарь всё сделает сам.
  2. Обработайте сами. Задайте data.handled = true, чтобы инвентарь не расходовал предмет, затем слушайте хук использования и удаляйте предмет сами, когда всё удалось:
-- server, in your resource
AddEventHandler('bsesx:useItem:radio_part', function(src)
if not doTheThing(src) then return end
exports.bs_inventory:RemoveItem(src, 'radio_part', 1)
end)

Событие bsesx:useItem:<item> вызывается для каждого использованного предмета после встроенных эффектов. Оно названо в честь моста ESX, но это обычное серверное событие, его может слушать любой ресурс.

Если вы также сообщаете античиту о крупных поступлениях предметов: exports.bs_guard:ReportItem(src, item, amount).

Всё со слотами, что не является сумкой игрока: ящики, багажники, тайники, дропы событий.

inv:RegisterContainer('myres:crate:1', { width = 6, height = 4, maxWeight = 150.0, label = 'Crate' })
-- optional 3rd arg: a src that is allowed to open it right away
inv:ContainerGive('myres:crate:1', 'scrap_metal', 5)
inv:OpenContainerFor(src, 'myres:crate:1')
local has = inv:ContainerHasItems('myres:crate:1')
local items = inv:ContainerContents('myres:crate:1')

Регистрируйте на сервере после собственных проверок (дистанция, замок, владение). Инвентарь доверяет этой таблице только в отношении размера, а не тому, что говорит клиент. Id - максимум 64 символа, добавляйте префикс вашего ресурса. bs_events/server/sv_main.lua - чистый пример.

inv:LoadoutGet(src, 'gadget') -- includes metadata
local ok, meta = inv:LoadoutTake(src, 'gadget', 1, 1, 'booster_drone')
inv:LoadoutPut(src, 'gadget', 1, 'booster_drone', meta)

ItemForWeapon(model) возвращает предмет для WEAPON_X, AmmoItemFor(weaponName) - предмет патронов.

WipeInventory(src) очищает игрока. Из меню F10 - только суперадмин, из кода используйте осторожно.