1
0
Fork 0
forked from Simnation/Main
Main/resources/[carscripts]/kimi_callbacks/server/ServerCallback.lua
2025-06-07 08:51:21 +02:00

94 lines
2.5 KiB
Lua

local callbackResponses = {}
local currentRequestId = 0
local callbacks = {}
-- register new callback
function Register(name, cb)
callbacks[name] = cb
end
-- trigger callback
function Trigger(name, playerId, ...)
return TriggerWithTimeout(name, playerId, 5000, ...)
end
-- trigger callback with custom timeout
function TriggerWithTimeout(name, playerId, 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 client
TriggerClientEvent("KI:cc", playerId, 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] ClientCallback \"" .. 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
RegisterServerEvent("KI:sc")
AddEventHandler("KI:sc", function(name, requestId, data)
local src = source
local requestName = name .. tostring(requestId)
if (callbacks[name] ~= nil) then
-- execute callback function and return its result
local result = { callbacks[name](src, table.unpack(data)) }
TriggerClientEvent("KI:scResponse", src, requestName, result)
else
-- callback does not exist
print("^1[ERROR] ServerCallback \"" .. name .. "\" does not exist!")
TriggerClientEvent("KI:scDoesNotExist", src, requestName, name)
end
end)
RegisterServerEvent("KI:ccResponse")
AddEventHandler("KI:ccResponse", function(requestName, data)
if (callbackResponses[requestName] ~= nil) then
-- receive data
callbackResponses[requestName] = data
end
end)
RegisterServerEvent("KI:ccDoesNotExist")
AddEventHandler("KI:ccDoesNotExist", function(requestName, name)
if (callbackResponses[requestName] ~= nil) then
callbackResponses[requestName] = "ERROR"
print("^1[ERROR] ClientCallback \"" .. name .. "\" does not exist!")
end
end)