Saltar al contenido principal

🧩 Crear un puente personalizado de marco

Dream Bridge admite ESX, QBCore y QBX de forma nativa. Si estás usando otro marco o uno modificado, puedes implementar tu propio puente personalizado para garantizar la compatibilidad.

Esta guía te muestra cómo crear un nuevo puente utilizando la plantilla integrada custom.

💡 Nota: QBX (Qbox) es totalmente compatible con el puente de QBCore. No se necesita una implementación separada.


📁 Estructura del puente

Todos los puentes se encuentran en la carpeta bridge/. Cada marco (por ejemplo, esx, qbcore, custom) tiene su propia subcarpeta con:

  • client.lua
  • server.lua
Bridge Structure

El puente detecta automáticamente tu marco activo mediante GetResourceState.

Importante: Si tu recurso de marco se renombra (por ejemplo, es_extendedroleplay_framework), la detección automática podría fallar.


🚀 Cómo usar el puente personalizado

Usa el puente custom:

  • Estás usando un marco independiente o no oficial/no compatible
    ➡️ Crea un nuevo puente basado en la plantilla custom.
  • Necesitas editar/cambiar algo en un puente existente.
    ➡️ Intenta editar primero el puente existente. Por ejemplo, tu tabla owned_vehicles es diferente de la predeterminada. En este caso solo necesitas editar las funciones relacionadas con vehículos en el puente existente. No es necesario crear uno nuevo o editar todo.
  • Ningún marco compatible se detecta por defecto.
    ➡️ Si has renombrado tu recurso de marco, quizás no se detecte automáticamente (por ejemplo, es_extendedroleplay_framework). En este caso, debes usar GetResourceState en tu recurso renombrado en el archivo de puente correcto. Custom Bridge GetResourceState

🛠️ Comenzando

  1. Copia la carpeta bridge/custom
    Renómbrala para que coincida con el nombre de tu marco personalizado (por ejemplo, bridge/myframework).
  2. Modifica tanto client.lua como server.lua
    Implementa tu lógica en las funciones proporcionadas.
  3. Ajusta la lógica de detección del marco
    Reemplaza o extiende las comprobaciones de GetResourceState para detectar tu marco personalizado.

✅ Ejemplo: client.lua

Ejemplo client.lua
if GetResourceState('my_framework') ~= 'started' then return end

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

function DreamFramework.showHelpNotification(text)
-- Tu código personalizado para mostrar ayuda
end

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

✅ Ejemplo: server.lua

Ejemplo 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

🧠 ¿Qué funciones deben implementarse?

Tu puente debe implementar todas las funciones incluidas en la plantilla personalizada y en otros puentes. Esto incluye:

  • Funciones de jugador (por ejemplo, getPlayerFromId, getPlayerName)
  • Gestión de empleos
  • Inventario & dinero
  • Propietario de vehículos
  • Eventos como OnPlayerLoaded, OnPlayerJobChange
  • Cualquier otra función que tenga el puente... Revisa los archivos bridge/custom/client.lua y bridge/custom/server.lua para obtener la lista completa de funciones necesarias.
⚠️ Las funciones obligatorias son imperativas

Cada función en la plantilla del puente debe implementarse en tu puente personalizado.
Si falta una sola función, tu marco probablemente lanzará múltiples errores, romperá scripts que dependan de esas funciones y causará comportamiento inesperado.

➡️ Revisa bridge/myframework/client.lua y bridge/myframework/server.lua para asegurarte de tener cobertura completa de funciones.

Funciones faltantes = experiencia rota.


⏰ Manejo de eventos

Algunos eventos deben activarse manualmente para la compatibilidad:

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

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

💬 Consejos

  • Usa registros como print("[Bridge] Cargado puente personalizado") para facilitar el depuración.
  • Prueba cada función individualmente en un entorno controlado.
  • Utiliza la carpeta custom como base — ya está prellenada con todas las funciones necesarias.

🙌 Contribuye con tu puente

¿Hiciste un puente funcional para tu marco?
¡No dudes en compartírnoslo! Ayuda a otros a beneficiarse de tu integración.

🧠 Tu contribución puede convertirse parte del proyecto oficial, y recibirás todo el crédito por tu trabajo.
💡 Si tienes alguna pregunta o necesitas ayuda, no dudes en contactarnos en nuestro servidor de Discord.


¡Feliz programación! 🚀