2015-02-09 23:41:52 +01:00
hb = { }
2013-06-28 22:58:06 +02:00
2015-02-09 23:41:52 +01:00
hb.hudtables = { }
2015-02-04 14:52:48 +01:00
2015-02-04 17:26:43 +01:00
-- number of registered HUD bars
2015-02-09 23:41:52 +01:00
hb.hudbars_count = 0
2015-02-04 17:26:43 +01:00
2014-04-14 06:02:42 +02:00
-- default settings
2015-02-04 02:18:22 +01:00
HUD_BARLENGTH = 160
2014-05-13 18:59:08 +02:00
2015-02-12 03:00:58 +01:00
-- statbar positions
HUD_START_OFFSET_LEFT = { x = - 175 , y = - 70 }
HUD_START_OFFSET_RIGHT = { x = 15 , y = - 70 }
HUD_POS_LEFT = { x = 0.5 , y = 1 }
HUD_POS_RIGHT = { x = 0.5 , y = 1 }
2015-02-04 17:26:43 +01:00
2015-02-12 03:00:58 +01:00
HUD_VMARGIN = 24
2014-05-13 18:59:08 +02:00
HUD_TICK = 0.1
2014-10-03 08:12:55 +02:00
2015-02-09 23:41:52 +01:00
function hb . value_to_barlength ( value , max )
2015-02-04 21:45:27 +01:00
if max == 0 then
return 0
else
return math.ceil ( ( value / max ) * HUD_BARLENGTH )
end
2015-02-04 02:18:22 +01:00
end
2014-04-14 06:02:42 +02:00
2015-02-09 23:41:52 +01:00
function hb . get_hudtable ( identifier )
return hb.hudtables [ identifier ]
2015-02-09 22:45:08 +01:00
end
2015-02-11 20:55:22 +01:00
function hb . register_hudbar ( identifier , text_color , label , textures , default_start_value , default_start_max , start_hidden , format_string )
2015-02-04 14:52:48 +01:00
local hudtable = { }
2015-02-04 17:26:43 +01:00
local pos , offset
2015-02-09 23:41:52 +01:00
if hb.hudbars_count % 2 == 0 then
2015-02-12 03:00:58 +01:00
pos = HUD_POS_LEFT
2015-02-04 17:26:43 +01:00
offset = {
2015-02-12 03:00:58 +01:00
x = HUD_START_OFFSET_LEFT.x ,
y = HUD_START_OFFSET_LEFT.y - HUD_VMARGIN * math.floor ( hb.hudbars_count / 2 )
2015-02-04 17:26:43 +01:00
}
else
2015-02-12 03:00:58 +01:00
pos = HUD_POS_RIGHT
2015-02-04 17:26:43 +01:00
offset = {
2015-02-12 03:00:58 +01:00
x = HUD_START_OFFSET_RIGHT.x ,
y = HUD_START_OFFSET_RIGHT.y - HUD_VMARGIN * math.floor ( ( hb.hudbars_count - 1 ) / 2 )
2015-02-04 17:26:43 +01:00
}
end
2015-02-04 14:52:48 +01:00
if format_string == nil then
format_string = " %s: %d/%d "
end
hudtable.add_all = function ( player , start_value , start_max )
if start_value == nil then start_value = default_start_value end
if start_max == nil then start_max = default_start_max end
local ids = { }
2015-02-04 16:16:48 +01:00
local state = { }
2015-02-04 18:42:40 +01:00
local name = player : get_player_name ( )
2015-02-12 03:15:00 +01:00
local bgscale , iconscale , text , barnumber
if start_max == 0 or start_hidden then
2015-02-04 21:39:52 +01:00
bgscale = { x = 0 , y = 0 }
else
bgscale = { x = 1 , y = 1 }
end
2015-02-12 03:15:00 +01:00
if start_hidden then
iconscale = { x = 0 , y = 0 }
barnumber = 0
text = " "
else
iconscale = { x = 1 , y = 1 }
barnumber = hb.value_to_barlength ( start_value , start_max )
text = string.format ( format_string , label , start_value , start_max )
end
2015-02-04 14:52:48 +01:00
ids.bg = player : hud_add ( {
hud_elem_type = " image " ,
position = pos ,
2015-02-04 21:39:52 +01:00
scale = bgscale ,
2015-02-04 14:52:48 +01:00
text = " hudbars_bar_background.png " ,
alignment = { x = 1 , y = 1 } ,
offset = { x = offset.x - 1 , y = offset.y - 1 } ,
} )
2015-02-04 20:36:27 +01:00
if textures.icon ~= nil then
2015-02-04 14:52:48 +01:00
ids.icon = player : hud_add ( {
hud_elem_type = " image " ,
position = pos ,
2015-02-12 03:15:00 +01:00
scale = iconscale ,
2015-02-04 20:36:27 +01:00
text = textures.icon ,
2015-02-04 14:52:48 +01:00
alignment = { x =- 1 , y = 1 } ,
offset = { x = offset.x - 3 , y = offset.y } ,
} )
end
ids.bar = player : hud_add ( {
hud_elem_type = " statbar " ,
position = pos ,
2015-02-04 20:36:27 +01:00
text = textures.bar ,
2015-02-12 03:15:00 +01:00
number = barnumber ,
2015-02-04 14:52:48 +01:00
alignment = { x =- 1 , y =- 1 } ,
offset = offset ,
} )
ids.text = player : hud_add ( {
hud_elem_type = " text " ,
position = pos ,
2015-02-11 20:40:19 +01:00
text = text ,
2015-02-04 14:52:48 +01:00
alignment = { x = 1 , y = 1 } ,
number = text_color ,
direction = 0 ,
offset = { x = offset.x + 2 , y = offset.y } ,
} )
2015-02-12 04:26:39 +01:00
-- Do not forget to update hb.get_hudbar_state if you add new fields to the state table
2015-02-11 20:55:22 +01:00
state.hidden = start_hidden
2015-02-04 16:16:48 +01:00
state.value = start_value
state.max = start_max
2015-02-11 20:40:19 +01:00
state.text = text
state.barlength = hb.value_to_barlength ( start_value , start_max )
2015-02-04 18:14:44 +01:00
2015-02-12 05:04:02 +01:00
if start_max < start_value then
minetest.log ( " error " , " [hudbars] Bad initial values of HUD bar identifier “ " .. tostring ( identifier ) .. " ” for player " .. name .. " : start_max ( " .. start_max .. " ) is smaller than start_value ( " .. start_value .. " )! " )
end
if start_max < 0 then
minetest.log ( " error " , " [hudbars] Bad initial values of HUD bar identifier “ " .. tostring ( identifier ) .. " ” for player " .. name .. " : start_max ( " .. start_max .. " ) is smaller than 0! " )
end
if start_value < 0 then
minetest.log ( " error " , " [hudbars] Bad initial values of HUD bar identifier “ " .. tostring ( identifier ) .. " ” for player " .. name .. " : start_value ( " .. start_value .. " ) is smaller than 0! " )
end
2015-02-09 23:41:52 +01:00
hb.hudtables [ identifier ] . hudids [ name ] = ids
hb.hudtables [ identifier ] . hudstate [ name ] = state
2015-02-04 14:52:48 +01:00
end
hudtable.identifier = identifier
hudtable.format_string = format_string
hudtable.label = label
hudtable.hudids = { }
2015-02-04 16:16:48 +01:00
hudtable.hudstate = { }
2015-02-04 17:26:43 +01:00
2015-02-09 23:41:52 +01:00
hb.hudbars_count = hb.hudbars_count + 1
2015-02-04 14:52:48 +01:00
2015-02-09 23:41:52 +01:00
hb.hudtables [ identifier ] = hudtable
2015-02-04 14:52:48 +01:00
end
2015-02-09 23:41:52 +01:00
function hb . init_hudbar ( player , identifier , start_value , start_max )
hb.hudtables [ identifier ] . add_all ( player , start_value , start_max )
2015-02-09 22:51:35 +01:00
end
2015-02-09 23:41:52 +01:00
function hb . change_hudbar ( player , identifier , new_value , new_max_value )
2015-02-09 23:13:33 +01:00
if new_value == nil and new_max_value == nil then
return
end
2015-02-04 14:52:48 +01:00
local name = player : get_player_name ( )
2015-02-09 23:41:52 +01:00
local hudtable = hb.get_hudtable ( identifier )
2015-02-11 20:40:19 +01:00
local value_changed , max_changed = false , false
2015-02-09 23:13:33 +01:00
if new_value ~= nil then
2015-02-11 20:40:19 +01:00
if new_value ~= hudtable.hudstate [ name ] . value then
hudtable.hudstate [ name ] . value = new_value
value_changed = true
end
2015-02-09 23:13:33 +01:00
else
new_value = hudtable.hudstate [ name ] . value
end
if new_max_value ~= nil then
2015-02-11 20:40:19 +01:00
if new_max_value ~= hudtable.hudstate [ name ] . max then
hudtable.hudstate [ name ] . max = new_max_value
max_changed = true
end
2015-02-09 23:13:33 +01:00
else
new_max_value = hudtable.hudstate [ name ] . max
end
2015-02-12 05:04:02 +01:00
if new_max_value < new_value then
minetest.log ( " error " , " [hudbars] Bad call to hb.change_hudbar, identifier: “ " .. tostring ( identifier ) .. " ”, player name: “ " .. name .. " ”. new_max_value ( " .. new_max_value .. " ) is smaller than new_value ( " .. new_value .. " )! " )
end
if new_max_value < 0 then
minetest.log ( " error " , " [hudbars] Bad call to hb.change_hudbar, identifier: “ " .. tostring ( identifier ) .. " ”, player name: “ " .. name .. " ”. new_max_value ( " .. new_max_value .. " ) is smaller than 0! " )
end
if new_value < 0 then
minetest.log ( " error " , " [hudbars] Bad call to hb.change_hudbar, identifier: “ " .. tostring ( identifier ) .. " ”, player name: “ " .. name .. " ”. new_value ( " .. new_value .. " ) is smaller than 0! " )
end
2015-02-04 16:16:48 +01:00
if hudtable.hudstate [ name ] . hidden == false then
2015-02-11 20:40:19 +01:00
if max_changed then
if hudtable.hudstate [ name ] . max == 0 then
player : hud_change ( hudtable.hudids [ name ] . bg , " scale " , { x = 0 , y = 0 } )
else
player : hud_change ( hudtable.hudids [ name ] . bg , " scale " , { x = 1 , y = 1 } )
end
end
if value_changed or max_changed then
local new_barlength = hb.value_to_barlength ( new_value , new_max_value )
if new_barlength ~= hudtable.hudstate [ name ] . barlength then
player : hud_change ( hudtable.hudids [ name ] . bar , " number " , hb.value_to_barlength ( new_value , new_max_value ) )
hudtable.hudstate [ name ] . barlength = new_barlength
end
local new_text = string.format ( hudtable.format_string , 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
end
2015-02-04 21:28:20 +01:00
end
2015-02-04 16:16:48 +01:00
end
end
2015-02-09 23:41:52 +01:00
function hb . hide_hudbar ( player , identifier )
2015-02-04 16:16:48 +01:00
local name = player : get_player_name ( )
2015-02-09 23:41:52 +01:00
local hudtable = hb.get_hudtable ( identifier )
2015-02-04 16:16:48 +01:00
if ( hudtable.hudstate [ name ] . hidden == false ) then
2015-02-12 03:18:58 +01:00
if hudtable.hudids [ name ] . icon ~= nil then
player : hud_change ( hudtable.hudids [ name ] . icon , " scale " , { x = 0 , y = 0 } )
end
2015-02-04 16:16:48 +01:00
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 " , " " )
hudtable.hudstate [ name ] . hidden = true
end
2015-02-04 14:52:48 +01:00
end
2015-02-09 23:41:52 +01:00
function hb . unhide_hudbar ( player , identifier )
2015-02-04 16:16:48 +01:00
local name = player : get_player_name ( )
2015-02-09 23:41:52 +01:00
local hudtable = hb.get_hudtable ( identifier )
2015-02-04 16:16:48 +01:00
if ( hudtable.hudstate [ name ] . hidden ) then
local name = player : get_player_name ( )
local value = hudtable.hudstate [ name ] . value
local max = hudtable.hudstate [ name ] . max
2015-02-12 03:18:58 +01:00
if hudtable.hudids [ name ] . icon ~= nil then
player : hud_change ( hudtable.hudids [ name ] . icon , " scale " , { x = 1 , y = 1 } )
end
2015-02-04 21:39:52 +01:00
if hudtable.hudstate [ name ] . max ~= 0 then
2015-02-04 21:28:20 +01:00
player : hud_change ( hudtable.hudids [ name ] . bg , " scale " , { x = 1 , y = 1 } )
end
2015-02-09 23:41:52 +01:00
player : hud_change ( hudtable.hudids [ name ] . bar , " number " , hb.value_to_barlength ( value , max ) )
2015-02-04 16:16:48 +01:00
player : hud_change ( hudtable.hudids [ name ] . text , " text " , tostring ( string.format ( hudtable.format_string , hudtable.label , value , max ) ) )
hudtable.hudstate [ name ] . hidden = false
end
end
2015-02-04 14:52:48 +01:00
2015-02-12 04:26:39 +01:00
function hb . get_hudbar_state ( player , identifier )
local ref = hb.get_hudtable ( identifier ) . hudstate [ player : get_player_name ( ) ]
-- Do not forget to update this chunk of code in case the state changes
local copy = {
hidden = ref.hidden ,
value = ref.value ,
max = ref.max ,
text = ref.text ,
barlength = ref.barlength ,
}
return copy
end
2015-02-12 03:00:58 +01:00
--register built-in HUD bars
2015-02-12 04:39:15 +01:00
if minetest.setting_getbool ( " enable_damage " ) then
hb.register_hudbar ( " health " , 0xFFFFFF , " Health " , { bar = " hudbars_bar_health.png " , icon = " hudbars_icon_health.png " } , 20 , 20 , false )
hb.register_hudbar ( " breath " , 0xFFFFFF , " Breath " , { bar = " hudbars_bar_breath.png " , icon = " hudbars_icon_breath.png " } , 10 , 10 , true )
end
2015-02-04 14:52:48 +01:00
2014-04-14 06:02:42 +02:00
--load custom settings
2015-02-09 23:42:56 +01:00
local set = io.open ( minetest.get_modpath ( " hudbars " ) .. " /hudbars.conf " , " r " )
2013-07-20 22:07:24 +02:00
if set then
2015-02-09 23:42:56 +01:00
dofile ( minetest.get_modpath ( " hudbars " ) .. " /hudbars.conf " )
2013-07-20 22:07:24 +02:00
set : close ( )
end
2013-06-28 22:58:06 +02:00
local function hide_builtin ( player )
2015-02-12 04:40:30 +01:00
player : hud_set_flags ( { healthbar = false , breathbar = false } )
2013-06-28 22:58:06 +02:00
end
2013-06-28 23:03:54 +02:00
2014-04-14 06:02:42 +02:00
local function custom_hud ( player )
2015-02-12 03:00:58 +01:00
if minetest.setting_getbool ( " enable_damage " ) then
hb.init_hudbar ( player , " health " , player : get_hp ( ) )
2015-02-12 05:07:00 +01:00
hb.init_hudbar ( player , " breath " , math.min ( player : get_breath ( ) , 10 ) )
2015-02-04 04:53:29 +01:00
end
2013-06-28 22:58:06 +02:00
end
2013-09-13 20:18:16 +02:00
2015-02-12 03:00:58 +01:00
-- update built-in HUD bars
2013-06-28 22:58:06 +02:00
local function update_hud ( player )
2015-02-12 04:39:15 +01:00
if minetest.setting_getbool ( " enable_damage " ) then
--air
local air = player : get_breath ( )
if air == 11 then
hb.hide_hudbar ( player , " breath " )
else
hb.unhide_hudbar ( player , " breath " )
hb.change_hudbar ( player , " breath " , air )
end
--health
hb.change_hudbar ( player , " health " , player : get_hp ( ) )
2014-04-06 16:33:38 +02:00
end
2013-06-28 22:58:06 +02:00
end
minetest.register_on_joinplayer ( function ( player )
minetest.after ( 0.5 , function ( )
hide_builtin ( player )
2014-04-14 06:02:42 +02:00
custom_hud ( player )
2013-06-28 22:58:06 +02:00
end )
end )
2014-04-14 06:51:28 +02:00
local main_timer = 0
2013-06-28 22:58:06 +02:00
local timer = 0
local timer2 = 0
minetest.after ( 2.5 , function ( )
minetest.register_globalstep ( function ( dtime )
2014-04-14 06:51:28 +02:00
main_timer = main_timer + dtime
2013-07-20 22:07:24 +02:00
timer = timer + dtime
timer2 = timer2 + dtime
2015-02-04 01:24:27 +01:00
if main_timer > HUD_TICK or timer > 4 then
2014-04-14 11:16:58 +02:00
if main_timer > HUD_TICK then main_timer = 0 end
2014-04-14 06:51:28 +02:00
for _ , player in ipairs ( minetest.get_connected_players ( ) ) do
2014-04-06 16:33:38 +02:00
-- only proceed if damage is enabled
2013-07-27 12:09:14 +02:00
if minetest.setting_getbool ( " enable_damage " ) then
2014-04-06 16:33:38 +02:00
-- update all hud elements
2013-07-27 12:09:14 +02:00
update_hud ( player )
2013-06-28 22:58:06 +02:00
end
2014-04-14 06:51:28 +02:00
end
2014-04-06 16:33:38 +02:00
2014-04-14 06:51:28 +02:00
end
2014-04-06 16:33:38 +02:00
if timer > 4 then timer = 0 end
2013-06-28 22:58:06 +02:00
end )
end )