framework.lua

The framework.lua config file allows you to change, modify or add your custom framework changes.

-- Framework detection and job counting configuration
local framework = {}

-- Auto-detect framework
local function detectFramework()
    if GetResourceState('qbx_core') == 'started' then
        return 'qbox'
    elseif GetResourceState('qb-core') == 'started' then
        return 'qbcore'
    elseif GetResourceState('es_extended') == 'started' then
        return 'esx'
    else
        return 'standalone'
    end
end

framework.current = detectFramework()

-- Framework-specific job counting functions
framework.getJobCounts = {
    qbox = function(jobCategories)
        local jobCounts = {}
        
        -- Initialize counts
        for categoryKey, categoryData in pairs(jobCategories) do
            jobCounts[categoryKey] = {
                count = 0,
                label = categoryData.label,
                icon = categoryData.icon,
                color = categoryData.color
            }
        end
        
        -- Count QBox players
        for _, player in pairs(exports.qbx_core:GetQBPlayers()) do
            if player and player.PlayerData and player.PlayerData.job then
                local playerJob = player.PlayerData.job
                local isOnDuty = playerJob.onduty or false
                
                if isOnDuty then
                    for categoryKey, categoryData in pairs(jobCategories) do
                        local isInCategory = false
                        
                        -- Check by job type
                        if categoryData.jobTypes and #categoryData.jobTypes > 0 then
                            for _, jobType in ipairs(categoryData.jobTypes) do
                                if playerJob.type == jobType then
                                    isInCategory = true
                                    break
                                end
                            end
                        end
                        
                        -- Check by job name
                        if not isInCategory and categoryData.jobCodes and #categoryData.jobCodes > 0 then
                            for _, jobCode in ipairs(categoryData.jobCodes) do
                                if playerJob.name == jobCode then
                                    isInCategory = true
                                    break
                                end
                            end
                        end
                        
                        if isInCategory then
                            jobCounts[categoryKey].count = jobCounts[categoryKey].count + 1
                        end
                    end
                end
            end
        end
        
        return jobCounts
    end,
    
    qbcore = function(jobCategories)
        local jobCounts = {}
        local QBCore = exports['qb-core']:GetCoreObject()
        
        -- Initialize counts
        for categoryKey, categoryData in pairs(jobCategories) do
            jobCounts[categoryKey] = {
                count = 0,
                label = categoryData.label,
                icon = categoryData.icon,
                color = categoryData.color
            }
        end
        
        -- Count QBCore players
        local players = QBCore.Functions.GetQBPlayers()
        for _, player in pairs(players) do
            if player and player.PlayerData and player.PlayerData.job then
                local playerJob = player.PlayerData.job
                local isOnDuty = playerJob.onduty or false
                
                if isOnDuty then
                    for categoryKey, categoryData in pairs(jobCategories) do
                        local isInCategory = false
                        
                        -- Check by job type
                        if categoryData.jobTypes and #categoryData.jobTypes > 0 then
                            for _, jobType in ipairs(categoryData.jobTypes) do
                                if playerJob.type == jobType then
                                    isInCategory = true
                                    break
                                end
                            end
                        end
                        
                        -- Check by job name
                        if not isInCategory and categoryData.jobCodes and #categoryData.jobCodes > 0 then
                            for _, jobCode in ipairs(categoryData.jobCodes) do
                                if playerJob.name == jobCode then
                                    isInCategory = true
                                    break
                                end
                            end
                        end
                        
                        if isInCategory then
                            jobCounts[categoryKey].count = jobCounts[categoryKey].count + 1
                        end
                    end
                end
            end
        end
        
        return jobCounts
    end,
    
    esx = function(jobCategories)
        local jobCounts = {}
        local ESX = exports['es_extended']:getSharedObject()
        
        -- Initialize counts
        for categoryKey, categoryData in pairs(jobCategories) do
            jobCounts[categoryKey] = {
                count = 0,
                label = categoryData.label,
                icon = categoryData.icon,
                color = categoryData.color
            }
        end
        
        -- Count ESX players
        local xPlayers = ESX.GetExtendedPlayers()
        for _, xPlayer in pairs(xPlayers) do
            if xPlayer then
                local playerJob = xPlayer.getJob()
                
                -- ESX doesn't have onduty by default, check if using a duty system
                local isOnDuty = true -- Assume on duty unless using a duty script
                
                if isOnDuty then
                    for categoryKey, categoryData in pairs(jobCategories) do
                        local isInCategory = false
                        
                        -- ESX doesn't have job types, only check job names
                        if categoryData.jobCodes and #categoryData.jobCodes > 0 then
                            for _, jobCode in ipairs(categoryData.jobCodes) do
                                if playerJob.name == jobCode then
                                    isInCategory = true
                                    break
                                end
                            end
                        end
                        
                        if isInCategory then
                            jobCounts[categoryKey].count = jobCounts[categoryKey].count + 1
                        end
                    end
                end
            end
        end
        
        return jobCounts
    end,
    
    standalone = function(jobCategories)
        -- Return empty counts for standalone
        local jobCounts = {}
        for categoryKey, categoryData in pairs(jobCategories) do
            jobCounts[categoryKey] = {
                count = 0,
                label = categoryData.label,
                icon = categoryData.icon,
                color = categoryData.color
            }
        end
        return jobCounts
    end
}

-- Get player count based on framework
framework.getPlayerCount = {
    qbox = function()
        local count = 0
        for _, _ in pairs(exports.qbx_core:GetQBPlayers()) do
            count = count + 1
        end
        return count
    end,
    
    qbcore = function()
        local QBCore = exports['qb-core']:GetCoreObject()
        local players = QBCore.Functions.GetQBPlayers()
        local count = 0
        for _, _ in pairs(players) do
            count = count + 1
        end
        return count
    end,
    
    esx = function()
        local ESX = exports['es_extended']:getSharedObject()
        local xPlayers = ESX.GetExtendedPlayers()
        return #xPlayers
    end,
    
    standalone = function()
        -- Use native FiveM function
        return #GetPlayers()
    end
}

return framework

Last updated