Свой ресурс поверх bs_core
Построим крошечный: «радиовышка», которую можно использовать раз в 10 минут за 50 наличными и немного опыта. Она выдуманная, но используемые части настоящие.
resources/[beyond]/bs_radiotower/├── fxmanifest.lua├── config/config.lua├── client/cl_main.lua└── server/sv_main.luaНачинайте имя с bs_. Имена ресурсов FiveM - одно глобальное пространство имён, ресурс radio рано или поздно столкнётся со чьим-то скриптом.
fxmanifest.lua
Заголовок раздела «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'Затем добавьте ensure bs_radiotower в server.cfg, после bs_core и после всего, что вы вызываете.
config/config.lua
Заголовок раздела «config/config.lua»RadioTower = {}RadioTower.Settings = { reward = 50, xp = 20, cooldown = 600, -- seconds pos = vector3(0.0, 0.0, 0.0), range = 3.0,}Глобальная таблица с именем вашего ресурса. Именно её правит помощник применения F1 (см. Помощник применения конфига).
server/sv_main.lua
Заголовок раздела «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)Деньги и опыт - только через экспорты bs_core. Никогда не пишите в столбцы БД сами.
client/cl_main.lua
Заголовок раздела «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)Для настоящего взаимодействия вместо команды зарегистрируйте опцию в bs_interactions (точка ALT), посмотрите, как это делают bs_recycler или bs_mining.
Если вы телепортируете игроков
Заголовок раздела «Если вы телепортируете игроков»Вызовите exports.bs_guard:Allow(src, 'teleport', 3000) перед перемещением на сервере, иначе bs_guard отметит каждое использование.
Ловушки (всё это случалось)
Заголовок раздела «Ловушки (всё это случалось)»- Глобальные переменные другого ресурса невидимы.
Items.Definitionsвнутри bs_admin - пустая таблица, а не таблица bs_inventory. Используйте экспорты. - Функции не проходят через экспорты. Передача функции-колбэка в экспорт другого ресурса не сработает. Поэтому BSB - это подключаемый файл, а не экспорт.
- Не используйте
Waitвнутри экспорта, который вызывает кто-то другой. Он выполняется в потоке вызывающего в вашей среде и выбрасывает ошибку. У bs_radial была эта ошибка, поэтому существуетBSB.Radial. local a, b = x and f() or y- Lua оставляет здесь только первое возвращаемое значениеf(). Пишите через if.- Локальная переменная, использованная выше объявления, - это глобальный nil.
luac5.4 -l file.lua | grep _ENVнаходит такие случаи. - Защищайте
GetEntityModelчерезDoesEntityExist. На мёртвом хендле клиент игры падает. - Никаких сообщений NUI на каждом кадре в простое. Отправляйте при изменении.
- Каждому
bs:ui:openedнуженbs:ui:closedна каждом пути выхода, см. Соглашения 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.