Files
2026-08-05 01:29:39 +02:00

80 lines
2.7 KiB
Lua

local registeredCallbacks = {}
local pendingExecutions = {}
local resourceName = GetCurrentResourceName()
print(('[%s] DevX RPC v0.4.1 aktiv.'):format(resourceName))
local function callbackEventName(name)
return ('devx_core:server:callback:%s:%s'):format(resourceName, name)
end
local function responseEventName()
return ('devx_core:client:callback:%s'):format(resourceName)
end
local function sendResult(requestSource, requestId, result)
TriggerClientEvent(responseEventName(), requestSource, requestId, result)
end
function DevXRegisterCallback(name, handler)
assert(type(name) == 'string' and name:match('^[%w_%-]+:[%w_%-]+$'),
'Callbackname ist ungültig.')
assert(type(handler) == 'function', 'Callbackhandler muss eine Funktion sein.')
assert(not registeredCallbacks[name], ('Callback %s wurde doppelt registriert.'):format(name))
registeredCallbacks[name] = true
local eventName = callbackEventName(name)
RegisterNetEvent(eventName)
AddEventHandler(eventName, function(requestId, payload)
local requestSource = source
if type(requestId) ~= 'string' or #requestId > 160 or type(payload) ~= 'table' then
sendResult(requestSource, tostring(requestId or ''), {
ok = false,
error = 'Ungültige Serveranfrage.'
})
return
end
local executionKey = ('%s:%s'):format(requestSource, requestId)
if pendingExecutions[executionKey] then
sendResult(requestSource, requestId, {
ok = false,
error = 'Diese Serveranfrage wird bereits verarbeitet.'
})
return
end
pendingExecutions[executionKey] = true
local completed = false
local function finish(result)
if completed then return end
completed = true
pendingExecutions[executionKey] = nil
if result == nil then result = { ok = true } end
sendResult(requestSource, requestId, result)
end
print(('[%s] RPC empfangen: %s von Spieler %s.'):format(resourceName, name, requestSource))
SetTimeout(20000, function()
if completed then return end
print(('[%s] RPC %s für Spieler %s hat nach 20 Sekunden nicht geantwortet.'):format(
resourceName, name, requestSource
))
finish({
ok = false,
error = ('Serververarbeitung für %s abgelaufen. Prüfe die txAdmin-Konsole.'):format(name)
})
end)
CreateThread(function()
local result = handler(requestSource, payload)
finish(result)
end)
end)
end