diff --git a/frameworkCache.lua b/frameworkCache.lua new file mode 100644 index 0000000..1e368da --- /dev/null +++ b/frameworkCache.lua @@ -0,0 +1,285 @@ +--[[ + Cached Resource Initialization Module + -------------------------------------- + This module initializes shared data (Items, Vehicles, Jobs, Gangs) + only once and stores it in _G.__jimBridgeDataCache for reuse across scripts. +]] + +local Exports = { + QBExport = "qb-core", + QBXExport = "qbx_core", + ESXExport = "es_extended", + OXCoreExport = "ox_core", + + OXInv = "ox_inventory", + QBInv = "qb-inventory", + PSInv = "ps-inventory", + QSInv = "qs-inventory", + CoreInv = "core_inventory", + CodeMInv = "codem-inventory", + OrigenInv = "origen_inventory", + TgiannInv = "tgiann-inventory", + + OXLibExport = "ox_lib", + + QBMenuExport = "qb-menu", + + QBTargetExport = "qb-target", + OXTargetExport = "ox_target", + + -- REDM + RSGExport = "rsg-core", + RSGInv = "rsg-inventory" +} + +-- Ensure cache only runs once +if _G.__jimBridgeDataCache then return end +_G.__jimBridgeDataCache = {} +local cache = _G.__jimBridgeDataCache + +function checkExists(resourceName) + return GetResourceState(resourceName):find("start") or GetResourceState(resourceName):find("stopped") +end + +local fileLoader = assert(load(LoadResourceFile("oxmysql", ('lib/MySQL.lua')), ('@@oxmysql/lib/MySQL.lua'))) +fileLoader() +if checkExists(Exports.OXCoreExport) then + -- Detected OX_Core in server, wait for it to be started if needed + while GetResourceState(Exports.OXCoreExport) ~= "started" do Wait(100) end + local fileLoader = assert(load(LoadResourceFile(Exports.OXCoreExport, ('lib/init.lua')), ('@@'..Exports.OXCoreExport..'/lib/init.lua'))) + fileLoader() +end +if checkExists(Exports.ESXExport) then + -- Detected ESX in server, wait for it to be started if needed + while GetResourceState(Exports.ESXExport) ~= "started" do Wait(100) end + local fileLoader = assert(load(LoadResourceFile(Exports.ESXExport, ('/imports.lua')), ('@@'..Exports.ESXExport..'/imports.lua'))) + fileLoader() +end + +-- Init variables +local Items, Vehicles, Jobs, Gangs, Core = nil, nil, nil, nil, nil +local itemResource, jobResource, vehResource = "", "", "" + +-- Print just to announce it knows the exports/scripts exist in the server +for _, v in pairs(Exports) do + if checkExists(v) then + print("^6Bridge^7: '^3"..v.."^7' detected") + end +end + +--------------------- +---- Load Items ----- +--------------------- +if checkExists(Exports.OXInv) then + -- Wait for OX Inventory to start if it's not already started + while GetResourceState(Exports.OXInv) ~= "started" do Wait(100) end + itemResource = Exports.OXInv + Items = exports[Exports.OXInv]:Items() + -- IF QBX-Core is running, merge items from there + if checkExists(Exports.QBExport)then + local tempWeapons = exports[Exports.QBExport]:GetCoreObject().Shared.Weapons + for k, v in pairs(tempWeapons) do + local info = exports[Exports.OXInv]:Items(v.name) + local weight = info and info.weight or 0 + if not Items[v.name] then + Items[v.name] = { + name = v.name, + label = v.label, + type = "weapon", + ammotype = v.ammotype or "AMMO_PISTOL", + weight = weight, + image = v.image or (v.name..".png"), + description = v.label or "", + } + end + end + end + -- tidy info into something jim_bridge can use + for k, v in pairs(Items) do + Items[k].image = (v.client and v.client.image) and v.client.image:gsub("nui://"..Exports.OXInv.."/web/images/", "") or k..".png" + Items[k].hunger = v.client and v.client.hunger + Items[k].thirst = v.client and v.client.thirst + end + +elseif checkExists(Exports.QBExport) then + while GetResourceState(Exports.QBExport) ~= "started" do Wait(100) end + itemResource = Exports.QBExport + Core = exports[Exports.QBExport]:GetCoreObject() + Items = Core.Shared.Items + +elseif checkExists(Exports.ESXExport) then + itemResource = Exports.ESXExport + if GetResourceState(Exports.QSInv):find("start") then + Items = exports[Exports.QSInv]:GetItemList() + else + Items = ESX.GetItems() + while not next(Items) do + Items = ESX.GetItems() + Wait(1000) + end + end + +elseif checkExists(Exports.RSGExport) then + while GetResourceState(Exports.RSGExport) ~= "started" do Wait(100) end + itemResource = Exports.RSGExport + Core = exports[Exports.RSGExport]:GetCoreObject() + Items = Core.Shared.Items +end + +--------------------- +--- Load Vehicles --- +--------------------- +if checkExists(Exports.QBXExport) or checkExists(Exports.QBExport) then + vehResource = Exports.QBExport + Core = Core or exports[Exports.QBExport]:GetCoreObject() + Vehicles = Core.Shared.Vehicles + +elseif checkExists(Exports.OXCoreExport) then + vehResource = Exports.OXCoreExport + Vehicles = {} + for k, v in pairs(Ox.GetVehicleData()) do + Vehicles[k] = { + model = k, hash = GetHashKey(k), + price = v.price, + name = v.name, + brand = v.make + } + end + +elseif checkExists(Exports.ESXExport) then + vehResource = Exports.ESXExport + while not MySQL do Wait(1000) end + Vehicles = {} + for _, v in pairs(MySQL.query.await('SELECT model, price, name FROM vehicles')) do + Vehicles[v.model] = { + model = v.model, + hash = GetHashKey(v.model), + price = v.price, + name = v.name, + } + end + +elseif checkExists(Exports.RSGExport) then + vehResource = Exports.RSGExport + Core = Core or exports[Exports.RSGExport]:GetCoreObject() + Vehicles = Core.Shared.Vehicles +end + +--------------------- +----- Load Jobs ----- +--------------------- +if checkExists(Exports.QBXExport) then + jobResource = Exports.QBXExport + Core = Core or exports[Exports.QBXExport]:GetCoreObject() + Jobs, Gangs = exports[Exports.QBXExport]:GetJobs(), exports[Exports.QBXExport]:GetGangs() + +elseif checkExists(Exports.OXCoreExport) then + jobResource = Exports.OXCoreExport + Jobs = {} + while not MySQL do Wait(1000) end + local tempJobs = MySQL.query.await('SELECT * FROM `ox_groups`') + local tempGrades = MySQL.query.await('SELECT * FROM `ox_group_grades`') + local gradeMap = {} + for _, grade in pairs(tempGrades) do + gradeMap[grade.group] = gradeMap[grade.group] or {} + gradeMap[grade.group][grade.grade] = { name = grade.label } + end + for _, job in pairs(tempJobs) do + Jobs[job.name] = { + label = job.label, + grades = gradeMap[job.name] or {} + } + end + Gangs = Jobs + +elseif checkExists(Exports.QBExport) then + jobResource = Exports.QBExport + Core = Core or exports[Exports.QBExport]:GetCoreObject() + Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs + +elseif checkExists(Exports.ESXExport) then + jobResource = Exports.ESXExport + ESX = exports[Exports.ESXExport]:getSharedObject() + Jobs = ESX.GetJobs() + while not next(Jobs) do + Wait(100) + Jobs = ESX.GetJobs() + end + for Role, Grades in pairs(Jobs) do + -- Check for if user has added grades + if Grades.grades == nil or not next(Grades.grades) then + goto continue + end + for grade, info in pairs(Grades.grades) do + if info.label and info.label:find("[Bb]oss") then + Jobs[Role].grades[grade].isBoss = true + goto continue + end + end + local highestGrade = nil + for k in pairs(Grades.grades) do + local num = tonumber(k) + if num and (not highestGrade or num > highestGrade) then + highestGrade = num + end + end + + if highestGrade then + print("found boss for", Role) + Jobs[Role].grades[tostring(highestGrade)].isBoss = true + end + ::continue:: + end + Gangs = Jobs + +elseif checkExists(Exports.RSGExport) then + jobResource = Exports.RSGExport + Core = Core or exports[Exports.RSGExport]:GetCoreObject() + Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs +end + +-- Save to global cache +cache.Items = Items +cache.Vehicles = Vehicles +cache.Jobs = Jobs +cache.Gangs = Gangs + +CreateThread(function() + local counts = { + Items = 0, + Vehicles = 0, + Jobs = 0, + Gangs = 0, + } + for k, v in pairs(cache) do + for count in pairs(v) do + counts[k] += 1 + end + end + print("^6FrameworkCache^7: ^2Loaded ^5"..tostring(counts.Items).."^2 Items from ^7"..itemResource) + print("^6FrameworkCache^7: ^2Loaded ^5"..tostring(counts.Vehicles).."^2 Vehicles from ^7"..vehResource) + print("^6FrameworkCache^7: ^2Loaded ^5"..tostring(counts.Jobs).."^2 Jobs from ^7"..jobResource) + print("^6FrameworkCache^7: ^2Loaded ^5"..tostring(counts.Gangs).."^2 Gangs from ^7"..jobResource) +end) + +--print(json.encode(cache.Items , { indent = true})) + +RegisterNetEvent("jim_bridge:requestCache", function() + local src = source + TriggerClientEvent("jim_bridge:receiveCache", src, _G.__jimBridgeDataCache) +end) + + +exports("GetSharedData", function() + -- Wait for data to be ready before returning it + local timeout = GetGameTimer() + 5000 + while ( + not _G.__jimBridgeDataCache or + (not _G.__jimBridgeDataCache.Items or next(_G.__jimBridgeDataCache.Items) == nil) or + (not _G.__jimBridgeDataCache.Vehicles or next(_G.__jimBridgeDataCache.Vehicles) == nil) or + (not _G.__jimBridgeDataCache.Jobs or next(_G.__jimBridgeDataCache.Jobs) == nil) + ) and GetGameTimer() < timeout do + Wait(50) + end + return _G.__jimBridgeDataCache +end) \ No newline at end of file diff --git a/fxmanifest.lua b/fxmanifest.lua index 2a2c436..7087c7a 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -16,4 +16,11 @@ files { } -- Version checker -server_scripts { '_versioncheck.lua' } \ No newline at end of file +server_scripts { + 'frameworkCache.lua', + '_versioncheck.lua' +} + +client_scripts { + 'ui_modules/*.lua' +} \ No newline at end of file diff --git a/shared/_loaders.lua b/shared/_loaders.lua index 3112745..1c50bff 100644 --- a/shared/_loaders.lua +++ b/shared/_loaders.lua @@ -52,7 +52,7 @@ function onPlayerLoaded(func, onStart) onPlayerFramework = ESXExport AddEventHandler('esx:playerLoaded', function() if waitForSharedLoad() then - if isStarted(ESXExport) then Wait(11000) end + if isStarted(ESXExport) then Wait(1000) end tempFunc() end end @@ -105,12 +105,16 @@ end --- -- Initialization code on resource start. --- end, true) --- ``` +local hasPrinted = false function onResourceStart(func, thisScript) debugPrint("^6Bridge^7: ^2Registering ^3onResourceStart^7()") AddEventHandler('onResourceStart', function(resourceName) if getScript() == resourceName and (thisScript or true) then if waitForSharedLoad() then - debugPrint("^6Bridge^7: ^2Shared Load Detected^7.") + if not hasPrinted then + debugPrint("^6Bridge^7: ^2Shared Load Detected^7.") + hasPrinted = true + end if isStarted(ESXExport) then Wait(10000) end func() end @@ -186,22 +190,38 @@ function waitForLogin() end end +local messageShown = false function waitForSharedLoad() local timeout = 100000 -- 10 seconds in milliseconds local startTime = GetGameTimer() local loaded = true + --Wait(1000) + local count = {} + local loop = 0 while ((not Jobs or not next(Jobs)) and (not Items or not next(Items)) and (not Vehicles or not next(Vehicles))) and (GetGameTimer() - startTime) < timeout do - print((GetGameTimer() - startTime) < timeout) + if not messageShown then + if (not Jobs or not next(Jobs)) then + debugPrint("^4Debug^7: ^2Waiting for Jobs to be loaded") + end + if (not Items or not next(Items)) then + debugPrint("^4Debug^7: ^2Waiting for Items to be loaded") + end + if (not Vehicles or not next(Vehicles)) then + debugPrint("^4Debug^7: ^2Waiting for Vehicles to be loaded") + end + end + messageShown = true + --print((GetGameTimer() - startTime) < timeout) Wait(1000) - debugPrint("Waiting for Jobs, Items, and Vehicles to be loaded") if Jobs and Items and Vehicles then - print("^6Bridge^7: ^2Jobs, Items, and Vehicles Loaded^7.") + --print("^6Bridge^7: ^2Jobs, Items, and Vehicles Loaded^7.") loaded = true break end + loop += 1 end if not loaded then - print("^4Error^7: ^2Timeout reached while waiting for shared load^7.") + print("^4Error^7: ^1Timeout reached while waiting for shared load^7.") return false else return true diff --git a/shared/coreloader.lua b/shared/coreloader.lua index 6deddb0..5d32050 100644 --- a/shared/coreloader.lua +++ b/shared/coreloader.lua @@ -1,25 +1,8 @@ ---[[ - Resource Initialization Module - -------------------------------- - This module initializes and loads shared data (Items, Vehicles, Jobs, Gangs) from the - various frameworks/inventory systems (OX, QB, ESX, etc.). It also corrects export names, - caches framework exports into simple variables, and prints debug information if enabled. -]] - -------------------------------------------------------------- --- Global Variable Initialization -------------------------------------------------------------- Items, Vehicles, Jobs, Gangs, Core = {}, nil, nil, nil, nil -------------------------------------------------------------- --- Correct QB Inventory Export -------------------------------------------------------------- --- Correct ps-invetory to ls-inventory if somehow you still have that +-- Shared Exports Initialization Exports.PSInv = isStarted("lj-inventory") and "lj-inventory" or Exports.PSInv -------------------------------------------------------------- --- Framework Exports and Inventory Identifiers -------------------------------------------------------------- OXLibExport, QBXExport, QBExport, ESXExport, OXCoreExport = Exports.OXLibExport or "", Exports.QBXExport or "", @@ -37,310 +20,83 @@ OXInv, QBInv, PSInv, QSInv, CoreInv, CodeMInv, OrigenInv, TgiannInv = Exports.OrigenInv or "", Exports.TgiannInv or "" -RSGExport, RSGInv = - Exports.RSGExport or "", - Exports.RSGInv or "" - +RSGExport, RSGInv = Exports.RSGExport or "", Exports.RSGInv or "" QBMenuExport = Exports.QBMenuExport or "" QBTargetExport, OXTargetExport = Exports.QBTargetExport or "", Exports.OXTargetExport or "" -------------------------------------------------------------- --- Debug: Print Found Exports -------------------------------------------------------------- --- Print a list of all exports that are currently started (if debugMode is enabled). -for _, v in pairs(Exports) do - if isStarted(v) then - debugPrint("^6Bridge^7: '^3"..v.."^7' export found") - end -end - -OxPlayer = nil -if isStarted(OXCoreExport) then - if not isServer() then - OxPlayer = Ox.GetPlayer() - end -end - -------------------------------------------------------------- --- Resource Variables for Items, Jobs, and Vehicles -------------------------------------------------------------- -local itemResource, jobResource, vehResource = "", "", "" - -------------------------------------------------------------- --- Loading Items -------------------------------------------------------------- --- Load and compile shared items from the detected inventory system. -if isStarted(OXInv) then - itemResource = OXInv - Items = exports[OXInv]:Items() - - -- Add weapons to Items from QBXCore if available - if isStarted(QBXExport) then - local tempWeapons = exports[QBExport]:GetCoreObject().Shared.Weapons - for k, v in pairs(tempWeapons) do - local tempWeaponInfo = exports[OXInv]:Items(v.name) - local weight = 0 - if tempWeaponInfo then - weight = tempWeaponInfo.weight - end - if not Items[v.name] then - Items[v.name] = { - name = v.name, - label = v.label, - type = "weapon", - ammotype = v.ammotype or "AMMO_PISTOL", - weight = weight, - image = v.image or (v.name..".png"), - description = v.label or "", - } - end - end - end - for k, v in pairs(Items) do - if v.client and v.client.image then - Items[k].image = (v.client.image):gsub("nui://"..OXInv.."/web/images/", "") - else - Items[k].image = k..".png" - end - Items[k].hunger = v.client and v.client.hunger or nil - Items[k].thirst = v.client and v.client.thirst or nil - end - -elseif isStarted(QBExport) then - itemResource = QBExport - Core = Core or exports[QBExport]:GetCoreObject() - Items = Core and Core.Shared.Items or nil - CreateThread(function() - while not Items or not next(Items) do - Items = exports[QBExport]:GetCoreObject().Shared.Items - Wait(1000) - end - end) - if isStarted(QBExport) and not isStarted(QBXExport) then - RegisterNetEvent('QBCore:Client:UpdateObject', function() - Core = Core or exports[QBExport]:GetCoreObject() - Items = Core and Core.Shared.Items or nil - end) - end - -elseif isStarted(ESXExport) then - itemResource = ESXExport - CreateThread(function() - if isServer() then - Items = ESX.GetItems() - while not createCallback do Wait(100) end - createCallback(getScript()..":getItems", function(source) - return Items - end) - end - if not isServer() then - Items = triggerCallback(getScript()..":getItems") - debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Items).." ^3Items^2 from ^7"..itemResource) - end - end) - -elseif isStarted(RSGExport) then - itemResource = RSGExport - Core = Core or exports[RSGExport]:GetCoreObject() - Items = Core and Core.Shared.Items or nil - RegisterNetEvent('RSGCore:Client:UpdateObject', function() - Core = Core or exports[RSGExport]:GetCoreObject() - Items = Core and Core.Shared.Items or nil - end) - -end - -if itemResource == nil then - print("^4ERROR^7: ^2No Item info detected ^7- ^2Check ^3starter^1.^2lua^7") -else - while not Items do Wait(100) end - debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Items).." ^3Items^2 from ^7"..itemResource) -end - - -------------------------------------------------------------- --- Loading Vehicles -------------------------------------------------------------- --- Compile vehicles from the detected frameworks into a unified table. if isStarted(QBXExport) or isStarted(QBExport) then - vehResource = QBExport Core = Core or exports[QBExport]:GetCoreObject() - Vehicles = Core and Core.Shared.Vehicles - if isStarted(QBExport) and not isStarted(QBXExport) then - RegisterNetEvent('QBCore:Client:UpdateObject', function() - Core = Core or exports[QBExport]:GetCoreObject() - Vehicles = Core and Core.Shared.Vehicles - end) - end +elseif isStarted(RSGExport) then + Core = Core or exports[RSGExport]:GetCoreObject() +end -elseif isStarted(OXCoreExport) then - vehResource = OXCoreExport - Vehicles = {} - for k, v in pairs(Ox.GetVehicleData()) do - Vehicles[k] = { model = k, hash = GetHashKey(k), price = v.price, name = v.name, brand = v.make } - end -elseif isStarted(ESXExport) then - vehResource = ESXExport +if IsDuplicityVersion() then CreateThread(function() - if isServer() then - createCallback(getScript()..":getVehiclesPrices", function(source) - return Vehicles - end) - while not MySQL do Wait(2000) print("^1Waiting for MySQL to exist") end - Vehicles = MySQL.query.await('SELECT model, price, name FROM vehicles') + local cache = nil + local timeout = GetGameTimer() + 5000 -- 5 seconds max wait + + -- Wait until jim_bridge is started and export is available + while not cache and GetGameTimer() < timeout do + if GetResourceState("jim_bridge"):find("start") then + local success, result = pcall(function() + return exports["jim_bridge"]:GetSharedData() + end) + if success and result then + cache = result + --print(json.encode(cache, {indent = true})) + end + end + Wait(100) end - if not isServer() then - --while not triggerCallback do print("waiting") Wait(100) end - local TempVehicles = triggerCallback(getScript()..":getVehiclesPrices") - for _, v in pairs(TempVehicles) do - Vehicles = Vehicles or {} + + if not cache then + print("^1ERROR^7: ^2jim_bridge export not available after timeout^7.") + return + end + + Items = cache.Items + Vehicles = cache.Vehicles + Jobs = cache.Jobs + Gangs = cache.Gangs + + debugPrint("^6Bridge^7: ^2Shared cache successfully loaded from export^7.") + end) +else + local hasCache = false + -- 🔹 Client Side: Request from server + _G.__jimBridgeDataCache = {} + + RegisterNetEvent("jim_bridge:receiveCache", function(data) + if not hasCache then + _G.__jimBridgeDataCache = data + hasCache = true + else + return + end + end) + + TriggerServerEvent("jim_bridge:requestCache") + + CreateThread(function() + while not _G.__jimBridgeDataCache or not next(_G.__jimBridgeDataCache) do Wait(50) end + local cache = _G.__jimBridgeDataCache + Items = cache.Items or {} + Vehicles = cache.Vehicles or {} + Jobs = cache.Jobs or {} + Gangs = cache.Gangs or {} + + if isStarted(ESXExport) then + for _, v in pairs(Vehicles) do Vehicles[v.model] = { model = v.model, - hash = GetHashKey(v.model), + hash = v.hash, price = v.price, name = v.name, brand = GetMakeNameFromVehicleModel(v.model):lower():gsub("^%l", string.upper) } end end - end) -elseif isStarted(RSGExport) then - vehResource = RSGExport - Core = Core or exports[RSGExport]:GetCoreObject() - Vehicles = Core and Core.Shared.Vehicles - RegisterNetEvent('RSGCore:Client:UpdateObject', function() - Core = Core or exports[RSGExport]:GetCoreObject() - Vehicles = Core and Core.Shared.Vehicles end) end -if vehResource == nil then - print("^4ERROR^7: ^2No Vehicle info detected ^7- ^2Check ^3starter^1.^2lua^7") -else - while not Vehicles do Wait(1000) end - debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Vehicles).." ^3Vehicles^2 from ^7"..vehResource) -end - -------------------------------------------------------------- --- Loading Jobs and Gangs -------------------------------------------------------------- --- Compile jobs and gangs from the detected framework. -if isStarted(QBXExport) then - jobResource = QBXExport - Core = Core or exports[QBExport]:GetCoreObject() - Jobs, Gangs = exports[QBXExport]:GetJobs(), exports[QBXExport]:GetGangs() - -elseif isStarted(OXCoreExport) then - jobResource = OXCoreExport - CreateThread(function() - if isServer() then - Jobs = {} - createCallback(getScript()..":getOxGroups", function(source) - return Jobs - end) - local tempJobs = MySQL.query.await('SELECT * FROM `ox_groups`') - local tempGrades = MySQL.query.await('SELECT * FROM `ox_group_grades`') - -- Index all grades by group - local gradeMap = {} - for _, grade in pairs(tempGrades) do - gradeMap[grade.group] = gradeMap[grade.group] or {} - gradeMap[grade.group][grade.grade] = { - name = grade.label - } - end - - -- Process jobs and attach grades - for _, job in pairs(tempJobs) do - Jobs[job.name] = { - label = job.label, - grades = gradeMap[job.name] or {} - } - end - - -- Copy to Gangs - Gangs = Jobs - else - Jobs = triggerCallback(getScript()..":getOxGroups") - Gangs = Jobs - end - end) - -elseif isStarted(QBExport) then - jobResource = QBExport - Core = Core or exports[QBExport]:GetCoreObject() - Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs - if isStarted(QBExport) and not isStarted(QBXExport) then - RegisterNetEvent('QBCore:Client:UpdateObject', function() - Core = exports[QBExport]:GetCoreObject() - Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs - end) - end - -elseif isStarted(ESXExport) then - jobResource = ESXExport - if isServer() then - -- If server, create callback to get jobs - createCallback(getScript()..":getESXJobs", function(source) - return Jobs - end) - -- Populate jobs table with ESX.GetJobs() - Jobs = ESX.GetJobs() - --jsonPrint(Jobs) - --If retreived jobs is empty, wait for ESX to load - while countTable(Jobs) == 0 do - Jobs = ESX.GetJobs() - Wait(100) - end - -- Organise into a table the script can use - for Role, Grades in pairs(Jobs) do - - -- Check for "Boss" in name of grades - for grade, info in pairs(Grades.grades) do - --print(grade) - --jsonPrint(info) - - if info.label then - --print(info) - if info.label:find("boss") or info.label:find("Boss") then - --print("Found Boss label for:", Grades.label) - Jobs[Role].grades[grade].isBoss = true - goto continue - end - end - end - - -- If no roles with "boss" in the name, revert to max grade - - -- Count grades - local count = countTable(Grades.grades) - Jobs[Role].grades[tostring(count-1)].isBoss = true - --print(Grades.label.." Grade: "..count.." is Boss") - ::continue:: - end - -- ESX Default doesn't have gangs, so copy jobs to gangs - Gangs = Jobs - end - -- If client side, trigger callback to get jobs - if not isServer() then - Jobs = triggerCallback(getScript()..":getESXJobs") - Gangs = Jobs - end - -elseif isStarted(RSGExport) then - jobResource = RSGExport - Core = Core or exports[RSGExport]:GetCoreObject() - Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs - RegisterNetEvent('RSGCore:Client:UpdateObject', function() - Core = exports[RSGExport]:GetCoreObject() - Jobs, Gangs = Core.Shared.Jobs, Core.Shared.Gangs - end) -end - -if jobResource == nil then - print("^4ERROR^7: ^2No Job info detected ^7- ^2Check ^3starter^1.^2lua^7") -else - while not Jobs do Wait(1000) end - debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Jobs).." ^3Jobs^2 from ^7"..jobResource) - debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Gangs).." ^3Gangs^2 from ^7"..jobResource) -end \ No newline at end of file