Cómo funcionan las integraciones#
Lifeguard Job revisa lo que ya está en marcha al iniciarse y se conecta a ello. Todo lo que se comunica con otro recurso vive en un archivo pequeño y sin cifrar — client/framework/, server/framework/, client/vehiclekeys/ y config/ — así que dar soporte a algo nuevo nunca implica tocar el núcleo cifrado.
Capa | Compatible | Sin él |
|---|---|---|
Framework | es_extended · qb-core · qbx_core | Obligatorio — las estaciones nunca aparecen sin uno. |
Target | ox_target, con | Avisos al acercarse con |
Llaves de vehículos | qs-vehiclekeys · qb-vehiclekeys · qbx_vehiclekeys · wasabi_carlock · vehicles_keys · ti_vehicleKeys · xd_locksystem · mono_carkeys · glfp10_carkeys · fivecode_carkeys · F_RealCarKeysSystem | El paso de las llaves no hace nada — ideal para servidores sin script de cerraduras. |
Uniforme | esx_skin + skinchanger · qb-clothing | Pon |
Combustible | Cualquier script con un export | Con |
Barras de progreso | qs-interface | La barra de progreso de ox_lib. |
Pago del trabajo | qs-job-management | El pago va directo al efectivo del jugador. |
Notificaciones | Integradas, o cualquier sistema que indiques | Las notificaciones propias del trabajo. |
La detección se ejecuta una sola vez, al iniciarse el recurso, y solo ve los recursos que ya están iniciados. Todo lo que quieras que se detecte debe estar por encima de
ensure qs-lifeguardenserver.cfg.
Target o avisos#
Config.Target decide cómo interactúa un socorrista con el capitán y con todo lo que hay en una llamada:
Config.Target = false. Acércate y aparece un aviso [E] junto a la persona u objeto; pulsa E. Con qs-textui en marcha, el aviso lo dibuja él; si no, se muestra como texto 3D en el mundo. No hay que instalar nada más.
Config.Target = true. Las mismas opciones aparecen en el third eye: la opción de la estación lleva el nombre de la estación, y cada llamada añade sus propias opciones a las personas y lugares implicados. Necesita que ox_target se inicie antes que el trabajo.
El minijuego de RCP siempre usa una pulsación de tecla, definida por Config.InteractKey (un id de control, 38 es E) y la letra que se muestra para ella, Config.InteractKeyLabel.
Llaves de vehículos#
El script de cerraduras compatible que esté en marcha recibe las llaves del ATV o de la moto acuática cuando se retira, y se las quita cuando se guarda, así que nadie conserva llaves de una matrícula que ya no existe. Para dar soporte a otro, añade un archivo a client/vehiclekeys/ — copia el existente más parecido:
-- 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)
endDespués añádelo a la lista de detección en config/config.lua, con el nombre del recurso a la izquierda y el del archivo a la derecha:
local vehicleKeys = {
['qs-vehiclekeys'] = 'qs-vehiclekeys',
-- ...
['my_keys'] = 'my_keys',
}Combustible#
Activa Config.Fuel y cada vehículo que retire un socorrista se llena hasta 100. Apunta Config.FuelExport a cualquier script de combustible que exponga SetFuel(vehicle, amount):
Config.Fuel = true
Config.FuelExport = exports['LegacyFuel'] -- or exports['ps-fuel'], exports['cdn-fuel'], ...El uniforme#
Con Config.Clothing = true el uniforme se pone al empezar un turno y la skin propia del jugador vuelve al terminar. Se define por género en config/clothing.lua, con los nombres de componentes de skinchanger; descomenta una línea para vestir también esa ranura:
male = {
['arms'] = 15,
['tshirt_1'] = 15, ['tshirt_2'] = 0,
['torso_1'] = 15, ['torso_2'] = 0,
['pants_1'] = 18, ['pants_2'] = 3,
['shoes_1'] = 34, ['shoes_2'] = 0,
['helmet_1'] = -1, ['helmet_2'] = 0,
['chain_1'] = 0, ['chain_2'] = 0,
-- ['glasses_1'] = 0, ['glasses_2'] = 0,
},En ESX se aplica mediante esx_skin y skinchanger; en QBCore, mediante el evento de outfit de qb-clothing. Para otro recurso de ropa, las dos funciones que ponen y quitan el uniforme — ApplyJobClothes y RemoveJobClothes — están en el mismo archivo y pueden apuntar a él. O pon Config.Clothing = false y deja que los jugadores usen su propio armario.
Notificaciones y barras de progreso#
Los mensajes emergentes — pago recibido, subida de nivel, una llamada fallida — son los propios del trabajo por defecto. Para enviarlos a través de tu sistema de notificaciones, edita CreateNotification en client/framework/esx.lua (o qb.lua) y reemplaza la línea que llama a Notify. Deja el resto de la función como está: también controla el panel de ayuda que explica cada llamada.
if Config.DefaultNotifications and action == 'notify' then
-- Notify({ title = type, message = text }) -- the built-in one
lib.notify({
type = type == 'info' and 'inform' or type, -- success · error · info
description = text,
})
else
SendNUIMessage({ action = action, type = type, text = text })
endLas barras de progreso usan qs-interface cuando está en marcha y la de ox_lib en caso contrario; la elección es la función ProgressBar del mismo archivo.
Logs de Discord#
Desactivados por defecto. Cada evento de abajo puede publicarse en Discord como un embed de color, con el nombre y el identificador del jugador en el pie:
Evento | Se envía cuando |
|---|---|
| Se asigna una llamada a un socorrista. |
| Se completa una llamada y se paga. |
| Una llamada se quedó sin tiempo o se abandonó. |
| Se entrega dinero a un jugador por una llamada. |
| Se otorga experiencia, con el nivel antes y después. |
| Se cambia o restablece un ajuste desde el panel de ajustes. |
Actívalos en config/config.lua:
Config.Webhooks = {
Enabled = true,
Name = 'qs-lifeguard', -- the bot's name
Avatar = '', -- an image URL, or '' for none
Timestamp = true,
Events = {
MissionStarted = true,
MissionFinished = true,
MissionAbandoned = true,
MoneyPaid = true,
ExperienceGiven = true,
ConfigChanged = true,
},
}Las URL van en server.cfg, no en la config. Una para todo, más un canal propio opcional para cualquier evento — su nombre en minúsculas:
set qs_lifeguard_webhook "https://discord.com/api/webhooks/..."
# Optional: money and experience to a staff-only channel
set qs_lifeguard_webhook_moneypaid "https://discord.com/api/webhooks/..."
set qs_lifeguard_webhook_experiencegiven "https://discord.com/api/webhooks/..."El envío es de tipo fire-and-forget: un webhook caído nunca retrasa ni le cuesta a nadie un pago.
Otros recursos de Quasar#
Recurso | Qué pasa cuando está en marcha |
|---|---|
Cada pago, individual y cooperativo, se realiza a través de él con el trabajo | |
Lee los niveles de socorrista de | |
qs-interface · qs-textui | Barras de progreso y avisos en pantalla al estilo Quasar. |
Llaves para cada ATV y moto acuática retirados. |
Añadir un framework#
ESX, QBCore y Qbox están cubiertos. Un core renombrado o derivado se admite mediante los dos archivos de framework, que no están cifrados:
Copia el puente más parecido
Copia
esx.luaoqb.luaenclient/framework/yserver/framework/, cambia la comprobación de la primera línea al nombre de tu framework y los exports al nombre del recurso de tu core.Conserva todas las funciones
El archivo del servidor responde quién es el jugador, su nombre y trabajo, le paga y le otorga experiencia:
AddMoney,GetPlayeridentifier,GetUserName,GetPlayerJobName,OnPlayerJobChanged,OnPlayerCharacterLoadedyAddXP. El archivo del cliente prepara las estaciones para los jugadores con el trabajo, reacciona a los cambios de trabajo y a la carga de personajes, y proporcionaProgressBar,SpawnVehicle,DeleteJobVehicleyCreateNotification.Regístralo
Añade tu core a la lista de detección al principio de
config/config.lua:lua local frameworks = { ['es_extended'] = 'esx', ['qb-core'] = 'qb', ['qbx_core'] = 'qb', ['my-core'] = 'mycore', }
Idiomas#
Se incluyen dieciocho traducciones en locales/: inglés (en), español (es), portugués (pt), francés (fr), alemán (de), italiano (it), neerlandés (nl), rumano (ro), danés (da), húngaro (hu), turco (tr), ruso (ru), búlgaro (bg), árabe (ar), hindi (hi), japonés (ja), coreano (ko) y chino simplificado (zh-CN). Elige una con Config.Language o desde el panel de ajustes.
Cada línea en pantalla es una clave en esos archivos — los nombres de las estaciones (STATION_NORTH…), los nombres de las llamadas, la guía y el panel — así que cambiar una palabra es editar el JSON. Una clave que falte en una traducción recurre al inglés. Para un idioma que no se incluye, copia en.json a un archivo nuevo, tradúcelo y pon Config.Language con su nombre en config.lua — el panel solo ofrece las dieciocho que se incluyen.



