Cómo funcionan las integraciones#
Todo lo que depende de otro recurso está detrás de un pequeño archivo sin cifrar que puedes editar libremente: los puentes de framework en client/framework/ y server/framework/, las opciones de target en client/target.lua, y las misiones en server/missions.lua.
Capa | Compatible | Sin ella |
|---|---|---|
Framework |
| Standalone: sin comprobación de trabajo y sin dinero. La experiencia, los niveles y la clasificación siguen funcionando. |
Target |
| Avisos de teclas cerca de los dueños, el perro y las cacas. |
Texto 3D |
| El script dibuja su propio texto 3D. |
Notificaciones | Integradas, o cualquier recurso que conectes en | — |
Misiones |
| Sin misiones. |
Pagos |
| Los paseos se pagan directamente en el efectivo del jugador. |
Registros | Webhooks de Discord | No se registra nada. |
Cada integración opcional se degrada sin hacer ruido. Un recurso que falta nunca impide que el trabajo arranque: esa función simplemente vuelve al comportamiento de la última columna.
Frameworks#
El framework se detecta a partir de los recursos ya iniciados cuando Dog Walker Job se carga: es_extended selecciona el puente de ESX, qb-core o qbx_core el de QBCore. Qbox funciona a través del puente de QBCore a propósito: qbx_core proporciona qb-core exactamente para esto.
Framework | Jugador identificado por | Paseos pagados en | Nombre del personaje desde |
|---|---|---|---|
ESX |
| La cuenta |
|
QBCore · Qbox |
|
|
|
Standalone | El identificador | Nada: no hay cartera | El nombre de FiveM |
¿Has renombrado tu core o usas un fork? Deja la detección en config/config.lua como está y adapta los archivos de puente. Cada puente del servidor responde a las mismas preguntas con los mismos nombres (GetPlayeridentifier, GetPlayerJobName, GetUserName, GetPlayers, GetPlayerFromIdentifier y AddMoney), así que apuntarlos a otro recurso es todo lo que necesita un framework nuevo.
Quién puede pasear perros#
Config.RequireJob = true -- false lets anyone walk dogs, without needing a job
Config.DogWalkerJob = { -- jobs allowed to walk dogs. Add as many as you need.
['dog_walker'] = true,
-- ['pet_shop'] = true,
}El trabajo se comprueba en el servidor cuando empieza un paseo, y de nuevo cuando se paga. Un jugador que pierde el trabajo a mitad de un paseo ve terminar todos sus paseos sin pago, y los blips de perros y las opciones de target desaparecen con él.
Target#
Establece Config.Target = true y elige el recurso con Config.TargetScript ("ox" o "qb"). Se añaden tres opciones, cada una a menos de 3 m:
En | Opción | Abre |
|---|---|---|
Cada dueño | Take <dog> for a walk / Return <dog> back to owner | El panel del perro |
Tu perro | Pet <dog> — o Catch <dog> tras escaparse | El menú de la pata, o la captura |
La caca | Pick up the poop | La limpieza |
Las opciones de los dueños solo se añaden para los jugadores que pueden trabajar, y se reconstruyen cada vez que cambia el trabajo. Con ox_target cada opción se añade y se elimina por su propio nombre, así que el trabajo nunca toca las opciones que otros recursos pongan en el mismo ped.
Notificaciones y visualización#
Notificaciones#
Con Config.DefaultNotifications = true el trabajo usa sus propias notificaciones, cada una con un color y un sonido. Ponlo en false y cada mensaje se pasa a SendTextMessage en config/config.lua en su lugar, donde llamas a tu propio recurso:
-- config/config.lua — only called when Config.DefaultNotifications is false
function SendTextMessage(msg, type)
-- type is 'info', 'success', 'warning' or 'error'
exports['your_notify']:Alert(msg, type)
endLa función incluida tiene una rama para info, error y success, todas comentadas. El trabajo también envía warning (el perro se hizo daño), así que gestiónalo también, o llama a tu recurso una vez para cada tipo como arriba. Los avisos de teclas no son notificaciones: siempre usan el panel de ayudas de la interfaz, o texto 3D.
Moneda y nombres#
Config.CurrencyPosition = "suffix" -- "prefix" → $500, "suffix" → 500 $
-- the symbol is CURRENCY_TYPE in config/translations.lua
Config.PlayerNameSource = 'character' -- 'character' → the character's name from the framework
-- 'cfx' → the FiveM / Steam display name
-- 'both' → "Character Name (FiveM Name)"
Config.PedGreeting = "He's been waiting by the door all morning. Take him out?"
-- the owner's line in the panel; empty hides itMisiones de qs-inventory#
Con Config.QuasarInventoryQuests = true y qs-inventory en ejecución, se crean dos misiones para cada jugador al entrar, y su progreso se informa a medida que los jugadores suben de nivel:
Misión | Nombre | Recompensa |
|---|---|---|
Dog Walker Progress |
| 300 |
Walking dogs |
| 200 |
Los títulos, descripciones y recompensas están en server/missions.lua. Deja la opción desactivada si no usas las misiones de qs-inventory: entonces no se registra nada.
qs-job-management#
Cuando qs-job-management está iniciado, los pagos de los paseos se le entregan con AddJobMoney(source, amount, 'dog_walker') en lugar de ir al efectivo del jugador. Las recompensas de la clasificación siempre se pagan directamente al jugador. No hace falta configurar nada: se detecta en cuanto se ejecuta.
Registros de Discord#
Cada paseo puede publicarse en Discord como un embed de color, con el nombre del jugador, su id de servidor y su identificador en el pie. Desactivado por defecto: pega una URL de webhook, pon Enabled en true y elige los eventos.
Evento | Se envía cuando |
|---|---|
| Un jugador saca a un perro, con la duración del paseo, el pago y la experiencia. |
| Se entrega y se paga un paseo, con el total junto al pago base, la experiencia y los minutos sin correa. |
| Un paseo termina sin pago (devuelto antes de tiempo o fallido), con cuántos minutos se pasearon. |
| Se entrega dinero a un jugador por un paseo. |
| Se concede experiencia, con el nivel antes y después, y el progreso hacia el siguiente. |
Cada evento acepta true (enviarlo al Url compartido), false (no enviarlo), o una URL de webhook propia, así el dinero y la experiencia pueden ir a un canal del staff mientras los paseos van a otro que todos pueden ver:
-- config/config.lua
Config.Webhooks = {
Enabled = true,
Url = 'https://discord.com/api/webhooks/...',
Name = 'qs-dogwalker', -- how the bot presents itself
Avatar = '', -- image URL, or '' for none
Timestamp = true,
Events = {
MissionStarted = true,
MissionFinished = true,
MissionAbandoned = true,
MoneyPaid = 'https://discord.com/api/webhooks/...staff',
ExperienceGiven = 'https://discord.com/api/webhooks/...staff',
},
}Idiomas#
Se incluyen once traducciones en config/translations.lua: inglés (en), español (es), italiano (it), 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.
Edita solo el texto entre comillas. Cualquier clave que un idioma no defina vuelve al inglés, así que una traducción nunca puede mostrar una clave sin traducir. Para añadir tu propio idioma, copia el bloque ['en'] con un código nuevo y establece Config.Language en él.



