hades_revisited/mods/hades_death_messages/init.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