1
0
mirror of https://github.com/sys4-fr/server-nalc.git synced 2024-12-25 18:20:36 +01:00

update hudbars, remove old duplicated code/textures (now in mff_hud)

This commit is contained in:
crabman77 2016-08-22 16:10:28 +02:00
parent ca2357e423
commit ae09d2076e
18 changed files with 434 additions and 174 deletions

View File

@ -131,6 +131,11 @@ chunksize = 3
mesecon.blinky_plant_interval = 7 mesecon.blinky_plant_interval = 7
# Set default mana regeneration to 3 # Set default mana regeneration to 3
mana_default_regen = 3 mana_default_regen = 3
# HUDBARS
hudbars_sorting = health=0, mana=1, satiation=2, sprint=3, breath=4, armor=5
hudbars_tick = 0.4
hudbars_start_offset_left_y = -100
hudbars_start_offset_right_y = -100
### IRC CHAT ### ### IRC CHAT ###
################ ################

View File

@ -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 ## 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. and unhidden on a per-player basis.
Note this does not yet display the HUD bar. 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 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. 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 #### Parameters
@ -99,22 +100,39 @@ Always `nil`.
## Modifying a HUD bar ## 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. You use the function `hb.change_hudbar` for this.
### `hb.change_hudbar(player, identifier, new_value, new_max_value)` ### `hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon, new_bgicon, new_bar, new_label, new_text_color)`
Changes the values of an initialized HUD bar for a certain player. `new_value` and `new_max_value` Changes the values and the appearance of an initialized HUD bar for a certain player. `new_value`
can be `nil`; if one of them is `nil`, that means the value is unchanged. If both values and `new_max_value` are the most important parameters as they specify the new current and maximum new values, you do not need
are `nil`, this function is a no-op. to worry too much about the other parameters.
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 The following parameters are less important and provided for styling the HUD bar after registration (if
actual length of the bar or the displayed string changed, so you do not have to worry about it. 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 #### Parameters
* `player`: `ObjectRef` of the player to which the HUD bar belongs to * `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`. * `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_value`: The new current value of the HUD bar
* `new_max_value`: The new maximum 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 #### Return value
Always `nil`. Always `nil`.

View File

@ -64,3 +64,20 @@ as of version 2.0.0 of the standard <http://semver.org/>.
1.2.1 1.2.1
----- -----
- Fix crash when enable_damage is changed in mid-game - 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

View File

@ -1,2 +1,2 @@
default default
mff_hud? intllib?

View File

@ -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.

View File

@ -1,9 +0,0 @@
-- Miscellaneous legacies from our old mod, HUD by BlockMen
--
minetest.register_on_joinplayer(function(player)
player:hud_set_flags({crosshair = true, hotbar = true, healthbar = false, wielditem = true, breathbar = false})
player:hud_set_hotbar_image("hudbars_hotbar.png")
player:hud_set_hotbar_selected_image("hudbars_hotbar_selected.png")
end)

View File

@ -1,24 +0,0 @@
-- HUD bars example config file
-------------------------------
-- Currently you can customize the starting position of the first bottom two HUD bars
-- and the vertical margin. That's all.
-- Remove the two dashes to activate a setting. Lua syntax is used.
-- The examples are all equal to the mod defaults
-------------------------------------------------------------------------------------------------------
-- Vertical space between two HUD bars
-- hb.settings.vmargin = 24
-- Pos of the first HUD bar the the left (“pos”, as in hud definition of hud_add of Minetest Lua API)
-- hb.settings.pos_left = { x=0.5, y=1 }
-- Pos of the first HUD bar the the right
-- hb.settings.pos_right= { x = 0.5, y = 1 }
-- Offset of the first HUD bar to the left (“offset”, as in HUD definition)
-- hb.settings.start_offset_left = { x = -175, y = -70 }
-- Offset of the first HUD bar to the right
-- hb.settings_start_offset_right = { x = 15, y = -70 }

333
mods/hudbars/init.lua Executable file → Normal file
View File

@ -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 = {}
hb.hudtables = {} hb.hudtables = {}
@ -5,19 +13,83 @@ hb.hudtables = {}
-- number of registered HUD bars -- number of registered HUD bars
hb.hudbars_count = 0 hb.hudbars_count = 0
-- table which records which HUD bar slots have been “registered” so far; used for automatic positioning
hb.registered_slots = {}
hb.settings = {} hb.settings = {}
hb.settings.custom = {} --MFF (crabman|19/06/15) add custom pos
-- default settings function hb.load_setting(sname, stype, defaultval, valid_values)
local sval
if stype == "string" then
sval = minetest.setting_get(sname)
elseif stype == "bool" then
sval = minetest.setting_getbool(sname)
elseif stype == "number" then
sval = tonumber(minetest.setting_get(sname))
end
if sval ~= nil then
if valid_values ~= nil then
local valid = false
for i=1,#valid_values do
if sval == valid_values[i] then
valid = true
end
end
if not valid then
minetest.log("error", "[hudbars] Invalid value for "..sname.."! Using default value ("..tostring(defaultval)..").")
return defaultval
else
return sval
end
else
return sval
end
else
return defaultval
end
end
-- (hardcoded) default settings
hb.settings.max_bar_length = 160 hb.settings.max_bar_length = 160
hb.settings.statbar_length = 20
-- statbar positions -- statbar positions
hb.settings.pos_left = { x=0.5, y=1 } hb.settings.pos_left = {}
hb.settings.pos_right= { x = 0.5, y = 1 } hb.settings.pos_right = {}
hb.settings.start_offset_left = { x = -175, y = -100 } hb.settings.start_offset_left = {}
hb.settings.start_offset_right = { x = 15, y = -100 } hb.settings.start_offset_right= {}
hb.settings.pos_left.x = hb.load_setting("hudbars_pos_left_x", "number", 0.5)
hb.settings.pos_left.y = hb.load_setting("hudbars_pos_left_y", "number", 1)
hb.settings.pos_right.x = hb.load_setting("hudbars_pos_right_x", "number", 0.5)
hb.settings.pos_right.y = hb.load_setting("hudbars_pos_right_y", "number", 1)
hb.settings.start_offset_left.x = hb.load_setting("hudbars_start_offset_left_x", "number", -175)
hb.settings.start_offset_left.y = hb.load_setting("hudbars_start_offset_left_y", "number", -86)
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 = 24 hb.settings.vmargin = hb.load_setting("hudbars_vmargin", "number", 24)
hb.settings.tick = 0.5 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)
-- 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"})
hb.settings.autohide_breath = hb.load_setting("hudbars_autohide_breath", "bool", true)
local sorting = minetest.setting_get("hudbars_sorting")
if sorting ~= nil then
hb.settings.sorting = {}
hb.settings.sorting_reverse = {}
for k,v in string.gmatch(sorting, "(%w+)=(%w+)") do
hb.settings.sorting[k] = tonumber(v)
hb.settings.sorting_reverse[tonumber(v)] = k
end
else
hb.settings.sorting = { ["health"] = 0, ["breath"] = 1 }
hb.settings.sorting_reverse = { [0] = "health", [1] = "breath" }
end
-- Table which contains all players with active default HUD bars (only for internal use) -- Table which contains all players with active default HUD bars (only for internal use)
--hb.players = {} --hb.players = {}
@ -26,7 +98,17 @@ function hb.value_to_barlength(value, max)
if max == 0 then if max == 0 then
return 0 return 0
else else
return math.ceil((value/max) * hb.settings.max_bar_length) if hb.settings.bar_type == "progress_bar" then
local x
if value < 0 then x=-0.5 else x = 0.5 end
local ret = math.modf((value/max) * hb.settings.max_bar_length + x)
return ret
else
local x
if value < 0 then x=-0.5 else x = 0.5 end
local ret = math.modf((value/max) * hb.settings.statbar_length + x)
return ret
end
end end
end end
@ -34,76 +116,55 @@ function hb.get_hudtable(identifier)
return hb.hudtables[identifier] return hb.hudtables[identifier]
end end
-- Local functions function hb.get_hudbar_position_index(identifier)
if hb.settings.sorting[identifier] ~= nil then
-- update built-in HUD bars return hb.settings.sorting[identifier]
local function update_hud(player) else
if minetest.setting_getbool("enable_damage") then local i = 0
--air while true do
local breath = player:get_breath() if hb.registered_slots[i] ~= true and hb.settings.sorting_reverse[i] == nil then
return i
if breath == 11 then
hb.hide_hudbar(player, "breath")
elseif breath then
hb.unhide_hudbar(player, "breath")
hb.change_hudbar(player, "breath", math.min(breath, 10))
end end
i = i + 1
--health
hb.change_hudbar(player, "health", player:get_hp())
end end
end end
local function hb_step()
--for playername, player in pairs(hb.players) do --MFF (6/03/2016) removed cause server register(bug/lag?) table hb.players[""]
for _,player in ipairs(minetest.get_connected_players()) do
-- only proceed if damage is enabled
if minetest.setting_getbool("enable_damage") then
-- update all hud elements
update_hud(player)
end end
end
minetest.after(hb.settings.tick, hb_step)
--minetest.chat_send_all("test")
end
-- end local functions
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)
minetest.log("action", "hb.register_hudbar: "..tostring(identifier))
local hudtable = {} local hudtable = {}
local pos, offset local pos, offset
local index = math.floor(hb.get_hudbar_position_index(identifier))
--MFF (crabman|19/06/15)|DEBUT add custom pos hb.registered_slots[index] = true
if hb.settings.custom.custom and hb.settings.custom[identifier] ~= nil then if hb.settings.alignment_pattern == "stack_up" then
if hb.settings.custom[identifier].x == 0 then
pos = hb.settings.pos_left pos = hb.settings.pos_left
offset = { offset = {
x = hb.settings.start_offset_left.x, x = hb.settings.start_offset_left.x,
y = hb.settings.start_offset_left.y - hb.settings.vmargin * math.floor(hb.settings.custom[identifier].y) y = hb.settings.start_offset_left.y - hb.settings.vmargin * index
}
elseif hb.settings.alignment_pattern == "stack_down" then
pos = hb.settings.pos_left
offset = {
x = hb.settings.start_offset_left.x,
y = hb.settings.start_offset_left.y + hb.settings.vmargin * index
}
else
if index % 2 == 0 then
pos = hb.settings.pos_left
offset = {
x = hb.settings.start_offset_left.x,
y = hb.settings.start_offset_left.y - hb.settings.vmargin * (index/2)
} }
else else
pos = hb.settings.pos_right pos = hb.settings.pos_right
offset = { offset = {
x = hb.settings.start_offset_right.x, x = hb.settings.start_offset_right.x,
y = hb.settings.start_offset_right.y - hb.settings.vmargin * math.floor(hb.settings.custom[identifier].y) y = hb.settings.start_offset_right.y - hb.settings.vmargin * ((index-1)/2)
} }
end end
--MFF (crabman|19/06/15) /FIN
elseif hb.hudbars_count % 2 == 0 then
pos = hb.settings.pos_left
offset = {
x = hb.settings.start_offset_left.x,
y = hb.settings.start_offset_left.y - hb.settings.vmargin * math.floor(hb.hudbars_count/2)
}
else
pos = hb.settings.pos_right
offset = {
x = hb.settings.start_offset_right.x,
y = hb.settings.start_offset_right.y - hb.settings.vmargin * math.floor((hb.hudbars_count-1)/2)
}
end end
if format_string == nil then if format_string == nil then
format_string = "%s: %d/%d" format_string = S("%s: %d/%d")
end end
hudtable.add_all = function(player, hudtable, start_value, start_max, start_hidden) hudtable.add_all = function(player, hudtable, start_value, start_max, start_hidden)
@ -113,7 +174,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta
local ids = {} local ids = {}
local state = {} local state = {}
local name = player:get_player_name() 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 if start_max == 0 or start_hidden then
bgscale = { x=0, y=0 } bgscale = { x=0, y=0 }
else else
@ -122,12 +183,15 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta
if start_hidden then if start_hidden then
iconscale = { x=0, y=0 } iconscale = { x=0, y=0 }
barnumber = 0 barnumber = 0
bgiconnumber = 0
text = "" text = ""
else else
iconscale = { x=1, y=1 } iconscale = { x=1, y=1 }
barnumber = hb.value_to_barlength(start_value, start_max) 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 = string.format(format_string, label, start_value, start_max)
end end
if hb.settings.bar_type == "progress_bar" then
ids.bg = player:hud_add({ ids.bg = player:hud_add({
hud_elem_type = "image", hud_elem_type = "image",
position = pos, position = pos,
@ -146,15 +210,34 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta
offset = { x = offset.x - 3, y = offset.y }, offset = { x = offset.x - 3, y = offset.y },
}) })
end 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 },
})
end
end
local bar_image
if hb.settings.bar_type == "progress_bar" then
bar_image = textures.bar
elseif hb.settings.bar_type == "statbar_classic" or hb.settings.bar_type == "statbar_modern" then
bar_image = textures.icon
end
ids.bar = player:hud_add({ ids.bar = player:hud_add({
hud_elem_type = "statbar", hud_elem_type = "statbar",
position = pos, position = pos,
text = textures.bar, text = bar_image,
number = barnumber, number = barnumber,
alignment = {x=-1,y=-1}, alignment = {x=-1,y=-1},
offset = offset, offset = offset,
size = "", size = "",
}) })
if hb.settings.bar_type == "progress_bar" then
ids.text = player:hud_add({ ids.text = player:hud_add({
hud_elem_type = "text", hud_elem_type = "text",
position = pos, position = pos,
@ -162,8 +245,9 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta
alignment = {x=1,y=1}, alignment = {x=1,y=1},
number = text_color, number = text_color,
direction = 0, 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 -- Do not forget to update hb.get_hudbar_state if you add new fields to the state table
state.hidden = start_hidden state.hidden = start_hidden
state.value = start_value state.value = start_value
@ -207,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) hb.hudtables[identifier].add_all(player, hudtable, start_value, start_max, start_hidden)
end 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 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 return
end end
@ -233,8 +317,35 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value)
hudtable.hudstate[name].value = new_value hudtable.hudstate[name].value = new_value
value_changed = true value_changed = true
end end
elseif hudtable.hudstate[name] then else
new_value = hudtable.hudstate[name].value 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 end
local main_error_text = local main_error_text =
@ -249,8 +360,8 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value)
minetest.log("error", main_error_text.."new_value ("..new_value..") is smaller than 0!") minetest.log("error", main_error_text.."new_value ("..new_value..") is smaller than 0!")
end end
if hudtable.hudstate[name] and hudtable.hudstate[name].hidden == false then if hudtable.hudstate[name].hidden == false then
if max_changed then if max_changed and hb.settings.bar_type == "progress_bar" then
if hudtable.hudstate[name].max == 0 then if hudtable.hudstate[name].max == 0 then
player:hud_change(hudtable.hudids[name].bg, "scale", {x=0,y=0}) player:hud_change(hudtable.hudids[name].bg, "scale", {x=0,y=0})
else else
@ -265,6 +376,7 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value)
hudtable.hudstate[name].barlength = new_barlength hudtable.hudstate[name].barlength = new_barlength
end 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 = string.format(hudtable.format_string, hudtable.label, new_value, new_max_value)
if new_text ~= hudtable.hudstate[name].text then if new_text ~= hudtable.hudstate[name].text then
player:hud_change(hudtable.hudids[name].text, "text", new_text) player:hud_change(hudtable.hudids[name].text, "text", new_text)
@ -273,17 +385,22 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value)
end end
end end
end end
end
function hb.hide_hudbar(player, identifier) function hb.hide_hudbar(player, identifier)
local name = player:get_player_name() local name = player:get_player_name()
local hudtable = hb.get_hudtable(identifier) local hudtable = hb.get_hudtable(identifier)
if(hudtable.hudstate[name].hidden == false) then if(hudtable.hudstate[name].hidden == false) then
if hb.settings.bar_type == "progress_bar" then
if hudtable.hudids[name].icon ~= nil then if hudtable.hudids[name].icon ~= nil then
player:hud_change(hudtable.hudids[name].icon, "scale", {x=0,y=0}) player:hud_change(hudtable.hudids[name].icon, "scale", {x=0,y=0})
end end
player:hud_change(hudtable.hudids[name].bg, "scale", {x=0,y=0}) player:hud_change(hudtable.hudids[name].bg, "scale", {x=0,y=0})
player:hud_change(hudtable.hudids[name].bar, "number", 0)
player:hud_change(hudtable.hudids[name].text, "text", "") 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 hudtable.hudstate[name].hidden = true
end end
end end
@ -291,18 +408,22 @@ end
function hb.unhide_hudbar(player, identifier) function hb.unhide_hudbar(player, identifier)
local name = player:get_player_name() local name = player:get_player_name()
local hudtable = hb.get_hudtable(identifier) local hudtable = hb.get_hudtable(identifier)
if(hudtable.hudstate[name] and hudtable.hudstate[name].hidden) then if(hudtable.hudstate[name].hidden) then
local name = player:get_player_name() local name = player:get_player_name()
local value = hudtable.hudstate[name].value local value = hudtable.hudstate[name].value
local max = hudtable.hudstate[name].max local max = hudtable.hudstate[name].max
if hb.settings.bar_type == "progress_bar" then
if hudtable.hudids[name].icon ~= nil then if hudtable.hudids[name].icon ~= nil then
player:hud_change(hudtable.hudids[name].icon, "scale", {x=1,y=1}) player:hud_change(hudtable.hudids[name].icon, "scale", {x=1,y=1})
end end
if hudtable.hudstate[name].max ~= 0 then if hudtable.hudstate[name].max ~= 0 then
player:hud_change(hudtable.hudids[name].bg, "scale", {x=1,y=1}) player:hud_change(hudtable.hudids[name].bg, "scale", {x=1,y=1})
end end
player:hud_change(hudtable.hudids[name].bar, "number", hb.value_to_barlength(value, max))
player:hud_change(hudtable.hudids[name].text, "text", tostring(string.format(hudtable.format_string, hudtable.label, value, max))) 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 hudtable.hudstate[name].hidden = false
end end
end end
@ -320,17 +441,10 @@ function hb.get_hudbar_state(player, identifier)
return copy return copy
end end
--load custom settings
local set = io.open(minetest.get_modpath("hudbars").."/hudbars.conf", "r")
if set then
dofile(minetest.get_modpath("hudbars").."/hudbars.conf")
set:close()
end
--register built-in HUD bars --register built-in HUD bars
if minetest.setting_getbool("enable_damage") then 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" }, 20, 20, false) 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, "Breath", { bar = "hudbars_bar_breath.png", icon = "hudbars_icon_breath.png" }, 10, 10, true) 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 end
local function hide_builtin(player) local function hide_builtin(player)
@ -342,31 +456,62 @@ end
local function custom_hud(player) local function custom_hud(player)
if minetest.setting_getbool("enable_damage") or hb.settings.forceload_default_hudbars then
local hide
if minetest.setting_getbool("enable_damage") then if minetest.setting_getbool("enable_damage") then
hb.init_hudbar(player, "health", player:get_hp()) hide = false
else
hide = true
end
hb.init_hudbar(player, "health", player:get_hp(), nil, hide)
local breath = player:get_breath() local breath = player:get_breath()
local hide_breath local hide_breath
if breath == 11 then hide_breath = true else hide_breath = false end 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) hb.init_hudbar(player, "breath", math.min(breath, 10), nil, hide_breath or hide)
end end
end end
-- update built-in HUD bars
local function update_hud(player)
if minetest.setting_getbool("enable_damage") then
if hb.settings.forceload_default_hudbars then
hb.unhide_hudbar(player, "health")
end
--air
local breath = player:get_breath()
if breath == 11 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))
end
--health
hb.change_hudbar(player, "health", player:get_hp())
elseif hb.settings.forceload_default_hudbars then
hb.hide_hudbar(player, "health")
hb.hide_hudbar(player, "breath")
end
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
minetest.after(hb.settings.tick, hb_step)
end
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
local name = player:get_player_name() local name = player:get_player_name()
if not name or name == "" then return end if not name or name == "" then return end
hide_builtin(player) hide_builtin(player)
custom_hud(player) custom_hud(player)
-- hb.players[name] = player
end) end)
minetest.after(0, hb_step) minetest.after(0, hb_step)
--[[
minetest.register_on_leaveplayer(function(player)
hb.players[player:get_player_name()] = nil
end)
--]]
-- Our legacy
dofile(minetest.get_modpath("hudbars").."/hud_legacy.lua")

View File

@ -0,0 +1,3 @@
Health = Leben
Breath = Atem
%s: %d/%d = %s: %d/%d

View File

@ -0,0 +1,5 @@
Health
Breath
# Default format string for progress bar-style HUD bars, e.g. “Health 5/20”
%s: %d/%d

1
mods/hudbars/mod.conf Normal file
View File

@ -0,0 +1 @@
name = hudbars

BIN
mods/hudbars/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 539 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 B