mtimer/init.lua
2017-07-28 19:01:08 +02:00

96 lines
3.1 KiB
Lua

-- Convert a given x,y string into a table {x=given_x, y=given_y} and return
-- it to be used of the screen location parameters in the HUD definition
local mtimer_location_value = function (o)
local given_x = o:gsub(',[^,]+$', '')
local given_y = o:gsub('^[^,]+,', '')
return {x=given_x, y=given_y}
end
local modpath = minetest.get_modpath(minetest.get_current_modname())..DIR_DELIM
local options = dofile(modpath..'system'..DIR_DELIM..'get_options.lua')
local interval = options['mtimer_update_interval']
local placeholder = options['mtimer_placeholder']
local font_color = options['mtimer_font_color']
local format = {
locale = options['mtimer_locale'],
start = options['mtimer_session_start'],
runtime = options['mtimer_session_runtime'],
current = options['mtimer_current_time'],
ingame = options['mtimer_ingame_time'],
output = options['mtimer_output_format']
}
local location = {
position = mtimer_location_value(options['mtimer_position']),
alignment = mtimer_location_value(options['mtimer_alignment']),
offset = mtimer_location_value(options['mtimer_offset'])
}
local player_data = {}
minetest.register_on_joinplayer(function(player)
minetest.after(1, function(player)
local player_name = player:get_player_name()
local _hud_id = player:hud_add({
hud_elem_type = 'text',
position = location.position,
alignment = location.alignment,
offset = location.offset,
text = placeholder,
number = '0x'..font_color
})
player_data[player_name] = {
start_time = os.time(),
hud_id = _hud_id
}
minetest.after(5, change_text, player)
end, player)
end)
minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name()
player_data[player_name] = nil
end)
function change_text(player)
local player_name = player:get_player_name()
if player_name == '' then return end
-- Save the game-detected locale. Fun fact: changing the locale on runtime
-- from within a mod causes the UI to glitch out completely.
local current_locale = os.setlocale(nil)
os.setlocale(format.locale)
local start_time = player_data[player_name].start_time
local hud_id = player_data[player_name].hud_id
local time = 24*60*minetest.get_timeofday()
local h = tostring((math.floor(time/60) % 60))
local m = tostring((math.floor(time) % 60))
local res = format.output:gsub('(+.)', {
['+s'] = os.date(format.start, start_time),
['+c'] = os.date(format.current),
['+r'] = os.date('!'..format.runtime:gsub('(+.)', {
['+h'] = '%H',
['+m'] = '%M',
['+s'] = '%S'
}), os.time() - start_time),
['+i'] = format.ingame:gsub('(+.)', {
['+h'] = string.rep('0', 2-#h)..h,
['+m'] = string.rep('0', 2-#m)..m
}),
['+n'] = "\n"
})
os.setlocale(current_locale) -- Restore game-detected locale
player:hud_change(hud_id, 'text', res)
minetest.after(interval, change_text, player)
end