1
0
Fork 0
forked from Simnation/Main
Main/resources/[carscripts]/kimi_callbacks/client/ClientCallback.lua

93 lines
2.4 KiB
Lua
Raw Permalink Normal View History

2025-06-07 08:51:21 +02:00
local callbackResponses = {}
local currentRequestId = 0
local callbacks = {}
-- register new callback
function Register(name, cb)
callbacks[name] = cb
end
-- trigger callback
function Trigger(name, ...)
return TriggerWithTimeout(name, 5000, ...)
end
-- trigger callback with custom timeout
function TriggerWithTimeout(name, timeout, ...)
-- set id for current request
local requestId = currentRequestId
-- advance next request id
currentRequestId = currentRequestId + 1
if (currentRequestId >= 65536) then
currentRequestId = 0
end
-- create request name from callback name and request id
local requestName = name .. tostring(requestId)
-- initialize callback response
callbackResponses[requestName] = true
-- send data to server
TriggerServerEvent("KI:sc", name, requestId, { ... })
-- await cb response
local timer = GetGameTimer()
while (callbackResponses[requestName] == true) do
Citizen.Wait(0)
if (GetGameTimer() > timer + timeout) then
-- timed out
print("^1[ERROR] ServerCallback \"" .. name .. "\" timed out after " .. tostring(timeout) .. "ms!")
callbackResponses[requestName] = "ERROR"
end
end
-- return nil if error occurred
if (callbackResponses[requestName] == "ERROR") then
return nil
end
-- return unpacked data
local data = callbackResponses[requestName]
callbackResponses[requestName] = nil
return table.unpack(data)
end
RegisterNetEvent("KI:cc")
AddEventHandler("KI:cc", function(name, requestId, data)
local requestName = name .. tostring(requestId)
if (callbacks[name] ~= nil) then
-- execute callback function and return its result
local result = { callbacks[name](table.unpack(data)) }
TriggerServerEvent("KI:ccResponse", requestName, result)
else
-- callback does not exist
print("^1[ERROR] ClientCallback \"" .. name .. "\" does not exist!")
TriggerServerEvent("KI:ccDoesNotExist", requestName, name)
end
end)
RegisterNetEvent("KI:scResponse")
AddEventHandler("KI:scResponse", function(requestName, data)
if (callbackResponses[requestName] ~= nil) then
-- receive data
callbackResponses[requestName] = data
end
end)
RegisterNetEvent("KI:scDoesNotExist")
AddEventHandler("KI:scDoesNotExist", function(requestName, name)
if (callbackResponses[requestName] ~= nil) then
callbackResponses[requestName] = "ERROR"
print("^1[ERROR] ServerCallback \"" .. name .. "\" does not exist!")
end
end)