medical/timers.lua
Elkien3 7797ad5d40 add treatable cut wound
lotta stuff, don't feel like explaining, cheers
2020-06-17 18:42:40 -05:00

85 lines
2.3 KiB
Lua

medical.timers = {}
function medical.start_timer(name, length, loop, arg, func, stoparg, stopfunc, cancel_on_release, cancel_owner)
local index
if name then
index = name
else
local i = 0
while true do
if not medical.timers[i] then
index = i
break
end
i = i + 1
end
end
medical.timers[index] = {}
medical.timers[index].length = length
medical.timers[index].timeleft = length
medical.timers[index].loop = loop
medical.timers[index].arg = arg
medical.timers[index].func = func
medical.timers[index].stoparg = stoparg
medical.timers[index].stopfunc = stopfunc
if cancel_owner and cancel_on_release then
medical.timers[index].cancel_on_release = cancel_on_release
medical.timers[index].cancel_owner = cancel_owner
local player = minetest.get_player_by_name(cancel_owner)
if player and not medical.lookingplayer[cancel_owner] then medical.lookingplayer[cancel_owner] = {dir = player:get_look_dir(), pos = player:get_pos()} end
end
return index
end
function medical.stop_timer(name, runonce)
local timer = medical.timers[name]
if runonce then
if type(timer.arg) == "table" then
timer.func(unpack(timer.arg))
else
timer.func(timer.arg)
end
end
if timer.stopfunc then
if type(timer.stoparg) == "table" then
timer.stopfunc(unpack(timer.stoparg))
else
timer.stopfunc(timer.stoparg)
end
end
medical.timers[name] = nil
end
minetest.register_globalstep(function(dtime)
for index, timer in pairs (medical.timers) do
timer.timeleft = timer.timeleft - dtime
if timer.timeleft <= 0 then
if type(timer.arg) == "table" then
timer.func(unpack(timer.arg))
else
timer.func(timer.arg)
end
if timer.loop then
medical.start_timer(index, timer.length, timer.loop, timer.arg, timer.func, timer.stoparg, timer.stopfunc, timer.cancel_on_release, timer.cancel_owner)
else
medical.stop_timer(index)
end
end
end
end)
controls.register_on_release(function(player, key, time)
local name = player:get_player_name()
for index, timer in pairs (medical.timers) do
if name == timer.cancel_owner and timer.cancel_on_release == key then
medical.stop_timer(index)
end
end
end)
medical.register_on_lookaway(function(player, name)
for index, timer in pairs (medical.timers) do
if name == timer.cancel_owner and timer.cancel_on_release then
medical.stop_timer(index)
end
end
end)