🧩 Tworzenie niestandardowego mostu ramowego
Dream Bridge obsługuje ESX, QBCore i QBX od razu. Jeśli korzystasz z innego lub zmodyfikowanego ramowego systemu, możesz zaimplementować swój niestandardowy most w celu zapewnienia kompatybilności.
Ten przewodnik przeprowadzi cię przez tworzenie nowego mostu przy użyciu wbudowanego szablonu custom.
💡 Wskazówka: QBX (Qbox) jest w pełni kompatybilny z mostem QBCore. Nie jest wymagana osobna implementacja.
📁 Struktura mostu
Wszystkie mosty znajdują się w folderze bridge/.
Każdy ramowy system (np. esx, qbcore, custom) ma swój własny podfolder z:
- client.lua
- server.lua
 
Most automatycznie wykrywa aktywny ramowy system za pomocą GetResourceState.
Ważne: Jeśli zasób twojego ramowego systemu zostanie zmieniony nazwę (np.
es_extended→roleplay_framework), automatyczne wykrywanie może zawieść.
🚀 Jak używać niestandardowego mostu
Użyj mostu custom:
- Korzystasz z samodzielnego lub nieoficjalnego/niewspieranego ramowego systemu 
 ➡️ Stwórz nowy most oparty na szabloniecustom.
- Musisz edytować/zmienić coś w istniejącym moście. 
 ➡️ Spróbuj najpierw edytować istniejący most. np. Tabela owned_vehicles różni się od domyślnej. W tym przypadku wystarczy edytować funkcje związane z pojazdami w istniejącym moście. Nie trzeba tworzyć nowego ani edytować wszystkiego.
- Żaden obsługiwany ramowy system nie jest wykrywany domyślnie. 
 ➡️ Jeśli zmieniłeś nazwę zasobu ramowego, może nie zostać on automatycznie wykryty (np.es_extended->roleplay_framework). W takim przypadku musisz dodaćGetResourceStatedo swojego zasobu o zmienionej nazwie w odpowiednim pliku mostu. 
🛠️ Rozpoczęcie pracy
- Skopiuj folder bridge/custom
 Zmień nazwę, aby pasowała do nazwy twojego niestandardowego ramowego systemu (np.bridge/myframework).
- Zmodyfikuj zarówno client.lua, jak iserver.lua
 Wprowadź swoją logikę w dostarczone szablony funkcji.
- Dostosuj logikę wykrywania ramowego systemu 
 Zastąp lub rozszerz sprawdzeniaGetResourceState, aby wykryć twój niestandardowy ramowy system.
✅ Przykład: client.lua
if GetResourceState('my_framework') ~= 'started' then return end
DreamFramework.ServerFramework = 'myframework'
DreamFramework.ServerFrameworkLoaded = true
function DreamFramework.showHelpNotification(text)
    -- Twój niestandardowy kod wyświetlania pomocy
end
function DreamFramework.getPlayerJobName()
    return exports['my_framework']:GetJobName()
end
✅ Przykład: 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
🧠 Jakie funkcje należy zaimplementować?
Twój most musi implementować wszystkie funkcje zawarte w szablonie custom oraz innych mostach. Obejmuje to:
- Funkcje gracza (np. getPlayerFromId,getPlayerName)
- Zarządzanie pracą
- Inwentarz i pieniądze
- Własność pojazdów
- Zdarzenia takie jak OnPlayerLoaded,OnPlayerJobChange
- Jakiekolwiek inne funkcje, które ma most...
Sprawdź pliki bridge/custom/client.luaibridge/custom/server.luaw celu uzyskania pełnej listy wymaganych funkcji.
Każda pojedyncza funkcja w szablonie mostu musi być zaimplementowana w twoim niestandardowym moście.
Jeśli brakuje nawet jednej funkcji, twój ramowy system prawdopodobnie wyświetli wiele błędów, przerwie skrypty polegające na tych funkcjach i spowoduje niespodziewane zachowanie.
➡️ Sprawdź podwójnie pliki bridge/myframework/client.lua i bridge/myframework/server.lua, aby upewnić się, że wszystkie funkcje są zaimplementowane.
Brakujące funkcje = złe doświadczenie.
⏰ Obsługa zdarzeń
Niektóre zdarzenia muszą być wyzwalane ręcznie w celu zapewnienia kompatybilności:
RegisterNetEvent('myfw:playerLoaded', function(playerId)
    OnPlayerLoaded(playerId)
end)
RegisterNetEvent('myfw:jobChanged', function(playerId, newJob)
    OnPlayerJobChange(playerId, newJob.name)
end)
💬 Wskazówki
- Używaj logów, takich jak print("[Most] Załadowano niestandardowy most"), aby ułatwić debugowanie.
- Testuj każdą funkcję osobno w kontrolowanym środowisku.
- Skorzystaj z folderu customjako bazy — jest już wypełniony wszystkimi wymaganymi szablonami.
🙌 Przekaż swój most
Stworzyłeś działający most dla własnego ramowego systemu?
Nie krępuj się podzielić się nim z nami — pomóż innym skorzystać z twojej integracji!
🧠 Twoja kontrybucja może stać się częścią oficjalnego projektu, a ty otrzymasz pełne uznanie za swoją pracę.
💡 Jeśli masz jakiekolwiek pytania lub potrzebujesz pomocy, śmiało skontaktuj się z nami na naszym serwerze Discord.
Miłego kodowania! 🚀