From 8c40aef72f3acc6b6b9974b7a6f3ca2b47521235 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 11 Jul 2020 05:12:45 +0200 Subject: [PATCH] Update hudbars mod to 2.3.1 --- mods/hudbars/API.md | 18 +++++- mods/hudbars/README.md | 6 +- mods/hudbars/init.lua | 149 ++++++++++++++++++++++++++++++++----------------- 3 files changed, 119 insertions(+), 54 deletions(-) diff --git a/mods/hudbars/API.md b/mods/hudbars/API.md index a53344c..ca6144a 100644 --- a/mods/hudbars/API.md +++ b/mods/hudbars/API.md @@ -45,7 +45,7 @@ a vertical gradient. ### Icon A 16×16 image shown left of the HUD bar. This is optional. -### `hb.register_hudbar(identifier, text_color, label, textures, default_start_value, default_start_max, default_start_hidden, format_string)` +### `hb.register_hudbar(identifier, text_color, label, textures, default_start_value, default_start_max, default_start_hidden, format_string, format_string_config)` This function registers a new custom HUD bar definition to the HUD bars mod, so it can be later used to be displayed, changed, hidden and unhidden on a per-player basis. Note this does not yet display the HUD bar. @@ -66,7 +66,21 @@ for more information. * `default_start_value`: If this HUD bar is added to a player, and no initial value is specified, this value will be used as initial current value * `default_max_value`: If this HUD bar is added to a player, and no initial maximum value is specified, this value will be used as initial maximum value * `default_start_hidden`: The HUD bar will be initially start hidden by default when added to a player. Use `hb.unhide_hudbar` to unhide it. -* `format_string`: This is optional; You can specify an alternative format string display the final text on the HUD bar. The default format string is “`%s: %d/%d`” (in this order: Label, current value, maximum value). See also the Lua documentation of `string.format`. +* `format_string`: Optional; You can specify an alternative format string to use for the final text on the HUD bar. The default format string is “`@1: @2/@3`” (The “@” numbers are placeholders that have a meaning in this order: @1 = Label, @2 = current value, @3 = maximum value). Do *not* use minetest.translator on this string, the string will be translated by `hudbars`, but you still must put this string into the translation catalogue file. +* `format_string_config`: Required if `format_string` is set. This allows to change which parameters to use in the format string. It's a table with these fields: + * `textdomain`: Text domain of the format string, used by `minetest.translate` + * `order`: Table that contains the order of the placeholders. It's also possible to remove placeholders. Default order: `{ "label", "value", "max_value" }` + * `format_value`: Format string to apply when displaying `value`. Syntax is same as in `string.format`. Default: `"%d"` + * `format_max_value`: Same as `format_value` but is applied to `max_value` + +#### Example +Example (mostly) from `hbarmor` mod: + +``` +hb.register_hudbar("armor", 0xFFFFFF, minetest.translator("hbarmor", "Armor"), { icon = "hbarmor_icon.png", bgicon = "hbarmor_bgicon.png", bar = "hbarmor_bar.png" }, 0, 100, hbarmor.autohide, N("@1: @2%"), { order = { "label", "value" }, textdomain = "hbarmor" } ) +``` + +Displays an armor HUD bar with a label of the form „Armor: 53%“. (`N` is a dummy function that returns its argument, used to make the string visible for translator scripts.) #### Return value Always `nil`. diff --git a/mods/hudbars/README.md b/mods/hudbars/README.md index a3a1a96..45f3b11 100644 --- a/mods/hudbars/README.md +++ b/mods/hudbars/README.md @@ -11,7 +11,8 @@ this mod will place them accordingly. position should be displayed correctly on every screen size. ## Current version -The current version is 1.10.0. +The current version is 2.3.1. +It works for Minetest 5.3.0. This software uses [semantic versioning](http://semver.org), as defined by version 2.0.0 of the SemVer standard. @@ -37,6 +38,9 @@ Translations: * Turkish: admicos * Dutch: kingoscargames * Italian: Hamlet +* Malay: muhdnurhidayat +* Russian: Imk +* Spanish: wuniversales This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it diff --git a/mods/hudbars/init.lua b/mods/hudbars/init.lua index d06455c..da9d1f3 100644 --- a/mods/hudbars/init.lua +++ b/mods/hudbars/init.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("hudbars") +local N = function(s) return s end hb = {} @@ -50,6 +51,35 @@ local function player_exists(player) return player ~= nil and player:is_player() end +local function make_label(format_string, format_string_config, label, start_value, max_value) + local params = {} + local order = format_string_config.order + for o=1, #order do + if order[o] == "label" then + table.insert(params, label) + elseif order[o] == "value" then + if format_string_config.format_value then + table.insert(params, string.format(format_string_config.format_value, start_value)) + else + table.insert(params, start_value) + end + elseif order[o] == "max_value" then + if format_string_config.format_max_value then + table.insert(params, string.format(format_string_config.format_max_value, max_value)) + else + table.insert(params, max_value) + end + end + end + local ret + if format_string_config.textdomain then + ret = minetest.translate(format_string_config.textdomain, format_string, unpack(params)) + else + ret = S(format_string, unpack(params)) + end + return ret +end + -- Table which contains all players with active default HUD bars (only for internal use) hb.players = {} @@ -89,7 +119,7 @@ function hb.get_hudbar_position_index(identifier) end end -function hb.register_hudbar(identifier, text_color, label, textures, default_start_value, default_start_max, default_start_hidden, format_string) +function hb.register_hudbar(identifier, text_color, label, textures, default_start_value, default_start_max, default_start_hidden, format_string, format_string_config) minetest.log("action", "hb.register_hudbar: "..tostring(identifier)) local hudtable = {} local pos, offset @@ -123,7 +153,19 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta end end if format_string == nil then - format_string = S("%s: %d/%d") + format_string = N("@1: @2/@3") + end + if format_string_config == nil then + format_string_config = {} + end + if format_string_config.order == nil then + format_string_config.order = { "label", "value", "max_value" } + end + if format_string_config.format_value == nil then + format_string_config.format_value = "%d" + end + if format_string_config.format_max_value == nil then + format_string_config.format_max_value = "%d" end hudtable.add_all = function(player, hudtable, start_value, start_max, start_hidden) @@ -148,7 +190,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta 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) + text = make_label(format_string, format_string_config, label, start_value, start_max) end if hb.settings.bar_type == "progress_bar" then ids.bg = player:hud_add({ @@ -158,6 +200,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta text = "hudbars_bar_background.png", alignment = {x=1,y=1}, offset = { x = offset.x - 1, y = offset.y - 1 }, + z_index = 0, }) if textures.icon ~= nil then ids.icon = player:hud_add({ @@ -167,39 +210,37 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta text = textures.icon, alignment = {x=-1,y=1}, offset = { x = offset.x - 3, y = offset.y }, - }) - end - elseif hb.settings.bar_type == "statbar_modern" then - if textures.bgicon ~= nil then - ids.bg = player:hud_add({ - hud_elem_type = "statbar", - position = pos, - text = textures.bgicon, - number = bgiconnumber, - alignment = {x=-1,y=-1}, - offset = { x = offset.x, y = offset.y }, - direction = 0, - size = {x=24, y=24}, + z_index = 1, }) end end - local bar_image, bar_size + local bar_image, bgicon, bar_size if hb.settings.bar_type == "progress_bar" then bar_image = textures.bar + -- NOTE: Intentionally set to nil. For some reason, on some systems, + -- the progress bar is displaced when the bar_size is set explicitly here. + -- On the other hand, setting this to nil is deprecated in MT 5.0.0 due to + -- a debug log warning, but nothing is explained in lua_api.txt. + -- This section is a potential bug magnet, please watch with care! + -- The size of the bar image is expected to be exactly 2×16 pixels. bar_size = nil elseif hb.settings.bar_type == "statbar_classic" or hb.settings.bar_type == "statbar_modern" then bar_image = textures.icon + bgicon = textures.bgicon bar_size = {x=24, y=24} end ids.bar = player:hud_add({ hud_elem_type = "statbar", position = pos, text = bar_image, + text2 = bgicon, number = barnumber, + item = bgiconnumber, alignment = {x=-1,y=-1}, offset = offset, direction = 0, size = bar_size, + z_index = 1, }) if hb.settings.bar_type == "progress_bar" then ids.text = player:hud_add({ @@ -210,6 +251,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta number = text_color, direction = 0, offset = { x = offset.x + 2, y = offset.y - 1}, + z_index = 2, }) end -- Do not forget to update hb.get_hudbar_state if you add new fields to the state table @@ -238,6 +280,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta hudtable.identifier = identifier hudtable.format_string = format_string + hudtable.format_string_config = format_string_config hudtable.label = label hudtable.hudids = {} hudtable.hudstate = {} @@ -267,6 +310,9 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) + if not hudtable.hudstate[name] then + return false + end local value_changed, max_changed = false, false if new_value ~= nil then @@ -298,7 +344,7 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon 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) + local new_text = make_label(hudtable.format_string, hudtable.format_string_config, 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 @@ -342,7 +388,7 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon end if hb.settings.bar_type == "progress_bar" then - local new_text = string.format(hudtable.format_string, hudtable.label, new_value, new_max_value) + local new_text = make_label(hudtable.format_string, hudtable.format_string_config, hudtable.label, new_value, new_max_value) if new_text ~= hudtable.hudstate[name].text then player:hud_change(hudtable.hudids[name].text, "text", new_text) hudtable.hudstate[name].text = new_text @@ -358,19 +404,16 @@ function hb.hide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end - if(hudtable.hudstate[name].hidden == false) then - if hb.settings.bar_type == "progress_bar" then - if hudtable.hudids[name].icon ~= nil then - player:hud_change(hudtable.hudids[name].icon, "scale", {x=0,y=0}) - 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) + if hb.settings.bar_type == "progress_bar" then + if hudtable.hudids[name].icon ~= nil then + player:hud_change(hudtable.hudids[name].icon, "scale", {x=0,y=0}) end - player:hud_change(hudtable.hudids[name].bar, "number", 0) - hudtable.hudstate[name].hidden = true + player:hud_change(hudtable.hudids[name].bg, "scale", {x=0,y=0}) + player:hud_change(hudtable.hudids[name].text, "text", "") end + player:hud_change(hudtable.hudids[name].bar, "number", 0) + player:hud_change(hudtable.hudids[name].bar, "item", 0) + hudtable.hudstate[name].hidden = true return true end @@ -379,23 +422,22 @@ function hb.unhide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end - if(hudtable.hudstate[name].hidden) then - local value = hudtable.hudstate[name].value - local max = hudtable.hudstate[name].max - if hb.settings.bar_type == "progress_bar" then - if hudtable.hudids[name].icon ~= nil then - player:hud_change(hudtable.hudids[name].icon, "scale", {x=1,y=1}) - end - if hudtable.hudstate[name].max ~= 0 then - 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) + local value = hudtable.hudstate[name].value + local max = hudtable.hudstate[name].max + if hb.settings.bar_type == "progress_bar" then + if hudtable.hudids[name].icon ~= nil then + player:hud_change(hudtable.hudids[name].icon, "scale", {x=1,y=1}) + end + if hudtable.hudstate[name].max ~= 0 then + player:hud_change(hudtable.hudids[name].bg, "scale", {x=1,y=1}) end - player:hud_change(hudtable.hudids[name].bar, "number", hb.value_to_barlength(value, max)) - hudtable.hudstate[name].hidden = false + player:hud_change(hudtable.hudids[name].text, "text", make_label(hudtable.format_string, hudtable.format_string_config, hudtable.label, value, max)) + elseif hb.settings.bar_type == "statbar_modern" then + player:hud_change(hudtable.hudids[name].bar, "scale", {x=1,y=1}) end + player:hud_change(hudtable.hudids[name].bar, "number", hb.value_to_barlength(value, max)) + player:hud_change(hudtable.hudids[name].bar, "item", hb.value_to_barlength(max, max)) + hudtable.hudstate[name].hidden = false return true end @@ -443,16 +485,20 @@ local function custom_hud(player) else hide = true end - hb.init_hudbar(player, "health", player:get_hp(), nil, hide) + local hp = player:get_hp() + local hp_max = player:get_properties().hp_max + hb.init_hudbar(player, "health", math.min(hp, hp_max), hp_max, hide) local breath = player:get_breath() + local breath_max = player:get_properties().breath_max local hide_breath - if breath == 11 and hb.settings.autohide_breath == true then hide_breath = true else hide_breath = false end - hb.init_hudbar(player, "breath", math.min(breath, 10), nil, hide_breath or hide) + if breath >= breath_max and hb.settings.autohide_breath == true then hide_breath = true else hide_breath = false end + hb.init_hudbar(player, "breath", math.min(breath, breath_max), breath_max, hide_breath or hide) end end local function update_health(player) - hb.change_hudbar(player, "health", player:get_hp()) + local hp_max = player:get_properties().hp_max + hb.change_hudbar(player, "health", player:get_hp(), hp_max) end -- update built-in HUD bars @@ -463,13 +509,14 @@ local function update_hud(player) hb.unhide_hudbar(player, "health") end --air + local breath_max = player:get_properties().breath_max local breath = player:get_breath() - if breath == 11 and hb.settings.autohide_breath == true then + if breath >= breath_max and hb.settings.autohide_breath == true then hb.hide_hudbar(player, "breath") else hb.unhide_hudbar(player, "breath") - hb.change_hudbar(player, "breath", math.min(breath, 10)) + hb.change_hudbar(player, "breath", math.min(breath, breath_max), breath_max) end --health update_health(player) -- 2.11.4.GIT