mirror of
https://github.com/jimathy/jim_bridge.git
synced 2026-08-17 05:56:02 +01:00
So information and request for help. The issue here is that my scripts require Job and Vehicle information when the script starts, to do a debug check if the job exists for the location. ESX doesn't share this with the client for some reason, so this requires me to request it from the server side at script ensure. This is causing issues because it delays loading of the rest of `jim_bridge` while it slowly requests `ESX.GetJobs()` table from server side This is delayed even more when the script is placed towards the top of the server load order and it needs to load other things like MLO's As its trying to load this the rest of the script carries on loading with missing information. So it loads the script thinking there are 0 jobs and breaks it. If anyone knows of a better way of doing this then please help. The only partial solution is to start my scripts last in the server load order
284 lines
11 KiB
Lua
284 lines
11 KiB
Lua
--[[
|
|
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
|
|
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 "",
|
|
Exports.QBExport or "",
|
|
Exports.ESXExport or "",
|
|
Exports.OXCoreExport or ""
|
|
|
|
OXInv, QBInv, PSInv, QSInv, CoreInv, CodeMInv, OrigenInv, TgiannInv =
|
|
Exports.OXInv or "",
|
|
Exports.QBInv or "",
|
|
Exports.PSInv or "",
|
|
Exports.QSInv or "",
|
|
Exports.CoreInv or "",
|
|
Exports.CodeMInv or "",
|
|
Exports.OrigenInv or "",
|
|
Exports.TgiannInv 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()
|
|
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
|
|
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(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
|
|
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')
|
|
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 {}
|
|
Vehicles[v.model] = {
|
|
model = v.model,
|
|
hash = GetHashKey(v.model),
|
|
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
|
|
CreateThread(function()
|
|
while not Vehicles do Wait(1000) end
|
|
debugPrint("^6Bridge^7: ^2Loading ^6"..countTable(Vehicles).." ^3Vehicles^2 from ^7"..vehResource)
|
|
end)
|
|
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 = OXExport
|
|
CreateThread(function()
|
|
if isServer() then
|
|
createCallback(getScript()..":getOxGroups", function(source)
|
|
Jobs = MySQL.query.await('SELECT * FROM `ox_groups`')
|
|
return Jobs
|
|
end)
|
|
else
|
|
local TempJobs = triggerCallback(getScript()..":getOxGroups")
|
|
Jobs = {}
|
|
for k, v in pairs(TempJobs) do
|
|
local grades = {}
|
|
--for i = 1, #v.grades do
|
|
-- grades[i] = { name = v.grades[i], isboss = (i == #v.grades) }
|
|
--end
|
|
Jobs[v.name] = { label = v.label, grades = grades }
|
|
end
|
|
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()
|
|
--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 k, v in pairs(Jobs) do
|
|
local count = countTable(Jobs[k].grades) - 1
|
|
Jobs[k].grades[tostring(count)].isBoss = true
|
|
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 Vehicle 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 |