Aller au contenu

API items et inventaire

Tout ceci est côté serveur sur bs_inventory. La liste complète avec fichier et ligne est sur la page API de bs_inventory.

Ajoutez-le à Items.Definitions dans 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 },
Champ
labelnom affiché
categorymedical, food, drink, weapon, ammo, material, tool, booster, gadget, drug, gear… détermine les onglets F10 et une partie du comportement
weight, w, hkg et taille dans la grille
stackmaximum par slot
usablepeut être utilisé depuis l’inventaire
valueprix de base pour les traders
datacomportement : heal, hunger, thirst, armour, weapon, ammo, drug, handled, defaultMeta, craftingStation…

Les définitions sont synchronisées dans bs_item_definitions au démarrage.

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

Vérifiez la valeur de retour de GiveItem. Un sac plein est un cas réel.

Faire faire quelque chose à un item quand il est utilisé

Section intitulée « Faire faire quelque chose à un item quand il est utilisé »

Deux façons :

  1. Utilisez les champs data intégrés (heal, hunger…) et l’inventaire s’en charge.
  2. Gérez-le vous-même. Définissez data.handled = true pour que l’inventaire ne le consomme pas, puis écoutez le hook d’utilisation et retirez-le vous-même quand ça a marché :
-- 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’événement bsesx:useItem:<item> se déclenche pour chaque item utilisé après les effets intégrés. Il porte le nom du pont ESX, mais c’est un événement serveur ordinaire, n’importe quelle ressource peut l’écouter.

Si vous signalez aussi de gros gains d’items à l’anti-cheat : exports.bs_guard:ReportItem(src, item, amount).

Tout ce qui a des slots et n’est pas le sac du joueur : caisses, coffres de voiture, stashes, drops d’événements.

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

Enregistrez-le côté serveur après vos propres vérifications (distance, verrou, propriété). L’inventaire ne fait confiance à cette table que pour la taille, jamais à ce que dit un client. Les ids font 64 caractères maximum, préfixez-les avec votre ressource. bs_events/server/sv_main.lua est un exemple propre.

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) donne l’item d’un WEAPON_X, AmmoItemFor(weaponName) l’item de munitions.

WipeInventory(src) vide un joueur. Superadmin uniquement depuis le menu F10, à utiliser avec précaution depuis le code.