🧩 Создание пользовательского моста для фреймворка
Dream Bridge поддерживает ESX, QBCore и QBX из коробки. Если вы используете другой или измененный фреймворк, вы можете реализовать свой пользовательский мост, чтобы обеспечить совместимость.
Это руководство поможет вам создать новый мост, используя предоставленный встроенный шаблон custom.
💡 Примечание: QBX (Qbox) полностью совместим с мостом QBCore. Отдельная реализация не требуется.
📁 Структура моста
Все мосты находятся в папке bridge/.
У каждого фреймворка (например, esx, qbcore, custom) есть своя подпапка с:
- client.lua
- server.lua
 
Мост автоматически определяет ваш активный фреймворк через GetResourceState.
Важно: Если ваш ресурс фреймворка переименован (например,
es_extended→roleplay_framework), автоматическое обнаружение может сбоить.
🚀 Как использовать пользовательский мост
Используйте мост custom:
- Вы используете автономный или неофициальный/неподдерживаемый фреймворк 
 ➡️ Создайте новый мост на основе шаблонаcustom.
- Вам нужно отредактировать/изменить что-то в существующем мосте. 
 ➡️ Попробуйте сначала отредактировать существующий мост. Например, ваша таблица owned_vehicles отличается от стандартной. В этом случае вам просто нужно отредактировать функции, связанные с транспортом, в существующем мосте. Нет необходимости создавать новый или редактировать все.
- Поддерживаемый фреймворк не обнаружен по умолчанию. 
 ➡️ Если вы переименовали ресурс вашего фреймворка, он может не быть обнаружен автоматически (например,es_extended->roleplay_framework). В этом случае вам нужно добавитьGetResourceStateдля вашего переименованного ресурса в правильный файл моста. 
🛠️ Начало работы
- Скопируйте папку bridge/custom
 Переименуйте ее, чтобы соответствовать названию вашего пользовательского фреймворка (например,bridge/myframework).
- Измените client.luaиserver.lua
 Реализуйте свою логику в предоставленных заглушках функций.
- Настройте логику обнаружения фреймворка 
 Замените или расширьте проверкиGetResourceStateдля обнаружения вашего пользовательского фреймворка.
✅ Пример: 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
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.
Счастливого кодинга! 🚀