Выберите один фреймворк и стройте всё на нём. У ESX Legacy самый большой набор бесплатных ресурсов, и работы (jobs) в нём хранятся в базе данных. QBCore - выбор по умолчанию для новых roleplay-серверов, и почти всё в нём лежит в файлах Lua, которые можно прочитать. Qbox - это QBCore, заново построенный на стеке ox_*, чище и быстрее, но с меньшим числом готовых ресурсов. Все три работают на одном и том же FXServer, все три теперь ожидают под собой oxmysql и ox_lib, и ни один не запустит скрипты работ другого без доработки. Фреймворк - единственное решение на сервере FiveM, которое действительно дорого менять потом, поэтому двадцать минут на него стоит потратить до установки чего-либо.
Что такое фреймворк на самом деле#
Сам по себе FXServer даёт мультиплеерную сессию GTA без правил: игроки появляются, и на этом всё. Фреймворк - это набор ресурсов, добавляющий то, что roleplay-сервер считает само собой разумеющимся: постоянного персонажа, привязанного к строке базы данных, деньги на счетах, инвентарь, работы с рангами, способ, которым один ресурс спрашивает другой, служит ли игрок в полиции.
Это скорее соглашение, чем код. Когда автор ресурса пишет «requires ESX», он имеет в виду, что его скрипт вызывает общий объект ESX и ожидает имена событий ESX, его таблицы базы данных и его определения предметов. Именно поэтому смешивать фреймворки нельзя: ресурс esx_, вызывающий xPlayer.getJob(), не получает от qb-core ничего вообще, потому что такой функции там нет.
Поэтому сервер на фреймворке - это не одна загрузка. Это ядро плюс схема базы данных плюс от 60 до 400 других ресурсов, и именно здесь живут и удовольствие, и виды отказов. Уровень выше разобран в статье сервер FiveM и txAdmin; эта статья о том, что класть внутрь resources/.
ESX, QBCore и Qbox рядом друг с другом#
| ESX Legacy | QBCore | Qbox | |
|---|---|---|---|
| Ядро | es_extended | qb-core | qbx_core |
| Работы заданы в | таблицах базы данных | shared/jobs.lua | shared/jobs.lua |
| Предметы заданы в | таблице базы данных | shared/items.lua | ox_inventory |
| Инвентарь | подключаемый | qb-inventory | ox_inventory |
| Пул бесплатных ресурсов | самый большой | очень большой | самый маленький |
| Стиль кода | самый старый, разнородный | аккуратный, многословный | самый строгий, самый новый |
ESX Legacy - поддерживаемая ветка старейшего фреймворка, всё ещё широко используемого; публикуется как esx_core - один репозиторий, содержащий es_extended вместе с его ресурсами меню, уведомлений и индикатора прогресса. Свежие версии требуют oxmysql и ox_lib; старые использовали mysql-async, и руководство, которое советует установить mysql-async, устарело. Отличительная привычка ESX - работы и ранги хранятся строками в таблицах jobs и job_grades, а не строками в файле конфигурации, так что добавление работы означает написание SQL или клики в phpMyAdmin. Кому-то это нравится. Большинство считает это самым раздражающим свойством ESX.
QBCore - фреймворк, с которого начинает большинство новых roleplay-серверов, и именно на него рассчитано большинство руководств, видео на YouTube и платных скриптов. Его конфигурация лежит в простом Lua в qb-core/shared/ - items.lua, jobs.lua, gangs.lua, vehicles.lua, weapons.lua, locations.lua, - так что добавление работы - это одна запись в таблице и перезапуск. Плата за это в том, что кодовая база росла быстро, качество ресурсов qb-* разнится, а многое из того, что люди запускают, - форк форка.
Qbox - продолжение QBCore, перестроенное на стеке Overextended: ox_lib, oxmysql, ox_inventory, ox_target, ox_doorlock. Он отбрасывает то, что QBCore сохранял ради совместимости, требует Lua 5.4 и актуальную сборку FXServer и выносит определения предметов из ядра в ox_inventory/data/items.lua. Он поставляется со слоем совместимости, отвечающим как qb-core, поэтому немало ресурсов qb-* работают без изменений - но не те, что трогают инвентарь, и не те, что пишут прямо в таблицы QBCore. Если ваш список ресурсов - в основном то, что вы будете писать или основательно править сами, в Qbox работать приятнее. Если ваш список ресурсов - в основном то, что вы скачали, QBCore будет сопротивляться меньше.
Упомянем ещё два имени, которые вам встретятся. ox_core - собственный фреймворк Overextended: небольшой, с чёткой позицией, почти без готового контента, для тех, кто хочет написать собственный сервер. vRP - предок большей части этого, и лучше оставить его в прошлом. Что бы вы ни читали на форумах, «самого быстрого» фреймворка, разницу с которым вы бы почувствовали, не существует: фреймворк стоит долю миллисекунды на тик, а всё остальное съедают 200 ресурсов, которые вы на него навалите.
Что должно лежать под всеми тремя#
Ни один из фреймворков не автономен. Прежде чем запустится ядро, должно работать следующее:
- `oxmysql` - мост к базе данных, который используют все актуальные фреймворки. Он читает строку подключения из convar и предоставляет функции запросов всем остальным ресурсам. Подробности - в статье базы данных FiveM и oxmysql.
- `ox_lib` - общая библиотека для колбэков, уведомлений, контекстных меню, индикаторов прогресса, зон и точек. Загружается как общий скрипт через
@ox_lib/init.luaи требуется всё большему числу ресурсов, выбрали вы Qbox или нет. - Ресурс голоса - обычный бесплатный выбор -
pma-voice, ему нужен трафикmumble, так что не трогайте его, пока не знаете, зачем вы его меняете. - Базовые ресурсы Cfx -
mapmanager,chat,spawnmanager,sessionmanagerиhardcap, поставляемые в стандартных данных сервера. Фреймворки заменяют поток появления и персонажей, но всё равно ожидают, что части сессии и чата существуют. - `screenshot-basic` - небольшой ресурс, его txAdmin использует для скриншотов игроков.
Порядок загрузки - не косметика. Ресурс, вызывающий MySQL.query, пока oxmysql ещё запускается, выбрасывает ошибку, а ресурс работы, запросивший общий объект до запуска ядра, получает nil и молча ничего не делает до конца сессии. В server.cfg это означает следующее:
ensure oxmysqlensure ox_libensure es_extended # or qb-core, or qbx_coreensure ox_inventoryensure pma-voice# anything that depends on the framework goes after the frameworkensure esx_policejobensure запускает ресурс или перезапускает, если он уже запущен, поэтому в файле конфигурации это правильный глагол. Каждая строка файла разобрана в статье server.cfg FiveM простыми словами.
Установка: рецепты txAdmin или вручную#
Установщик txAdmin умеет собирать сервер из рецепта - файла YAML, который скачивает репозитории, распаковывает их в resources/, импортирует SQL и записывает начальный server.cfg. В процессе настройки он запрашивает строку подключения к базе данных и создаёт таблицы в той базе, на которую вы укажете. В списке рецептов встречались шаблон Cfx по умолчанию, сборка ESX Legacy и сборки сообщества, и он меняется от версии к версии txAdmin, так что читайте, что предлагает ваша установка, а не то, что показывало видео двухлетней давности.
Рецепты стоит использовать ровно для одного: за десять минут поднять первый работающий сервер, чтобы увидеть, как выглядит неломающийся фреймворк. А затем посмотрите на то, что он вам дал.
resources/ [system]/ # build helpers from the default server data [standalone]/ oxmysql/ ox_lib/ pma-voice/ [core]/ es_extended/ ox_inventory/ [jobs]/ esx_policejob/ esx_ambulancejob/FXServer сканирует resources/ в поисках папок, названия которых заключены в квадратные скобки, и заглядывает внутрь них рекурсивно. Папка без скобок считается самим ресурсом и должна содержать fxmanifest.lua, иначе она невидима. ensure всегда принимает имя ресурса, а не путь, так что ensure esx_policejob работает, как бы глубоко вы его ни вложили.
Вручную это четыре шага, и вы должны уметь их выполнять:
- Скачайте релиз ядра для фреймворка, распакуйте его в
resources/[core]/и проверьте, что имя папки совпадает с тем, что документация велит указывать вensure. - Импортируйте SQL-дамп фреймворка в вашу базу данных. Сделайте это до первого запуска, а не после того, как всё зависло.
- Поместите строку подключения в
server.cfgи добавьте строкиensureв порядке зависимостей. - Запустите сервер с открытой консолью и читайте каждую строку, пока первый игрок не сможет появиться.
Манифест и что по нему можно узнать#
У каждого ресурса есть fxmanifest.lua. Прочитав его до установки, вы узнаете больше, чем из форумного поста, откуда он взят.
fx_version 'cerulean'game 'gta5'lua54 'yes'author 'someone'version '1.2.0'shared_scripts { '@ox_lib/init.lua', 'config.lua',}client_scripts { 'client/*.lua' }server_scripts { '@oxmysql/lib/MySQL.lua', 'server/*.lua',}dependencies { 'ox_lib', 'oxmysql' }Форма @resource/file.lua вытягивает файл из другого ресурса, так внедряются oxmysql и ox_lib. fx_version 'cerulean' - текущее поколение манифеста; adamant и bodacious старее и всё ещё работают. lua54 'yes' включает для ресурса Lua 5.4 и требуется ресурсам Qbox. Блок escrow_ignore означает, что ресурс частично зашифрован через Cfx asset escrow, что нормально для платных скриптов и означает, что исправить его ошибки самим не получится.
На что смотреть, прежде чем запускать чужой ресурс: os.execute, PerformHttpRequest на незнакомый домен, длинная строка base64, переданная в load, или любой add_ace, записанный в файл Lua. Утёкшие платные скрипты - основной путь, которым FiveM-серверы получают бэкдоры, а полезная нагрузка обычно одна из этих четырёх вещей. Общая версия этого довода - в статье как держать сервер с модами в чистоте.
Пишем под фреймворк#
Форма везде одна: получить объект фреймворка один раз, получить объект игрока по серверному ID, вызывать его методы.
local ESX = exports['es_extended']:getSharedObject()RegisterCommand('wage', function(source) local xPlayer = ESX.GetPlayerFromId(source) if not xPlayer then return end xPlayer.addAccountMoney('bank', 500)end, true)local QBCore = exports['qb-core']:GetCoreObject()RegisterCommand('wage', function(source) local Player = QBCore.Functions.GetPlayer(source) if not Player then return end Player.Functions.AddMoney('bank', 500, 'weekly-wage')end, true)Qbox предоставляет своё ядро напрямую как exports.qbx_core, так что та же задача выглядит как exports.qbx_core:GetPlayer(source), а функции игрока висят на результате. Старые руководства по ESX используют TriggerEvent('esx:getSharedObject', ...) вместо экспорта; в Legacy это всё ещё работает, но в новом коде писать следует экспорт, потому что он не может попасть в гонку с порядком запуска ресурсов.
true в конце RegisterCommand - флаг ограничения. Он требует для команды разрешения ACE вместо того, чтобы открывать её для всех, и в этом разница между командой администратора и подарком первому, кто прочтёт список ваших ресурсов.
Производительность и где фреймворк не виноват#
Сервер на фреймворке, который тормозит, почти никогда не страдает от нехватки железа. Измеряйте, прежде чем что-либо покупать:
resmon 1в консоли F8 клиента перечисляет каждый ресурс с его покадровым временем CPU. Всё, что держится выше 0.5 ms, пока ничего не происходит, делает лишнюю работу.- Монитор ресурсов txAdmin показывает серверную сторону, и именно там всплывают запросы к базе данных в циклах.
- Консоль - вторая половина истории. Ресурс, выбрасывающий ошибку на каждом тике, с удовольствием съест ядро, печатая причину - см. как читать консоль.
Типичные цифры для сервера с обычным списком ресурсов roleplay:
| Игроки | Ресурсы | RAM | Примечания |
|---|---|---|---|
| Тест, 1-5 | 60-100 | 2 GB | Голое ядро и несколько работ |
| 16-32 | 100-200 | 4 GB | Типичный первый публичный сервер |
| 32-64 | 200-300 | 6-8 GB | Стриминговые ассеты начинают иметь значение |
| 64-128 | 300+ | 8-12 GB | Нужен человек, аудирующий ресурсы |
Две вещи, которые действительно стоят памяти, а не CPU, - это стримящиеся ассеты (пользовательский транспорт, MLO, одежда) и ресурсы, кэширующие большие таблицы на каждого игрока. Обе растут вместе со списком ресурсов, и ни одна не уменьшается, когда игроки уходят, поэтому еженедельный перезапуск - стандартная практика на roleplay-серверах.
Обновление фреймворка без потерянных выходных#
Обновления фреймворка - не то же самое, что обновления плагинов. Релиз ядра может изменить столбцы базы данных, переименовать события и сломать разом все ресурсы, написанные под старые имена.
- Прочтите примечания к релизу о несовместимых изменениях, прежде чем что-либо скачивать. У повышения мажорной версии ESX или QBCore обычно есть список миграции.
- Сначала экспортируйте базу данных. Любое обновление ядра, затрагивающее схему, необратимо на обратном пути.
- Запустите новое ядро на втором сервере с копией базы данных и вашим настоящим списком ресурсов и зайдите в игру. Тестовый сервер в том же аккаунте стоит один небольшой тариф и спасает именно этот вечер.
- Обновляйте фреймворк и зависящие от него ресурсы вместе, а не по одному.
- Храните старую папку
resources/как архив, пока новая не переживёт полную игровую сессию. Дисциплина отката описана в статье что делать, когда обновление мода всё ломает.
На RE:NODE для серверов FiveM доступен txAdmin, файловый менеджер распаковывает архивы на месте, так что релиз ресурса попадает прямо в resources/, SFTP есть на каждом сервере для массовой загрузки, а вкладка Schedules может выполнять еженедельный перезапуск. Лицензионный ключ ваш, из портала Cfx.re, а не наш, поэтому он переезжает вместе с вами.
FAQ#
Можно ли запускать ресурсы ESX и QBCore на одном сервере?
Нет. У них разные объекты, разные события и разные схемы базы данных. Несколько ресурсов написаны так, что определяют оба, а Qbox намеренно отвечает как qb-core ради совместимости, но скрипт работы esx_ на сервере QBCore нужно переписывать, а не настраивать.
Какой фреймворк выбрать совсем новому серверу?
QBCore, если у вас нет особой причины. На него рассчитано большинство бесплатных ресурсов, большинство платных скриптов и почти все руководства, а это в полночь, когда вы застряли, значит гораздо больше любого архитектурного довода. Выбирайте Qbox, если собираетесь писать собственные ресурсы и вам комфортно читать исходный код.
Нужно ли платить за ресурсы?
Нет, но большинство серверов платят. Бесплатного пула вполне хватает для работ, магазинов, гаражей и инвентарей. Платные скрипты покупают отполированность и поддержку. Чего нельзя делать - устанавливать утёкшие платные скрипты: это самый частый путь бэкдора на сервер FiveM, а тот, кто дал вам файл, не является автором.
Откуда берутся работы в каждом фреймворке?
ESX читает их из таблиц jobs и job_grades в базе данных, так что новая работа - это вставка. QBCore и Qbox читают их из общего файла Lua, так что новая работа - это запись в таблице и перезапуск. Всем трём затем нужен ресурс работы, чтобы этой работе было чем заниматься.
Сколько памяти нужно серверу на фреймворке?
Два гигабайта тянут ядро и несколько работ для тестирования. Четыре - реалистичный минимум для публичного сервера, а полный список roleplay на 64 игрока обычно укладывается в шесть-восемь. Если вы выше при менее чем 200 ресурсах, что-то течёт, а не занято работой.
Нужен ли мне собственный лицензионный ключ?
Да. FXServer не запустится без лицензионного ключа Cfx.re, выданного вам на портале Cfx.re, а он привязан к адресу, на котором работает, так что перенос сервера означает перевыпуск ключа, а не копирование.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.