🧩 Створення власного моста для фреймворку
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
🧠 Які функції потрібно реалізувати?
Ваш міст повинен реалізувати всі функції, включені в шаблон custom та всі інші мости. Це включає:
- Функції гравця (наприклад, 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.
Щасливого кодування! 🚀