Перейти к основному содержимому

🧩 Создание пользовательского моста для фреймворка

Dream Bridge поддерживает ESX, QBCore и QBX из коробки. Если вы используете другой или измененный фреймворк, вы можете реализовать свой пользовательский мост, чтобы обеспечить совместимость.

Это руководство поможет вам создать новый мост, используя предоставленный встроенный шаблон custom.

💡 Примечание: QBX (Qbox) полностью совместим с мостом QBCore. Отдельная реализация не требуется.


📁 Структура моста

Все мосты находятся в папке bridge/. У каждого фреймворка (например, esx, qbcore, custom) есть своя подпапка с:

  • client.lua
  • server.lua
Структура моста

Мост автоматически определяет ваш активный фреймворк через GetResourceState.

Важно: Если ваш ресурс фреймворка переименован (например, es_extendedroleplay_framework), автоматическое обнаружение может сбоить.


🚀 Как использовать пользовательский мост

Используйте мост custom:

  • Вы используете автономный или неофициальный/неподдерживаемый фреймворк
    ➡️ Создайте новый мост на основе шаблона custom.
  • Вам нужно отредактировать/изменить что-то в существующем мосте.
    ➡️ Попробуйте сначала отредактировать существующий мост. Например, ваша таблица owned_vehicles отличается от стандартной. В этом случае вам просто нужно отредактировать функции, связанные с транспортом, в существующем мосте. Нет необходимости создавать новый или редактировать все.
  • Поддерживаемый фреймворк не обнаружен по умолчанию.
    ➡️ Если вы переименовали ресурс вашего фреймворка, он может не быть обнаружен автоматически (например, es_extended -> roleplay_framework). В этом случае вам нужно добавить GetResourceState для вашего переименованного ресурса в правильный файл моста. Получение состояния ресурса пользовательского моста

🛠️ Начало работы

  1. Скопируйте папку bridge/custom
    Переименуйте ее, чтобы соответствовать названию вашего пользовательского фреймворка (например, bridge/myframework).
  2. Измените client.lua и server.lua
    Реализуйте свою логику в предоставленных заглушках функций.
  3. Настройте логику обнаружения фреймворка
    Замените или расширьте проверки GetResourceState для обнаружения вашего пользовательского фреймворка.

✅ Пример: client.lua

Пример client.lua
if GetResourceState('my_framework') ~= 'started' then return end

DreamFramework.ServerFramework = 'myframework'
DreamFramework.ServerFrameworkLoaded = true

function DreamFramework.showHelpNotification(text)
-- Ваш пользовательский код отображения справки
end

function DreamFramework.getPlayerJobName()
return exports['my_framework']:GetJobName()
end

✅ Пример: server.lua

Пример server.lua
if GetResourceState('my_framework') ~= 'started' then return end

DreamFramework.ServerFramework = 'myframework'
DreamFramework.ServerFrameworkLoaded = true

function DreamFramework.getPlayerFromId(source)
return exports['my_framework']:GetPlayer(source)
end

function DreamFramework.getPlayerMoney(source, account)
local player = DreamFramework.getPlayerFromId(source)
return player.money or 0
end

🧠 Какие функции нужно реализовать?

Ваш мост должен реализовать все функции, включенные в пользовательский шаблон и все другие мосты. Сюда входят:

  • Функции игрока (например, getPlayerFromId, getPlayerName)
  • Управление работой
  • Инвентарь и деньги
  • Собственность на транспорте
  • События типа OnPlayerLoaded, OnPlayerJobChange
  • Любые другие функции, которые есть в мосте... Проверьте файлы bridge/custom/client.lua и bridge/custom/server.lua для полного списка необходимых функций.
⚠️ Обязательные функции обязательны

Каждая функция в шаблоне моста должна быть реализована в вашем пользовательском мосту.
Если хотя бы одна функция отсутствует, ваш фреймворк скорее всего выдаст несколько ошибок, нарушит скрипты, полагающиеся на эти функции, и вызовет непредвиденное поведение.

➡️ Проверьте bridge/myframework/client.lua и bridge/myframework/server.lua, чтобы убедиться в полном покрытии функций.

Отсутствующие функции = неполноценный опыт.


⏰ Обработка событий

Некоторые события должны быть запущены вручную для совместимости:

RegisterNetEvent('myfw:playerLoaded', function(playerId)
OnPlayerLoaded(playerId)
end)

RegisterNetEvent('myfw:jobChanged', function(playerId, newJob)
OnPlayerJobChange(playerId, newJob.name)
end)

💬 Советы

  • Используйте журналы типа print("[Мост] Загружен пользовательский мост") для упрощения отладки.
  • Тестируйте каждую функцию отдельно в контролируемой среде.
  • Используйте папку custom в качестве базы — она уже заполнена всеми необходимыми заглушками.

🙌 Внесите свой вклад в мост

Создали рабочий мост для своего собственного фреймворка?
Не стесняйтесь поделиться им с нами — помогите другим воспользоваться вашей интеграцией!

🧠 Ваш вклад может стать частью официального проекта, и вы получите полное признание за свою работу.
💡 Если у вас есть вопросы или вам нужна помощь, не стесняйтесь обращаться к нам на нашем сервере Discord.


Счастливого кодинга! 🚀