İçeriğe geç

Eşya ve envanter API'si

Bunların hepsi bs_inventory üzerinde sunucu tarafındadır. Dosya ve satırlı tam liste bs_inventory API sayfasında.

bs_inventory/config/config_items.lua içindeki Items.Definitions’a ekleyin:

radio_part = { label = 'Radio part', category = 'material', weight = 0.3, w = 1, h = 1,
stack = 10, usable = false, value = 20 },
Alan
labelgösterilen ad
categorymedical, food, drink, weapon, ammo, material, tool, booster, gadget, drug, gear… F10 sekmelerini ve bazı davranışları belirler
weight, w, hkg ve ızgara boyutu
stackyuva başına en fazla
usableenvanterden kullanılabilir
valuesatıcılar için temel fiyat
datadavranış: heal, hunger, thirst, armour, weapon, ammo, drug, handled, defaultMeta, craftingStation…

Tanımlar başlangıçta bs_item_definitions ile eşitlenir.

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

GiveItem’in dönüş değerini kontrol edin. Dolu bir çanta gerçek bir durumdur.

Bir eşyanın kullanıldığında bir şey yapmasını sağlama

Section titled “Bir eşyanın kullanıldığında bir şey yapmasını sağlama”

İki yol:

  1. Yerleşik data alanlarını (heal, hunger…) kullanın, envanter yapar.
  2. Kendiniz işleyin. Envanter tüketmesin diye data.handled = true ayarlayın, sonra kullanım kancasını dinleyin ve işe yaradığında eşyayı kendiniz kaldırın:
-- 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)

bsesx:useItem:<item> olayı, yerleşik etkilerden sonra kullanılan her eşya için tetiklenir. Adını ESX köprüsünden alır ama düz bir sunucu olayıdır, herhangi bir kaynak dinleyebilir.

Büyük eşya kazançlarını hile karşıtına da bildiriyorsanız: exports.bs_guard:ReportItem(src, item, amount).

Oyuncu çantası olmayan yuvalı her şey: sandıklar, araç bagajları, saklama yerleri, olay düşürmeleri.

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

Sunucuda kendi kontrollerinizden (mesafe, kilit, sahiplik) sonra kaydedin. Envanter bu tabloya yalnızca boyut için güvenir, bir istemcinin söylediğine asla. Kimlikler en fazla 64 karakter, kaynağınızın önekini ekleyin. bs_events/server/sv_main.lua temiz bir örnektir.

Ekipmanlar (hızlı çubuk, güçlendirmeler, aletler)

Section titled “Ekipmanlar (hızlı çubuk, güçlendirmeler, aletler)”
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) bir WEAPON_X için eşyayı, AmmoItemFor(weaponName) cephane eşyasını verir.

WipeInventory(src) bir oyuncuyu boşaltır. F10 menüsünden yalnızca superadmin, koddan dikkatli kullanın.