Helpers
What they are
Helpers is a global server-side table defined in configs/s.helpers.lua. It wraps common framework operations (jobs, items, money, identifiers, admin) so your handlers don't have to deal with framework-specific code.
These are NOT exports โ they're globals available inside Config.UnlockHandlerForSkills, Config.CategoryVisibilityHandler, Config.PremiumCurrency.handler, and any other server-side config hook.
The underlying framework calls (Core.GetJob, Core.GetItemCount, etc.) are provided by devhub_lib โ so as long as devhub_lib is configured for your framework, all helpers work the same way regardless of whether you use ESX, QBCore, or a custom core.
Functions
Helpers.CheckJob(source, job, grade)
Check if a player has a specific job, optionally with a minimum grade.
Parameters:
source(number): Player server IDjob(string): Job name (e.g.'police')grade(number | nil): Minimum grade required (optional)
Returns: boolean
if Helpers.CheckJob(source, 'police', 2) then
-- player is at least a grade 2 police officer
endHelpers.HasItem(source, item, amount)
Check if the player has at least amount of an item in their inventory.
Parameters:
source(number): Player server IDitem(string): Item nameamount(number | nil): Amount required (defaults to 1)
Returns: boolean
if Helpers.HasItem(source, 'energy_drink', 2) then
-- player has at least 2 energy drinks
endHelpers.CheckIdentifier(source, identifier)
Check if the player's identifier matches an exact value.
Parameters:
source(number): Player server IDidentifier(string): Identifier to match (e.g.'license:abc...')
Returns: boolean
if Helpers.CheckIdentifier(source, 'license:abcdef1234567890') then
-- this is THE player
endHelpers.IsAdmin(source)
Convenience wrapper for Core.IsPlayerAdmin(source).
Returns: boolean
if Helpers.IsAdmin(source) then
-- admin-only branch
endHelpers.HasEnoughMoney(source, amount)
Check if the player has at least amount cash on hand.
Parameters:
source(number): Player server IDamount(number): Required amount of cash
Returns: boolean
if Helpers.HasEnoughMoney(source, 500) then
-- player can afford it
endHelpers.CheckUnlockedSkill(source, categoryUid, skillUid)
Check if a specific skill is already unlocked. Useful for chaining unlocks (require a previous skill).
Parameters:
source(number): Player server IDcategoryUid(string): Category UIDskillUid(string): Skill UID
Returns: boolean
if Helpers.CheckUnlockedSkill(source, 'personal', 'runFaster_1') then
-- prerequisite met
endHelpers.RemoveItem(source, item, amount)
Remove an item from the player's inventory.
Parameters:
source(number): Player server IDitem(string): Item nameamount(number | nil): Amount to remove (defaults to 1)
Helpers.RemoveItem(source, 'energy_drink', 1)Helpers.RemoveMoney(source, amount)
Remove cash from the player.
Parameters:
source(number): Player server IDamount(number): Amount of cash to remove
Helpers.RemoveMoney(source, 500)Example โ combined unlock requirement
A skill that requires the player to be a grade 2+ police officer, hold an energy drink, and pay $500 in cash:
Config.UnlockHandlerForSkills = {
['personal'] = {
['runFaster_3'] = {
unlockRequirementMessage = 'Police only โ costs 1 energy drink and $500.',
handler = function(source)
if not Helpers.CheckJob(source, 'police', 2) then return false end
if not Helpers.HasItem(source, 'energy_drink', 1) then return false end
if not Helpers.HasEnoughMoney(source, 500) then return false end
Helpers.RemoveItem(source, 'energy_drink', 1)
Helpers.RemoveMoney(source, 500)
return true
end,
},
},
}Example โ premium currency handler
The same helpers can power a premium currency handler that uses regular cash as the "premium" payment:
Config.PremiumCurrency = {
type = "optional",
label = "$",
icon = "fas fa-dollar-sign",
handler = function(amount, categoryUid, skillUid, source)
if not Helpers.HasEnoughMoney(source, amount) then return false end
Helpers.RemoveMoney(source, amount)
return true
end,
}