El trabajo de un vistazo#
Un paseo tiene tres partes, y todas ocurren junto al dueño de un perro o junto al propio perro: no hay ningún menú que abrir desde otro lugar.
Paso | Qué ocurre |
|---|---|
Recoger | Habla con un dueño. La cámara pasa a él, el panel se abre a su lado y Start walk te entrega el perro con la correa. |
Pasear | Sigue moviéndote hasta que el temporizador del paseo llegue a cero. Cuida del perro por el camino: limpia lo que deje, usa el menú de la pata y decide si lo sueltas de la correa. |
Devolver | Vuelve con el mismo dueño dentro del tiempo extra y pulsa Return dog. El servidor comprueba el paseo y te paga en dinero y experiencia. |
Los dueños y sus perros#
Una instalación nueva incluye diez dueños por Mirror Park, cada uno con un perro, un blip y un marcador flotante. Los paseos más largos pagan más y requieren un nivel más alto.
Perro | Dueño | Paseo | Paga | XP | Nivel |
|---|---|---|---|---|---|
Rocky — rottweiler | Carlos Mendez | 2 min | 150 | 120 | 1 |
Clifford — retriever | Laura Torres | 2 min | 150 | 150 | 1 |
Duke — caniche | Roberto Jimenez | 3 min | 150 | 150 | 1 |
Storm — westie | Ana Garcia | 3 min | 150 | 150 | 1 |
Buddy — retriever | Miguel Santos | 5 min | 200 | 150 | 2 |
Max — pastor | Sofia Reyes | 8 min | 250 | 180 | 1 |
Coco — caniche | Isabella Martinez | 12 min | 300 | 220 | 4 |
Daisy — Chop | Alejandro Cruz | 15 min | 350 | 250 | 5 |
Charlie — westie | Valentina Lopez | 18 min | 400 | 300 | 6 |
Luna — pug | Diego Hernandez | 22 min | 450 | 350 | 7 |
Cada dueño lleva un modelo elegido al azar de Config.EmployerModels. Los blips solo se muestran a los jugadores que pueden trabajar y cambian de color mientras paseas a ese perro, así siempre encuentras el camino de vuelta.
Añadir un perro#
Cada entrada de Config.Locations es un dueño y un perro. Añade tantos como quieras:
Config.Locations = {
{
employer_coords = vector4(1302.26, -529.99, 71.27, 163.87), -- where the owner stands
dog_coords = vector4(1304.51, -532.17, 71.40, 120.44), -- where the dog waits
dog_model = 'a_c_rottweiler', -- ped model of the dog
dog_name = 'Rocky', -- panel, blip and paw menu
owner_name = 'Carlos Mendez', -- the owner's card in the panel
dog_image = 'rottweiler.png', -- picture on the dog card
price_money = 150, -- paid when the dog is handed back in time
walking_time = 2, -- length of the walk, in MINUTES
experience = 120, -- experience paid on a successful walk
required_level = 1 -- level needed to take this dog out
},
}dog_image es un archivo en assets/dogs/ (Config.DogImageFolder). Se incluyen imágenes para el caniche, el pug, el retriever, el rottweiler y el pastor; coloca tu propio PNG ahí y reinicia el recurso; los PNG transparentes se ven mejor, ya que la tarjeta pone su propio brillo detrás. Un valor que contenga :// se usa como dirección web, y Config.DogImageFallback se muestra para una ubicación sin imagen.
Sirve cualquier ped de perro.
a_c_rottweiler,a_c_shepherd,a_c_chopya_c_retrieverse sientan mientras esperan en la puerta; los demás se quedan de pie. Un modelo mal escrito imprimeinvalid modelen la consola F8 y ese perro se omite.
El panel del perro#
Hablar con un dueño abre el panel. La cámara pasa a un primer plano del dueño, encuadrado en la mitad izquierda de la pantalla con una tarjeta que lleva su nombre y la línea Config.PedGreeting; el panel ocupa la mitad derecha.
Sección | Qué muestra |
|---|---|
El perro | Su imagen, su nombre y su dueño. |
Detalles del trabajo | El nivel requerido, la duración del paseo, la recompensa y la experiencia de este perro. |
Tu progreso | Tu nivel y experiencia, tu bonificación de nivel, cuántos perros puedes pasear a la vez y cuánto vale limpiar. |
Start walk / Return dog | Start walk mientras el perro está en casa, Return dog mientras lo paseas. Un aviso sustituye al botón mientras el perro descansa o cuando ya paseas tantos perros como permite tu nivel. |
Guía | Un recorrido por el trabajo, leído de |
Estadísticas | La clasificación. Se oculta cuando |
Devolver un perro antes de que termine su temporizador pide confirmación primero (Return the dog before the walk is over?) y confirmar con Abandon walk lo termina sin pago. No hay un botón aparte para abandonar: devolverlo antes de tiempo es abandonar.
El panel se cierra solo cuando te alejas más de 6 m del dueño o mueres con él abierto, así nadie se queda nunca con el cursor atascado.
El paseo#
Una vez puesta la correa, una tarjeta de seguimiento muestra el perro, el tiempo restante, su felicidad y cualquier cosa que requiera tu atención. Las reglas del paseo están en Config.Walk:
Ajuste | Por defecto | Qué hace |
|---|---|---|
| true | El temporizador solo avanza mientras caminas, corres o esprintas. Quedarte quieto lo pausa y la tarjeta dice Keep moving to advance the walk. |
| 3 min | Tiempo extra para devolver el perro una vez terminado el temporizador. Si se agota, el perro vuelve a casa solo, sin pago. |
| 1 min | Descanso antes de poder volver a sacar al mismo perro. Se mantiene tras una reconexión. |
| 100 m | Un perro que se queda así de atrás durante tres segundos seguidos vuelve corriendo a casa y el paseo falla. |
| true | Subirte a cualquier vehículo termina el paseo. |
| 5.0 m | Longitud de la cuerda de la correa. |
| 150 m | A qué distancia se dibujan los perros de otros jugadores. Consulta Los perros de otros jugadores. |
| 8 | Máximo de correas dibujadas a la vez en otros jugadores, primero las más cercanas. |
Si un ped o un vehículo derriba al perro, se le vuelve a atar la correa, el perro pierde felicidad y recibes un aviso. Si su entidad se pierde por el streaming, se vuelve a colocar detrás de ti en lugar de fallar el paseo.
Cómo termina un paseo#
Resultado | Pagado |
|---|---|
Devuelto a su dueño tras el temporizador, dentro del tiempo extra | Sí |
Devuelto antes de tiempo (Abandon walk) | No |
Se agotó el tiempo extra | No |
El perro se quedó más de | No |
Te subiste a un vehículo | No |
El perro murió | No |
Un perro que se escapó no fue atrapado a tiempo | No |
Perdiste el trabajo a mitad del paseo: todos los paseos terminan a la vez | No |
Cada uno de estos inicia el tiempo de espera del perro, con pago o sin él.
Limpiar#
Una vez por paseo, en un punto aleatorio entre el 30 % y el 80 % del temporizador, el perro se detiene a hacer sus necesidades y la tarjeta dice There is something to clean up. Acércate y pulsa G (o usa el third-eye) para recogerlo y ganar experiencia y felicidad extra. Lo que quede en el suelo se elimina al terminar el paseo.
Config.Poop = {
chance = 100, -- % chance the dog stops during a walk
minPercent = 30, -- earliest point of the walk (% elapsed)
maxPercent = 80, -- latest point of the walk (% elapsed)
experience = 10, -- experience for cleaning it up
maxPerWalk = 1, -- cleanups the server will pay for per walk
}Felicidad y pago#
Cada perro empieza el paseo con un 70 % de felicidad. Baja lentamente con la correa, cae cuando esprintas o el perro se hace daño, y sube con la atención. Cuanto más feliz esté el perro al devolverlo, mayor será la propina. La felicidad solo cambia mientras el temporizador del paseo está en marcha.
Cambio | Por defecto | Ajuste |
|---|---|---|
Felicidad inicial | 70 |
|
Pasear con correa | −4 por minuto |
|
Esprintar (los perros odian que los arrastren) | −1 por segundo |
|
Golpeado por un ped o un vehículo | −25 |
|
Limpiar lo que deja | +10 |
|
Acciones del menú de la pata | 0 a +14 cada una |
|
Pasear sin correa | +25 por minuto |
|
Atrapado tras escaparse | −15 |
|
Lo que paga un paseo#
El pago es el price_money del perro más tres propinas, y la experiencia es el experience del perro más una bonificación sin correa. Todo se calcula en el servidor:
payment = price_money × (1 + level tip + happiness tip + off-leash tip)
experience = experience + off-leash experienceBonificación | Valor | Límite |
|---|---|---|
Propina por nivel | +1 % por nivel ( | +50 % ( |
Propina por felicidad | Escala con la felicidad al devolver el perro | +15 % al 100 % ( |
Propina sin correa | +3 % por minuto completo suelto ( | +30 % ( |
Experiencia sin correa | +10 por minuto completo suelto ( | +30 % de la experiencia del perro ( |
Ejemplo: un paseador de nivel 10 devuelve a Luna con un 80 % de felicidad tras 4 minutos sin correa. Cobra 450 × (1 + 0.10 + 0.12 + 0.12) = 603, y gana 350 + 40 = 390 de experiencia.
El dinero se paga en efectivo: la cuenta money en ESX, cash en QBCore y Qbox. Con qs-job-management en ejecución, se paga a través de él.
El menú de la pata#
Ve al perro que estás paseando y pulsa E (o usa el third-eye) para abrir un menú radial con forma de huella. La almohadilla central muestra el nombre del perro, su felicidad y su ánimo: Wagging its tail desde el 75 %, Could use some attention desde el 45 %, Not enjoying this walk por debajo.
Acción | Qué hace | Felicidad | Tiempo de espera |
|---|---|---|---|
Acariciar | La propia escena de caricias de Chop del juego: te arrodillas, el perro se coloca delante de ti y ambos reproducen animaciones faciales. El movimiento se bloquea durante la escena; la cámara no. | +14 | 20 s |
Sentarse | El perro se sienta y se queda donde está en lugar de seguirte. | +5 | 10 s |
Junto | Llama al perro de vuelta a tu lado. | +5 | 10 s |
Soltar | Quita la correa. Solo se muestra mientras el perro lleva correa. | +10 | 5 s |
Correa | Vuelve a ponerla. Solo se muestra mientras el perro está suelto. | 0 | 5 s |
Solo una de las opciones Soltar y Correa aparece en pantalla a la vez, así que el menú muestra cuatro dedos, que es lo que hace que parezca una pata. Cada opción es una entrada de Config.PawMenu.options:
{ id = 'pet', label = 'PAW_PET', hint = 'PAW_PET_HINT', icon = 'pet', color = 'pink', happiness = 14, cooldown = 20 },
-- id one of the built-in actions: pet, sit, heel, release, leash
-- label/hint translation keys from config/translations.lua
-- icon pet, play, treat, sit, heel, speak, water, photo, trick, praise, star, paw
-- color blue, green, amber, purple, pink, red
-- requires 'leashed' or 'loose' to show it only in that state
-- happiness happiness the action gives back
-- cooldown seconds before it can be used againConfig.Petting ajusta la escena de caricias: su duration (4.5 s), lockCamera para bloquear también el ratón durante ella, y leashCamera para el plano de cámara cuando se pone y se quita la correa. Si las animaciones de Chop faltan en tu build del juego, se reproduce en su lugar un clip de caricias más simple.
Pasear sin correa#
Soltar convierte el paseo en una apuesta. Suelto, el perro trota un poco más separado a tu lado, su felicidad sube rápido en lugar de bajar, y cada minuto completo paga dinero y experiencia extra. Pero en cuanto lleva cinco segundos suelto, puede escaparse; se tira una vez por segundo:
chance % = escapeChance − level × levelReduction − (happiness / 100) × happinessReduction
= 1.2 − level × 0.06 − (happiness / 100) × 0.8 -- never below minChance (0.1)Un paseador de nivel 1 con un perro infeliz arriesga alrededor de un 1.1 % por segundo; un paseador de nivel 15 con un perro al 100 % se queda en el mínimo del 0.1 %. La experiencia y un perro feliz son lo que hace que merezca la pena soltarlo.
Cuando se escapa, la correa cae, el perro sale corriendo con un blip rojo encima y el reloj del paseo se detiene. Acércate a menos de 3 m y pulsa E (o usa el third-eye) para agarrarlo: vuelve a la correa, un poco menos feliz. Si no lo atrapas en 90 segundos, vuelve a casa para siempre y el paseo falla.
Config.FreeRoam = {
enable = true,
experiencePerMinute = 10, -- extra experience per full minute loose
tipPerMinute = 0.03, -- extra payment per minute, as a fraction of price_money
maxTipBonus = 0.30, -- never more than +30% from free roaming
maxExperienceBonus = 0.30, -- never more than +30% of the walk's experience
happinessPerMinute = 25, -- happiness gained per minute while loose
escapeChance = 1.2, -- % chance per second that a loose dog bolts
levelReduction = 0.06, -- subtracted per walker level
happinessReduction = 0.8, -- subtracted at 100% happiness, scaled below it
minChance = 0.1, -- never drops below this
catchTime = 90, -- seconds to catch it before it runs home
catchDistance = 3.0, -- how close you must get to grab it
runDistance = 80.0, -- how far it runs when it bolts
catchPenalty = 15, -- happiness lost by the chase
}Niveles#
La experiencia llena una barra hacia el siguiente nivel. El nivel 1 necesita 1,000 de experiencia y cada nivel siguiente necesita un 10 % más que el anterior, así que el nivel 5 necesita 1,464 y el nivel 10 necesita 2,357.
Cada nivel añade un +1 % a cada pago (hasta +50 %), desbloquea los perros que lo requieren y aumenta cuántos perros puedes pasear a la vez:
Desde el nivel | Perros a la vez |
|---|---|
1 | 1 |
4 | 2 |
10 | 3 |
15 | 4 |
Config.LevelExperience = {
BaseExperience = 1000, -- experience required for level 1
GrowthFactor = 1.1, -- each level needs this much more than the last
TipPerLevel = 0.01, -- +1% payment per level
MaxTipMultiplier = 0.5, -- never more than +50% from levels
DogWalkingAmount = {
{ level = 1, max_dogs = 1 },
{ level = 4, max_dogs = 2 },
{ level = 10, max_dogs = 3 },
{ level = 15, max_dogs = 4 },
},
}Cada perro extra es su propio paseo: su propia correa, temporizador, tarjeta de seguimiento y pago. Una subida de nivel se anuncia con una notificación.
No hay ningún comando para establecer un nivel. Para cambiar el nivel de alguien, edita
levelyexperienceen su fila deqs_dog_walkermientras está desconectado; el servidor lo vuelve a leer cuando regresa.
La clasificación#
El botón Statistics del panel abre tres clasificaciones (All time, Season y Today), cada una ordenada por experiencia con las ganancias al lado, un cuadro de búsqueda, tu propia fila resaltada, una cuenta atrás hasta el siguiente reinicio y los últimos ganadores.
La clasificación diaria se reinicia cada día a las 00:00 hora del servidor, y la de temporada a las 00:00 del primer día de cada mes. En cada reinicio se paga a los tres primeros:
Puesto | Diaria | Temporada |
|---|---|---|
1.º | 2,500 | 25,000 |
2.º | 1,200 | 12,000 |
3.º | 600 | 6,000 |
A un ganador que está desconectado en el reinicio se le guarda la recompensa y se le paga la próxima vez que entre.
Config.Leaderboard = {
enable = true, -- false hides the Statistics button entirely
updateMinutes = 1, -- minutes between refreshes
maxPlayers = 100, -- walkers shown per board
rewards = {
Daily = { [1] = 2500, [2] = 1200, [3] = 600 },
Season = { [1] = 25000, [2] = 12000, [3] = 6000 },
},
}Los reinicios se comprueban un minuto después de medianoche y en cada arranque, y cada uno se reclama en la base de datos antes de pagar nada. Un reinicio del servidor en mitad de un pago nunca puede pagar una clasificación dos veces, y un servidor que estaba apagado a medianoche paga en su siguiente arranque.
Teclas, target y avisos#
Ajuste | Por defecto | Qué hace |
|---|---|---|
| false | true pone opciones de third-eye en los dueños, los perros y las cacas. false usa avisos de teclas en su lugar. |
| "ox" |
|
| false | true dibuja los avisos como texto 3D flotante (a través de qs-textui cuando está en ejecución). false los muestra en el panel de ayudas de la interfaz. |
| 38 (E) | Hablar con un dueño, abrir el menú de la pata, atrapar a un perro que se escapó. |
| 58 (G) | Limpiar lo que deja el perro. |
Los avisos de teclas aparecen a menos de 3 m de un dueño y a 2 m de tu perro. Cuando ambos están en rango, gana el dueño (tu perro también está a tu lado en la puerta), salvo con un perro que se escapó: atraparlo tiene prioridad sobre todo. Los códigos de tecla son los FiveM control IDs.
Blips y el marcador#
Config.Blip = {
enable = true,
sprite = 463,
size = 1.0,
display = 2,
colorFree = 3, -- while the dog is waiting for a walker
colorWalking = 1, -- while you are out walking that dog
useDogNames = false, -- true = blip named after the dog
defaultName = "Dog",
}
Config.PedMarker = {
enabled = true,
type = 0, -- 0 = the upside-down cone
height = 1.2, -- metres above the owner's head
distance = 25.0, -- how close you must be to see it
bob = true, -- drifts gently up and down
size = { x = 0.25, y = 0.25, z = 0.18 },
color = { r = 59, g = 130, b = 246, a = 170 },
}Los sprites y colores son las FiveM blip references; las formas de los marcadores son las FiveM marker references.
Los perros de otros jugadores#
Todos ven los paseos de todos. Cuando un jugador saca a un perro, cada cliente cercano dibuja ese perro atado a su mano, y el perro que esperaba en la puerta del dueño desaparece para todos hasta que se devuelve. Los jugadores que entran a mitad de un paseo, o que se acercan más tarde, recogen los paseos que ya están en marcha.
Cada perro dibujado es un ped, una cuerda y la física entre ellos, así que dos ajustes en Config.Walk deciden lo que eso cuesta a los equipos más débiles: renderDistance (150 m) y maxRemoteLeashes (8, primero los más cercanos). Por encima de unos 400 m no se puede dibujar nada sea cual sea el ajuste: más allá del rango de red del juego, el personaje del otro jugador no existe en tu cliente.



