diff --git a/elixir.lua b/elixir.lua index fdb716e..0fa5fa2 100644 --- a/elixir.lua +++ b/elixir.lua @@ -12,22 +12,11 @@ fun_caves.register_status({ player:set_armor_groups(armor) minetest.chat_send_player(player_name, minetest.colorize('#FF0000', 'Your skin feels softer...')) fun_caves.db.status[player_name].armor_elixir = nil + fun_caves.display_armor(player) end, }) -minetest.register_on_joinplayer(function(player) - local player_name = player:get_player_name() - - if fun_caves.db.status[player_name] and fun_caves.db.status[player_name].armor_elixir then - local factor = fun_caves.db.status[player_name].armor_elixir.factor - local armor = player:get_armor_groups() - armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy * factor))) - player:set_armor_groups(armor) - end -end) - - if fun_caves.expire_elixir_on_death then minetest.register_on_dieplayer(function(player) local player_name = player:get_player_name() @@ -37,6 +26,7 @@ if fun_caves.expire_elixir_on_death then armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy / factor))) player:set_armor_groups(armor) fun_caves.db.status[player_name].armor_elixir = nil + fun_caves.display_armor(player) end end) end @@ -48,13 +38,14 @@ local function armor(user, factor) if fun_caves.db.status[player_name].armor_elixir then local old_factor = fun_caves.db.status[player_name].armor_elixir.factor - armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy / factor))) + armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy / old_factor))) end armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy * factor))) user:set_armor_groups(armor) minetest.chat_send_player(player_name, 'Your skin feels harder...') fun_caves.set_status(player_name, 'armor_elixir', elixir_duration, {factor = factor}) + fun_caves.display_armor(user) end local descs = { diff --git a/init.lua b/init.lua index 54890e8..e5fdfd6 100644 --- a/init.lua +++ b/init.lua @@ -179,42 +179,35 @@ minetest.register_on_shutdown(function() end) -minetest.register_on_joinplayer(function(player) - local player_name = player:get_player_name() - if not fun_caves.db.status[player_name] then - fun_caves.db.status[player_name] = {} - end -end) - - local hunger_mod = minetest.get_modpath("hunger") fun_caves.hunger_id = {} function fun_caves.hunger_change(player, change) - local name = player:get_player_name() + local player_name = player:get_player_name() if hunger_mod then if change < 0 then - hunger.update_hunger(player, hunger.players[name].lvl + change * 4) + hunger.update_hunger(player, hunger.players[player_name].lvl + change * 4) end return end local hp = player:get_hp() if change < 0 or hp >= 16 then - fun_caves.db.hunger[name] = math.min(20, math.max(0, fun_caves.db.hunger[name] + change)) - player:hud_change(fun_caves.hunger_id[name], 'number', fun_caves.db.hunger[name]) - if fun_caves.db.hunger[name] == 0 then + fun_caves.db.hunger[player_name] = math.min(20, math.max(0, fun_caves.db.hunger[player_name] + change)) + player:hud_change(fun_caves.hunger_id[player_name], 'number', fun_caves.db.hunger[player_name]) + if fun_caves.db.hunger[player_name] == 0 then player:set_hp(player:get_hp() - 1) end end end +local hunger_hud if not hunger_mod then - minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() + hunger_hud = function(player) + local player_name = player:get_player_name() - if not fun_caves.db.hunger[name] then - fun_caves.db.hunger[name] = 20 + if not fun_caves.db.hunger[player_name] then + fun_caves.db.hunger[player_name] = 20 end local hunger_bar = { @@ -223,13 +216,13 @@ if not hunger_mod then offset = {x = 0, y = -90}, name = "hunger", text = "farming_bread.png", - number = fun_caves.db.hunger[name], + number = fun_caves.db.hunger[player_name], direction = 0, size = { x=24, y=24 }, } - fun_caves.hunger_id[name] = player:hud_add(hunger_bar) - end) + fun_caves.hunger_id[player_name] = player:hud_add(hunger_bar) + end minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing) if hp_change > 0 then @@ -238,14 +231,85 @@ if not hunger_mod then end) minetest.register_on_dieplayer(function(player) - local name = player:get_player_name() + local player_name = player:get_player_name() local pos = vector.round(player:getpos()) if not hunger_mod then - fun_caves.db.hunger[name] = 20 - player:hud_change(fun_caves.hunger_id[name], 'number', 20) + fun_caves.db.hunger[player_name] = 20 + player:hud_change(fun_caves.hunger_id[player_name], 'number', 20) end - minetest.chat_send_player(name, 'Your bones will lie at ('..pos.x..','..pos.y..','..pos.z..'), in ignominy, unless you collect them.') + minetest.chat_send_player(player_name, 'Your bones will lie at ('..pos.x..','..pos.y..','..pos.z..'), in ignominy, unless you collect them.') end) end + +local armor_mod = minetest.get_modpath("3d_armor") +fun_caves.armor_id = {} +local armor_hud +if armor_mod then + fun_caves.display_armor = function(player) + end +else + armor_hud = function(player) + local player_name = player:get_player_name() + + local armor_icon = { + hud_elem_type = 'image', + name = "armor_icon", + text = 'fun_caves_shield.png', + scale = {x=1,y=1}, + position = {x=0.8, y=1}, + offset = {x = -30, y = -80}, + } + + local armor_text = { + hud_elem_type = 'text', + name = "armor_text", + text = '0%', + number = 0xFFFFFF, + position = {x=0.8, y=1}, + offset = {x = 0, y = -80}, + } + + fun_caves.armor_id[player_name] = {} + fun_caves.armor_id[player_name].icon = player:hud_add(armor_icon) + fun_caves.armor_id[player_name].text = player:hud_add(armor_text) + end + + fun_caves.display_armor = function(player) + local player_name = player:get_player_name() + local armor = player:get_armor_groups() + if not armor or not armor.fleshy then + return + end + + player:hud_change(fun_caves.armor_id[player_name].text, 'text', (100 - armor.fleshy)..'%') + end +end + + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + + if not fun_caves.db.status[player_name] then + fun_caves.db.status[player_name] = {} + end + + if armor_hud then + armor_hud(player) + end + + if hunger_hud then + hunger_hud(player) + end + + if fun_caves.db.status[player_name] and fun_caves.db.status[player_name].armor_elixir then + local factor = fun_caves.db.status[player_name].armor_elixir.factor + local armor = player:get_armor_groups() + armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy * factor))) + player:set_armor_groups(armor) + minetest.after(1, function() + fun_caves.display_armor(player) + end) + end +end) diff --git a/textures/fun_caves_shield.png b/textures/fun_caves_shield.png new file mode 100644 index 0000000..d804d2a Binary files /dev/null and b/textures/fun_caves_shield.png differ