İçeriğe geç

Mimari

bs_core durumun sahibidir. Para, XP, ihtiyaçlar, konum, karakter verisi: bunları yalnızca bs_core yazar ve satırı yalnızca bs_core kaydeder. Diğer tüm kaynaklar bs_core’a export’lar üzerinden sorar. Kayıtları dürüst tutan budur: bir karakteri değişmiş olarak işaretleyen tek bir yer ve yazan tek bir yer vardır.

NUI (html in each resource, shared shell in bs_ui)
| SendNUIMessage / fetch (NUI callbacks)
Client Lua mirrors state, never authoritative
| net events + BSB callbacks
Server Lua Player objects, validation, hooks
| oxmysql (behind bs_core/server/sv_database.lua)
MariaDB migrations in bs_core/sql

İstemci sorar, sunucu karar verir, sunucu sonucu geri gönderir. İstemcinin gönderdiği her şey sunucuda yeniden denetlenir. Örneğin ihtiyaçlar bir istemci raporundan yalnızca azalabilir, açlığı geri getirmek bir tüketilebilirden gelen sunucu eylemidir.

Her birinin ne yaptığı Resource listesi sayfasında.

GrupKaynaklar
Çekirdekbs_core, bs_loading, bs_multichar, bs_esx_bridge
UIbs_ui (HUD, bildirim, paylaşılan NUI parçaları), bs_radial, bs_menu (merkez), bs_chat, bs_scoreboard
Oyuncubs_inventory, bs_skills, bs_medical, bs_bodily, bs_emotes, bs_boosters, bs_gadgets, bs_drugs
Dünyabs_world, bs_interactions (ALT target dot, containers), bs_economy (loot), bs_traders, bs_vehicles, bs_building, bs_crafting, bs_gates, bs_stash, bs_recycler, bs_mining, bs_scenes, bs_events, bs_extraction
Zombilerbs_zombies, bs_zombiepeds, bs_zombiesfx, bs_atlas, nodes
Sosyalbs_factions, bs_faction_bases, bs_jobs, bs_vip
Personelbs_admin, bs_tester, bs_config, bs_guard, bs_cinecam
Varlıklarbs_assets
connecting -> playerConnecting: identity resolved, ban checked
loading -> client handshake (bs:session:clientReady)
select -> limbo, frozen and invisible, character list/create/delete/select
playing -> Player object exists server side, ped spawned

/logout ve bağlantı kopması ikisi de önce zorla kaydeden BS.UnloadPlayer’dan geçer. İstemci tarafında exports.bs_core:GetSessionState() nerede olduğunuzu söyler, exports.bs_core:IsLoaded() ise basit “karakter var mı” denetimidir.

Player nesnesi bs_core’un Lua durumunda yaşar. Fonksiyonlar export sınırını geçmez, bu yüzden nesneyi almazsınız, işi yapan export’ları çağırırsınız:

-- server
local p = exports.bs_core:GetPlayerSummary(src) -- plain table: charId, name, level, xp, accounts, needs, role...
exports.bs_core:AddMoney(src, 'cash', 50, 'my_reason')
exports.bs_core:RemoveMoney(src, 'bank', 200, 'my_reason')
exports.bs_core:AddXP(src, 25, 'my_reason')
local v = exports.bs_core:GetPlayerMeta(src, 'my_key', nil)
exports.bs_core:SetPlayerMeta(src, 'my_key', { any = 'table' })
exports.bs_core:AwardAction(src, 'zombie_kill') -- uses Config.Rewards

İstemci tarafı: exports.bs_core:GetData(), GetNeeds(), IsLoaded().

Karakter üst verisi (GetPlayerMeta/SetPlayerMeta) karakter başına küçük veriler için kolay yerdir. bs_drugs bağımlılığı kendi tablosu olmadan orada tutar.

bs_core’un süreç içi bir pub/sub’ı (BS.On / BS.Emit) vardır ve her kancayı bs:hook:<name> adlı normal bir olay olarak yeniden yayınlar. Kaynağınızdan:

AddEventHandler('bs:hook:player:loaded', function(data) ... end)
AddEventHandler('bs:hook:player:unloaded', function(...) ... end)
KancaTaraf
core:readyikisi
player:loaded, player:spawned, player:unloadedikisi
player:money, player:levelUpikisi
player:xp, player:actionserver
character:created, character:selectedserver
session:state, needs:changedclient

