Pular para o conteúdo

API de itens e inventário

Tudo isto é do lado do servidor, no bs_inventory. A lista completa com ficheiro e linha está na página da API do bs_inventory.

Adiciona-o a Items.Definitions em 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 },
Campo
labelnome mostrado
categorymedical, food, drink, weapon, ammo, material, tool, booster, gadget, drug, gear… determina os separadores do F10 e parte do comportamento
weight, w, hkg e tamanho na grelha
stackmáximo por slot
usablepode ser usado a partir do inventário
valuepreço base para os traders
datacomportamento: heal, hunger, thirst, armour, weapon, ammo, drug, handled, defaultMeta, craftingStation…

As definições são sincronizadas para bs_item_definitions no arranque.

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

Verifica o valor de retorno de GiveItem. Uma mochila cheia é um caso real.

Duas formas:

  1. Usa os campos data incorporados (heal, hunger…) e o inventário trata disso.
  2. Trata tu mesmo. Define data.handled = true para o inventário não o consumir, depois escuta o hook de uso e remove-o tu quando correu bem:
-- 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)

O evento bsesx:useItem:<item> dispara para todos os itens usados depois dos efeitos incorporados. O nome vem da ponte ESX, mas é um evento de servidor normal, qualquer recurso o pode escutar.

Se também reportas grandes ganhos de itens ao anti-cheat: exports.bs_guard:ReportItem(src, item, amount).

Tudo o que tem slots e não é a mochila do jogador: caixas, porta-bagagens, stashes, drops de eventos.

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')

Regista-o no servidor depois das tuas próprias verificações (distância, bloqueio, propriedade). O inventário só confia nesta tabela para o tamanho, nunca no que um cliente diz. Os ids têm no máximo 64 caracteres; põe-lhes o prefixo do teu recurso. O bs_events/server/sv_main.lua é um bom exemplo.

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) dá o item para um WEAPON_X, AmmoItemFor(weaponName) o item de munição.

WipeInventory(src) esvazia um jogador. Só superadmin a partir do menu F10; usa com cuidado a partir do código.