X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=mods%2Fdrowning%2Finit.lua;h=197b236245c805751e0ae01b3edb0ceb0175d76a;hb=1cd7d5d4bc01f40d4a94aa4362d3f1462f3fc919;hp=6e5cbe1dcb6e0db5cfb86784e48502439d26896e;hpb=a7ad8db876ef251a75c927f10386dfd80722b336;p=Crafter.git diff --git a/mods/drowning/init.lua b/mods/drowning/init.lua index 6e5cbe1..197b236 100644 --- a/mods/drowning/init.lua +++ b/mods/drowning/init.lua @@ -1,190 +1,92 @@ local minetest,vector,hud_manager = minetest,vector,hud_manager -local mod_storage = minetest.get_mod_storage() - -local drowning_class = {} - -drowning_class.get_group = minetest.get_item_group - -local player_drowning = {} - -drowning_class.tick = nil - -drowning_class.breath = nil - -drowning_pointer = {} -- allows other mods to access data - --- creates volitile data for the game to use -drowning_class.set_data = function(player,data) - local name = player:get_player_name() - if not player_drowning[name] then - player_drowning[name] = {} - end - - for index,i_data in pairs(data) do - player_drowning[name][index] = i_data - end - - if data.breath then - - if data.breath > 20 then - if hud_manager.hud_exists(player,"breath_bg") then - hud_manager.remove_hud(player,"breath_bg") - end - if hud_manager.hud_exists(player,"breath") then - hud_manager.remove_hud(player,"breath") - end - else - if not hud_manager.hud_exists(player,"breath_bg") then - hud_manager.add_hud(player,"breath_bg",{ - hud_elem_type = "statbar", - position = {x = 0.5, y = 1}, - text = "bubble_bg.png", - number = 20, - direction = 1, - size = {x = 24, y = 24}, - offset = {x = 24*10, y= -(48 + 52 + 39)}, - }) - end - if not hud_manager.hud_exists(player,"breath") then - hud_manager.add_hud(player,"breath",{ - hud_elem_type = "statbar", - position = {x = 0.5, y = 1}, - text = "bubble.png", - number = data.breath, - direction = 1, - size = {x = 24, y = 24}, - offset = {x = 24*10, y= -(48 + 52 + 39)}, - }) - end - - hud_manager.change_hud({ - player = player , - hud_name = "breath", - element = "number", - data = data.breath - }) +local mod_storage = minetest.get_mod_storage() +local pool = {} + +-- updates bubble bar +local update_breath_bar = function(player,breath) + if breath > 20 then + if hud_manager.hud_exists(player,"breath_bg") then + hud_manager.remove_hud(player,"breath_bg") end - end -end - --- indexes drowning data and returns it -drowning_class.get_data = function(player,requested_data) - local name = player:get_player_name() - if player_drowning[name] then - local data_list = {} - local count = 0 - for index,i_data in pairs(requested_data) do - if player_drowning[name][i_data] then - data_list[i_data] = player_drowning[name][i_data] - count = count + 1 - end + if hud_manager.hud_exists(player,"breath") then + hud_manager.remove_hud(player,"breath") end - if count > 0 then - return(data_list) - else - return(nil) + else + if not hud_manager.hud_exists(player,"breath_bg") then + hud_manager.add_hud(player,"breath_bg",{ + hud_elem_type = "statbar", + position = {x = 0.5, y = 1}, + text = "bubble_bg.png", + number = 20, + direction = 1, + size = {x = 24, y = 24}, + offset = {x = 24*10, y= -(48 + 52 + 39)}, + }) + end + if not hud_manager.hud_exists(player,"breath") then + hud_manager.add_hud(player,"breath",{ + hud_elem_type = "statbar", + position = {x = 0.5, y = 1}, + text = "bubble.png", + number = breath, + direction = 1, + size = {x = 24, y = 24}, + offset = {x = 24*10, y= -(48 + 52 + 39)}, + }) end - end - return(nil) -end --- removes data -drowning_class.terminate = function(player) - local name = player:get_player_name() - if player_drowning[name] then - player_drowning[name] = nil + hud_manager.change_hud({ + player = player , + hud_name = "breath", + element = "number", + data = breath + }) end end -- loads data from mod storage -drowning_class.load_data = function(player) - local name = player:get_player_name() +local name +local temp_pool +local load_data = function(player) + name = player:get_player_name() + pool[name] = {} + temp_pool = pool[name] if mod_storage:get_int(name.."d_save") > 0 then - return({ - breath = mod_storage:get_float(name.."breath" ), - breath_ticker = mod_storage:get_float(name.."breath_ticker"), - drowning = mod_storage:get_float(name.."drowning" ), - }) + temp_pool.breath = mod_storage:get_float(name.."breath" ) + temp_pool.ticker = mod_storage:get_float(name.."breath_ticker") + temp_pool.drowning = mod_storage:get_float(name.."drowning" ) else - return({ - breath = 20, - breath_ticker = 0 , - drowning = 0 , - }) + temp_pool.breath = 21 + temp_pool.ticker = 0 + temp_pool.drowning = 0 end end -- saves data to be utilized on next login -drowning_class.save_data = function(player) - local name - if type(player) ~= "string" and player:is_player() then - name = player:get_player_name() - elseif type(player) == "string" then - name = player - end - if player_drowning[name] then - for index,integer in pairs(player_drowning[name]) do - mod_storage:set_float(name..index,integer) - end +local temp_pool +local save_data = function(name) + if type(name) ~= "string" and name:is_player() then + name = name:get_player_name() end + temp_pool = pool[name] + mod_storage:set_float(name.."breath", temp_pool.breath) + mod_storage:set_float(name.."breath_ticker", temp_pool.ticker) + mod_storage:set_float(name.."drowning", temp_pool.drowning) mod_storage:set_int(name.."d_save", 1) - player_drowning[name] = nil + pool[name] = nil end -- is used for shutdowns to save all data -drowning_class.save_all = function() - for name,data in pairs(player_drowning) do - drowning_class.save_data(name) +local save_all = function() + for name,_ in pairs(pool) do + save_data(name) end end --- creates volitile data for the game to use -drowning_pointer.set_data = function(player,data) - local name = player:get_player_name() - if not player_drowning[name] then - player_drowning[name] = {} - end - - for index,i_data in pairs(data) do - player_drowning[name][index] = i_data - end - - if data.breath then - hud_manager.change_hud({ - player = player , - hud_name = "breath", - element = "number", - data = data.breath - }) - end -end - --- indexes drowning data and returns it -drowning_pointer.get_data = function(player,requested_data) - local name = player:get_player_name() - if player_drowning[name] then - local data_list = {} - local count = 0 - for index,i_data in pairs(requested_data) do - if player_drowning[name][i_data] then - data_list[i_data] = player_drowning[name][i_data] - count = count + 1 - end - end - if count > 0 then - return(data_list) - else - return(nil) - end - end - return(nil) -end - - -- remove stock health bar minetest.hud_replace_builtin("breath",{ hud_elem_type = "statbar", @@ -195,120 +97,100 @@ minetest.hud_replace_builtin("breath",{ size = {x = 0, y = 0}, offset = {x = 0, y= 0}, }) -minetest.register_on_joinplayer(function(player) - local data = drowning_class.load_data(player) - drowning_class.set_data(player,data) +minetest.register_on_joinplayer(function(player) + load_data(player) player:hud_set_flags({breathbar=false}) end) -- saves specific users data for when they relog minetest.register_on_leaveplayer(function(player) - drowning_class.save_data(player) - drowning_class.terminate(player) + save_data(player) end) -- save all data to mod storage on shutdown minetest.register_on_shutdown(function() - drowning_class.save_all() + save_all() end) +local name +is_player_drowning = function(player) + name = player:get_player_name() + return(pool[name].drowning) +end + -- reset the player's data +local name +local temp_pool minetest.register_on_respawnplayer(function(player) - drowning_class.set_data(player,{ - breath = 20, - breath_ticker = 0 , - drowning = 0 , - }) + name = player:get_player_name() + temp_pool = pool[name] + temp_pool.breath = 21 + temp_pool.ticker = 0 + temp_pool.drowning = 0 + update_breath_bar(player,temp_pool.breath) end) --handle the breath bar -drowning_class.handle_breath = function(dtime) - for _,player in ipairs(minetest.get_connected_players()) do - local name = player:get_player_name() +local name +local temp_pool +local head +local hp +local handle_breath = function(player,dtime) + name = player:get_player_name() + head = get_player_head_env(player) + temp_pool = pool[name] + hp = player:get_hp() + if hp <= 0 then + return + end + if minetest.get_item_group(head, "drowning") > 0 then - local data = environment_pointer.get_data(player,{"head"}) + temp_pool.ticker = temp_pool.ticker + dtime - if data then - data = data.head - end + if temp_pool.breath > 0 and temp_pool.ticker >= 1.3 then - if drowning_class.get_group(data, "drowning") > 0 then - - drowning_class.ticker = drowning_class.get_data(player,{"breath_ticker"}) + if temp_pool.breath == 21 then + temp_pool.breath = 20 + end + temp_pool.breath = temp_pool.breath - 2 - drowning_class.breath = drowning_class.get_data(player,{"breath"}) - - if drowning_class.breath then - drowning_class.breath = drowning_class.breath.breath - end + temp_pool.drowning = 0 - if drowning_class.ticker then - drowning_class.ticker = drowning_class.ticker.breath_ticker - end - - drowning_class.ticker = drowning_class.ticker + dtime - - if drowning_class.breath > 0 and drowning_class.ticker >= 1.3 then + update_breath_bar(player,temp_pool.breath) + elseif temp_pool.breath <= 0 and temp_pool.ticker >= 1.3 then - drowning_class.breath = drowning_class.breath - 2 + temp_pool.drowning = 1 - drowning_class.set_data(player,{breath = drowning_class.breath}) - - drowning_class.set_data(player,{drowning = 0}) - - elseif drowning_class.breath <= 0 and drowning_class.ticker >= 1.3 then - - drowning_class.set_data(player,{drowning=1}) + if hp > 0 then + player:set_hp( hp - 2 ) + end + end - local hp = player:get_hp() + if temp_pool.ticker >= 1.3 then + temp_pool.ticker = 0 + end - if hp > 0 then - player:set_hp(hp-2) - end - end + else - if drowning_class.ticker >= 1.3 then - drowning_class.ticker = 0 - end + temp_pool.ticker = temp_pool.ticker + dtime - drowning_class.set_data(player,{breath_ticker = drowning_class.ticker}) + if temp_pool.breath < 21 and temp_pool.ticker >= 0.25 then - else - - drowning_class.breath = drowning_class.get_data(player,{"breath"}) + temp_pool.breath = temp_pool.breath + 2 - drowning_class.ticker = drowning_class.get_data(player,{"breath_ticker"}) - - if drowning_class.ticker then - drowning_class.ticker = drowning_class.ticker.breath_ticker - end - - if drowning_class.breath then - drowning_class.breath = drowning_class.breath.breath - end - - drowning_class.ticker = drowning_class.ticker + dtime + temp_pool.drowning = 0 + + temp_pool.ticker = 0 - if drowning_class.breath < 21 and drowning_class.ticker >= 0.25 then - - drowning_class.breath = drowning_class.breath + 2 - - drowning_class.set_data(player,{ - breath = drowning_class.breath, - drowning = 0, - breath_ticker = 0, - }) - elseif drowning_class.breath < 21 then - drowning_class.set_data(player,{breath_ticker = drowning_class.ticker}) - else - drowning_class.set_data(player,{breath_ticker = 0}) - end + update_breath_bar(player,temp_pool.breath) end end end -- inject into main loop minetest.register_globalstep(function(dtime) - drowning_class.handle_breath(dtime) + for _,player in ipairs(minetest.get_connected_players()) do + handle_breath(player,dtime) + end end) \ No newline at end of file