mirror of
https://github.com/citizenfx/cfx-server-data.git
synced 2025-01-11 00:03:18 +08:00
69 lines
1.9 KiB
Lua
69 lines
1.9 KiB
Lua
-- whitelist c2s events
|
|
RegisterServerEvent('hostingSession')
|
|
RegisterServerEvent('hostedSession')
|
|
|
|
-- event handler for pre-session 'acquire'
|
|
local currentHosting
|
|
local hostReleaseCallbacks = {}
|
|
|
|
-- TODO: add a timeout for the hosting lock to be held
|
|
-- TODO: add checks for 'fraudulent' conflict cases of hosting attempts (typically whenever the host can not be reached)
|
|
AddEventHandler('hostingSession', function()
|
|
-- if the lock is currently held, tell the client to await further instruction
|
|
if currentHosting then
|
|
TriggerClientEvent('sessionHostResult', source, 'wait')
|
|
|
|
-- register a callback for when the lock is freed
|
|
table.insert(hostReleaseCallbacks, function()
|
|
TriggerClientEvent('sessionHostResult', source, 'free')
|
|
end)
|
|
|
|
return
|
|
end
|
|
|
|
-- if the current host was last contacted less than a second ago
|
|
if GetHostId() then
|
|
if GetPlayerLastMsg(GetHostId()) < 1000 then
|
|
TriggerClientEvent('sessionHostResult', source, 'conflict')
|
|
|
|
return
|
|
end
|
|
end
|
|
|
|
hostReleaseCallbacks = {}
|
|
|
|
currentHosting = source
|
|
|
|
TriggerClientEvent('sessionHostResult', source, 'go')
|
|
|
|
-- set a timeout of 5 seconds
|
|
SetTimeout(5000, function()
|
|
if not currentHosting then
|
|
return
|
|
end
|
|
|
|
currentHosting = nil
|
|
|
|
for _, cb in ipairs(hostReleaseCallbacks) do
|
|
cb()
|
|
end
|
|
end)
|
|
end)
|
|
|
|
AddEventHandler('hostedSession', function()
|
|
-- check if the client is the original locker
|
|
if currentHosting ~= source then
|
|
-- TODO: drop client as they're clearly lying
|
|
print(currentHosting, '~=', source)
|
|
return
|
|
end
|
|
|
|
-- free the host lock (call callbacks and remove the lock value)
|
|
for _, cb in ipairs(hostReleaseCallbacks) do
|
|
cb()
|
|
end
|
|
|
|
currentHosting = nil
|
|
end)
|
|
|
|
EnableEnhancedHostSupport(true) |