Skip to content

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions