diff --git a/[core]/es_extended/server/common.lua b/[core]/es_extended/server/common.lua index 48ca2272..1f87bf3b 100644 --- a/[core]/es_extended/server/common.lua +++ b/[core]/es_extended/server/common.lua @@ -1,6 +1,7 @@ ESX = {} ESX.Players = {} ESX.Jobs = {} +ESX.JobsPlayerCount = {} ESX.Items = {} Core = {} Core.UsableItemsCallbacks = {} diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index 3e60ac9b..49ee3a8e 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -276,6 +276,34 @@ function ESX.GetExtendedPlayers(key, val) return xPlayers end +function ESX.GetNumPlayers(key, val) + if not key then + return #GetPlayers() + end + + if type(val) == "table" then + local numPlayers = {} + if key == "job" then + for _, v in ipairs(val) do + numPlayers[v] = (ESX.JobsPlayerCount[v] or 0) + end + return numPlayers + end + + local filteredPlayers = ESX.GetExtendedPlayers(key, val) + for i, v in pairs(filteredPlayers) do + numPlayers[i] = (#v or 0) + end + return numPlayers + end + + if key == "job" then + return (ESX.JobsPlayerCount[val] or 0) + end + + return #ESX.GetExtendedPlayers(key, val) +end + function ESX.GetPlayerFromId(source) return ESX.Players[tonumber(source)] end diff --git a/[core]/es_extended/server/main.lua b/[core]/es_extended/server/main.lua index ea3b4615..118b88ed 100644 --- a/[core]/es_extended/server/main.lua +++ b/[core]/es_extended/server/main.lua @@ -386,7 +386,10 @@ AddEventHandler('playerDropped', function(reason) if xPlayer then TriggerEvent('esx:playerDropped', playerId, reason) - + local job = xPlayer.getJob().name + local currentJob = ESX.JobsPlayerCount[job] + ESX.JobsPlayerCount[job] = ((currentJob and currentJob > 0) and currentJob or 1) -1 + GlobalState[("%s:count"):format(job)] = ESX.JobsPlayerCount[job] Core.playersByIdentifier[xPlayer.identifier] = nil Core.SavePlayer(xPlayer, function() ESX.Players[playerId] = nil @@ -394,6 +397,26 @@ AddEventHandler('playerDropped', function(reason) end end) +AddEventHandler("esx:playerLoaded", function(playerId, xPlayer, isNew) + local job = xPlayer.getJob().name + local jobKey = ("%s:count"):format(job) + + ESX.JobsPlayerCount[job] = (ESX.JobsPlayerCount[job] or 0) +1 + GlobalState[jobKey] = ESX.JobsPlayerCount[job] +end) + +AddEventHandler("esx:setJob", function(src, job, lastJob) + local lastJobKey = ('%s:count'):format(lastJob.name) + local jobKey = ('%s:count'):format(job.name) + local currentLastJob = ESX.JobsPlayerCount[lastJob.name] + + ESX.JobsPlayerCount[lastJob.name] = ((currentLastJob and currentLastJob > 0) and currentLastJob or 1) -1 + ESX.JobsPlayerCount[job.name] = (ESX.JobsPlayerCount[job.name] or 0) + 1 + + GlobalState[lastJobKey] = ESX.JobsPlayerCount[lastJob.name] + GlobalState[jobKey] = ESX.JobsPlayerCount[job.name] +end) + AddEventHandler('esx:playerLogout', function(playerId, cb) local xPlayer = ESX.GetPlayerFromId(playerId) if xPlayer then