Pisanie zasobu na bazie bs_core
Zbudujmy malutki: „wieżę radiową”, której można użyć raz na 10 minut za 50 gotówki i trochę XP. Jest zmyślona, ale używane części są prawdziwe.
resources/[beyond]/bs_radiotower/├── fxmanifest.lua├── config/config.lua├── client/cl_main.lua└── server/sv_main.luaDodaj prefiks bs_. Nazwy zasobów FiveM to jedna globalna przestrzeń nazw, zasób o nazwie radio prędzej czy później zderzy się z czyimś skryptem.
fxmanifest.lua
Dział zatytułowany „fxmanifest.lua”fx_version 'cerulean'game 'gta5'lua54 'yes'
name 'bs_radiotower'description 'BeyondSurvival - radio tower example'
shared_scripts { '@bs_core/shared/sh_bridge.lua', -- BSB callbacks + BSB.RegisterCommand 'config/config.lua',}client_scripts { 'client/cl_main.lua' }server_scripts { 'server/sv_main.lua' }
dependencies { 'bs_core' }
-- live overrides from the F1 console, AFTER your config filesshared_script '@bs_config/shared/apply.lua'-- crash breadcrumbsclient_script '@bs_core/shared/sh_crumbs.lua'Potem dodaj ensure bs_radiotower do server.cfg, po bs_core i po wszystkim, co wywołujesz.
config/config.lua
Dział zatytułowany „config/config.lua”RadioTower = {}RadioTower.Settings = { reward = 50, xp = 20, cooldown = 600, -- seconds pos = vector3(0.0, 0.0, 0.0), range = 3.0,}Globalna tabela z nazwą twojego zasobu. To ją poprawia pomocnik stosowania F1 (zobacz Pomocnik stosowania konfiguracji).
server/sv_main.lua
Dział zatytułowany „server/sv_main.lua”local last = {} -- [charId] = os.time()
BSB.RegisterCallback('radiotower:use', function(src) local p = exports.bs_core:GetPlayerSummary(src) if not p then return { ok = false, error = 'Not loaded.' } end
-- never trust the client: check distance here too local pos = GetEntityCoords(GetPlayerPed(src)) if #(pos - RadioTower.Settings.pos) > RadioTower.Settings.range + 2.0 then return { ok = false, error = 'Too far.' } end
local now = os.time() if last[p.charId] and now - last[p.charId] < RadioTower.Settings.cooldown then return { ok = false, error = 'Nothing on the air yet.' } end last[p.charId] = now
exports.bs_core:AddMoney(src, 'cash', RadioTower.Settings.reward, 'radiotower') exports.bs_core:AddXP(src, RadioTower.Settings.xp, 'radiotower') return { ok = true }end)Pieniądze i XP tylko przez eksporty bs_core. Nigdy nie zapisuj do kolumn bazy samodzielnie.
client/cl_main.lua
Dział zatytułowany „client/cl_main.lua”local function use() if not exports.bs_core:IsLoaded() then return end Crumb('radiotower', 'use') local res = BSB.Await('radiotower:use', 5000) if not res then return end -- timed out, server side not running TriggerEvent('bs:ui:notify', { type = res.ok and 'success' or 'error', message = res.ok and 'You picked up a signal.' or res.error, })end
RegisterCommand('radiotower', use, false)Dla prawdziwej interakcji zarejestrowałbyś opcję w bs_interactions (kropka ALT) zamiast komendy, zobacz jak robią to bs_recycler lub bs_mining.
Jeśli teleportujesz graczy
Dział zatytułowany „Jeśli teleportujesz graczy”Wywołaj exports.bs_guard:Allow(src, 'teleport', 3000) przed przeniesieniem ich na serwerze, inaczej bs_guard oflaguje każde użycie.
Pułapki (wszystkie się zdarzyły)
Dział zatytułowany „Pułapki (wszystkie się zdarzyły)”- Globalne innego zasobu są niewidoczne.
Items.Definitionsw bs_admin to pusta tabela, a nie tabela bs_inventory. Używaj eksportów. - Funkcje nie przechodzą przez eksporty. Przekazanie funkcji callback do eksportu innego zasobu nie zadziała. Dlatego BSB to plik do dołączenia, a nie eksport.
- Nie używaj
Waitw eksporcie, który wywołuje ktoś inny. Działa w wątku wywołującego w twoim środowisku i rzuca błąd. bs_radial miał ten błąd, dlatego istniejeBSB.Radial. local a, b = x and f() or y- Lua zachowuje tu tylko pierwszą zwróconą wartośćf(). Zapisz to z if.- Zmienna lokalna użyta przed deklaracją to globalny nil.
luac5.4 -l file.lua | grep _ENVje znajduje. - Zabezpieczaj
GetEntityModelprzezDoesEntityExist. Na martwym uchwycie klient gry wywala się na twardo. - Żadnych wiadomości NUI co klatkę w bezczynności. Wysyłaj przy zmianie.
- Każde
bs:ui:openedwymagabs:ui:closedna każdej ścieżce wyjścia, zobacz Konwencje UI/NUI.
bs19.org · Privacy · Terms · Cookie settings
Cookies and outside content
The site only needs two essential cookies to keep you logged in and protect forms. Videos and streams from YouTube and Twitch load from their servers, which can set their own cookies, so they stay off until you say yes. Nothing is pre-ticked and you can change your mind any time with "Cookie settings" at the bottom of every page. Details.
Questions about the server, the framework or the site? A real person reads this, usually within a day.