From a5e3b259fae403ca543224778728528f6d36ff18 Mon Sep 17 00:00:00 2001 From: Brandon Date: Fri, 19 Jun 2020 20:22:32 -0400 Subject: [PATCH] Keep poisons from killing the player and prevent compounding poison effects. --- mods/ITEMS/mcl_potions/functions.lua | 31 ++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 8ae3e1118b..667eb99561 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -1,13 +1,19 @@ local invisibility = {} +local poisoned = {} --- reset player invisibility if they go offline +-- reset player invisibility/poison if they go offline minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() + if invisibility[name] then invisibility[name] = nil end + if poisoned[name] then + poisoned[name] = nil + end + end) function mcl_potions.invisible(player, toggle) @@ -26,6 +32,13 @@ function mcl_potions.invisible(player, toggle) end +function mcl_potions.poison(player, toggle) + + if not player then return false end + poisoned[player:get_player_name()] = toggle + +end + function mcl_potions._use_potion(item, pos, color) local d = 0.1 item:replace("mcl_potions:glass_bottle") @@ -59,10 +72,11 @@ end function mcl_potions.healing_func(player, hp) if is_zombie[player:get_entity_name()] then hp = -hp end + if hp > 0 then player:set_hp(math.min(player:get_hp() + hp, player:get_properties().hp_max)) else - player:set_hp(player:get_hp() + hp) + player:set_hp(math.max(player:get_hp() + hp, 1)) end end @@ -86,8 +100,17 @@ function mcl_potions.weakness_func(player, factor, duration) end function mcl_potions.poison_func(player, factor, duration) - for i=1,math.floor(duration/factor) do - minetest.after(i*factor, function() player:set_hp(player:get_hp() - 1) end) + + if not poisoned[player:get_player_name()] then + mcl_potions.poison(player, true) + for i=1,math.floor(duration/factor) do + minetest.after(i*factor, function() + if poisoned[player:get_player_name()] then + player:set_hp(math.max(player:get_hp() - 1,1)) + end + end) + end + minetest.after(duration, function() mcl_potions.poison(player, false) end) end end