diff --git a/client/events.lua b/client/events.lua index c172c16..67755aa 100644 --- a/client/events.lua +++ b/client/events.lua @@ -208,7 +208,9 @@ end) -- Client Callback RegisterNetEvent('QBCore:Client:TriggerClientCallback', function(name, ...) - QBCore.Functions.TriggerClientCallback(name, function(...) + if not QBCore.ClientCallbacks[name] then return end + + QBCore.ClientCallbacks[name](function(...) TriggerServerEvent('QBCore:Server:TriggerClientCallback', name, ...) end, ...) end) @@ -216,7 +218,12 @@ end) -- Server Callback RegisterNetEvent('QBCore:Client:TriggerCallback', function(name, ...) if QBCore.ServerCallbacks[name] then - QBCore.ServerCallbacks[name](...) + QBCore.ServerCallbacks[name].promise:resolve(...) + + if QBCore.ServerCallbacks[name].callback then + QBCore.ServerCallbacks[name].callback(...) + end + QBCore.ServerCallbacks[name] = nil end end) diff --git a/client/functions.lua b/client/functions.lua index 45034a5..8c03183 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -6,14 +6,26 @@ function QBCore.Functions.CreateClientCallback(name, cb) QBCore.ClientCallbacks[name] = cb end -function QBCore.Functions.TriggerClientCallback(name, cb, ...) - if not QBCore.ClientCallbacks[name] then return end - QBCore.ClientCallbacks[name](cb, ...) -end +function QBCore.Functions.TriggerCallback(name, ...) + local cb = nil + local args = { ... } -function QBCore.Functions.TriggerCallback(name, cb, ...) - QBCore.ServerCallbacks[name] = cb - TriggerServerEvent('QBCore:Server:TriggerCallback', name, ...) + if QBCore.Shared.IsFunction(args[1]) then + cb = args[1] + table.remove(args, 1) + end + + QBCore.ServerCallbacks[name] = { + callback = cb, + promise = promise.new() + } + + TriggerServerEvent('QBCore:Server:TriggerCallback', name, table.unpack(args)) + + if cb == nil then + Citizen.Await(QBCore.ServerCallbacks[name].promise) + return QBCore.ServerCallbacks[name].promise.value + end end function QBCore.Debug(resource, obj, depth) diff --git a/server/events.lua b/server/events.lua index 9311e80..00b0fa5 100644 --- a/server/events.lua +++ b/server/events.lua @@ -32,7 +32,7 @@ local databaseConnected, bansTableExists = readyFunction == nil, readyFunction = if readyFunction ~= nil then MySQL.ready(function() databaseConnected = true - + local DatabaseInfo = QBCore.Functions.GetDatabaseInfo() if not DatabaseInfo or not DatabaseInfo.exists then return end @@ -125,15 +125,23 @@ end) -- Client Callback RegisterNetEvent('QBCore:Server:TriggerClientCallback', function(name, ...) if QBCore.ClientCallbacks[name] then - QBCore.ClientCallbacks[name](...) + QBCore.ClientCallbacks[name].promise:resolve(...) + + if QBCore.ClientCallbacks[name].callback then + QBCore.ClientCallbacks[name].callback(...) + end + QBCore.ClientCallbacks[name] = nil end end) -- Server Callback RegisterNetEvent('QBCore:Server:TriggerCallback', function(name, ...) + if not QBCore.ServerCallbacks[name] then return end + local src = source - QBCore.Functions.TriggerCallback(name, src, function(...) + + QBCore.ServerCallbacks[name](src, function(...) TriggerClientEvent('QBCore:Client:TriggerCallback', src, name, ...) end, ...) end) diff --git a/server/functions.lua b/server/functions.lua index 9cfe78e..d9bfc57 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -434,9 +434,26 @@ end ---@param source any ---@param cb function ---@param ... any -function QBCore.Functions.TriggerClientCallback(name, source, cb, ...) - QBCore.ClientCallbacks[name] = cb - TriggerClientEvent('QBCore:Client:TriggerClientCallback', source, name, ...) +function QBCore.Functions.TriggerClientCallback(name, source, ...) + local cb = nil + local args = { ... } + + if QBCore.Shared.IsFunction(args[1]) then + cb = args[1] + table.remove(args, 1) + end + + QBCore.ClientCallbacks[name] = { + callback = cb, + promise = promise.new() + } + + TriggerClientEvent('QBCore:Client:TriggerClientCallback', source, name, table.unpack(args)) + + if cb == nil then + Citizen.Await(QBCore.ClientCallbacks[name].promise) + return QBCore.ClientCallbacks[name].promise.value + end end ---Create Server Callback @@ -446,16 +463,6 @@ function QBCore.Functions.CreateCallback(name, cb) QBCore.ServerCallbacks[name] = cb end ----Trigger Serv er Callback ----@param name string ----@param source any ----@param cb function ----@param ... any -function QBCore.Functions.TriggerCallback(name, source, cb, ...) - if not QBCore.ServerCallbacks[name] then return end - QBCore.ServerCallbacks[name](source, cb, ...) -end - -- Items ---Create a usable item @@ -475,7 +482,7 @@ function QBCore.Functions.CreateUseableItem(item, data) elseif type(data) == "function" then rawFunc = data end - + if rawFunc then QBCore.UsableItems[item] = { func = rawFunc, diff --git a/shared/main.lua b/shared/main.lua index d01b93c..2863b35 100644 --- a/shared/main.lua +++ b/shared/main.lua @@ -68,6 +68,14 @@ function QBShared.ChangeVehicleExtra(vehicle, extra, enable) end end +function QBShared.IsFunction(value) + if type(value) == 'table' then + return value.__cfx_functionReference ~= nil and type(value.__cfx_functionReference) == "string" + end + + return type(value) == 'function' +end + function QBShared.SetDefaultVehicleExtras(vehicle, config) -- Clear Extras for i = 1, 20 do