Cómo funcionan las integraciones#
Nada en la lógica propia del trabajo sabe qué framework, script de llaves o sistema de ropa usas. Cada uno de ellos está detrás de un pequeño archivo puente abierto, y el correcto se elige según lo que ya está en ejecución cuando se inicia el recurso:
Capa | Compatibles | Sin él |
|---|---|---|
Framework | es_extended · qb-core · qbx_core | Obligatorio. No hay modo independiente. |
Llaves de vehículos | qs-vehiclekeys · qb-vehiclekeys · qbx_vehiclekeys · F_RealCarKeysSystem · fivecode_carkeys · glfp10_carkeys · mono_carkeys · ti_vehicleKeys · vehicles_keys · wasabi_carlock · xd_locksystem | No se entrega ninguna llave. El autobús aparece con el motor encendido. |
Target | ox_target · qb-target | Los jugadores se acercan al despachador y pulsan E. |
Ropa | esx_skin + skinchanger · qb-clothing, y cualquier cosa que responda a sus eventos | Desactiva |
Combustible | LegacyFuel, o cualquier recurso con un export | El depósito queda como apareció el autobús. |
Text UI | qs-textui | Texto 3D simple dibujado por el script. |
Notificaciones | Integradas, o cualquier sistema mediante | — |
Inventario | qs-inventory | Sin bloqueo del inventario al cambiarse de ropa, y sin misiones. |
Dinero del trabajo | qs-job-management | Los pagos de las rutas van al efectivo del conductor. |
Marcador | qs-scoreboard, o cualquier script que lea | — |
Base de datos | oxmysql | Obligatorio. |
La detección solo ve los recursos que ya están iniciados. Todo lo que quieras que encuentre debe tener su
ensurepor encima deqs-busjobenserver.cfg.
Notificaciones y avisos#
Notificaciones#
Por defecto, el trabajo dibuja sus propias notificaciones — subidas de nivel, pagos, penalizaciones por choques, tarifas — con un sonido para cada tipo. Para enviarlas a tu propio sistema, desactiva Config.DefaultNotifications y completa SendTextMessage en config/config.lua. Se ejecuta en el cliente y recibe el texto y un tipo — 'info', 'error' o 'success':
-- config/config.lua
Config.DefaultNotifications = false
function SendTextMessage(msg, type)
-- ox_lib
lib.notify({ description = msg, type = type == 'info' and 'inform' or type })
-- or any other resource, e.g.:
-- exports['okokNotify']:Alert('Bus', msg, 5000, type)
endLas indicaciones "press E" de la esquina forman parte de la interfaz y se dibujan en cualquier caso.
Avisos 3D y la moneda#
Con qs-textui en ejecución, los avisos "[E]" del despachador, las paradas y el punto de devolución los dibuja ese recurso; si no, el script dibuja texto 3D simple. Config.DrawText3D = false deja solo la indicación de la esquina. Cada precio mostrado usa el símbolo CURRENCY_TYPE de tu idioma en translations.lua, colocado según Config.CurrencyPosition — 'prefix' para $500, 'suffix' para 500 zł.
Llaves de vehículos#
Las llaves del autobús se entregan al conductor cuando aparece y se retiran cuando se elimina, mediante el script de llaves que esté en ejecución. Cada uno tiene su propio puente en client/vehiclekeys/, y el nombre detectado termina en Config.Vehiclekeys. Para fijar uno a mano — cuando se ejecutan dos scripts de llaves a la vez, o el tuyo fue renombrado — reemplaza la línea de detección:
-- config/config.lua
-- Auto, the default: the first running resource in the list wins.
Config.Vehiclekeys = dependencyCheck(vehicleKeys) or 'none'
-- Pinned: always this bridge, whatever is running.
Config.Vehiclekeys = 'qs-vehiclekeys'Añadir un sistema de llaves#
Copia un puente
Copia
client/vehiclekeys/none.lua— o el puente más parecido al tuyo — a un archivo nuevo con el nombre de tu recurso de llaves. Se cargan todos los archivos de esa carpeta, y cada uno solo se ejecuta cuando su nombre coincide conConfig.Vehiclekeys.Cambia la condición y las dos llamadas
lua -- client/vehiclekeys/my_keys.lua if Config.Vehiclekeys ~= 'my_keys' then return end function AddVehiclekeys(vehicle, plate) exports['my_keys']:GiveKeys(plate) end function RemoveVehiclekeys(vehicle, plate) exports['my_keys']:RemoveKeys(plate) endRegístralo para la detección
Añade una línea a la lista
vehicleKeysenconfig/config.lua— el nombre del recurso en ejecución y, después, el nombre de tu puente:lua local vehicleKeys = { ['qs-vehiclekeys'] = 'qs-vehiclekeys', -- ... ['my_keys'] = 'my_keys', }
Target#
El target no se detecta: actívalo e indica su nombre. El despachador tendrá entonces una opción Start working a 3 m o menos (TARGET_START_WORKING en las traducciones), y el aviso de tecla del despachador se desactiva. Las paradas y el punto de devolución siempre usan la tecla.
Config.Target = true
Config.TargetScript = 'ox' -- 'ox' for ox_target, 'qb' for qb-targetRopa#
En ESX, el uniforme se pone mediante esx_skin y skinchanger:loadClothes, y después se vuelve a cargar el aspecto guardado del personaje. En QBCore y Qbox pasa por qb-clothing:client:loadOutfit y se restaura con qb-clothes:loadPlayerSkin, así que los scripts de apariencia que responden a los eventos de qb-clothing funcionan tal cual. Para illenium-appearance, client/clothing.lua tiene su evento de recarga listo como una línea comentada junto a la de qb-clothes:
-- client/clothing.lua, when the route ends (QBCore / Qbox)
TriggerServerEvent("qb-clothes:loadPlayerSkin")
--TriggerEvent("illenium-appearance:client:reloadSkin")El atuendo en sí se define al principio del mismo archivo — consulta El uniforme.
Combustible#
Con Config.Fuel = true, el autobús se llena hasta 100 al aparecer, mediante Config.FuelExport:SetFuel(vehicle, 100.0). Apúntalo a cualquier recurso de combustible con ese export:
Config.Fuel = true
Config.FuelExport = exports['LegacyFuel']
-- Config.FuelExport = exports['cdn-fuel']
-- Config.FuelExport = exports['ps-fuel']Deja Config.Fuel desactivado para scripts de combustible sin un export SetFuel.
Registros de Discord#
Todo lo que mueve dinero o experiencia puede publicarse en Discord como un embed, coloreado por tipo para que un canal se lea de un vistazo. Los registros están desactivados hasta que configures Enabled y pegues una URL de webhook.
Evento | Se envía cuando | Campos |
|---|---|---|
| Se toma una ruta desde el panel. | Autobús, paradas, pago, experiencia |
| Se devuelve el autobús y la ruta paga. | Pago, experiencia, penalización por choques |
| Se abandona una ruta desde el panel, o se deja al desconectarse. | Pasajeros a bordo |
| Un pago de ruta y cada tarifa de billete que recibe un conductor. | Importe, concepto, pasajero |
| Se otorga experiencia. | Ganada, nivel antes → después, hacia el siguiente, total |
-- config/config.lua
Config.Webhooks = {
Enabled = true,
Url = 'https://discord.com/api/webhooks/…', -- the shared channel
Name = 'qs-busjob',
Avatar = '', -- an image URL, or '' for none
Timestamp = true,
Events = {
MissionStarted = true, -- to the shared Url
MissionFinished = true,
MissionAbandoned = false, -- not sent
MoneyPaid = 'https://discord.com/api/webhooks/…', -- a staff channel of its own
ExperienceGiven = true,
},
}Cada evento acepta true (el compartido, Url), false (desactivado) o una URL propia. El pie de cada embed indica el jugador, su server id y su identificador.
Misiones de qs-inventory#
Con qs-inventory en ejecución y Config.QuasarInventoryQuests = true, se crean tres misiones de conductor de autobús para cada jugador al entrar — y para todos los que ya están conectados cuando se inicia el recurso — y el progreso se informa mientras juegan:
Misión | Avanza cuando |
|---|---|
| El conductor sube de nivel. |
| Se completa y se paga una ruta. |
| Un pasajero jugador le paga un billete al conductor. |
Los títulos, las descripciones y las recompensas se definen en server/missions.lua. Mantén los valores name de las misiones tal como están: el progreso se informa según esos nombres.
Dinero del trabajo y el marcador#
Cuando qs-job-management está en ejecución, cada pago de ruta se le entrega (AddJobMoney, en el trabajo bus_driver) en lugar de ir directamente al efectivo del conductor. Las tarifas de billetes y los premios de la clasificación siempre se pagan en efectivo.
qs-scoreboard cuenta los conductores de autobús de servicio mediante el export getOnDutyCount. Un conductor está de servicio desde que empieza una ruta hasta que se completa o se abandona. Cualquier otro marcador puede leer el mismo export — consulta Comandos y exports.
Idiomas#
Se incluyen once traducciones completas en config/translations.lua: inglés (en), italiano (it), español (es), francés (fr), portugués (pt), alemán (de), ruso (ru), turco (tr), neerlandés (nl), chino simplificado (cn) y chino tradicional (zh-tw). Elige uno con Config.Language al principio del archivo.
-- config/translations.lua
Config.Language = 'es'Cualquier línea puede reescribirse directamente — cambia solo el texto entre comillas. Una línea que falte en tu idioma recurre al inglés en lugar de mostrar su clave sin procesar. Para un idioma que no está en la lista, copia el bloque ['en'], dale un código nuevo, tradúcelo y establece Config.Language en ese código.



