Saltearse al contenido

API de items e inventario

Todo esto es del lado del servidor en bs_inventory. La lista completa con archivo y línea está en la página de la API de bs_inventory.

Añádelo a Items.Definitions en 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
labelnombre mostrado
categorymedical, food, drink, weapon, ammo, material, tool, booster, gadget, drug, gear… determina las pestañas de F10 y parte del comportamiento
weight, w, hkg y tamaño en la cuadrícula
stackmáximo por slot
usablese puede usar desde el inventario
valueprecio base para los traders
datacomportamiento: heal, hunger, thirst, armour, weapon, ammo, drug, handled, defaultMeta, craftingStation…

Las definiciones se sincronizan con bs_item_definitions al arrancar.

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

Comprueba el valor de retorno de GiveItem. Una mochila llena es un caso real.

Dos formas:

  1. Usa los campos data incorporados (heal, hunger…) y el inventario lo hace.
  2. Gestiónalo tú. Define data.handled = true para que el inventario no lo consuma, luego escucha el hook de uso y quítalo tú cuando haya funcionado:
-- 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)

El evento bsesx:useItem:<item> se dispara para cada item usado después de los efectos incorporados. Lleva el nombre del puente ESX, pero es un evento de servidor normal, cualquier recurso puede escucharlo.

Si además reportas grandes ganancias de items al anti-cheat: exports.bs_guard:ReportItem(src, item, amount).

Cualquier cosa con slots que no sea la mochila del jugador: cajas, maleteros, 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')

Regístralo en el servidor después de tus propias comprobaciones (distancia, cerradura, propiedad). El inventario solo confía en esta tabla para el tamaño, nunca en lo que diga un cliente. Los ids tienen como máximo 64 caracteres; ponles el prefijo de tu recurso. bs_events/server/sv_main.lua es un ejemplo limpio.

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) da el item de un WEAPON_X, AmmoItemFor(weaponName) el item de munición.

WipeInventory(src) vacía a un jugador. Solo superadmin desde el menú F10; úsalo con cuidado desde el código.