69 lines
		
	
	
		
			No EOL
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			No EOL
		
	
	
		
			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) |