2022-08-16 16:12:37 -04:00

182 lines
4.5 KiB
Lua

local HUD_POSITION = {x = 0.1, y = 0.2}
local O2_BAR_OFFSET = {x = 0, y = 0}
local SUITE_INCOMPLETE_OFFSET = {x = 0, y = 20}
local HUD_ALIGNMENT = {x = 1, y = 0}
local hud = {} -- playername -> data
local setup_hud = function(player)
local playername = player:get_player_name()
local hud_data = {}
hud[playername] = hud_data
hud_data.overlay = player:hud_add({
hud_elem_type = "image",
position = {x = 0.5, y = 0.5},
scale = {
x = -100,
y = -100
},
text = "spacesuit_overlay.png"
})
hud_data.o2_bg = player:hud_add({
hud_elem_type = "image",
position = HUD_POSITION,
offset = O2_BAR_OFFSET,
text = "spacesuit_o2_levels_bg.png",
alignment = HUD_ALIGNMENT,
scale = {x = -80, y = 1}
})
hud_data.o2_fg = player:hud_add({
hud_elem_type = "image",
position = HUD_POSITION,
offset = O2_BAR_OFFSET,
text = "spacesuit_o2_levels_fg_green.png",
alignment = HUD_ALIGNMENT,
scale = {x = 0, y = 1}
})
hud_data.o2_label = player:hud_add({
hud_elem_type = "text",
position = HUD_POSITION,
offset = {x = O2_BAR_OFFSET.x - 80, y = O2_BAR_OFFSET.y},
text = "O2-Level:",
alignment = HUD_ALIGNMENT,
scale = {x = 100, y = 100},
number = 0x00FF00
})
hud_data.o2_level = player:hud_add({
hud_elem_type = "text",
position = {x = 1, y = HUD_POSITION.y },
offset = {x = O2_BAR_OFFSET.x - 70, y = O2_BAR_OFFSET.y},
text = "",
alignment = HUD_ALIGNMENT,
scale = {x = 100, y = 100},
number = 0x00FF00
})
hud_data.suit_incomplete = player:hud_add({
hud_elem_type = "text",
position = HUD_POSITION,
offset = SUITE_INCOMPLETE_OFFSET,
text = "",
alignment = HUD_ALIGNMENT,
scale = {x = 100, y = 100},
number = 0xFF0000
})
end
local remove_hud = function(player)
local playername = player:get_player_name()
local hud_data = hud[playername]
player:hud_remove(hud_data.overlay)
player:hud_remove(hud_data.o2_bg)
player:hud_remove(hud_data.o2_fg)
player:hud_remove(hud_data.o2_label)
player:hud_remove(hud_data.o2_level)
player:hud_remove(hud_data.suit_incomplete)
hud[playername] = nil
end
local get_color = function(r,g,b)
return b + (g * 256) + (r * 256 * 256)
end
local update_hud = function(player, has_full_suit, armor_list)
local playername = player:get_player_name()
local hud_data = hud[playername]
if not hud_data then
return
end
if has_full_suit then
player:hud_change(hud_data.suit_incomplete, "text", "")
else
player:hud_change(hud_data.suit_incomplete, "text", "Spacesuit incomplete!")
end
local max_wear = 0
for _,item in pairs(armor_list) do
-- wear:0 == full, wear:65535 == empty
if item:get_name() == "spacesuit:helmet" then
max_wear = math.max(max_wear, item:get_wear())
elseif item:get_name() == "spacesuit:chestplate" then
max_wear = math.max(max_wear, item:get_wear())
elseif item:get_name() == "spacesuit:pants" then
max_wear = math.max(max_wear, item:get_wear())
elseif item:get_name() == "spacesuit:boots" then
max_wear = math.max(max_wear, item:get_wear())
end
end
local factor_full = 1 - (max_wear / 65535)
player:hud_change(hud_data.o2_level, "text", math.floor(factor_full * 100) .. "%")
player:hud_change(hud_data.o2_fg, "scale", { x=math.floor(factor_full * -80), y=1 })
local color
if factor_full > 0.3 then
-- green
color = get_color(0,255,0)
player:hud_change(hud_data.o2_fg, "text", "spacesuit_o2_levels_fg_green.png")
elseif factor_full > 0.1 then
-- yellow
color = get_color(255,255,0)
player:hud_change(hud_data.o2_fg, "text", "spacesuit_o2_levels_fg_yellow.png")
else
-- red
color = get_color(255,0,0)
player:hud_change(hud_data.o2_fg, "text", "spacesuit_o2_levels_fg_red.png")
end
player:hud_change(hud_data.o2_label, "number", color)
player:hud_change(hud_data.o2_level, "number", color)
end
minetest.register_on_leaveplayer(function(player)
-- remove stale hud data
local playername = player:get_player_name()
hud[playername] = nil
end)
spacesuit.set_player_wearing = function(player, has_full_suit, has_helmet, armor_list)
local playername = player:get_player_name()
local hud_data = hud[playername]
if hud_data and has_helmet then
-- player wears it
update_hud(player, has_full_suit, armor_list)
elseif not hud_data and not has_helmet then
-- player does not wear it
elseif hud_data and not has_helmet then
-- player stopped wearing
remove_hud(player)
elseif not hud_data and has_helmet then
-- player started wearing
setup_hud(player)
minetest.after(0.1, function()
update_hud(player, has_full_suit, armor_list)
end)
end
end