epic/executor/executor_hud.lua
2022-01-01 22:42:06 +01:00

98 lines
1.9 KiB
Lua

local hud = {} -- playername -> data
local HUD_POSITION = {x = epic.hud.posx, y = epic.hud.posy}
local HUD_ALIGNMENT = {x = 1, y = 0}
local get_color = function(r,g,b)
return b + (g * 256) + (r * 256 * 256)
end
local function setup(playername, name)
if hud[playername] then
return
end
local player = minetest.get_player_by_name(playername)
local data = {}
data.name = player:hud_add({
hud_elem_type = "text",
position = HUD_POSITION,
offset = {x = 0, y = 0},
text = name or "",
alignment = HUD_ALIGNMENT,
scale = {x = 100, y = 100},
number = 0x00FF00
})
data.time = player:hud_add({
hud_elem_type = "text",
position = HUD_POSITION,
offset = {x = 0, y = 20},
text = "",
alignment = HUD_ALIGNMENT,
scale = {x = 100, y = 100},
number = 0x00FF00
})
hud[playername] = data
end
local function exit_cleanup(playername)
local data = hud[playername]
local player = minetest.get_player_by_name(playername)
if not data or not player then
return
end
if data.name then
player:hud_remove(data.name)
end
if data.time then
player:hud_remove(data.time)
end
hud[playername] = nil
end
epic.register_hook({
on_execute_epic = function(player, _, state)
setup(player:get_player_name(), state.name)
end,
on_epic_exit = exit_cleanup,
on_epic_abort = exit_cleanup
})
local function update()
for playername, state in pairs(epic.state) do
local data = hud[playername]
local player = minetest.get_player_by_name(playername)
if player and data and data.time then
local color = get_color(0,255,0)
local time_str = ""
if state.time and state.time > 0 then
time_str = epic.format_time(state.time)
if state.time < 300 then
color = get_color(255,255,0)
elseif state.time < 60 then
color = get_color(255,0,0)
end
end
player:hud_change(data.time, "text", time_str)
player:hud_change(data.time, "number", color)
end
end
minetest.after(1.0, update)
end
minetest.after(1.0, update)