From b931e33b6330b000ce8ca5671592efd18e91b2a8 Mon Sep 17 00:00:00 2001 From: Linden Date: Wed, 30 Jun 2021 02:20:44 +1000 Subject: [PATCH] improvement(esx): Allow retrieval of ESX.Players with specific data --- [esx]/es_extended/server/functions.lua | 10 ++++++++-- esx_example/server/main.lua | 17 +++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/[esx]/es_extended/server/functions.lua b/[esx]/es_extended/server/functions.lua index 3b3120d8..a1d3977c 100644 --- a/[esx]/es_extended/server/functions.lua +++ b/[esx]/es_extended/server/functions.lua @@ -232,10 +232,16 @@ ESX.GetPlayers = function() return sources end -ESX.GetExtendedPlayers = function() +ESX.GetExtendedPlayers = function(key, val) local xPlayers = {} for k, v in pairs(ESX.Players) do - table.insert(xPlayers, v) + if key then + if (key == 'job' and v.job.name == val) or v[key] == val then + table.insert(xPlayers, v) + end + else + table.insert(xPlayers, v) + end end return xPlayers end diff --git a/esx_example/server/main.lua b/esx_example/server/main.lua index 07c57681..441d5867 100644 --- a/esx_example/server/main.lua +++ b/esx_example/server/main.lua @@ -3,14 +3,27 @@ AddEventHandler('esx:playerLoaded', function(playerId, xPlayer, isNew) ESX.Players[playerId] = xPlayer.job.name end) +RegisterNetEvent('esx:setJob') -- When a player loads in, we can store some basic information about them locally +AddEventHandler('esx:setJob', function(playerId, job, lastJob) + ESX.Players[playerId] = job.name +end) + AddEventHandler('esx:playerDropped', function(playerId, reason) -- Remove the data once the player no longer exists ESX.Players[playerId] = nil end) AddEventHandler('onResourceStart', function(resourceName) -- The resource just restarted so we actually have a fresh copy of ESX.Players from the framework - if (GetCurrentResourceName() == resourceName) then - for _, xPlayer in pairs(ESX.Players) do + if (GetCurrentResourceName() == resourceName) then -- Useful if we need to run functions or send events after a restart + for playerId, xPlayer in pairs(ESX.Players) do print( ('%s %s is online with player id %s'):format(xPlayer.job.grade_label, xPlayer.name, playerId) ) end end +end) + +Citizen.CreateThread(function() + Citizen.Wait(1000) + local xPlayers = ESX.GetExtendedPlayers('job', 'police') -- New hitchless xPlayer loop, with the ability to only return players with specific data + for _, xPlayer in pairs(xPlayers) do + print(xPlayer.source, xPlayer.job.grade_label, xPlayer.name) + end end) \ No newline at end of file