RE:NODE

Руководства12 мин чтения

Фреймворки FiveM: сравнение ESX, QBCore и Qbox

Чем отличаются ESX, QBCore и Qbox, что нужно каждому под капотом, как загружаются ресурсы и какой фреймворк выбрать для нового roleplay-сервера.

0 прочтений

Выберите один фреймворк и стройте всё на нём. У 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 LegacyQBCoreQbox
Ядроes_extendedqb-coreqbx_core
Работы заданы втаблицах базы данныхshared/jobs.luashared/jobs.lua
Предметы заданы втаблице базы данныхshared/items.luaox_inventory
Инвентарьподключаемыйqb-inventoryox_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 это означает следующее:

server.cfg - order matters
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_policejob

ensure запускает ресурс или перезапускает, если он уже запущен, поэтому в файле конфигурации это правильный глагол. Каждая строка файла разобрана в статье server.cfg FiveM простыми словами.

Установка: рецепты txAdmin или вручную#

Установщик txAdmin умеет собирать сервер из рецепта - файла YAML, который скачивает репозитории, распаковывает их в resources/, импортирует SQL и записывает начальный server.cfg. В процессе настройки он запрашивает строку подключения к базе данных и создаёт таблицы в той базе, на которую вы укажете. В списке рецептов встречались шаблон Cfx по умолчанию, сборка ESX Legacy и сборки сообщества, и он меняется от версии к версии txAdmin, так что читайте, что предлагает ваша установка, а не то, что показывало видео двухлетней давности.

Рецепты стоит использовать ровно для одного: за десять минут поднять первый работающий сервер, чтобы увидеть, как выглядит неломающийся фреймворк. А затем посмотрите на то, что он вам дал.

code
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 работает, как бы глубоко вы его ни вложили.

Вручную это четыре шага, и вы должны уметь их выполнять:

  1. Скачайте релиз ядра для фреймворка, распакуйте его в resources/[core]/ и проверьте, что имя папки совпадает с тем, что документация велит указывать в ensure.
  2. Импортируйте SQL-дамп фреймворка в вашу базу данных. Сделайте это до первого запуска, а не после того, как всё зависло.
  3. Поместите строку подключения в server.cfg и добавьте строки ensure в порядке зависимостей.
  4. Запустите сервер с открытой консолью и читайте каждую строку, пока первый игрок не сможет появиться.

Манифест и что по нему можно узнать#

У каждого ресурса есть fxmanifest.lua. Прочитав его до установки, вы узнаете больше, чем из форумного поста, откуда он взят.

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, вызывать его методы.

ESX Legacy, server side
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)
QBCore, server side
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-560-1002 GBГолое ядро и несколько работ
16-32100-2004 GBТипичный первый публичный сервер
32-64200-3006-8 GBСтриминговые ассеты начинают иметь значение
64-128300+8-12 GBНужен человек, аудирующий ресурсы

Две вещи, которые действительно стоят памяти, а не CPU, - это стримящиеся ассеты (пользовательский транспорт, MLO, одежда) и ресурсы, кэширующие большие таблицы на каждого игрока. Обе растут вместе со списком ресурсов, и ни одна не уменьшается, когда игроки уходят, поэтому еженедельный перезапуск - стандартная практика на roleplay-серверах.

Обновление фреймворка без потерянных выходных#

Обновления фреймворка - не то же самое, что обновления плагинов. Релиз ядра может изменить столбцы базы данных, переименовать события и сломать разом все ресурсы, написанные под старые имена.

  1. Прочтите примечания к релизу о несовместимых изменениях, прежде чем что-либо скачивать. У повышения мажорной версии ESX или QBCore обычно есть список миграции.
  2. Сначала экспортируйте базу данных. Любое обновление ядра, затрагивающее схему, необратимо на обратном пути.
  3. Запустите новое ядро на втором сервере с копией базы данных и вашим настоящим списком ресурсов и зайдите в игру. Тестовый сервер в том же аккаунте стоит один небольшой тариф и спасает именно этот вечер.
  4. Обновляйте фреймворк и зависящие от него ресурсы вместе, а не по одному.
  5. Храните старую папку 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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000