diff --git a/API.md b/API.md old mode 100644 new mode 100755 index d18f05b..8dd8f0e --- a/API.md +++ b/API.md @@ -1,4 +1,4 @@ -API documentation for the HUD bars mod 1.2.1 +API documentation for the HUD bars mod 1.4.1 ============================================ ## Introduction @@ -50,8 +50,9 @@ This function registers a new custom HUD bar definition to the HUD bars mod, so and unhidden on a per-player basis. Note this does not yet display the HUD bar. -The HUD bars will be displayed in a “first come, first serve” order. This mod does not allow fow a custom order or a way to set it -manually in a reliable way. +The HUD bars will be displayed in a “first come, first serve” order. This API does not allow fow a custom order or a way to set it +manually in a reliable way. However, you can use the setting `hudbars_sorting` for this. See the advanced setting menu in Minetest +for more information. #### Parameters @@ -99,22 +100,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/README.txt b/README.txt old mode 100644 new mode 100755 diff --git a/changelog.txt b/changelog.txt old mode 100644 new mode 100755 index 3c4f0bc..8edab4e --- a/changelog.txt +++ b/changelog.txt @@ -64,3 +64,20 @@ as of version 2.0.0 of the standard . 1.2.1 ----- - Fix crash when enable_damage is changed in mid-game + +1.3.0 +----- +- Make all settings avaialbe in Minetest's advanced settings menu +- Fix HUD bars overlap when both hudbars_tick and hudbars_vmargin were set +- Use Markdown syntax in readme file +- Fix some factual mistakes in readme file +- Add metadata: mod.conf, description.txt, screenshot.png + +1.4.0 +----- +- Allow to change HUD bar images and label after it has been registered +- Minor API.md correction + +1.4.1 +----- +- Fix bug in hb.change_hudbar being a no-op if new_value and new_max value are nil diff --git a/depends.txt b/depends.txt old mode 100644 new mode 100755 index e69de29..9207dab --- a/depends.txt +++ b/depends.txt @@ -0,0 +1,2 @@ +default +intllib? diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..9e10e89 --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +Replaces the health and breath symbols in the HUD by “progress bars” and shows exact values. Other mods can add more progress bars for custom player stats. diff --git a/hudbars.conf b/hudbars.conf new file mode 100755 index 0000000..af83d69 --- /dev/null +++ b/hudbars.conf @@ -0,0 +1,10 @@ +-- if custom==true, use custom position +-- X 0=left, 1=right +--Y 0,1,2 = down--> up +hb.settings.custom.custom = true +hb.settings.custom.health = { x = 0, y = 0 } +hb.settings.custom.satiation = { x = 0, y = 1 } +hb.settings.custom.sprint = { x = 1, y = 1 } +hb.settings.custom.mana = { x = 1, y = 0 } +hb.settings.custom.armor = { x = 1, y = 2 } +hb.settings.custom.breath = { x = 0, y = 2 } diff --git a/init.lua b/init.lua index 7a30096..11138fb 100644 --- a/init.lua +++ b/init.lua @@ -1,3 +1,11 @@ +local S +if (minetest.get_modpath("intllib")) then + dofile(minetest.get_modpath("intllib").."/intllib.lua") + S = intllib.Getter(minetest.get_current_modname()) +else + S = function ( s ) return s end +end + hb = {} hb.hudtables = {} @@ -59,23 +67,12 @@ hb.settings.start_offset_left.y = hb.load_setting("hudbars_start_offset_left_y", hb.settings.start_offset_right.x = hb.load_setting("hudbars_start_offset_right_x", "number", 15) hb.settings.start_offset_right.y = hb.load_setting("hudbars_start_offset_right_y", "number", -86) -hb.settings.vmargin = hb.load_setting("hudbars_tick", "number", 24) -hb.settings.tick = hb.load_setting("hudbars_tick", "number", 0.1) +hb.settings.vmargin = hb.load_setting("hudbars_vmargin", "number", 24) +hb.settings.tick = hb.load_setting("hudbars_tick", "number", 0.4) -- experimental setting: Changing this setting is not officially supported, do NOT rely on it! hb.settings.forceload_default_hudbars = hb.load_setting("hudbars_forceload_default_hudbars", "bool", true) ---[[ -- hudbars_alignment_pattern: This setting changes the way the HUD bars are ordered on the display. You can choose - between a zig-zag pattern or a vertically stacked pattern. - The following values are allowed: - zigzag: Starting from the left bottom, the next is right from the first, - the next is above the first, the next is right of the third, etc. - This is the default. - stack_up: The HUD bars are stacked vertically, going upwards. - stack_down: The HUD bars are stacked vertically, going downwards. -]] - -- Misc. settings hb.settings.alignment_pattern = hb.load_setting("hudbars_alignment_pattern", "string", "zigzag", {"zigzag", "stack_up", "stack_down"}) hb.settings.bar_type = hb.load_setting("hudbars_bar_type", "string", "progress_bar", {"progress_bar", "statbar_classic", "statbar_modern"}) @@ -95,7 +92,7 @@ else end -- Table which contains all players with active default HUD bars (only for internal use) -hb.players = {} +--hb.players = {} function hb.value_to_barlength(value, max) if max == 0 then @@ -167,7 +164,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta end end if format_string == nil then - format_string = "%s: %d/%d" + format_string = S("%s: %d/%d") end hudtable.add_all = function(player, hudtable, start_value, start_max, start_hidden) @@ -177,7 +174,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta local ids = {} local state = {} local name = player:get_player_name() - local bgscale, iconscale, text, barnumber + local bgscale, iconscale, text, barnumber, bgiconnumber if start_max == 0 or start_hidden then bgscale = { x=0, y=0 } else @@ -186,10 +183,12 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta if start_hidden then iconscale = { x=0, y=0 } barnumber = 0 + bgiconnumber = 0 text = "" else iconscale = { x=1, y=1 } barnumber = hb.value_to_barlength(start_value, start_max) + bgiconnumber = hb.settings.statbar_length text = string.format(format_string, label, start_value, start_max) end if hb.settings.bar_type == "progress_bar" then @@ -216,9 +215,8 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta ids.bg = player:hud_add({ hud_elem_type = "statbar", position = pos, - scale = bgscale, text = textures.bgicon, - number = hb.settings.statbar_length, + number = bgiconnumber, alignment = {x=-1,y=-1}, offset = { x = offset.x, y = offset.y }, }) @@ -237,6 +235,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta number = barnumber, alignment = {x=-1,y=-1}, offset = offset, + size = "", }) if hb.settings.bar_type == "progress_bar" then ids.text = player:hud_add({ @@ -246,7 +245,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta alignment = {x=1,y=1}, number = text_color, direction = 0, - offset = { x = offset.x + 2, y = offset.y }, + offset = { x = offset.x + 2, y = offset.y - 1}, }) end -- Do not forget to update hb.get_hudbar_state if you add new fields to the state table @@ -283,7 +282,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta hudtable.default_start_max = default_start_max hb.hudbars_count= hb.hudbars_count + 1 - + hb.hudtables[identifier] = hudtable end @@ -292,8 +291,8 @@ 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) - if new_value == nil and new_max_value == nil then +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 and new_icon == nil and new_bgicon == nil and new_bar == nil and new_label == nil and new_text_color == nil then return end @@ -301,21 +300,52 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value) local hudtable = hb.get_hudtable(identifier) local value_changed, max_changed = false, false - if new_value ~= nil then - if new_value ~= hudtable.hudstate[name].value then - hudtable.hudstate[name].value = new_value - value_changed = true - end - else - new_value = hudtable.hudstate[name].value - end if new_max_value ~= nil then if new_max_value ~= hudtable.hudstate[name].max then hudtable.hudstate[name].max = new_max_value max_changed = true end else - new_max_value = hudtable.hudstate[name].max + new_max_value = (hudtable.hudstate[name] or {max = 0}).max + end + + if new_value ~= nil and hudtable.hudstate[name] then + if new_value ~= hudtable.hudstate[name].value then + if new_value > new_max_value then + new_value = new_max_value + end + hudtable.hudstate[name].value = new_value + value_changed = true + end + else + new_value = (hudtable.hudstate[name] or {value = 0}).value + 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 = @@ -367,6 +397,8 @@ function hb.hide_hudbar(player, identifier) end player:hud_change(hudtable.hudids[name].bg, "scale", {x=0,y=0}) player:hud_change(hudtable.hudids[name].text, "text", "") + elseif hb.settings.bar_type == "statbar_modern" then + player:hud_change(hudtable.hudids[name].bg, "number", 0) end player:hud_change(hudtable.hudids[name].bar, "number", 0) hudtable.hudstate[name].hidden = true @@ -388,6 +420,8 @@ function hb.unhide_hudbar(player, identifier) player:hud_change(hudtable.hudids[name].bg, "scale", {x=1,y=1}) end player:hud_change(hudtable.hudids[name].text, "text", tostring(string.format(hudtable.format_string, hudtable.label, value, max))) + elseif hb.settings.bar_type == "statbar_modern" then + player:hud_change(hudtable.hudids[name].bg, "number", hb.settings.statbar_length) end player:hud_change(hudtable.hudids[name].bar, "number", hb.value_to_barlength(value, max)) hudtable.hudstate[name].hidden = false @@ -409,8 +443,8 @@ end --register built-in HUD bars if minetest.setting_getbool("enable_damage") or hb.settings.forceload_default_hudbars then - hb.register_hudbar("health", 0xFFFFFF, "Health", { bar = "hudbars_bar_health.png", icon = "hudbars_icon_health.png", bgicon = "hudbars_bgicon_health.png" }, 20, 20, false) - hb.register_hudbar("breath", 0xFFFFFF, "Breath", { bar = "hudbars_bar_breath.png", icon = "hudbars_icon_breath.png" }, 10, 10, true) + hb.register_hudbar("health", 0xFFFFFF, S("Health"), { bar = "hudbars_bar_health.png", icon = "hudbars_icon_health.png", bgicon = "hudbars_bgicon_health.png" }, 20, 20, false) + hb.register_hudbar("breath", 0xFFFFFF, S("Breath"), { bar = "hudbars_bar_breath.png", icon = "hudbars_icon_breath.png", bgicon = "hudbars_bgicon_breath.png" }, 10, 10, true) end local function hide_builtin(player) @@ -437,7 +471,6 @@ local function custom_hud(player) end end - -- update built-in HUD bars local function update_hud(player) if minetest.setting_getbool("enable_damage") then @@ -462,30 +495,23 @@ local function update_hud(player) end end -minetest.register_on_joinplayer(function(player) - hide_builtin(player) - custom_hud(player) - hb.players[player:get_player_name()] = player -end) - -minetest.register_on_leaveplayer(function(player) - hb.players[player:get_player_name()] = nil -end) - -local main_timer = 0 -local timer = 0 -minetest.register_globalstep(function(dtime) - main_timer = main_timer + dtime - timer = timer + dtime - if main_timer > hb.settings.tick or timer > 4 then - if main_timer > hb.settings.tick then main_timer = 0 end - -- only proceed if damage is enabled - if minetest.setting_getbool("enable_damage") or hb.settings.forceload_default_hudbars then - for playername, player in pairs(hb.players) do - -- update all hud elements - update_hud(player) - end +local function hb_step() + if minetest.setting_getbool("enable_damage") or hb.settings.forceload_default_hudbars then + for _,player in ipairs(minetest.get_connected_players()) do + -- only proceed if damage is enabled + -- update all hud elements + update_hud(player) end end - if timer > 4 then timer = 0 end + minetest.after(hb.settings.tick, hb_step) +end + + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + if not name or name == "" then return end + hide_builtin(player) + custom_hud(player) end) + +minetest.after(0, hb_step) diff --git a/locale/de.txt b/locale/de.txt new file mode 100644 index 0000000..578764e --- /dev/null +++ b/locale/de.txt @@ -0,0 +1,3 @@ +Health = Leben +Breath = Atem +%s: %d/%d = %s: %d/%d diff --git a/locale/template.txt b/locale/template.txt new file mode 100644 index 0000000..0a26b8f --- /dev/null +++ b/locale/template.txt @@ -0,0 +1,5 @@ +Health +Breath + +# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +%s: %d/%d diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..add28e6 --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name = hudbars diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..93ed93e Binary files /dev/null and b/screenshot.png differ diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..5779063 --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,98 @@ +[Appearance] +# Specifies how the value indicators (i.e. health, breah, etc.) look. There are 3 styles +# available. You can choose between the default progress-bar-like bars and the good +# old statbars like you know from vanilla Minetest. +# These values are possible: +# - progress_bar: A horizontal progress-bar-like bar with a label, showing numerical value +# (current, maximum), and an icon. These bars usually convey the most +# information. This is the default and recommended value. +# - statbar_classic: Classic statbar, like in vanilla Minetest. Made out of up to 20 +# half-symbols. Those bars represent the vague ratio between +# the current value and the maximum value. 1 half-symbol stands for +# approximately 5% of the maximum value. +# - statbar_modern: Like the classic statbar, but also supports background images, this +# kind of statbar may be considered to be more user-friendly than the +# classic statbar. This bar type closely resembles the mod +# “Better HUD” [hud] by BlockMen. +hudbars_bar_type (HUD bars style) enum progress_bar progress_bar,statbar_classic,statbar_modern + + +# If enabled (default), the breath indicators in the HUD will be automatically hidden shortly +# after the breath has been filled up. Otherwise, the breath will always be displayed. +hudbars_autohide_breath (Automatically hide breath indicators) bool true + +# This setting changes the way the HUD bars are ordered on the display. You can choose +# between a zig-zag pattern (default) or a vertically stacked pattern. +# The following values are allowed: +# - zigzag: Starting from the left bottom, the next is right from the first, +# the next is above the first, the next is right of the third, etc. +# - stack_up: The HUD bars are stacked vertically, going upwards. +# - stack_down: The HUD bars are stacked vertically, going downwards. +hudbars_alignment_pattern (HUD bars alignment pattern) enum zigzag zigzag,stack_up,stack_down + +# This setting allows you to specify the order of the HUD bars explicitly. If left empty +# (the default), the health and breath indicators come first, additional indicators +# may appear in any order. This setting is quite technical and normal users probably do not +# need to worry about it. +# +# Syntax: +# The setting has to be specified as a comma-seperated list of key=value pairs, where a key +# refers to the identifier of a HUD bar and the value refers to the slot number of where the +# HUD bar should be placed. The slot number must be an integer greater of equal to 0. Where +# the HUD bars will be displayed exactly depends on the alignment pattern being used. +# All HUD bars to which no order value has been applied will fill in all slots which have +# not been occupied by the HUD bars specified in this setting, the slots will be filled in +# from the lowest slot number. +# Note that the order of those remaining HUD bars is not fixed, it basically just boils +# down on which mod “came” first. Don't worry, the mod will still work perfectly fine, this +# setting is entirely optional. +# The identifier for the health bar is “health” and the identifier for the breath bar is +# “breath”. For other HUD bars, you have to learn it from the mod which is supplying them. +# +# Be careful not to use slot indices twice, or else different HUD bars will be drawn over +# each other! +# +# Example: “breath=0, health=1” +# This makes the breath bar first and the health bar second, which is the opposite order +# of the default one. +hudbars_sorting (HUD bars order) string + +[Positions and offsets] +# Horizontal (x) main position of the HUD bars over the entire screen. +# 0.0 is left-most, 1.0 is right-most. +# For the zig-zag alignment pattern, this is for the left HUD bars. +hudbars_pos_left_x (Left HUD bar screen x position) float 0.5 0.0 1.0 +# Vertical (y) main position of the HUD bars over the entire screen. +# 0.0 is top, 1.0 is bottom. +# For the zig-zag alignment pattern, this is for the left HUD bars. +hudbars_pos_left_y (Left HUD bar screen y position) float 1.0 0.0 1.0 +# Horizontal (x) main position of the right HUD bars over the entire screen. +# 0.0 is left-most, 1.0 is right-most. +# Only used for the zig-zag alignment pattern. +hudbars_pos_right_x (Right HUD bar screen x position) float 0.5 0.0 1.0 +# Vertical main position (y) of the right HUD bars over the entire screen. +# 0.0 is top, 1.0 is bottom. +# Only used for the zig-zag alignment pattern. +hudbars_pos_right_y (Right HUD bar screen y position) float 1.0 0.0 1.0 + +# Precise x offset in pixels from the basic screen x position of the HUD bars. +# For the zig-zag alignment pattern, this is for the left HUD bars. +hudbars_start_offset_left_x (Left HUD bar x offset) int -175 +# Precise y offset in pixels from the basic screen y position of the HUD bars. +# For the zig-zag alignment pattern, this is for the left HUD bars. +hudbars_start_offset_left_y (Left HUD bar y offset) int -86 +# Precise x offset in pixels from the basic screen x position of the right HUD bars. +# Only used for the zig-zag alignment pattern. +hudbars_start_offset_right_x (Right HUD bar x offset) int 15 +# Precise y offset in pixels from the basic screen y position of the right HUD bars. +# Only used for the zig-zag alignment pattern. +hudbars_start_offset_right_y (Right HUD bar y offset) int -86 + +# The vertical distance between two HUD bars, in pixels. +hudbars_vmargin (Vertical distance between HUD bars) int 24 0 + +[Performance] +# The of seconds which need to pass before the server updates the default HUD bars +# (health and breath). Increase this number if you have a slow server or a slow network +# connection and experience performance problems. +hudbars_tick (Default HUD bars update interval) float 0.1 0.0 4.0 diff --git a/textures/hudbars_bar_background.png b/textures/hudbars_bar_background.png old mode 100644 new mode 100755 index cbc6c3f..9a9513b Binary files a/textures/hudbars_bar_background.png and b/textures/hudbars_bar_background.png differ diff --git a/textures/hudbars_bar_breath.png b/textures/hudbars_bar_breath.png old mode 100644 new mode 100755 diff --git a/textures/hudbars_bar_health.png b/textures/hudbars_bar_health.png old mode 100644 new mode 100755 diff --git a/textures/hudbars_bgicon_breath.png b/textures/hudbars_bgicon_breath.png new file mode 100644 index 0000000..176629a Binary files /dev/null and b/textures/hudbars_bgicon_breath.png differ diff --git a/textures/hudbars_bgicon_health.png b/textures/hudbars_bgicon_health.png old mode 100644 new mode 100755 index e2be276..8c1ddad Binary files a/textures/hudbars_bgicon_health.png and b/textures/hudbars_bgicon_health.png differ diff --git a/textures/hudbars_icon_breath.png b/textures/hudbars_icon_breath.png old mode 100644 new mode 100755 diff --git a/textures/hudbars_icon_health.png b/textures/hudbars_icon_health.png old mode 100644 new mode 100755