mtimer/system/update_timer.lua
2021-05-08 21:35:30 +02:00

183 lines
6.1 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local m = mtimer
local deserialize = minetest.deserialize
local cs = minetest.chat_send_player
local S = m.translator
-- Calculate HUD positions and offsets
--
-- Based on the given named position a table of positional tables is returned
-- by this helper function. When an invalid named position is provided all
-- tables only contain 0 values. Valid positions shown in the diagram below.
--
-- +--------------------------------+
-- | tl tc tr |
-- | |
-- | |
-- | ml mc mr |
-- | |
-- | |
-- | bl bc br |
-- +--------------------------------+
--
-- For orientation: `mc` is the center of the screen (where the crosshair is).
-- `bc` is the location of the hotbar and health bars, etc.
-- Both are valid positions but should not be used.
--
-- Provided offsets will be added or substracted according to the position. In
-- result the pffset behaves like a border
--
-- @param pos A positional string as described
-- @param poffset An offset table like { x=1, y=1 }
-- @return table a Table containing the positional tables based on the string
local get_hud_positions = function (pos, offset)
local p = { x = 0, y = 0 }
local a = { x = 0, y = 0 }
local o = { x = 0, y = 0 }
if pos == 'tl' then
p = { x = 0, y = 0 }
a = { x = 1, y = 1 }
o = { x = 5 + offset.x, y = 3 + offset.y }
end
if pos == 'tc' then
p = { x = 0.5, y = 0 }
a = { x = 0, y = 1 }
o = { x = 0 - offset.x, y = 3 + offset.y }
end
if pos == 'tr' then
p = { x = 1, y = 0 }
a = { x=-1, y = 1 }
o = { x = -6 - offset.x, y = 3 + offset.y }
end
if pos == 'ml' then
p = { x = 0, y = 0.5 }
a = { x = 1, y = 0 }
o = { x = 5 + offset.x, y = 0 + offset.y }
end
if pos == 'mc' then
p = { x = 0.5,y = 0.5 }
a = { x = 0, y = 0 }
o = { x = 0 + offset.x, y = 0 + offset.y }
end
if pos == 'mr' then
p = { x = 1, y = 0.5 }
a = { x = -1,y = 0 }
o = { x = -6 - offset.x, y = 0 + offset.y }
end
if pos == 'bl' then
p = { x = 0, y = 1 }
a = { x = 1, y = -1 }
o = { x = 5 + offset.x, y = 0 - offset.y }
end
if pos == 'bc' then
p = { x = 0.5, y = 1 }
a = { x = 0, y = -1 }
o = { x = 0 + offset.x, y = 0 - offset.y }
end
if pos == 'br' then
p = { x = 1, y = 1 }
a = { x = -1, y = -1 }
o = { x = -6 - offset.x, y = 0 - offset.y }
end
return { position = p, alignment = a, offset = o }
end
-- Update the timer
--
-- This function updates the timer for the given player referenced by the
-- players name. The function is called when a formspec update (fields) is
-- sent to the server and is automatically called by the registered globalstep.
--
-- The function sets the needed values based on the player meta data and uses
-- the `mtimer.get_timer_data` function for the actual data to be shown.
--
-- @param player_name Name of the player to update the timer for
-- @return void
mtimer.update_timer = function (player_name)
local player = minetest.get_player_by_name(player_name)
local meta = player:get_meta()
local m = m.meta
local hud_id = meta:get_string('mtimer:hud_id')
local text = mtimer.get_timer_data(player_name).formatted
local number = meta:get_string(m.color.key):gsub('#', '0x')
local size = meta:get_string(m.hud_element_size.key)
local position = meta:get_string(m.position.key)
local offset = deserialize(meta:get_string(m.hud_element_offset.key))
local orientation = get_hud_positions(position, offset)
if meta:get_string(m.visible.key) == 'false' then text = '' end
player:hud_change(hud_id, 'text', text)
player:hud_change(hud_id, 'number', number)
player:hud_change(hud_id, 'position', orientation.position)
player:hud_change(hud_id, 'alignment', orientation.alignment)
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))
-- 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