209 lines
6.4 KiB
Lua
209 lines
6.4 KiB
Lua
local S = minetest.get_translator("hades_death_messages")
|
|
local N = function(s) return s end
|
|
|
|
hades_death_messages = {}
|
|
|
|
-- Death messages
|
|
local msgs = {
|
|
["drown"] = {
|
|
N("Drowning"),
|
|
},
|
|
["drown_water"] = {
|
|
N("Drowning in water"),
|
|
},
|
|
["drown_lava"] = {
|
|
N("Drowning in lava"),
|
|
},
|
|
["node"] = {
|
|
N("Damage from a block"),
|
|
},
|
|
["projectile_mese_arrow"] = {
|
|
N("Shot by a mese monster crystal shard"),
|
|
},
|
|
["projectile_fireball"] = {
|
|
N("Shot by a fireball"),
|
|
},
|
|
["murder"] = {
|
|
N("Melee attack from an unknown source"),
|
|
},
|
|
["murder_any"] = {
|
|
N("Melee attack from an unknown source"),
|
|
},
|
|
["mob_kill"] = {
|
|
N("Hit from a hostile creature"),
|
|
},
|
|
["fall"] = {
|
|
N("Falling"),
|
|
},
|
|
["other"] = {
|
|
N("Unknown"),
|
|
}
|
|
}
|
|
|
|
local mobkills = {
|
|
["mobs_hades:mutant"] = N("Punch from a mutant"),
|
|
["mobs_hades:cave_master"] = N("Hit from a cave master"),
|
|
["mobs_hades:cave_elder"] = N("Hit from a cave elder"),
|
|
["mobs_hades:mese_monster"] = N("Headbutt from a mese monster"),
|
|
["mobs_hades:deep_mese_monster"] = N("Headbutt from a deep mese monster"),
|
|
["mobs_hades:oerkki"] = N("Hit from an oerkki"),
|
|
["mobs_hades:stone_monster"] = N("Hit from a stone monster"),
|
|
["mobs_hades:deep_stone_monster"] = N("Hit from a deep stone monster"),
|
|
["mobs_hades:spider_gold"] = N("Bite from a gold spider"),
|
|
["mobs_hades:spider_sapphire"] = N("Bite from a sapphire spider"),
|
|
["mobs_hades:spider_ruby"] = N("Bite from a ruby spider"),
|
|
["mobs_hades:spider_mese"] = N("Bite from a mese spider"),
|
|
}
|
|
|
|
-- Select death message
|
|
local smsg = function(msg)
|
|
return S("Cause of death: @1.", msg)
|
|
end
|
|
|
|
local dmsg = function(mtype, ...)
|
|
local r = math.random(1, #msgs[mtype])
|
|
return S("Cause of death: @1.", msgs[mtype][r], ...)
|
|
end
|
|
|
|
-- Select death message for death by mob
|
|
local mmsg = function(mtype, ...)
|
|
if mobkills[mtype] then
|
|
return S("Cause of death: @1.", S(mobkills[mtype], ...))
|
|
else
|
|
return dmsg("mob_kill", ...)
|
|
end
|
|
end
|
|
|
|
local last_damages = { }
|
|
|
|
minetest.register_on_dieplayer(function(player, reason)
|
|
-- Death message
|
|
local message = minetest.settings:get_bool("hades_show_death_messages", true)
|
|
if message == nil then
|
|
message = true
|
|
end
|
|
if message then
|
|
local name = player:get_player_name()
|
|
if not name then
|
|
return
|
|
end
|
|
local msg
|
|
if last_damages[name] then
|
|
-- custom message
|
|
msg = smsg(last_damages[name].message)
|
|
elseif reason.type == "node_damage" then
|
|
local pos = player:get_pos()
|
|
local node = reason.node
|
|
local node_def = minetest.registered_nodes[node]
|
|
if node_def and node_def._hades_node_death_message then
|
|
local field = node_def._hades_node_death_message
|
|
local field_msg
|
|
if type(field) == "table" then
|
|
field_msg = field[math.random(1, #field)]
|
|
else
|
|
field_msg = field
|
|
end
|
|
local textdomain
|
|
if node_def.mod_origin then
|
|
textdomain = node_def.mod_origin
|
|
else
|
|
textdomain = "hades_death_messages"
|
|
end
|
|
-- We assume the textdomain of the death message in the node definition
|
|
-- equals the modname.
|
|
msg = smsg(minetest.translate(textdomain, field_msg))
|
|
else
|
|
msg = dmsg("node")
|
|
end
|
|
elseif reason.type == "drown" then
|
|
local pos = player:get_pos()
|
|
-- check "head position" to estimate in which node the player drowned
|
|
local cpos = {x=pos.x,y=pos.y+1,z=pos.z}
|
|
local dnode = minetest.get_node(cpos)
|
|
if minetest.get_item_group(dnode.name, "water") then
|
|
msg = dmsg("drown_water")
|
|
elseif minetest.get_item_group(dnode.name, "lava") then
|
|
msg = dmsg("drown_lava")
|
|
else
|
|
msg = dmsg("drown")
|
|
end
|
|
elseif reason.type == "punch" then
|
|
-- Punches
|
|
local hitter = reason.object
|
|
local hittername, hittertype, hittersubtype, shooter
|
|
-- Custom message
|
|
if last_damages[name] then
|
|
msg = smsg(last_damages[name].message)
|
|
-- Unknown hitter
|
|
elseif hitter == nil then
|
|
msg = dmsg("murder_any")
|
|
-- Player
|
|
elseif hitter:is_player() then
|
|
hittername = hitter:get_player_name()
|
|
if hittername ~= nil then
|
|
msg = dmsg("murder", hittername)
|
|
else
|
|
msg = dmsg("murder_any")
|
|
end
|
|
-- Mob (according to Common Mob Interface)
|
|
elseif hitter:get_luaentity()._cmi_is_mob then
|
|
if hitter:get_luaentity().nametag and hitter:get_luaentity().nametag ~= "" then
|
|
hittername = hitter:get_luaentity().nametag
|
|
end
|
|
hittersubtype = hitter:get_luaentity().name
|
|
if hittername then
|
|
msg = dmsg("murder", hittername)
|
|
elseif hittersubtype ~= nil and hittersubtype ~= "" then
|
|
msg = mmsg(hittersubtype)
|
|
else
|
|
msg = dmsg("murder_any")
|
|
end
|
|
elseif hitter:get_luaentity().name == "mobs_hades:mese_arrow" then
|
|
msg = dmsg("projectile_mese_arrow")
|
|
elseif hitter:get_luaentity().name == "mobs_hades:fireball" then
|
|
msg = dmsg("projectile_fireball")
|
|
end
|
|
-- Falling
|
|
elseif reason.type == "fall" then
|
|
msg = dmsg("fall")
|
|
-- Other
|
|
elseif reason.type == "set_hp" then
|
|
if last_damages[name] then
|
|
msg = smsg(last_damages[name].message)
|
|
end
|
|
end
|
|
if not msg then
|
|
msg = dmsg("other")
|
|
end
|
|
-- Send message after short delay so it appears after "You died.".
|
|
minetest.after(0.25, function(data)
|
|
minetest.chat_send_player(data.name, minetest.colorize("#FF8080", data.msg))
|
|
end, {name=name, msg=msg})
|
|
last_damages[name] = nil
|
|
end
|
|
end)
|
|
|
|
-- dmg_sequence_number is used to discard old damage events
|
|
local dmg_sequence_number = 0
|
|
local start_damage_reset_countdown = function (player, sequence_number)
|
|
minetest.after(1, function(playername, sequence_number)
|
|
if last_damages[playername] and last_damages[playername].sequence_number == sequence_number then
|
|
last_damages[playername] = nil
|
|
end
|
|
end, player:get_player_name(), sequence_number)
|
|
end
|
|
|
|
-- Send a custom death mesage when damaging a player via set_hp or punch.
|
|
-- To be called directly BEFORE damaging a player via set_hp or punch.
|
|
-- The next time the player dies due to a set_hp, the message will be shown.
|
|
-- The player must die via set_hp within 0.1 seconds, otherwise the message will be discarded.
|
|
function hades_death_messages.player_damage(player, message)
|
|
last_damages[player:get_player_name()] = { message = message, sequence_number = dmg_sequence_number }
|
|
start_damage_reset_countdown(player, dmg_sequence_number)
|
|
dmg_sequence_number = dmg_sequence_number + 1
|
|
if dmg_sequence_number >= 65535 then
|
|
dmg_sequence_number = 0
|
|
end
|
|
end
|
|
|