How Integrations Work#
Everything that depends on another resource sits behind a small, unencrypted file you are free to edit: the framework bridges in client/framework/ and server/framework/, the target options in client/target.lua, and the quests in server/missions.lua.
Layer | Supported | Without it |
|---|---|---|
Framework |
| Standalone: no job check and no money. Experience, levels and the leaderboard still work. |
Target |
| Key prompts near the owners, the dog and the poop. |
3D text |
| The script draws its own 3D text. |
Notifications | Built in, or any resource you wire into | — |
Quests |
| No quests. |
Payouts |
| Walks pay straight into the player's cash. |
Logs | Discord webhooks | Nothing is logged. |
Every optional integration degrades quietly. A missing resource never stops the job from starting — that one feature simply falls back to the behaviour in the last column.
Frameworks#
The framework is detected from the resources already started when Dog Walker Job loads: es_extended selects the ESX bridge, qb-core or qbx_core the QBCore one. Qbox runs through the QBCore bridge on purpose — qbx_core provides qb-core for exactly this.
Framework | Player identified by | Walks paid into | Character name from |
|---|---|---|---|
ESX |
| The |
|
QBCore · Qbox |
|
|
|
Standalone | The | Nothing — there is no wallet | The FiveM name |
Renamed your core, or running a fork? Leave the detection in config/config.lua as it is and adapt the bridge files instead. Every server bridge answers the same questions with the same names — GetPlayeridentifier, GetPlayerJobName, GetUserName, GetPlayers, GetPlayerFromIdentifier and AddMoney — so pointing them at another resource is all a new framework needs.
Who can walk dogs#
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,
}The job is checked on the server when a walk starts, and again when it is paid. A player who loses the job mid-walk has every walk ended without pay, and their dog blips and target options disappear with it.
Target#
Set Config.Target = true and pick the resource with Config.TargetScript ("ox" or "qb"). Three options are added, each within 3 m:
On | Option | Opens |
|---|---|---|
Each owner | Take <dog> for a walk / Return <dog> back to owner | The dog panel |
Your dog | Pet <dog> — or Catch <dog> after it bolted | The paw menu, or the catch |
The poop | Pick up the poop | The clean-up |
Owner options are only added for players allowed to work, and are rebuilt whenever the job changes. With ox_target every option is added and removed by its own name, so the job never touches options other resources put on the same ped.
Notifications and Display#
Notifications#
With Config.DefaultNotifications = true the job uses its own notifications, each with a colour and a sound. Set it to false and every message is handed to SendTextMessage in config/config.lua instead, where you call your own resource:
-- 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)
endThe shipped function has a branch for info, error and success, all commented out. The job also sends warning (the dog got hurt), so handle it too, or call your resource once for every type as above. Key prompts are not notifications: they always use the interface's hint panel, or 3D text.
Currency and names#
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 itqs-inventory Quests#
With Config.QuasarInventoryQuests = true and qs-inventory running, two quests are created for every player as they load in, and their progress is reported as players level up:
Quest | Name | Reward |
|---|---|---|
Dog Walker Progress |
| 300 |
Walking dogs |
| 200 |
Titles, descriptions and rewards are in server/missions.lua. Leave the option off if you do not use qs-inventory's quests: nothing is registered then.
qs-job-management#
When qs-job-management is started, walk payouts are handed to it with AddJobMoney(source, amount, 'dog_walker') instead of going into the player's cash. Leaderboard rewards are always paid to the player directly. Nothing needs configuring: it is picked up as soon as it runs.
Discord Logs#
Every walk can be posted to Discord as a coloured embed, with the player's name, server id and identifier in the footer. Off by default: paste a webhook URL, set Enabled to true, and choose the events.
Event | Sent when |
|---|---|
| A player takes a dog out — with the walk time, pay and experience. |
| A walk is handed in and paid — with the total next to the base pay, the experience and the minutes off the leash. |
| A walk ends without pay — returned early or failed — with how many minutes were walked. |
| Money is handed to a player for a walk. |
| Experience is granted — with the level before and after, and the progress toward the next one. |
Each event takes true (send it to the shared Url), false (do not send it), or a webhook URL of its own — so money and experience can go to a staff channel while walks go somewhere everybody can see:
-- 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',
},
}Languages#
Eleven translations ship in config/translations.lua: English (en), Spanish (es), Italian (it), French (fr), Portuguese (pt), German (de), Russian (ru), Turkish (tr), Dutch (nl), Simplified Chinese (cn) and Traditional Chinese (zh-tw). Pick one with Config.Language at the top of the file.
Edit only the text between the quotes. Any key a language does not define falls back to English, so a translation can never show a raw key. To add your own language, copy the ['en'] block under a new code and set Config.Language to it.