Net olayları üzerinden istek/yanıt. Dosyayı manifestinize ekleyin, kendi Lua durumunuzda BSB olsun:

shared_scripts { '@bs_core/shared/sh_bridge.lua' }
-- server
BSB.RegisterCallback('mything:get', function(src, a, b)
return { ok = true, value = a + b }
end)
-- client
local res = BSB.Await('mything:get', 5000, 1, 2) -- blocks this thread, nil on timeout

Diğer yön, sunucu tek bir istemciye sorar:

-- client
BSB.RegisterClientCallback('mything:where', function() return GetEntityCoords(PlayerPedId()) end)
-- server
local pos = BSB.AwaitClient(src, 'mything:where', 3000)

Nasıl çalışır: istek her kaynağa yayınlanır, adı kaydeden yanıtlar, diğerleri sessiz kalır. Yani:

  • bilinmeyen veya durdurulmuş bir ad zaman aşımına uğrar, hata vermez
  • adlar geneldir, sisteminizin önekini ekleyin (squad:invite, factions:roster, vendor:buy)
  • sunucu her istemciyi kaynak başına saniyede 40 istekle sınırlar
  • hata fırlatan bir işleyici callback "x" errored yazdırır ve istemci nil alır

Dönüşler için kural, ok içeren ve başarısızlıkta error bulunan bir tablodur: { ok = false, error = 'Not in a squad.' }.

Ayrıca BSB.RegisterCommand(name, ace, help, args, handler) (ACE denetimi, pcall ve sohbet önerisi tek seferde) ve radyal çark için istemcide BSB.Radial(spec) var. Kendinizinkini yazmak yerine bunları kullanın.

@bs_core/shared/sh_services.lua BS.Provide / BS.Use sağlar. Export çağırmanın denetimli bir yoludur: sağlayıcı ne sunduğunu söyler, tüketici bir tanıtıcı veya yüksek sesli bir günlük satırı alır, asla sessiz bir nil değil.

local inv = BS.Use('inventory')
if inv then inv.GiveItem(src, 'bandage', 1) end

Yenidir, çoğu kod hâlâ export’ları doğrudan çağırır. İkisi de çalışır.

BagÜzerindeAyarlayanAnlamı
bsDownedoyuncubs_medicaloyuncu yere düştü
bsDead, bsRevivableoyuncubs_medical
bsDrugModsoyuncu (yerel)bs_drugsdrain, regen, cap, infection, sway
bsSteadyoyuncu (yerel)bs_boostersgeri tepme/salınım çarpanı
bsDroneoyuncubs_gadgetsdrone uçurma
bsSquadoyuncubs_factionsmanga bilgisi
bsFactionStyle, bsFactionTag, bsFactionCanInvite, bsFactionSafeZoneoyuncubs_factionsetiket stili, izinler, güvenli bölge
bsVipTagoyuncubs_vip{ tier, colour, style, hex, blip, hud }, VIP yoksa nil
bsInRaid, bsRogueoyuncubs_extractionPvP bölgesi durumu
bsSittingoyuncubs_emotes
bsZombievarlıkbs_zombiesyürüyen kayıt kimliği. Ayrıca ağ modunda zType, zGait, zState…
bsZombieDeadvarlıkbs_zombiesağ cesedi
bsCorpsevarlıkbs_medicaloyuncu gövdesi
bsProtected, bsKeepvarlıkçokbs_world’ün temizlik taraması onu atlar
bsVehicle, bsLocked, bsOwned, bsWindowsDownaraçbs_vehicles
bsBuiltvarlıkbs_building

bs_world tarafından temizlenmemesi gereken bir varlık oluşturuyorsanız, üzerine bsProtected ayarlayın.

bs:<system>:<thing>, sonda lower camel case:

bs:session:clientReady bs:characters:select bs:player:money
bs:inventory:state bs:squad:sync bs:z:add
bs:ui:notify bs:ui:opened bs:medical:died

bs_core kendi adlarını BS.Events içinde tutar (bs_core/shared/sh_events.lua), böylece hiçbir şey sabit yazılmaz. Kancalar bs:hook:*’dır. Callback adları bs: öneki olmadan system:action kullanır.

Kaynak başına her olay ve callback API başvurusunda.