How Integrations Work#
Hunter Job looks at what is running when it starts and adapts. The framework and the inventory are detected in config/config.lua; everything framework-specific — money, items, the job, the blip, the progress bar — lives in the small bridge files under client/framework/ and server/framework/, which are left open for you to edit.
Layer | Supported | Without it |
|---|---|---|
Framework |
| Required — no employer, no blip, no money. |
Inventory |
| Items go through your framework's own item functions. |
Target |
| Press |
Clothing |
| Set |
Progress bar |
| The ox_lib progress bar. |
3D prompts |
| The built-in drawn text. |
Quests |
| Off by default. |
Job money |
| Mission pay goes straight to the player's cash. |
Notifications | Built in, or any resource you wire in | — |
Logs | Discord webhooks | Off by default. |
Every optional integration degrades silently. A missing resource makes its feature stand down — nothing errors. Detection only sees resources that started before
qs-hunter, so keep your framework and inventory above it inserver.cfg.
Notifications#
With Config.DefaultNotifications = true the script uses its own notifications, drawn by its interface with sounds and colours per type. Set it to false and every notification is handed to SendTextMessage at the bottom of section 1 of config/config.lua — fill in the lines for your resource:
-- config/config.lua
Config.DefaultNotifications = false
function SendTextMessage(msg, type) -- type: 'info' · 'error' · 'success'
if type == 'info' then
exports['okokNotify']:Alert('Hunter', msg, 5000, 'info')
end
if type == 'error' then
exports['okokNotify']:Alert('Hunter', msg, 5000, 'error')
end
if type == 'success' then
exports['okokNotify']:Alert('Hunter', msg, 5000, 'success')
end
endThe function ships with commented examples for the vanilla GTA notification and a generic export. The on-screen prompts — Start working, Harvest animal — are not notifications and always use the script's own hint.
The currency symbol is CURRENCY_TYPE in config/translations.lua, and Config.CurrencyPosition puts it before ($500) or after (500 zł) the amount, everywhere a price is shown.
Targets#
-- config/config.lua
Config.Target = true
Config.TargetScript = "ox" -- "ox" (ox_target) or "qb" (qb-target)Two options are registered: Start working on the employer and Harvest animal on each downed animal of the player's own mission, both within 3 m. They live in client/target.lua — open, so a different target resource is a matter of adding a branch there. With targeting on, the key prompts are not drawn at all.
Inventories#
Two inventories are spoken to directly, and every other one through the framework:
ox_inventory — items are checked against its item list, and the hunting rifle is handed over with 10 rounds loaded, because ox keeps ammo on the weapon.
qs-inventory — items are checked against its catalogue, and it can lock itself during the outfit change (
Config.QuasarInventory) and run the hunter quests (Config.QuasarInventoryQuests).Anything else — items are given, counted and removed with ESX's
xPlayerfunctions or QBCore'sPlayer.Functions, and checked against the framework's item list.
Before an item is given, the script asks whether the inventory knows it at all. That is how a missing item is told apart from a full bag: the player sees This item does not exist: … rather than being sent to empty an inventory that has room, and the server console names the item for you.
Gear | qs-inventory · QBCore | ox_inventory |
|---|---|---|
Rifle · knife · hatchet |
| The same names — ox matches them in any case. |
Sniper ammo |
|
|
Running another inventory with its own ammo name? Look it up in that inventory's item list and put it in the same place.
Clothing#
The outfit in client/clothing.lua is applied through the framework's usual clothing resource:
Framework | Putting it on | Taking it off |
|---|---|---|
ESX |
|
|
QBCore |
|
|
On illenium-appearance, uncomment the illenium-appearance:client:reloadSkin line that sits next to the QBCore restore in the same file. Any other clothing script is wired in that one function.
qs-inventory Quests#
With Config.QuasarInventoryQuests = true and qs-inventory running, three quests are created for each player as they load, and advanced as they hunt:
Quest | Reward | Progress |
|---|---|---|
Hunter Progress | 300 | +20 per level gained |
Finish hunter quests | 100 | +5 per mission completed |
Hunt animals | 100 | +2 per animal harvested |
Titles, descriptions and rewards are in server/missions.lua.
Job Management#
When qs-job-management is started, a mission's money is handed to it with AddJobMoney(source, amount, 'hunter') instead of going straight to the player's cash. Experience, leaderboard earnings and the Discord log are recorded the same either way. Shop sales and leaderboard prizes always pay the player directly.
Discord Logs#
Five events can be posted to Discord as colour-coded embeds, each footed with the player's name, server ID and identifier. Paste a webhook into Url, switch Enabled on, and choose per event: true sends it to the shared URL, false does not send it, and a URL of its own sends it to a different channel.
-- config/config.lua
Config.Webhooks = {
Enabled = true,
Url = 'https://discord.com/api/webhooks/...', -- the shared channel
Name = 'qs-hunter', -- how the bot presents itself
Avatar = '', -- an image URL, or '' for none
Timestamp = true,
Events = {
MissionStarted = true,
MissionFinished = true,
MissionAbandoned = true,
MoneyPaid = 'https://discord.com/api/webhooks/...staff', -- its own channel
ExperienceGiven = false,
},
}Event | Sent when | Shows |
|---|---|---|
| A leader takes a hunt. | What it asks for, the crew, the pay and the experience. |
| The last animal is in and the crew is paid. | The crew, and the pay and experience — per member and pot on a split. |
| A hunter leaves from the panel, is kicked or disconnects. | The reason and how many are left in the crew. |
| A mission payout reaches a player. | The amount and the mission. |
| Any experience is granted — harvests and missions. | The gain, the level before and after, progress to the next level and the lifetime total. |
Overriding Detection#
Both values are worked out at the top of config/config.lua. To pin one by hand — two inventories running at once, or a renamed core — replace the detected value with a fixed one:
-- Auto, the default
Config.Framework = dependencyCheck(frameworks) or 'standalone'
Config.Inventory = dependencyCheck(inventories) or 'default'
-- Pinned
Config.Framework = 'qb' -- 'esx' or 'qb' (Qbox counts as 'qb')
Config.Inventory = 'ox_inventory' -- the inventory's resource namePaying into the bank#
Mission pay, sales and leaderboard prizes go to cash, and the shop charges cash. The account is named once per framework in server/framework/esx.lua and server/framework/qb.lua:
function AddMoney(source, price)
local xPlayer = GetPlayerId(source)
if not xPlayer then return end
xPlayer.addAccountMoney('bank', price) -- was 'money'
end
function RemoveMoney(price, src)
local xPlayer = GetPlayerId(src)
if not xPlayer then return end
xPlayer.removeAccountMoney('bank', price) -- was 'money'
end
function GetMoney(source)
local xPlayer = GetPlayerId(source)
if not xPlayer then return 0 end
return xPlayer.getAccount('bank').money -- was xPlayer.getMoney()
endfunction AddMoney(source, price)
local xPlayer = GetPlayerId(source)
if not xPlayer then return end
xPlayer.Functions.AddMoney('bank', price) -- was 'cash'
end
function RemoveMoney(price, src)
local xPlayer = GetPlayerId(src)
if not xPlayer then return end
xPlayer.Functions.RemoveMoney('bank', price) -- was 'cash'
end
function GetMoney(source)
local xPlayer = GetPlayerId(source)
if not xPlayer then return 0 end
return xPlayer.PlayerData.money['bank'] or 0 -- was 'cash'
endAdding a framework#
A framework that is not on the list is a copy of the closest bridge pair with its calls changed. The server bridge answers who a player is and moves their money and items; the client bridge decides whether the player may hunt and spawns the employer:
File | Must provide |
|---|---|
|
|
| Sets |
Each file starts by returning early unless Config.Framework names it, so add your framework to the frameworks table in the config too. The leaderboard reads player names from users (firstname, lastname) outside QBCore and from players.charinfo on it.
Languages#
Eleven translations ship in config/translations.lua: English (en), Italian (it), Spanish (es), 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.
Config.Language = "es"Any key a language does not define is filled in from English, so a translation never shows raw keys. To reword something, edit the text between the quotes. To add a language, copy the ['en'] block, give it a new code and translate it. A few keys are worth knowing:
Keys | What they are |
|---|---|
| The currency symbol shown with every price. |
| Animal names on blips, mission cards and the tracker. A new animal needs its own key. |
| The Guide view. Delete a step's key and the step disappears. |
| The corner hints and 3D prompts. |
| Every refusal and confirmation — listed with their meaning in Common Errors. |



