MineClone2/mods/PLAYER/mcl_death/init.lua

117 lines
2.9 KiB
Lua

minetest.register_on_dieplayer(function(player)
local keep = minetest.setting_getbool("mcl_keep_inventory_on_death")
if keep == false then
local inv = player:get_inventory()
local pos = player:getpos()
local lists = { "main", "craft", "armor" }
for l=1,#lists do
for i,stack in ipairs(inv:get_list(lists[l])) do
local x = math.random(0, 9)/3
local z = math.random(0, 9)/3
pos.x = pos.x + x
pos.z = pos.z + z
minetest.add_item(pos, stack)
stack:clear()
inv:set_stack(lists[l], i, stack)
pos.x = pos.x - x
pos.z = pos.z - z
end
end
end
-- Death message
local message = minetest.setting_getbool("mcl_show_death_messages")
if message == nil then message = true end
if message then
local name = player:get_player_name()
-- Death messages
local msgs = {
["arrow"] = {
"%s was fatally hit by an arrow.",
"%s has been killed with an arrow.",
},
["cactus"] = {
"%s was killed by a cactus.",
"%s was pricked to death.",
},
["fire"] = {
"%s has been cooked crisp.",
"%s felt the burn.",
"%s died in the flames.",
"%s died in a fire.",
},
["explosion"] = {
"%s was caught in an explosion.",
},
["lava"] = {
"%s melted in lava.",
"%s took a bath in a hot lava tub.",
"%s died in lava.",
"%s could not survive in lava.",
},
["drown"] = {
"%s forgot to breathe.",
"%s drowned.",
"%s ran out of oxygen.",
},
["void"] = {
"%s fell into the endless void.",
},
["suffocation"] = {
"%s suffocated to death.",
},
["starve"] = {
"%s starved.",
},
["murder"] = {
"%s was killed by %s.",
},
["falling_anvil"] = {
"%s was smashed by a falling anvil!",
},
["falling_block"] = {
"%s was smashed by a falling block.",
"%s was buried under a falling block.",
},
["fall_damage"] = {
"%s fell from a high cliff.",
"%s took fatal fall damage.",
"%s fell victim to gravity.",
},
["other"] = {
"%s died.",
}
}
-- Select death message
local dmsg = function(mtype, ...)
local r = math.random(1, #msgs[mtype])
return string.format(msgs[mtype][r], ...)
end
local node = minetest.registered_nodes[minetest.get_node(player:getpos()).name]
local msg
-- Lava
if minetest.get_item_group(node.name, "lava") ~= 0 then
msg = dmsg("lava", name)
-- Drowning
elseif player:get_breath() == 0 then
msg = dmsg("drown", name)
-- Fire
elseif minetest.get_item_group(node.name, "fire") ~= 0 then
msg = dmsg("fire", name)
-- Void
elseif node.name == "mcl_core:void" then
msg = dmsg("void", name)
-- Cactus
elseif node.name == "mcl_core:cactus" then
msg = dmsg("cactus", name)
-- Other
else
msg = dmsg("other", name)
end
minetest.chat_send_all(msg)
end
end)