From fff42e2a4209b751b51e6ee887d553816587e918 Mon Sep 17 00:00:00 2001
From: Wuzzy <almikes@aol.com>
Date: Sun, 3 Jul 2016 00:18:54 +0200
Subject: [PATCH] Allow to change HUD bar images and label later

---
 API.md   | 33 +++++++++++++++++++++++++--------
 init.lua | 29 ++++++++++++++++++++++++++++-
 2 files changed, 53 insertions(+), 9 deletions(-)

diff --git a/API.md b/API.md
index 8af63b6..39ef683 100644
--- a/API.md
+++ b/API.md
@@ -99,22 +99,39 @@ Always `nil`.
 
 
 ## Modifying a HUD bar
-After a HUD bar has been added, you can change the current and maximum value on a per-player basis.
+After a HUD bar has been added, you can change the current and maximum value and other attributes on a per-player basis.
 You use the function `hb.change_hudbar` for this.
 
-### `hb.change_hudbar(player, identifier, new_value, new_max_value)`
-Changes the values of an initialized HUD bar for a certain player. `new_value` and `new_max_value`
-can be `nil`; if one of them is `nil`, that means the value is unchanged. If both values
-are `nil`, this function is a no-op.
-This function also tries minimize the amount of calls to `hud_change` of the Minetest Lua API, and
-therefore, network traffic. `hud_change` is only called if it is actually needed, i.e. when the
-actual length of the bar or the displayed string changed, so you do not have to worry about it.
+### `hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon, new_bgicon, new_bar, new_label, new_text_color)`
+Changes the values and the appearance of an initialized HUD bar for a certain player. `new_value`
+and `new_max_value` are the most important parameters as they specify the new current and maximum new values, you do not need
+to worry too much about the other parameters.
+
+The following parameters are less important and provided for styling the HUD bar after registration (if
+this is desired). The “styling” parameters parallel the parameters of `hb.register_hudbar`. It is
+recommended to not change the style of a HUD bar too often as this can be distracting or confusing
+for players.
+
+`new_value`, `new_max_value` `new_icon`, `new_bgicon`, `new_bar`, `new_label` and `new_text_color` can be
+`nil`; if one of them is `nil`, that means the value is unchanged. If all those values are `nil`, this
+function is a no-op.
+
+This function tries to minimize the amount of calls to `hud_change` of the Minetest Lua API
+(and thus, network traffic), when you only change the value and/or  maximum value. In this case,
+`hud_change` is only called if it is actually needed, e.g. when the actual length of the bar
+or the displayed string changed, so you do not have to worry about it. There is, however, no
+such network optimization for the “styling” parameters, so keep this in mind.
 
 #### Parameters
 * `player`: `ObjectRef` of the player to which the HUD bar belongs to
 * `identifier`: The identifier of the HUD bar type to change, as specified in `hb.register_hudbar`.
 * `new_value`: The new current value of the HUD bar
 * `new_max_value`: The new maximum value of the HUD bar
+* `new_icon`: File name of the new icon
+* `new_bgicon`: File name of the new background icon for the modern-style statbar
+* `new_bar`: File name of the new bar segment image
+* `new_label`: A new text label of the HUD bar. Note the format string still applies
+* `new_text_color`: A 3-octet number defining the new color of the text.
 
 #### Return value
 Always `nil`.
diff --git a/init.lua b/init.lua
index 3aba7e1..7421156 100644
--- a/init.lua
+++ b/init.lua
@@ -281,7 +281,7 @@ function hb.init_hudbar(player, identifier, start_value, start_max, start_hidden
 	hb.hudtables[identifier].add_all(player, hudtable, start_value, start_max, start_hidden)
 end
 
-function hb.change_hudbar(player, identifier, new_value, new_max_value)
+function hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon, new_bgicon, new_bar, new_label, new_text_color)
 	if new_value == nil and new_max_value == nil then
 		return
 	end
@@ -307,6 +307,33 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value)
 		new_max_value = hudtable.hudstate[name].max
 	end
 
+	if hb.settings.bar_type == "progress_bar" then
+		if new_icon ~= nil and hudtable.hudids[name].icon ~= nil then
+			player:hud_change(hudtable.hudids[name].icon, "text", new_icon)
+		end
+		if new_bgicon ~= nil and hudtable.hudids[name].bgicon ~= nil then
+			player:hud_change(hudtable.hudids[name].bgicon, "text", new_bgicon)
+		end
+		if new_bar ~= nil then
+			player:hud_change(hudtable.hudids[name].bar , "text", new_bar)
+		end
+		if new_label ~= nil then
+			hudtable.label = new_label
+			local new_text = string.format(hudtable.format_string, new_label, hudtable.hudstate[name].value, hudtable.hudstate[name].max)
+			player:hud_change(hudtable.hudids[name].text, "text", new_text)
+		end
+		if new_text_color ~= nil then
+			player:hud_change(hudtable.hudids[name].text, "number", new_text_color)
+		end
+	else
+		if new_icon ~= nil and hudtable.hudids[name].bar ~= nil then
+			player:hud_change(hudtable.hudids[name].bar, "text", new_icon)
+		end
+		if new_bgicon ~= nil and hudtable.hudids[name].bg ~= nil then
+			player:hud_change(hudtable.hudids[name].bg, "text", new_bgicon)
+		end
+	end
+
 	local main_error_text =
 		"[hudbars] Bad call to hb.change_hudbar, identifier: “"..tostring(identifier).."”, player name: “"..name.."”. "
 	if new_max_value < new_value then