Przejdź do głównej zawartości

API przedmiotów i ekwipunku

Wszystko to po stronie serwera w bs_inventory. Pełna lista z plikiem i linią jest na stronie API bs_inventory.

Dodaj go do Items.Definitions w 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 },
Pole
labelwyświetlana nazwa
categorymedical, food, drink, weapon, ammo, material, tool, booster, gadget, drug, gear… steruje zakładkami F10 i częścią zachowania
weight, w, hkg i rozmiar w siatce
stackmaks. na slot
usablemożna użyć z ekwipunku
valuecena bazowa dla handlarzy
datazachowanie: heal, hunger, thirst, armour, weapon, ammo, drug, handled, defaultMeta, craftingStation…

Definicje są synchronizowane do bs_item_definitions przy starcie.

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

Sprawdzaj wartość zwracaną przez GiveItem. Pełna torba to realny przypadek.

Dwa sposoby:

  1. Użyj wbudowanych pól data (heal, hunger…), a ekwipunek zrobi to sam.
  2. Obsłuż to sam. Ustaw data.handled = true, żeby ekwipunek go nie zużył, potem nasłuchuj haka użycia i usuń przedmiot sam, gdy się udało:
-- 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)

Zdarzenie bsesx:useItem:<item> jest wywoływane dla każdego użytego przedmiotu po wbudowanych efektach. Nazwa pochodzi od mostu ESX, ale to zwykłe zdarzenie serwerowe, każdy zasób może go nasłuchiwać.

Jeśli zgłaszasz też duże przyrosty przedmiotów do anty-cheata: exports.bs_guard:ReportItem(src, item, amount).

Wszystko ze slotami, co nie jest torbą gracza: skrzynie, bagażniki, skrytki, zrzuty zdarzeń.

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

Rejestruj na serwerze po własnych sprawdzeniach (odległość, zamek, własność). Ekwipunek ufa tej tabeli tylko co do rozmiaru, nigdy temu, co mówi klient. Id mają maks. 64 znaki, dodawaj prefiks swojego zasobu. bs_events/server/sv_main.lua to czysty przykład.

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) daje przedmiot dla WEAPON_X, AmmoItemFor(weaponName) przedmiot amunicji.

WipeInventory(src) opróżnia gracza. Z menu F10 tylko superadmin, z kodu używaj ostrożnie.