From 014dba1012d57e61f0b2ecf16f7be0bfd2269972 Mon Sep 17 00:00:00 2001 From: MrNewb <47620135+MrNewb@users.noreply.github.com> Date: Sun, 31 Aug 2025 22:49:12 -0400 Subject: [PATCH] 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... --- modules/framework/_default/client.lua | 27 +++++++++++ modules/framework/_default/server.lua | 68 ++++++++++++++++++++++----- 2 files changed, 82 insertions(+), 13 deletions(-) diff --git a/modules/framework/_default/client.lua b/modules/framework/_default/client.lua index 5d895be..2bcb7c6 100644 --- a/modules/framework/_default/client.lua +++ b/modules/framework/_default/client.lua @@ -1,3 +1,30 @@ +---@diagnostic disable: duplicate-set-field Framework = Framework or {} +local currentJobCounts = GlobalState.jobcounts or {} + +AddStateBagChangeHandler('jobcounts', 'global', function(bagName, key, value) + if not value then currentJobCounts = {} return end + currentJobCounts = value +end) + +---This is an internal function that will be used to retrieve job counts later. +---@param jobName string +---@return number +Framework.GetJobCount = function(jobName) + if not currentJobCounts[jobName] then return 0 end + return currentJobCounts[jobName] +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 + return Framework \ No newline at end of file diff --git a/modules/framework/_default/server.lua b/modules/framework/_default/server.lua index 5dcdf95..40161ff 100644 --- a/modules/framework/_default/server.lua +++ b/modules/framework/_default/server.lua @@ -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)