Scrivere una risorsa sopra bs_core
Costruiamone una minuscola: una “torre radio” che si può usare una volta ogni 10 minuti per 50 in contanti e un po’ di XP. È inventata, le parti che usa sono reali.
Cartella
Sezione intitolata “Cartella”resources/[beyond]/bs_radiotower/├── fxmanifest.lua├── config/config.lua├── client/cl_main.lua└── server/sv_main.luaMetti il prefisso bs_. I nomi delle risorse FiveM sono un unico spazio dei nomi globale, una risorsa chiamata radio prima o poi si scontrerà con lo script di qualcuno.
fxmanifest.lua
Sezione intitolata “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'Poi aggiungi ensure bs_radiotower a server.cfg, dopo bs_core e dopo tutto ciò che chiami.
config/config.lua
Sezione intitolata “config/config.lua”RadioTower = {}RadioTower.Settings = { reward = 50, xp = 20, cooldown = 600, -- seconds pos = vector3(0.0, 0.0, 0.0), range = 3.0,}Una tabella globale col nome della tua risorsa. È ciò che modifica l’helper di applicazione di F1 (vedi Helper di applicazione della configurazione).
server/sv_main.lua
Sezione intitolata “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)Denaro e XP solo tramite gli export di bs_core. Non scrivere mai tu stesso nelle colonne del DB.
client/cl_main.lua
Sezione intitolata “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)Per una vera interazione registreresti un’opzione con bs_interactions (il punto ALT) invece di un comando, guarda come fanno bs_recycler o bs_mining.
Se teletrasporti i giocatori
Sezione intitolata “Se teletrasporti i giocatori”Chiama exports.bs_guard:Allow(src, 'teleport', 3000) prima di spostarli sul server, o bs_guard segnala ogni uso.
Trappole (sono successe tutte)
Sezione intitolata “Trappole (sono successe tutte)”- I globali di un’altra risorsa sono invisibili.
Items.Definitionsdentro bs_admin è una tabella vuota, non quella di bs_inventory. Usa gli export. - Le funzioni non attraversano gli export. Passare una funzione callback all’export di un’altra risorsa non funziona. Per questo BSB è un file che includi, non un export.
- Non usare
Waitdentro un export chiamato da altri. Gira nel thread del chiamante nel tuo runtime e lancia un errore. bs_radial aveva questo bug, per questo esisteBSB.Radial. local a, b = x and f() or y- Lua qui tiene solo il primo ritorno dif(). Scrivilo con un if.- Una variabile locale usata prima della dichiarazione è un nil globale.
luac5.4 -l file.lua | grep _ENVle trova. - Proteggi
GetEntityModelconDoesEntityExist. Su un handle morto manda in crash il client di gioco. - Nessun messaggio NUI a ogni frame da fermi. Invia al cambiamento.
- Ogni
bs:ui:openedrichiede unbs:ui:closedsu ogni percorso di uscita, vedi Convenzioni 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.