Salta ai contenuti

API di oggetti e inventario

Tutto questo è lato server su bs_inventory. L’elenco completo con file e riga è nella pagina API di bs_inventory.

Aggiungilo a Items.Definitions in 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 mostrato
categorymedical, food, drink, weapon, ammo, material, tool, booster, gadget, drug, gear… guida le schede F10 e parte del comportamento
weight, w, hkg e dimensione sulla griglia
stackmassimo per slot
usableutilizzabile dall’inventario
valueprezzo base per i venditori
datacomportamento: heal, hunger, thirst, armour, weapon, ammo, drug, handled, defaultMeta, craftingStation…

Le definizioni vengono sincronizzate in bs_item_definitions all’avvio.

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

Controlla il valore di ritorno di GiveItem. Uno zaino pieno è un caso reale.

Due modi:

  1. Usa i campi data integrati (heal, hunger…) e l’inventario fa il resto.
  2. Gestiscilo tu. Imposta data.handled = true perché l’inventario non lo consumi, poi ascolta l’hook d’uso e rimuovilo tu quando ha funzionato:
-- 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)

L’evento bsesx:useItem:<item> scatta per ogni oggetto usato dopo gli effetti integrati. Prende il nome dal ponte ESX ma è un normale evento server, qualsiasi risorsa può ascoltarlo.

Se segnali anche grandi guadagni di oggetti all’anti-cheat: exports.bs_guard:ReportItem(src, item, amount).

Tutto ciò che ha slot e non è lo zaino del giocatore: casse, bagagliai, nascondigli, rilasci di eventi.

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

Registralo sul server dopo i tuoi controlli (distanza, blocco, proprietà). L’inventario si fida di questa tabella solo per la dimensione, mai di ciò che dice un client. Gli id sono al massimo 64 caratteri, prefissali con la tua risorsa. bs_events/server/sv_main.lua è un esempio pulito.

Equipaggiamenti (barra rapida, potenziamenti, gadget)

Sezione intitolata “Equipaggiamenti (barra rapida, potenziamenti, gadget)”
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à l’oggetto per un WEAPON_X, AmmoItemFor(weaponName) l’oggetto munizioni.

WipeInventory(src) svuota un giocatore. Dal menu F10 solo superadmin, usalo con cautela da codice.