Escrever um recurso sobre o bs_core
Vamos construir um pequeno: uma “torre de rádio” que podes usar uma vez a cada 10 minutos por $50 em dinheiro e algum XP. É inventada, as partes que usa são reais.
resources/[beyond]/bs_radiotower/├── fxmanifest.lua├── config/config.lua├── client/cl_main.lua└── server/sv_main.luaPõe-lhe o prefixo bs_. Os nomes de recursos do FiveM são um único espaço de nomes global; um recurso chamado radio vai colidir com o script de alguém mais cedo ou mais tarde.
fxmanifest.lua
Seção intitulada “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'Depois adiciona ensure bs_radiotower ao server.cfg, depois do bs_core e depois de tudo o que chamas.
config/config.lua
Seção intitulada “config/config.lua”RadioTower = {}RadioTower.Settings = { reward = 50, xp = 20, cooldown = 600, -- seconds pos = vector3(0.0, 0.0, 0.0), range = 3.0,}Uma tabela global com o nome do teu recurso. É isso que o helper de apply do F1 altera (ver Helper de config apply).
server/sv_main.lua
Seção intitulada “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)Dinheiro e XP só através dos exports do bs_core. Nunca escrevas tu nas colunas da BD.
client/cl_main.lua
Seção intitulada “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)Para uma interação a sério, registarias uma opção no bs_interactions (o ponto ALT) em vez de um comando; vê como o bs_recycler ou o bs_mining o fazem.
Se teletransportares jogadores
Seção intitulada “Se teletransportares jogadores”Chama exports.bs_guard:Allow(src, 'teleport', 3000) antes de os mover no servidor, ou o bs_guard assinala cada uso.
Armadilhas (todas aconteceram)
Seção intitulada “Armadilhas (todas aconteceram)”- As globais de outro recurso são invisíveis.
Items.Definitionsdentro do bs_admin é uma tabela vazia, não a do bs_inventory. Usa exports. - As funções não atravessam exports. Passar uma função de callback ao export de outro recurso não funciona. É por isso que o BSB é um ficheiro que incluis, não um export.
- Não uses
Waitdentro de um export que outro chama. Corre na thread de quem chama, no teu runtime, e dá erro. O bs_radial tinha este bug, é por isso que existe oBSB.Radial. local a, b = x and f() or y- o Lua só guarda o primeiro retorno def()aí. Escreve com um if.- Um local usado acima da sua declaração é uma global nil.
luac5.4 -l file.lua | grep _ENVencontra-os. - Protege
GetEntityModelcomDoesEntityExist. Num handle morto faz crashar o cliente do jogo. - Sem mensagens NUI a cada frame em idle. Envia quando muda.
- Cada
bs:ui:openedprecisa de umbs:ui:closedem todos os caminhos de saída, ver Convenções de 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.