Improve health display lifecycle management

This commit is contained in:
Signal 2025-09-17 01:31:21 -04:00
parent d6662e8094
commit 82772ce999

View file

@ -40,18 +40,17 @@ Player = {
e.eye_height = 1.6 e.eye_height = 1.6
e.health_display = minetest.add_entity(p:get_pos(), "display")
e.health_display:set_attach(p, nil, vector.new(0, 17, 0))
e:update_hp(p:get_hp()) e:update_hp(p:get_hp())
return e return e
end, end,
update_hp = function(m, hp) update_hp = function(m, hp)
if not (m.health_display and m.health_display:is_valid()) then if not (m.health_display and m.health_display:is_valid()) then
m.health_display = minetest.add_entity(m.object:get_pos(), "display") local pos = m.object:get_pos()
if not pos then return end
m.health_display = minetest.add_entity(pos, "rgt_player:health_display")
m.health_display:set_attach(m.object, nil, vector.new(0, 17, 0)) m.health_display:set_attach(m.object, nil, vector.new(0, 17, 0))
m.health_display:get_luaentity().owner = m
end end
local tx = "[combine:90x90" local tx = "[combine:90x90"
for i = math.floor(hp /2), math.floor(m.props.hp_max /2) -1 do for i = math.floor(hp /2), math.floor(m.props.hp_max /2) -1 do
@ -210,9 +209,10 @@ Player = {
if hp < p:get_properties().hp_max then if hp < p:get_properties().hp_max then
p:set_hp(hp +1) p:set_hp(hp +1)
-- Make sure the health display is still loaded. -- Make sure the health display is still loaded.
elseif not (m.health_display and m.health_display:is_valid()) then end
m.health_display = minetest.add_entity(m.object:get_pos(), "display")
m.health_display:set_attach(m.object, nil, vector.new(0, 17, 0)) if not (m.health_display and m.health_display:is_valid()) then
m:update_hp(hp)
end end
m.last_time = time m.last_time = time
@ -287,6 +287,10 @@ Player = {
end end
p:hud_set_hotbar_image("[combine:"..(21 *slots +1).."x22"..list) p:hud_set_hotbar_image("[combine:"..(21 *slots +1).."x22"..list)
p:hud_set_hotbar_selected_image("rgt_hotbar_selected.png") p:hud_set_hotbar_selected_image("rgt_hotbar_selected.png")
end,
deinit = function(m)
m.health_display:remove()
rgt.players[m.name] = nil
end end
} }
setmetatable(Player, { setmetatable(Player, {
@ -320,7 +324,7 @@ minetest.register_on_joinplayer(function(p)
end) end)
minetest.register_on_leaveplayer(function(p) minetest.register_on_leaveplayer(function(p)
ns.players[p:get_player_name()] = nil ns.players[p:get_player_name()]:deinit()
end) end)
minetest.register_globalstep(function(time) minetest.register_globalstep(function(time)
@ -333,6 +337,22 @@ minetest.register_on_player_hpchange(function(p, hp_change)
rgt.players[p:get_player_name()]:update_hp(p:get_hp() +hp_change) rgt.players[p:get_player_name()]:update_hp(p:get_hp() +hp_change)
end) end)
minetest.register_entity("rgt_player:health_display", {
initial_properties = {
visual = "sprite",
textures = {"blank.png"},
static_save = false
},
on_detach = function(e)
e.object:remove()
end,
on_deactivate = function(e)
if e.owner then
minetest.after(0, function() e.owner:update_hp(e.owner.object:get_hp()) end)
end
end
})
minetest.register_chatcommand("hungerbar", { minetest.register_chatcommand("hungerbar", {
func = function(name, args) func = function(name, args)
local m = rgt.players[name] local m = rgt.players[name]