Cómo funcionan las integraciones#
Nada dentro de Dealership Creator sabe qué framework, target o inventario usas. Cada recurso de terceros se alcanza a través de un contrato, y un pequeño archivo de puente por backend rellena ese contrato. La detección ocurre al arrancar, y la consola muestra lo que eligió.
Capa | Compatible | Sin él |
|---|---|---|
Framework |
| Funciona de forma independiente: su propia gestión del dinero y sin registro de coches — suficiente para probarlo en un servidor vacío. |
Vehículos | La tabla propia de tu framework — | Sigue al framework. Configúralo a mano solo cuando un garaje independiente gestione esa tabla. |
Target |
| Los mostradores y los coches de exhibición recurren a un marcador dibujado y una tecla. |
Inventario |
| Sin monedas de ítem. Todo lo demás funciona. |
Llaves de vehículos |
| Los coches comprados y los de prueba de conducción se entregan sin llave. |
Banca |
| Los pagos siguen funcionando; no se refleja ninguna línea en el extracto, y las cajas de los trabajos las gestiona el script. |
Teléfono |
| Solo notificaciones en pantalla, sin notificaciones push en el teléfono. |
Capturas de pantalla |
| El estudio fotográfico se oculta; las imágenes siguen siendo manuales. |
Notificaciones |
| ox_lib, que de todos modos es una dependencia — y la alternativa si la elegida llega a fallar. |
HUD |
| El HUD del jugador sigue en pantalla en las salas de exposición y las ventanas. |
Sincronización del clima |
| Nada que pausar. Con una sincronización no listada en marcha, el estudio fotográfico puede parpadear mientras ambas se disputan el reloj. |
Base de datos |
| Obligatoria. La única. |
Toda integración opcional se degrada en silencio. Un recurso que falta hace que su función se desactive, no que lance un error. Por eso importa el resumen de arranque — es el único lugar que te dice que falta una integración antes de que lo haga un jugador.
Notificaciones y el HUD#
Notificaciones#
Config.Notify decide cómo se ven los mensajes que aparecen sobre el juego — "tu coche ha sido entregado", "estás demasiado lejos". La detección elige el primer recurso de notificaciones que encuentra en ejecución; las notificaciones propias del framework ("qb", "qbx", "esx") solo se usan cuando las configuras a mano. Configura "interface" para las notificaciones propias del script, con el estilo de sus ventanas.
-- config/shared/config.lua
Config.Notify = "okokNotify" -- or leave the line commented and let it detectSi el sistema elegido llega a fallar — detenido, o con un export renombrado en una actualización —, el mensaje se muestra a través de ox_lib, así que no se pierde nada.
Ocultar el HUD del jugador#
Con un HUD compatible en ejecución, se oculta mientras se usa una sala de exposición, cualquiera de las ventanas, una prueba de conducción, el creador, las herramientas de amueblado o la herramienta de fotos, y vuelve en cuanto ninguno está en uso. Config.HideHud activa o desactiva cada uno de esos momentos:
Config.HideHud = {
window = true,
showroom = true,
testDrive = true,
creator = true,
decorate = true,
capture = true, -- or the HUD ends up in every catalogue picture
}Para un recurso de HUD o de notificaciones que no esté en la lista, configura el valor en "custom" y rellena la única función en client/custom/hud/custom.lua o client/custom/notify/custom.lua.
Logs de Discord#
Todo lo que hacen los jugadores en tus concesionarios puede publicarse en Discord como un embed — 47 tipos de log, cada uno con el jugador y sus identificadores, el coche y su imagen, la matrícula, el importe y el concesionario, en el idioma de tu servidor. Ambas tablas están en config/server/webhooks.lua.
Canal | Qué se envía ahí |
|---|---|
| Coches vendidos, recomprados, financiados, liquidados, embargados y alquilados. |
| Pruebas de conducción, tratos y comisiones del mostrador de ventas, la caja, el personal, los muebles y los coches de la explanada. |
| Rutas de reposición: pedidas, compradas directamente, entregadas, perdidas, fuera de tiempo, fallidas. |
| Concesionarios creados, editados, eliminados y traspasados, teletransportes, el catálogo, los ajustes. |
| Rechazos: un jugador que no estaba donde decía, una petición manipulada, una acción de administrador rechazada, un límite de frecuencia, un reembolso que hay que corregir a mano. |
| Todo lo que se envía a un canal sin URL. Déjalo vacío también y ese log no se envía. |
-- config/server/webhooks.lua
Config.Webhooks = {
default = '',
sales = 'https://discord.com/api/webhooks/...',
security = 'https://discord.com/api/webhooks/...',
}
Config.Logs = {
purchase = { channel = 'sales' }, -- the default
test_drive_started = { channel = 'https://discord.com/api/webhooks/...' }, -- a channel of its own
furniture_bought = { channel = 'activity', enabled = false }, -- never sent
}Config.LogOptions define el nombre y el avatar del webhook, qué identificadores se muestran bajo un jugador (discord se convierte en una mención clicable), si se adjunta la imagen del coche y si las tiendas con dueño pueden tener un canal propio. Ejecuta qs-dealership:testlogs en la consola del servidor para enviar una prueba a cada canal y ver cuáles aceptó Discord.
Un canal por concesionario#
Un dueño — o cualquier rango con el permiso settings — pega un webhook en el apartado Overview → Discord logs de su tienda en la ventana del jugador, y las ventas, el personal, la caja, las pruebas de conducción y las rutas de reposición de esa tienda se publican ahí además de en tus canales. Un administrador puede configurarlo en la pestaña Trading del creador. Solo se aceptan direcciones de webhook de Discord y, una vez guardada, la dirección nunca se vuelve a mostrar a un jugador.
Anular la detección#
Cada capa se detecta buscando recursos iniciados en orden de prioridad — gana el primero que se encuentra. Un valor explícito en config/shared/config.lua siempre tiene prioridad sobre la detección, y el resumen de arranque lo indica como (manual) para que veas que fue deliberado.
-- Auto, the default: the first started resource in the list wins.
Config.Inventory = ConfigAutoDetect('Inventory', {
'ox_inventory',
'qs-advanced-inventory',
'qs-inventory',
'qb-inventory',
}, 'vanilla')
-- Manual: skip detection entirely.
Config.Inventory = 'ox_inventory'Vale la pena hacerlo cuando hay dos candidatos en marcha a la vez, o cuando un recurso ha sido renombrado en tu servidor y la detección no lo ve con su nombre habitual. La detección solo ve recursos que ya están iniciados, así que todo lo que quieras que encuentre debe estar por encima de ensure qs-dealership en server.cfg.
Garajes, talleres de tuning y coches de reposición#
Los vehículos de las rutas de reposición y los coches de prueba de conducción no deben guardarse, modificarse ni venderse. A la mayoría de los scripts de garaje y de tuning se les puede indicar que los rechacen con una sola llamada, en el cliente:
if exports['qs-dealership']:IsTemporaryVehicle(vehicle) then
return -- a restock run or a test drive: not yours to store
endLos vehículos de reposición también llevan una clave de state bag replicada que cualquier script puede leer sin llamar a nada. IsMissionVehicle responde solo para las rutas de reposición, IsTestDriveVehicle solo para las pruebas de conducción. Consulta Comandos y exports.
Una moneda personalizada#
Una moneda VIP o de donador que vive en tu propia tabla, o en otro script, se conecta en un solo archivo: server/custom/currency/custom.lua. Tiene tres pequeñas funciones — leer un saldo, quitar una cantidad, devolver una cantidad — y dos ejemplos completos comentados: uno para una columna en tu propia tabla de usuarios y otro para los exports de otro recurso.
-- server/custom/currency/custom.lua
function Currency.Get(source, currencyId) ... end -- nil = cannot be read, 0 = has none
function Currency.Remove(source, currencyId, amount, reason) ... end
function Currency.Add(source, currencyId, amount, reason) ... endDescomenta el ejemplo que corresponda, cambia el nombre de la tabla o del export y reinicia. Hasta que ese archivo esté rellenado, la moneda no aparece en ningún sitio — una moneda que el servidor no puede leer nunca se ofrece con un saldo de cero.
Implementa
RemoveyAddjuntas. Un pago dividido cobra de varias monedas por turnos y, si una posterior falla, las anteriores se devuelven medianteAdd. Sin ella, una compra rechazada se quedaría en silencio con las monedas del jugador.
Añadir un backend#
Dar soporte a algo que no está en la lista es deliberadamente sencillo: un archivo más una línea. Nada más en el recurso cambia, porque nada más hace referencia nunca a tu framework por su nombre.
Copia el puente más parecido
Cada puente es un pequeño archivo sin cifrar en
client/custom/<kind>/oserver/custom/<kind>/. Copia el más parecido al tuyo —server/custom/inventory/ox_inventory.lua, por ejemplo — y renómbralo con el nombre de tu recurso.Cambia las llamadas de dentro
Cada puente está protegido para que solo se ejecute cuando es el backend elegido, y rellena unas pocas funciones con los exports propios de tu recurso:
lua if Config.Inventory ~= 'my_inventory' then return end function Inventory.GetItemCount(source, item) ... end function Inventory.RemoveItem(source, item, count) ... endRegístralo para la detección
Añade una entrada a la lista
ConfigAutoDetectcorrespondiente enconfig/shared/config.lua, para que se encuentre automáticamente y aparezca en el resumen de arranque.
Los frameworks, targets, llaves, banca y teléfonos se amplían exactamente igual, contra sus propios contratos. Si eso es más de lo que quieres asumir, envíanos el nombre del recurso.
Idiomas#
Se incluyen cinco traducciones completas en locales/: inglés (en), español (es), francés (fr), alemán (de) y portugués (pt). Configura Config.Locale en config/shared/config.lua. Para añadir otro, copia en.json con el nuevo código, tradúcelo y configura el locale con ese código — todo lo que quede sin traducir recurre al inglés.



