From f7d50a80782376d2e1c068e4d0a7ce9632f28bda Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Wed, 23 Aug 2017 22:32:10 +0200 Subject: Respect object property hp_max field for players (#6287) * Respect object property hp_max field for players This allows modders to configure the maximal HP per player * Statbars: Downscale bar to full 20 HP when exceeding this value Add default max HP for players and breath constants to builtin Document the constants * Rename PLAYER_MAX_HP -> PLAYER_MAX_HP_DEFAULT --- builtin/game/constants.lua | 4 ++++ builtin/game/statbars.lua | 49 ++++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 19 deletions(-) (limited to 'builtin/game') diff --git a/builtin/game/constants.lua b/builtin/game/constants.lua index 50c515b24..29eeb8330 100644 --- a/builtin/game/constants.lua +++ b/builtin/game/constants.lua @@ -21,6 +21,10 @@ core.EMERGE_GENERATED = 4 -- constants.h -- Size of mapblocks in nodes core.MAP_BLOCKSIZE = 16 +-- Default maximal HP of a player +core.PLAYER_MAX_HP_DEFAULT = 20 +-- Maximal breath of a player +core.PLAYER_MAX_BREATH = 11 -- light.h -- Maximum value for node 'light_source' parameter diff --git a/builtin/game/statbars.lua b/builtin/game/statbars.lua index 6aa106140..1b83dd4ac 100644 --- a/builtin/game/statbars.lua +++ b/builtin/game/statbars.lua @@ -6,7 +6,7 @@ local health_bar_definition = hud_elem_type = "statbar", position = { x=0.5, y=1 }, text = "heart.png", - number = 20, + number = core.PLAYER_MAX_HP_DEFAULT, direction = 0, size = { x=24, y=24 }, offset = { x=(-10*24)-25, y=-(48+24+16)}, @@ -37,39 +37,45 @@ local function initialize_builtin_statbars(player) return end - if (hud_ids[name] == nil) then + if not hud_ids[name] then hud_ids[name] = {} -- flags are not transmitted to client on connect, we need to make sure -- our current flags are transmitted by sending them actively player:hud_set_flags(player:hud_get_flags()) end + local hud = hud_ids[name] if player:hud_get_flags().healthbar and enable_damage then - if hud_ids[name].id_healthbar == nil then - health_bar_definition.number = player:get_hp() - hud_ids[name].id_healthbar = player:hud_add(health_bar_definition) + if hud.id_healthbar == nil then + local hp = player:get_hp() + local max_display_hp = math.max(core.PLAYER_MAX_HP_DEFAULT, + math.max(player:get_properties().hp_max, hp)) + -- Limit width of health bar: Scale to the default maximal HP + health_bar_definition.number = + hp / max_display_hp * core.PLAYER_MAX_HP_DEFAULT + hud.id_healthbar = player:hud_add(health_bar_definition) end else - if hud_ids[name].id_healthbar ~= nil then - player:hud_remove(hud_ids[name].id_healthbar) - hud_ids[name].id_healthbar = nil + if hud.id_healthbar ~= nil then + player:hud_remove(hud.id_healthbar) + hud.id_healthbar = nil end end - if (player:get_breath() < 11) then + if player:get_breath() < core.PLAYER_MAX_BREATH then if player:hud_get_flags().breathbar and enable_damage then - if hud_ids[name].id_breathbar == nil then - hud_ids[name].id_breathbar = player:hud_add(breath_bar_definition) + if hud.id_breathbar == nil then + hud.id_breathbar = player:hud_add(breath_bar_definition) end else - if hud_ids[name].id_breathbar ~= nil then - player:hud_remove(hud_ids[name].id_breathbar) - hud_ids[name].id_breathbar = nil + if hud.id_breathbar ~= nil then + player:hud_remove(hud.id_breathbar) + hud.id_breathbar = nil end end - elseif hud_ids[name].id_breathbar ~= nil then - player:hud_remove(hud_ids[name].id_breathbar) - hud_ids[name].id_breathbar = nil + elseif hud.id_breathbar ~= nil then + player:hud_remove(hud.id_breathbar) + hud.id_breathbar = nil end end @@ -101,7 +107,12 @@ local function player_event_handler(player,eventname) initialize_builtin_statbars(player) if hud_ids[name].id_healthbar ~= nil then - player:hud_change(hud_ids[name].id_healthbar,"number",player:get_hp()) + local hp = player:get_hp() + local max_display_hp = math.max(core.PLAYER_MAX_HP_DEFAULT, + math.max(player:get_properties().hp_max, hp)) + -- Limit width of health bar: Scale to the default maximal HP + local hp_count = hp / max_display_hp * core.PLAYER_MAX_HP_DEFAULT + player:hud_change(hud_ids[name].id_healthbar, "number", hp_count) return true end end @@ -110,7 +121,7 @@ local function player_event_handler(player,eventname) initialize_builtin_statbars(player) if hud_ids[name].id_breathbar ~= nil then - player:hud_change(hud_ids[name].id_breathbar,"number",player:get_breath()*2) + player:hud_change(hud_ids[name].id_breathbar, "number", player:get_breath() * 2) return true end end -- cgit v1.2.3