MineClone5/mods/ITEMS/mcl_totems/init.lua

100 lines
2.9 KiB
Lua
Raw Permalink Normal View History

2021-04-23 13:40:51 +02:00
local hud_totem = {}
2021-04-23 13:40:51 +02:00
minetest.register_on_leaveplayer(function(player)
hud_totem[player] = nil
end)
2021-10-24 21:31:51 +02:00
local particle_colors = {"98BF22", "C49E09", "337D0B", "B0B021", "1E9200"} -- TODO: real MC colors
2021-05-29 21:24:16 +02:00
2021-04-23 13:40:51 +02:00
-- Save the player from death when holding totem of undying in hand
mcl_damage.register_modifier(function(obj, damage, reason)
if obj:is_player() then
local hp = obj:get_hp()
if hp - damage <= 0 then
local wield = obj:get_wielded_item()
2022-01-24 17:26:14 +01:00
local in_offhand = false
if not (wield:get_name() == "mobs_mc:totem") then
local inv = obj:get_inventory()
if inv then
wield = obj:get_inventory():get_stack("offhand", 1)
in_offhand = true
end
end
2021-04-23 13:40:51 +02:00
if wield:get_name() == "mobs_mc:totem" then
local ppos = obj:get_pos()
local pnname = minetest.get_node(ppos).name
-- Some exceptions when _not_ to save the player
2021-07-12 20:05:52 +02:00
for n = 1, #mobs_mc.misc.totem_fail_nodes do
2021-04-23 13:40:51 +02:00
if pnname == mobs_mc.misc.totem_fail_nodes[n] then
return
end
end
-- Reset breath as well
if obj:get_breath() < 11 then
obj:set_breath(10)
end
if not minetest.is_creative_enabled(obj:get_player_name()) then
wield:take_item()
2022-01-24 17:26:14 +01:00
if in_offhand then
obj:get_inventory():set_stack("offhand", 1, wield)
mcl_inventory.update_inventory_formspec(obj)
else
obj:set_wielded_item(wield)
end
2021-04-23 13:40:51 +02:00
end
awards.unlock(obj:get_player_name(), "mcl:postMortal")
2021-04-23 13:40:51 +02:00
-- Effects
2021-10-24 21:31:51 +02:00
minetest.sound_play({name = "mcl_totems_totem", gain = 1}, {pos=ppos, max_hear_distance = 16}, true)
2021-06-08 17:13:00 +02:00
for i = 1, 4 do
for c = 1, #particle_colors do
minetest.add_particlespawner({
2021-10-25 22:25:34 +02:00
amount = math.floor(100 / (4 * #particle_colors)),
time = 1,
minpos = vector.offset(ppos, 0, -1, 0),
maxpos = vector.offset(ppos, 0, 1, 0),
minvel = vector.new(-1.5, 0, -1.5),
maxvel = vector.new(1.5, 1.5, 1.5),
minacc = vector.new(0, -0.1, 0),
maxacc = vector.new(0, -1, 0),
minexptime = 1,
maxexptime = 3,
minsize = 1,
maxsize = 2,
collisiondetection = true,
collision_removal = true,
object_collision = false,
vertical = false,
texture = "mcl_particles_totem" .. i .. ".png^[colorize:#" .. particle_colors[c],
glow = 10,
})
end
2021-10-24 21:31:51 +02:00
end
2021-05-29 21:24:16 +02:00
2021-08-26 12:17:15 +02:00
-- Big totem overlay
2021-04-23 13:40:51 +02:00
if not hud_totem[obj] then
hud_totem[obj] = obj:hud_add({
hud_elem_type = "image",
text = "mcl_totems_totem.png",
2021-10-24 21:31:51 +02:00
position = {x = 0.5, y = 1},
scale = {x = 17, y = 17},
offset = {x = 0, y = -178},
2021-04-23 13:40:51 +02:00
z_index = 100,
})
minetest.after(3, function()
if obj:is_player() then
obj:hud_remove(hud_totem[obj])
hud_totem[obj] = nil
end
end)
end
-- Set HP to exactly 1
return hp - 1
end
end
end
2021-07-12 20:05:52 +02:00
end, 1000)