diff --git a/[core]/es_extended/client/modules/callback.lua b/[core]/es_extended/client/modules/callback.lua index c1ed4999..4692790d 100644 --- a/[core]/es_extended/client/modules/callback.lua +++ b/[core]/es_extended/client/modules/callback.lua @@ -1,3 +1,5 @@ +---@diagnostic disable: duplicate-set-field + Callbacks = {} Callbacks.__index = Callbacks @@ -16,7 +18,7 @@ function Callbacks:Execute(cb, ...) local success, errorString = pcall(cb, ...) if not success then - error(("Failed to execute Callback with RequestId: ^5%s^1"):format(self.currentId )) + print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(self.currentId)) error(errorString) return end @@ -33,13 +35,14 @@ function Callbacks:ServerRecieve(requestId, invoker, ...) local callback = self.requests[self.currentId] Callbacks:Execute(callback, ...) + self.requests[self.currentId] = nil end function Callbacks:Register(name, cb) self.storage[name] = cb end -function Callbacks:RecieveClient(eventName, requestId, invoker, ...) +function Callbacks:ClientRecieve(eventName, requestId, invoker, ...) self.currentId = requestId if not self.storage[eventName] then @@ -47,7 +50,7 @@ function Callbacks:RecieveClient(eventName, requestId, invoker, ...) end local returnCb = function(...) - TriggerServerEvent("esx:clientCallback", self.currentId, invoker, ...) + TriggerServerEvent("esx:clientCallback", requestId, invoker, ...) end local callback = self.storage[eventName] @@ -77,5 +80,5 @@ ESX.RegisterClientCallback = function(eventName, callback) end RegisterNetEvent("esx:triggerClientCallback", function(...) - Callbacks:RecieveClient(...) + Callbacks:ClientRecieve(...) end) diff --git a/[core]/es_extended/server/modules/callback.lua b/[core]/es_extended/server/modules/callback.lua index eb69728f..02599988 100644 --- a/[core]/es_extended/server/modules/callback.lua +++ b/[core]/es_extended/server/modules/callback.lua @@ -1,43 +1,87 @@ -local serverCallbacks = {} +---@diagnostic disable: duplicate-set-field -local clientRequests = {} -local RequestId = 0 +Callbacks = {} +Callbacks.__index = Callbacks ----@param eventName string ----@param callback function -ESX.RegisterServerCallback = function(eventName, callback) - serverCallbacks[eventName] = callback +Callbacks.requests = {} +Callbacks.storage = {} +Callbacks.id = 0 + +function Callbacks:Register(name, cb) + self.storage[name] = cb end -RegisterNetEvent("esx:triggerServerCallback", function(eventName, requestId, invoker, ...) - if not serverCallbacks[eventName] then - return error(("Server Callback not registered, name: ^5%s^1, invoker resource: ^5%s^1"):format(eventName, invoker)) +function Callbacks:Execute(cb, ...) + local success, errorString = pcall(cb, ...) + + if not success then + print(("[^1ERROR^7] Failed to execute Callback with RequestId: ^5%s^7"):format(self.currentId)) + error(errorString) + return + end + self.currentId = nil +end + +function Callbacks:Trigger(player, event, cb, invoker, ...) + self.requests[self.id] = cb + + TriggerClientEvent("esx:triggerClientCallback", player, event, self.id, invoker, ...) + + self.id += 1 +end + +function Callbacks:ServerRecieve(player, event, requestId, invoker, ...) + self.currentId = requestId + + if not self.storage[event] then + return error(("Server Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(event, invoker)) end - local source = source + local returnCb = function(...) + TriggerClientEvent("esx:serverCallback", player, self.currentId, invoker, ...) + end + local callback = self.storage[event] - serverCallbacks[eventName](source, function(...) - TriggerClientEvent("esx:serverCallback", source, requestId, invoker, ...) - end, ...) + self:Execute(callback, player, returnCb, ...) +end + +function Callbacks:RecieveClient(requestId, invoker, ...) + self.currentId = requestId + + if not self.requests[self.currentId] then + return error(("Client Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(self.currentId, invoker)) + end + + local callback = self.requests[self.currentId] + + self:Execute(callback, ...) + self.requests[self.currentId] = nil +end + +RegisterNetEvent("esx:clientCallback", function(requestId, invoker, ...) + Callbacks:RecieveClient(requestId, invoker, ...) end) +RegisterNetEvent("esx:triggerServerCallback", function(eventName, requestId, invoker, ...) + local source = source + Callbacks:ServerRecieve(source, eventName, requestId, invoker, ...) +end) + + ---@param player number playerId ---@param eventName string ---@param callback function ---@param ... any -ESX.TriggerClientCallback = function(player, eventName, callback, ...) - clientRequests[RequestId] = callback +function ESX.TriggerClientCallback(player, eventName, callback, ...) + local invokingResource = GetInvokingResource() + local invoker = (invokingResource and invokingResource ~= "unknown") and invokingResource or "es_extended" - TriggerClientEvent("esx:triggerClientCallback", player, eventName, RequestId, GetInvokingResource() or "unknown", ...) - - RequestId = RequestId + 1 + Callbacks:Trigger(player, eventName, callback, invoker, ...) end -RegisterNetEvent("esx:clientCallback", function(requestId, invoker, ...) - if not clientRequests[requestId] then - return error(("Client Callback with requestId ^5%s^1 Was Called by ^5%s^1 but does not exist."):format(requestId, invoker)) - end +---@param eventName string +---@param callback function +ESX.RegisterServerCallback = function(eventName, callback) + Callbacks:Register(eventName, callback) +end - clientRequests[requestId](...) - clientRequests[requestId] = nil -end)