Add job count tracking to framework

Introduces job count tracking and retrieval functions to both client and server modules. The server now maintains and updates a global state of job counts, synchronizing changes to clients. Refactors job registration logic for accuracy and consistency, and adds utility functions for total job counts and player source retrieval.

This usage with the state may be a problem on initial start for highly populated servers as 200 players load in for example...
This commit is contained in:
MrNewb committed 2025-08-31 22:49:31 -04:00
1 parent 9fdb41e9f6
commit 014dba1012
2 files changed
+82 -13

No files matched your search

+55 -13
View File
@@ -1,13 +1,33 @@
---@diagnostic disable: duplicate-set-field
Framework = Framework or {}
local jobsRegisteredTable = {}
local invertedJobsRegisteredTable = {}
local globalState = GlobalState
globalState.jobcounts = {}
---This is an internal function that will be used to retrieve job counts later.
---@param jobName string
---@return number
Framework.GetJobCount = function(jobName)
return #jobsRegisteredTable[jobName] or 0
if not jobsRegisteredTable[jobName] then return 0 end
local count = 0
for _ in pairs(jobsRegisteredTable[jobName]) do
count = count + 1
end
return count
end
---This will allow passing a table of job names and returning a sum of the total count.
---@param tbl any
---@return number
Framework.GetJobCountTotal = function(tbl)
local total = 0
for _, jobName in pairs(tbl) do
total = total + Framework.GetJobCount(jobName)
end
return total
end
---This will return a list of player sources for a given job.
@@ -15,7 +35,11 @@ end
---@return table
Framework.GetPlayerSourcesByJob = function(jobName)
if not jobsRegisteredTable[jobName] then return {} end
return jobsRegisteredTable[jobName]
local sources = {}
for src in pairs(jobsRegisteredTable[jobName]) do
table.insert(sources, src)
end
return sources
end
---This will update the cached tables for job counts.
@@ -23,18 +47,25 @@ end
---@param src number
---@param jobName string
Framework.AddJobCount = function(src, jobName)
if not src or not jobName then return false end
if not jobsRegisteredTable[jobName] then jobsRegisteredTable[jobName] = {} end
if jobsRegisteredTable[jobName][src] then return false end
jobsRegisteredTable[jobName][src] = true
invertedJobsRegisteredTable[src] = jobName
return true, #jobsRegisteredTable[jobName]
local newJobCounts = {}
for job, _ in pairs(jobsRegisteredTable) do
newJobCounts[job] = Framework.GetJobCount(job)
end
globalState.jobcounts = newJobCounts
return true
end
---This will return the job name for a given source.
---This is an internal function that will be used to retrieve job names in situations where player data is unavailable.
---@param src number
Framework.SearchJobCountBySource = function(src)
if not invertedJobsRegisteredTable[src] then return nil end
return invertedJobsRegisteredTable[src]
end
@@ -42,19 +73,30 @@ end
---@param src number
---@param jobName string | nil
Framework.RemoveJobCount = function(src, jobName)
if not jobName then
jobName = Framework.SearchJobCountBySource(src)
end
if not src then return false end
if not jobName then jobName = invertedJobsRegisteredTable[src] end
if not jobName then return false end
if not jobsRegisteredTable[jobName] then return false end
if not jobsRegisteredTable[jobName][src] then return false end
invertedJobsRegisteredTable[src] = nil
jobsRegisteredTable[jobName][src] = nil
return true, #jobsRegisteredTable[jobName]
if jobsRegisteredTable[jobName] then
jobsRegisteredTable[jobName][src] = nil
end
local newJobCounts = {}
for job, _ in pairs(jobsRegisteredTable) do
local count = Framework.GetJobCount(job)
if count > 0 then
newJobCounts[job] = count
end
end
globalState.jobcounts = newJobCounts
return true
end
AddEventHandler('community_bridge:Server:OnPlayerJobChange', function(src, newJobName)
local previousJob = Framework.SearchJobCountBySource(src)
local previousJob = invertedJobsRegisteredTable[src]
if previousJob then Framework.RemoveJobCount(src, previousJob) end
if newJobName then Framework.AddJobCount(src, newJobName) end
end)