diff --git a/locale/mtimer.de.tr b/locale/mtimer.de.tr index 643af8f..0eab6b2 100644 --- a/locale/mtimer.de.tr +++ b/locale/mtimer.de.tr @@ -68,7 +68,7 @@ Session Duration=Sitzungsdauer Session Start Time=Sitzungsstart-Zeit Host Time=Hostzeit -# Custom Timer Things +# Custom Timer Setup Running=Timer läuft Stopped=Angehalten Finished=Abgeschlossen @@ -83,12 +83,22 @@ Configure the custom timer=Individuellen Timer konfigurieren Start the custom timer=Individuellen Timer starten Stop stop custom timer=Individuellen Timer anhalten Restart the custom timer=Individuellen Timer neu starten + +# Custonm timer status messages The custom timer is already running=Der individuelle Timer läuft bereits The custom timer is not running=Der individuelle Timer läuft nicht The custom timer was started=Der individuelle Timer wurde gestartet The custom timer was stopped=Der individuelle Timer wurde angehalten The custom timer was restarted=Der individuelle timer wurde neu gestartet +# Custom Timer Controls +The timer is currently @1=Der Timer ist aktuell @1 +running=aktiv +stopped=angehalten +Start=Starten +Stop=Anhalten +Restart=Neustart + # Default Timer Format Current Date: @1=Aktuelles Datum: @1 Ingame Time: @1=Spielzeit: @1 diff --git a/system/chat_command.lua b/system/chat_command.lua index 41c3703..70001a0 100644 --- a/system/chat_command.lua +++ b/system/chat_command.lua @@ -1,8 +1,6 @@ local m = mtimer local S = m.translator local d = m.dialog -local cs = minetest.chat_send_player -local ds = minetest.deserialize -- Colorize a command sequence @@ -17,46 +15,6 @@ local command = function (command) end -local custom_timer_handling = function (name, action) - local player = minetest.get_player_by_name(name) - local player_meta = player:get_meta() - local current_timestamp = os.time(os.date('!*t')) - local ctv_key = m.meta.custom_timer_settings.key - local ctv = ds(player_meta:get_string(ctv_key)) - - if action == 'start' then - if ctv.running ~= true then - ctv.running = true - ctv.start_timestamp = current_timestamp - cs(name, S('The custom timer was started')) - else - cs(name, S('The custom timer is already running')) - end - end - - if action == 'stop' then - if ctv.running ~= false then - ctv.running = false - ctv.start_timestamp = 0 - cs(name, S('The custom timer was stopped')) - else - cs(name, S('The custom timer is not running')) - end - end - - if action == 'restart' then - if ctv.running == true then - ctv.start_timestamp = current_timestamp - cs(name, S('The custom timer was restarted')) - else - cs(name, S('The custom timer is not running')) - end - end - - player_meta:set_string(ctv_key, minetest.serialize(ctv)) -end - - -- Chat command -- -- The `/mtimer` chat command opens the main menu and allows to directly open @@ -106,9 +64,9 @@ minetest.register_chatcommand('mtimer', { if action == 'tf' then d.timer_format(name) end if action == 'ct' then d.custom_timer(name) end - if action == 'ctstart' then custom_timer_handling(name,'start') end - if action == 'ctstop' then custom_timer_handling(name,'stop') end - if action == 'ctrestart' then custom_timer_handling(name,'restart') end + if action == 'ctstart' then mtimer.update_custom_timer(name, { action = 'start' }) end + if action == 'ctstop' then mtimer.update_custom_timer(name, { action = 'stop' }) end + if action == 'ctrestart' then mtimer.update_custom_timer(name, { action = 'restart' }) end if action == 'help' then local message = { @@ -131,7 +89,7 @@ minetest.register_chatcommand('mtimer', { command('ctstop ')..S('Stop stop custom timer'), command('ctrestart')..S('Restart the custom timer') } - cs(name, table.concat(message, '\n')) + minetest.chat_send_player(name, table.concat(message, '\n')) end end }) diff --git a/system/formspecs/custom_timer.lua b/system/formspecs/custom_timer.lua index e339f5b..ae1d3ed 100644 --- a/system/formspecs/custom_timer.lua +++ b/system/formspecs/custom_timer.lua @@ -19,6 +19,7 @@ local esc = minetest.formspec_escape mtimer.dialog.custom_timer = function (player_name) local player_meta = minetest.get_player_by_name(player_name):get_meta() local ctv = minetest.deserialize(player_meta:get_string(m.meta.custom_timer_settings.key)) + local timer_status = (ctv.running == true) and S('running') or S('stopped') local days = ctv.values.days or 0 local hours = ctv.values.hours or 0 @@ -36,8 +37,8 @@ mtimer.dialog.custom_timer = function (player_name) mtimer.show_formspec('mtimer:custom_timer', { title = S('Custom Timer'), show_to = player_name, - height = 5.3, - width = 9, + height = 6.25, + width = 13, formspec = { 'field_close_on_enter[v_format_running;false]', 'field_close_on_enter[v_format_stopped;false]', @@ -47,20 +48,18 @@ mtimer.dialog.custom_timer = function (player_name) 'field_close_on_enter[v_minutes;false]', 'field_close_on_enter[v_seconds;false]', 'container[0,0]', - ' label[0,0.25;'..S('Running')..'] field[2.25,0;6.5,0.5;v_format_running;;'..esc(format_running)..']', - ' label[0,0.85;'..S('Stopped')..'] field[2.25,0.6;6.5,0.5;v_format_stopped;;'..esc(format_stopped)..']', - ' label[0,1.45;'..S('Finished')..'] field[2.25,1.2;6.5,0.5;v_format_finished;;'..esc(format_finished)..']', + ' label[0,0.25;'..S('Running')..'] field[2.5,0;10.5,0.5;v_format_running;;'..esc(format_running)..']', + ' label[0,0.85;'..S('Stopped')..'] field[2.5,0.6;10.5,0.5;v_format_stopped;;'..esc(format_stopped)..']', + ' label[0,1.45;'..S('Finished')..'] field[2.5,1.2;10.5,0.5;v_format_finished;;'..esc(format_finished)..']', ' box[0,2;+contentWidth,0.04;#ffffff]', 'container_end[]', 'container[3.75,2.4]', - ' label[0,0;'..S('Information')..']', - ' label[1.75,0;'..S('Variable')..']', - ' label[3.25,0;'..S('Used Value')..']', - ' box[0,0.25;5,0.02;#ffffff]', - ' label[0,0.5;'..S('Days')..'] label[1.75,0.5;{days}] label[3.25,0.5;'..days..']', - ' label[0,0.9;'..S('Hours')..'] label[1.75,0.9;{hours}] label[3.25,0.9;'..hours..']', - ' label[0,1.3;'..S('Minutes')..'] label[1.75,1.3;{minutes}] label[3.25,1.3;'..minutes..']', - ' label[0,1.7;'..S('Seconds')..'] label[1.75,1.7;{seconds}] label[3.25,1.7;'..seconds..']', + ' label[0,0;'..S('Information')..'] label[2.5,0;'..S('Variable')..'] label[5,0;'..S('Used Value')..']', + ' box[0,0.25;7,0.02;#ffffff]', + ' label[0,0.5;'..S('Days')..'] label[2.5,0.5;{days}] label[5,0.5;'..days..']', + ' label[0,0.9;'..S('Hours')..'] label[2.5,0.9;{hours}] label[5,0.9;'..hours..']', + ' label[0,1.3;'..S('Minutes')..'] label[2.5,1.3;{minutes}] label[5,1.3;'..minutes..']', + ' label[0,1.7;'..S('Seconds')..'] label[2.5,1.7;{seconds}] label[5,1.7;'..seconds..']', 'container_end[]', 'container[0,2.3]', ' container[0,0]', @@ -84,11 +83,20 @@ mtimer.dialog.custom_timer = function (player_name) ' button[0,0.75;0.75,0.25;c_seconds_m;-]', ' container_end[]', 'container_end[]', - 'container[0,3.6]', + 'container[0,3.75]', ' checkbox[0,0;mode_countdown;'..S('Countdown')..';'..a_countdown..']', ' checkbox[0,0.4;mode_timer;'..S('Timer Mode')..';'..a_timer..']', ' checkbox[0,0.8;mode_continuous;'..S('Continuous Run')..';'..a_continuous..']', 'container_end[]', + 'container[0,5.55]', + ' box[0,-0.25;+contentWidth,0.04;#ffffff]', + ' label[0,0.375;'..esc(S('The timer is currently @1', timer_status))..']', + ' container[+contentWidth,0]', + mtimer.get_icon_button('ct_start', { width = 2.25, label = S('Start'), container = { left = -7.25 } }), + mtimer.get_icon_button('ct_stop', { width = 2.25, label = S('Stop'), container = { left = -4.75 } }), + mtimer.get_icon_button('ct_restart', { width = 2.25, label = S('Restart'), container = { left = -2.25 } }), + ' container_end[]', + 'container_end[]', } }) end diff --git a/system/on_receive_fields.lua b/system/on_receive_fields.lua index 51ffcc9..0e99b65 100644 --- a/system/on_receive_fields.lua +++ b/system/on_receive_fields.lua @@ -39,7 +39,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.set_visible then meta:set_string(attr.key, 'true') end if fields.set_invisible then meta:set_string(attr.key, 'false') end if fields.default then meta:set_string(attr.key, attr.default) end - if not fields.quit then d.set_visibility(name) end end @@ -232,7 +231,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) seconds = seconds } - -- Set default values if requested + -- Set default values if requested and instantly return to prevent the + -- rest of the configuration to be executed. At this point only + -- resetting all values is desired. if fields.default then meta:set_string(attr.key, attr.default) d.custom_timer(name) @@ -243,8 +244,19 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) -- Set values if not quitting if not fields.quit then meta:set_string(attr.key, minetest.serialize(ctv)) - d.custom_timer(name) end + + -- Control timer if one of the control buttons was pressed. This is run + -- after the values safing in order to use the new values instead of + -- the values that were stored before. + local ct_update = false + if fields.ct_start then ct_update = { action = 'start' } end + if fields.ct_stop then ct_update = { action = 'stop' } end + if fields.ct_restart then ct_update = { action = 'restart' } end + if ct_update~=false then mtimer.update_custom_timer(name,ct_update) end + + -- Show the timer formspec if not quitting + if not fields.quit then d.custom_timer(name) end end diff --git a/system/update_timer.lua b/system/update_timer.lua index 9e56cfd..2b83c21 100644 --- a/system/update_timer.lua +++ b/system/update_timer.lua @@ -1,5 +1,7 @@ local m = mtimer local deserialize = minetest.deserialize +local cs = minetest.chat_send_player +local S = m.translator -- Calculate HUD positions and offsets @@ -117,3 +119,66 @@ mtimer.update_timer = function (player_name) player:hud_change(hud_id, 'size', {x=size, y=size}) player:hud_change(hud_id, 'offset', orientation.offset) end + + +-- Update the custom timer +-- +-- This function handles updates for the custom timer for the player referenced +-- by the provided `name` parameter. This needs to be a player name string. +-- +-- The update is performed based on the provided table. +-- +-- update_parameters = { +-- action = 'the_action' +-- } +-- +-- Currently the only actions are `start`, `stop`, and `restart`. +-- +-- @param player_name The name of the player to update the custom timer for +-- @param update_parameters The update parameters table as described +mtimer.update_custom_timer = function (player_name, update_parameters) + local up = update_parameters or {} + local player = minetest.get_player_by_name(player_name) + local player_meta = player:get_meta() + local current_timestamp = os.time(os.date('!*t')) + local ctv_key = m.meta.custom_timer_settings.key + local ctv = minetest.deserialize(player_meta:get_string(ctv_key)) + + print(dump(player_name)) + + -- Start timer if not running + if up.action == 'start' then + if ctv.running ~= true then + ctv.running = true + ctv.start_timestamp = current_timestamp + cs(player_name, S('The custom timer was started')) + else + cs(player_name, S('The custom timer is already running')) + end + end + + -- Stop timer if running + if up.action == 'stop' then + if ctv.running ~= false then + ctv.running = false + ctv.start_timestamp = 0 + cs(player_name, S('The custom timer was stopped')) + else + cs(player_name, S('The custom timer is not running')) + end + end + + -- Restart timer + if up.action == 'restart' then + if ctv.running == true then + ctv.start_timestamp = current_timestamp + cs(player_name, S('The custom timer was restarted')) + else + cs(player_name, S('The custom timer is not running')) + end + end + + -- Write timer update to player meta data + player_meta:set_string(ctv_key, minetest.serialize(ctv)) +end + diff --git a/textures/buttons/actions/mtimer_ct_restart.png b/textures/buttons/actions/mtimer_ct_restart.png new file mode 100644 index 0000000..8c6fada Binary files /dev/null and b/textures/buttons/actions/mtimer_ct_restart.png differ diff --git a/textures/buttons/actions/mtimer_ct_start.png b/textures/buttons/actions/mtimer_ct_start.png new file mode 100644 index 0000000..773d9e8 Binary files /dev/null and b/textures/buttons/actions/mtimer_ct_start.png differ diff --git a/textures/buttons/actions/mtimer_ct_stop.png b/textures/buttons/actions/mtimer_ct_stop.png new file mode 100644 index 0000000..2f39267 Binary files /dev/null and b/textures/buttons/actions/mtimer_ct_stop.png differ