_xtend.i() -- 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 _xtimer_location_value = function (o) local x = o:gsub(',[^,]+$', '') local y = o:gsub('^[^,]+,', '') return {x=x, y=y} end local interval = _xtend.g('xtimer_update_interval') local placeholder = _xtend.g('xtimer_placeholder') local font_color = _xtend.g('xtimer_font_color') local format = { locale = _xtend.g('xtimer_locale'), start = _xtend.g('xtimer_session_start'), runtime = _xtend.g('xtimer_session_runtime'), current = _xtend.g('xtimer_current_time'), ingame = _xtend.g('xtimer_ingame_time'), output = _xtend.g('xtimer_output_format') } local location = { position = _xtimer_location_value(_xtend.g('xtimer_position')), alignment = _xtimer_location_value(_xtend.g('xtimer_alignment')), offset = _xtimer_location_value(_xtend.g('xtimer_offset')) } local playerData = {} minetest.register_on_joinplayer(function(player) minetest.after(1, function(player) local playerName = player:get_player_name() local _hudID = player:hud_add({ hud_elem_type = 'text', position = location.position, alignment = location.alignment, offset = location.offset, text = placeholder, number = '0x'..font_color }) playerData[playerName] = { startTime = os.time(), hudID = _hudID } minetest.after(5, _xtimer_changeText, player) end, player) end) minetest.register_on_leaveplayer(function(player) local playerName = player:get_player_name() playerData[playerName] = nil end) function _xtimer_changeText(player) local playerName = player:get_player_name() if playerName == '' 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 currentLocale = os.setlocale(nil) os.setlocale(format.locale) local startTime = playerData[playerName].startTime local hudID = playerData[playerName].hudID 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, startTime), ['+c'] = os.date(format.current), ['+r'] = os.date('!'..format.runtime:gsub('(+.)', { ['+h'] = '%H', ['+m'] = '%M', ['+s'] = '%S' }), os.time() - startTime), ['+i'] = format.ingame:gsub('(+.)', { ['+h'] = string.rep('0', 2-#h)..h, ['+m'] = string.rep('0', 2-#m)..m }), ['+n'] = "\n" }) os.setlocale(currentLocale) -- Restore game-detected locale player:hud_change(hudID, 'text', res) minetest.after(interval, _xtimer_changeText, player) end