]> git.lizzy.rs Git - Crafter.git/blob - mods/drowning/init.lua
remove server debug
[Crafter.git] / mods / drowning / init.lua
1 local minetest,vector,hud_manager = minetest,vector,hud_manager
2
3 local mod_storage = minetest.get_mod_storage()
4 local pool = {}
5
6 -- updates bubble bar
7 local update_breath_bar = function(player,breath)
8         if breath > 20 then
9                 if hud_manager.hud_exists(player,"breath_bg") then
10                         hud_manager.remove_hud(player,"breath_bg")
11                 end
12                 if hud_manager.hud_exists(player,"breath") then
13                         hud_manager.remove_hud(player,"breath")
14                 end
15         else
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",
21                                 number = 20,
22                                 direction = 1,
23                                 size = {x = 24, y = 24},
24                                 offset = {x = 24*10, y= -(48 + 52 + 39)},
25                         })
26                 end
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},
31                                 text = "bubble.png",
32                                 number = breath,
33                                 direction = 1,
34                                 size = {x = 24, y = 24},
35                                 offset = {x = 24*10, y= -(48 + 52 + 39)},
36                         })
37                 end
38
39                 hud_manager.change_hud({
40                         player    =  player ,
41                         hud_name  = "breath",
42                         element   = "number",
43                         data      =  breath
44                 })
45         end
46 end
47
48 -- loads data from mod storage
49 local name
50 local temp_pool
51 local load_data = function(player)
52         name = player:get_player_name()
53         pool[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"     )
59         else
60                 temp_pool.breath        = 21
61                 temp_pool.ticker = 0 
62                 temp_pool.drowning      = 0 
63         end
64 end
65
66 -- saves data to be utilized on next login
67 local temp_pool
68 local save_data = function(name)
69         if type(name) ~= "string" and name:is_player() then
70                 name = name:get_player_name()
71         end
72         temp_pool = pool[name]
73
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)
78
79         pool[name] = nil
80 end
81
82 -- is used for shutdowns to save all data
83 local save_all = function()
84         for name,_ in pairs(pool) do
85                 save_data(name)
86         end
87 end
88
89
90 -- remove stock health bar
91 minetest.hud_replace_builtin("breath",{
92         hud_elem_type = "statbar",
93         position = {x = 0, y = 0},
94         text = "nothing.png",
95         number = 0,
96         direction = 0,
97         size = {x = 0, y = 0},
98         offset = {x = 0, y= 0},
99 })
100
101 minetest.register_on_joinplayer(function(player)
102         load_data(player)
103         player:hud_set_flags({breathbar=false})
104 end)
105
106 -- saves specific users data for when they relog
107 minetest.register_on_leaveplayer(function(player)
108         save_data(player)
109 end)
110
111 -- save all data to mod storage on shutdown
112 minetest.register_on_shutdown(function()
113         save_all()
114 end)
115
116 local name
117 is_player_drowning = function(player)
118         name = player:get_player_name()
119         return(pool[name].drowning)
120 end
121
122 -- reset the player's data
123 local name
124 local temp_pool
125 minetest.register_on_respawnplayer(function(player)
126         name = player:get_player_name()
127         temp_pool = pool[name]
128         temp_pool.breath   = 21
129         temp_pool.ticker   = 0
130         temp_pool.drowning = 0
131         update_breath_bar(player,temp_pool.breath)
132 end)
133
134 --handle the breath bar
135 local name
136 local temp_pool
137 local head
138 local hp
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]
143         hp = player:get_hp()
144         if hp <= 0 then
145                 return
146         end
147         if minetest.get_item_group(head, "drowning") > 0 then
148
149                 temp_pool.ticker = temp_pool.ticker + dtime
150                 
151                 if temp_pool.breath > 0 and temp_pool.ticker >= 1.3 then
152
153                         if temp_pool.breath == 21 then
154                                 temp_pool.breath = 20
155                         end     
156                         temp_pool.breath = temp_pool.breath - 2
157
158                         temp_pool.drowning = 0
159
160                         update_breath_bar(player,temp_pool.breath)
161                 elseif temp_pool.breath <= 0 and temp_pool.ticker >= 1.3 then
162
163                         temp_pool.drowning = 1
164
165                         if hp > 0 then
166                                 player:set_hp( hp - 2 )
167                         end
168                 end
169
170                 if temp_pool.ticker >= 1.3 then
171                         temp_pool.ticker = 0
172                 end
173
174         else
175
176                 temp_pool.ticker = temp_pool.ticker + dtime             
177
178                 if temp_pool.breath < 21 and temp_pool.ticker >= 0.25 then
179                         
180                         temp_pool.breath = temp_pool.breath + 2
181                         
182                         temp_pool.drowning      = 0
183                         
184                         temp_pool.ticker = 0
185
186                         update_breath_bar(player,temp_pool.breath)
187                 end
188         end
189 end
190
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)
195         end
196 end)