1 local minetest,vector,hud_manager = minetest,vector,hud_manager
3 local mod_storage = minetest.get_mod_storage()
7 local update_breath_bar = function(player,breath)
9 if hud_manager.hud_exists(player,"breath_bg") then
10 hud_manager.remove_hud(player,"breath_bg")
12 if hud_manager.hud_exists(player,"breath") then
13 hud_manager.remove_hud(player,"breath")
16 if not hud_manager.hud_exists(player,"breath_bg") then
17 hud_manager.add_hud(player,"breath_bg",{
18 hud_elem_type = "statbar",
19 position = {x = 0.5, y = 1},
20 text = "bubble_bg.png",
23 size = {x = 24, y = 24},
24 offset = {x = 24*10, y= -(48 + 52 + 39)},
27 if not hud_manager.hud_exists(player,"breath") then
28 hud_manager.add_hud(player,"breath",{
29 hud_elem_type = "statbar",
30 position = {x = 0.5, y = 1},
34 size = {x = 24, y = 24},
35 offset = {x = 24*10, y= -(48 + 52 + 39)},
39 hud_manager.change_hud({
48 -- loads data from mod storage
51 local load_data = function(player)
52 name = player:get_player_name()
54 temp_pool = pool[name]
55 if mod_storage:get_int(name.."d_save") > 0 then
56 temp_pool.breath = mod_storage:get_float(name.."breath" )
57 temp_pool.ticker = mod_storage:get_float(name.."breath_ticker")
58 temp_pool.drowning = mod_storage:get_float(name.."drowning" )
62 temp_pool.drowning = 0
66 -- saves data to be utilized on next login
68 local save_data = function(name)
69 if type(name) ~= "string" and name:is_player() then
70 name = name:get_player_name()
72 temp_pool = pool[name]
74 mod_storage:set_float(name.."breath", temp_pool.breath)
75 mod_storage:set_float(name.."breath_ticker", temp_pool.ticker)
76 mod_storage:set_float(name.."drowning", temp_pool.drowning)
77 mod_storage:set_int(name.."d_save", 1)
82 -- is used for shutdowns to save all data
83 local save_all = function()
84 for name,_ in pairs(pool) do
90 -- remove stock health bar
91 minetest.hud_replace_builtin("breath",{
92 hud_elem_type = "statbar",
93 position = {x = 0, y = 0},
97 size = {x = 0, y = 0},
98 offset = {x = 0, y= 0},
101 minetest.register_on_joinplayer(function(player)
103 player:hud_set_flags({breathbar=false})
106 -- saves specific users data for when they relog
107 minetest.register_on_leaveplayer(function(player)
111 -- save all data to mod storage on shutdown
112 minetest.register_on_shutdown(function()
117 is_player_drowning = function(player)
118 name = player:get_player_name()
119 return(pool[name].drowning)
122 -- reset the player's data
125 minetest.register_on_respawnplayer(function(player)
126 name = player:get_player_name()
127 temp_pool = pool[name]
128 temp_pool.breath = 21
130 temp_pool.drowning = 0
131 update_breath_bar(player,temp_pool.breath)
134 --handle the breath bar
139 local handle_breath = function(player,dtime)
140 name = player:get_player_name()
141 head = get_player_head_env(player)
142 temp_pool = pool[name]
147 if minetest.get_item_group(head, "drowning") > 0 then
149 temp_pool.ticker = temp_pool.ticker + dtime
151 if temp_pool.breath > 0 and temp_pool.ticker >= 1.3 then
153 if temp_pool.breath == 21 then
154 temp_pool.breath = 20
156 temp_pool.breath = temp_pool.breath - 2
158 temp_pool.drowning = 0
160 update_breath_bar(player,temp_pool.breath)
161 elseif temp_pool.breath <= 0 and temp_pool.ticker >= 1.3 then
163 temp_pool.drowning = 1
166 player:set_hp( hp - 2 )
170 if temp_pool.ticker >= 1.3 then
176 temp_pool.ticker = temp_pool.ticker + dtime
178 if temp_pool.breath < 21 and temp_pool.ticker >= 0.25 then
180 temp_pool.breath = temp_pool.breath + 2
182 temp_pool.drowning = 0
186 update_breath_bar(player,temp_pool.breath)
191 -- inject into main loop
192 minetest.register_globalstep(function(dtime)
193 for _,player in ipairs(minetest.get_connected_players()) do
194 handle_breath(player,dtime)