Skip to content
This repository was archived by the owner on Apr 28, 2026. It is now read-only.
This repository was archived by the owner on Apr 28, 2026. It is now read-only.

Validate Job Duty Status #41

@137ElPro

Description

@137ElPro

Problem:
Players can access job-specific inventories and resources even when off duty, breaking roleplay immersion and allowing potential exploits.

Solution:
Validate that the player is onDuty before allowing access to inventories, shops, or job-specific actions.

Benefit:
Ensures realistic roleplay and prevents misuse of resources for jobs like police, EMS, or mechanics.

Base Example code:

modules/bridge/client.lua

function client.hasGroup(group)
	if not PlayerData.loaded then return end

	if PlayerData.groups.onDuty ~= nil and not PlayerData.groups.onDuty then return end

	if type(group) == 'table' then
		for name, rank in pairs(group) do
			local groupRank = PlayerData.groups[name]
			if groupRank and groupRank >= (rank or 0) then
				return name, groupRank
			end
		end
	else
		local groupRank = PlayerData.groups[group]
		if groupRank then
			return group, groupRank
		end
	end
end

modules/bridge/server.lua

function server.hasGroup(inv, group)
	if inv.player.groups.onDuty ~= nil and not inv.player.groups.onDuty then return end

	if type(group) == 'table' then
		for name, rank in pairs(group) do
			local groupRank = inv.player.groups[name]
			if groupRank and groupRank >= (rank or 0) then
				return name, groupRank
			end
		end
	else
		local groupRank = inv.player.groups[group]
		if groupRank then
			return group, groupRank
		end
	end
end

ESX Example code:

modules/bridge/esx/client.lua

AddEventHandler('esx:setPlayerData', function(key, value)
	if not PlayerData.loaded or GetInvokingResource() ~= 'es_extended' then return end


	if key == 'job' then
		key = 'groups'
		value = { 
			[value.name] = value.grade, 
			onDuty =  value.onDuty
		}
	end

	PlayerData[key] = value
	OnPlayerData(key, value)
end)

modules/bridge/esx/server.lua

AddEventHandler('esx:setJob', function(source, job, lastJob)
    local inventory = Inventory(source)
    if not inventory then return end

    inventory.player.groups[lastJob.name] = nil

    inventory.player.groups[job.name] = job.grade

    inventory.player.groups.onDuty = job.onDuty or false
end)


function server.setPlayerData(player)
local groups = {
        [player.job.name] = player.job.grade,
        onDuty = player.job.onDuty
    }

	return {
		source = player.source,
		name = player.name,
		groups = groups,
		sex = player.sex or player.variables.sex,
		dateofbirth = player.dateofbirth or player.variables.dateofbirth,
	}
end

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions