Escribir un recurso sobre bs_core
Construyamos uno pequeño: una “torre de radio” que puedes usar una vez cada 10 minutos por $50 en efectivo y algo de XP. Es inventada, las partes que usa son reales.
Carpeta
Sección titulada «Carpeta»resources/[beyond]/bs_radiotower/├── fxmanifest.lua├── config/config.lua├── client/cl_main.lua└── server/sv_main.luaPonle el prefijo bs_. Los nombres de recursos de FiveM son un único espacio de nombres global; un recurso llamado radio acabará chocando con el script de alguien.
fxmanifest.lua
Sección titulada «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'Luego añade ensure bs_radiotower a server.cfg, después de bs_core y después de todo lo que llames.
config/config.lua
Sección titulada «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 tabla global con el nombre de tu recurso. Eso es lo que modifica el helper de apply de F1 (ver Helper de config apply).
server/sv_main.lua
Sección titulada «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)Dinero y XP solo mediante exports de bs_core. Nunca escribas tú en las columnas de la BD.
client/cl_main.lua
Sección titulada «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 una interacción real registrarías una opción en bs_interactions (el punto ALT) en vez de un comando; mira cómo lo hacen bs_recycler o bs_mining.
Si teletransportas jugadores
Sección titulada «Si teletransportas jugadores»Llama a exports.bs_guard:Allow(src, 'teleport', 3000) antes de moverlos en el servidor, o bs_guard marcará cada uso.
Trampas (todas ocurrieron)
Sección titulada «Trampas (todas ocurrieron)»- Las globales de otro recurso son invisibles.
Items.Definitionsdentro de bs_admin es una tabla vacía, no la de bs_inventory. Usa exports. - Las funciones no cruzan los exports. Pasar una función callback al export de otro recurso no funciona. Por eso BSB es un archivo que incluyes, no un export.
- No uses
Waitdentro de un export que llama otro. Se ejecuta en el thread de quien llama en tu runtime y lanza un error. bs_radial tenía este bug, por eso existeBSB.Radial. local a, b = x and f() or y- Lua solo conserva el primer retorno def()ahí. Escríbelo con un if.- Un local usado antes de su declaración es una global nil.
luac5.4 -l file.lua | grep _ENVlas encuentra. - Protege
GetEntityModelconDoesEntityExist. Con un handle muerto el cliente del juego se cuelga. - Sin mensajes NUI cada frame en reposo. Envía al cambiar.
- Cada
bs:ui:openednecesita unbs:ui:closeden cada camino de salida, ver Convenciones 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.