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) | 
