Zum Inhalt springen

Items- & Inventar-API

All das läuft serverseitig auf bs_inventory. Die vollständige Liste mit Datei und Zeile steht auf der bs_inventory-API-Seite.

Füge es in Items.Definitions in bs_inventory/config/config_items.lua ein:

radio_part = { label = 'Radio part', category = 'material', weight = 0.3, w = 1, h = 1,
stack = 10, usable = false, value = 20 },
Feld
labelangezeigter Name
categorymedical, food, drink, weapon, ammo, material, tool, booster, gadget, drug, gear… steuert die F10-Tabs und teils das Verhalten
weight, w, hkg und Rastergröße
stackMaximum pro Slot
usablekann aus dem Inventar benutzt werden
valueGrundpreis für Händler
dataVerhalten: heal, hunger, thirst, armour, weapon, ammo, drug, handled, defaultMeta, craftingStation…

Definitionen werden beim Start in bs_item_definitions synchronisiert.

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

Prüfe den Rückgabewert von GiveItem. Eine volle Tasche ist ein realer Fall.

Zwei Wege:

  1. Nutze die eingebauten data-Felder (heal, hunger…) und das Inventar erledigt es.
  2. Behandle es selbst. Setze data.handled = true, damit das Inventar es nicht verbraucht, lausche dann auf den Use-Hook und entferne es selbst, wenn es geklappt hat:
-- 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)

Das Event bsesx:useItem:<item> wird für jedes benutzte Item nach den eingebauten Effekten ausgelöst. Der Name stammt von der ESX-Brücke, es ist aber ein normales Server-Event, jede Ressource kann darauf lauschen.

Wenn du außerdem große Item-Zugewinne an den Anti-Cheat meldest: exports.bs_guard:ReportItem(src, item, amount).

Alles mit Slots, das nicht die Spielertasche ist: Kisten, Kofferräume, Stashes, Event-Drops.

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

Registriere ihn auf dem Server nach deinen eigenen Prüfungen (Distanz, Schloss, Besitz). Das Inventar vertraut dieser Tabelle nur bei der Größe, nie dem, was ein Client sagt. IDs sind maximal 64 Zeichen, setze das Präfix deiner Ressource davor. bs_events/server/sv_main.lua ist ein sauberes Beispiel.

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) liefert das Item zu einem WEAPON_X, AmmoItemFor(weaponName) das Munitions-Item.

WipeInventory(src) leert einen Spieler. Im F10-Menü nur für Superadmins, im Code mit Vorsicht verwenden.