mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-31 07:25:22 +01:00 
			
		
		
		
	* squashed: CSM: Implement register_globalstep * Re-use fatal error mechanism from server to disconnect client on CSM error * Little client functions cleanups * squashed: CSM: add core.after function * core.after is shared code between client & server * ModApiUtil get_us_time feature enabled for client
		
			
				
	
	
		
			44 lines
		
	
	
		
			1013 B
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1013 B
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local jobs = {}
 | |
| local time = 0.0
 | |
| local last = core.get_us_time() / 1000000
 | |
| 
 | |
| core.register_globalstep(function(dtime)
 | |
| 	local new = core.get_us_time() / 1000000
 | |
| 	if new > last then
 | |
| 		time = time + (new - last)
 | |
| 	else
 | |
| 		-- Overflow, we may lose a little bit of time here but
 | |
| 		-- only 1 tick max, potentially running timers slightly
 | |
| 		-- too early.
 | |
| 		time = time + new
 | |
| 	end
 | |
| 	last = new
 | |
| 
 | |
| 	if #jobs < 1 then
 | |
| 		return
 | |
| 	end
 | |
| 
 | |
| 	-- Iterate backwards so that we miss any new timers added by
 | |
| 	-- a timer callback, and so that we don't skip the next timer
 | |
| 	-- in the list if we remove one.
 | |
| 	for i = #jobs, 1, -1 do
 | |
| 		local job = jobs[i]
 | |
| 		if time >= job.expire then
 | |
| 			core.set_last_run_mod(job.mod_origin)
 | |
| 			job.func(unpack(job.arg))
 | |
| 			table.remove(jobs, i)
 | |
| 		end
 | |
| 	end
 | |
| end)
 | |
| 
 | |
| function core.after(after, func, ...)
 | |
| 	assert(tonumber(after) and type(func) == "function",
 | |
| 		"Invalid core.after invocation")
 | |
| 	jobs[#jobs + 1] = {
 | |
| 		func = func,
 | |
| 		expire = time + after,
 | |
| 		arg = {...},
 | |
| 		mod_origin = core.get_last_run_mod()
 | |
| 	}
 | |
| end
 |