1
0
Fork 0
MineClone2/mods/HUD/mcl_death_messages/init.lua

236 lines
8.1 KiB
Lua
Raw Normal View History

2019-03-07 21:10:39 +01:00
local S = minetest.get_translator("mcl_death_messages")
mcl_death_messages = {}
2017-07-24 18:19:24 +02:00
-- Death messages
local msgs = {
["arrow"] = {
2019-03-07 21:10:39 +01:00
S("%s was fatally hit by an arrow."),
S("%s has been killed with an arrow."),
2017-07-24 18:19:24 +02:00
},
2017-07-24 20:57:23 +02:00
["arrow_name"] = {
2019-03-07 21:10:39 +01:00
S("%s was shot by an arrow from %s."),
2017-07-24 20:57:23 +02:00
},
2017-07-24 18:19:24 +02:00
["drown"] = {
2019-03-07 21:10:39 +01:00
S("%s forgot to breathe."),
S("%s drowned."),
S("%s ran out of oxygen."),
2017-07-24 18:19:24 +02:00
},
["murder"] = {
2019-03-07 21:10:39 +01:00
S("%s was killed by %s."),
2017-07-24 18:19:24 +02:00
},
["mob_kill"] = {
2019-03-07 21:10:39 +01:00
S("%s was killed by a mob."),
2017-07-24 18:19:24 +02:00
},
2017-07-24 18:36:41 +02:00
["blaze_fireball"] = {
2019-03-07 21:10:39 +01:00
S("%s was burned to death by a blaze's fireball."),
S("%s was killed by a fireball from a blaze."),
2017-07-24 18:36:41 +02:00
},
2017-07-24 19:53:03 +02:00
["fire_charge"] = {
2019-03-08 20:22:01 +01:00
S("%s was burned by a fire charge."),
2017-07-24 19:53:03 +02:00
},
2017-07-24 18:36:41 +02:00
["ghast_fireball"] = {
2019-03-07 21:10:39 +01:00
S("A ghast scared %s to death."),
S("%s has been fireballed by a ghast."),
2017-07-24 18:36:41 +02:00
},
2019-03-08 20:22:01 +01:00
["fall"] = {
2019-03-07 21:10:39 +01:00
S("%s fell from a high cliff."),
S("%s took fatal fall damage."),
S("%s fell victim to gravity."),
2017-07-24 18:19:24 +02:00
},
["other"] = {
2019-03-07 21:10:39 +01:00
S("%s died."),
2017-07-24 18:19:24 +02:00
}
}
local mobkills = {
2019-03-07 21:10:39 +01:00
["mobs_mc:zombie"] = S("%s was killed by a zombie."),
["mobs_mc:baby_zombie"] = S("%s was killed by a baby zombie."),
["mobs_mc:blaze"] = S("%s was killed by a blaze."),
["mobs_mc:slime"] = S("%s was killed by a slime."),
["mobs_mc:witch"] = S("%s was killed by a witch."),
["mobs_mc:magma_cube_tiny"] = S("%s was killed by a magma cube."),
["mobs_mc:magma_cube_small"] = S("%s was killed by a magma cube."),
["mobs_mc:magma_cube_big"] = S("%s was killed by a magma cube."),
["mobs_mc:wolf"] = S("%s was killed by a wolf."),
["mobs_mc:cat"] = S("%s was killed by a cat."),
["mobs_mc:ocelot"] = S("%s was killed by an ocelot."),
["mobs_mc:ender_dragon"] = S("%s was killed by an ender dragon."),
["mobs_mc:wither"] = S("%s was killed by a wither."),
["mobs_mc:enderman"] = S("%s was killed by an enderman."),
["mobs_mc:endermite"] = S("%s was killed by an endermite."),
["mobs_mc:ghast"] = S("%s was killed by a ghast."),
["mobs_mc:guardian_elder"] = S("%s was killed by an elder guardian."),
["mobs_mc:guardian"] = S("%s was killed by a guardian."),
["mobs_mc:iron_golem"] = S("%s was killed by an iron golem."),
["mobs_mc:polar_bear"] = S("%s was killed by a polar_bear."),
["mobs_mc:killer_bunny"] = S("%s was killed by a killer bunny."),
["mobs_mc:shulker"] = S("%s was killed by a shulker."),
["mobs_mc:silverfish"] = S("%s was killed by a silverfish."),
["mobs_mc:skeleton"] = S("%s was killed by a skeleton."),
["mobs_mc:stray"] = S("%s was killed by a stray."),
["mobs_mc:slime_tiny"] = S("%s was killed by a slime."),
["mobs_mc:slime_small"] = S("%s was killed by a slime."),
["mobs_mc:slime_big"] = S("%s was killed by a slime."),
["mobs_mc:spider"] = S("%s was killed by a spider."),
["mobs_mc:cave_spider"] = S("%s was killed by a cave spider."),
["mobs_mc:vex"] = S("%s was killed by a vex."),
["mobs_mc:evoker"] = S("%s was killed by an evoker."),
["mobs_mc:illusioner"] = S("%s was killed by an illusioner."),
["mobs_mc:vindicator"] = S("%s was killed by a vindicator."),
["mobs_mc:villager_zombie"] = S("%s was killed by a zombie villager."),
["mobs_mc:husk"] = S("%s was killed by a husk."),
["mobs_mc:baby_husk"] = S("%s was killed by a baby husk."),
["mobs_mc:pigman"] = S("%s was killed by a zombie pigman."),
["mobs_mc:baby_pigman"] = S("%s was killed by a baby zombie pigman."),
2017-07-24 18:19:24 +02:00
}
-- Select death message
local dmsg = function(mtype, ...)
local r = math.random(1, #msgs[mtype])
return string.format(msgs[mtype][r], ...)
end
-- Select death message for death by mob
local mmsg = function(mtype, ...)
if mobkills[mtype] then
return string.format(mobkills[mtype], ...)
else
return dmsg("mob_kill", ...)
end
end
local last_damages = { }
2017-07-24 18:19:24 +02:00
2019-03-08 20:22:01 +01:00
minetest.register_on_dieplayer(function(player, reason)
2017-06-09 13:39:06 +02:00
-- Death message
local message = minetest.settings:get_bool("mcl_showDeathMessages")
2019-03-08 20:22:01 +01:00
if message == nil then
message = true
end
2017-06-09 13:39:06 +02:00
if message then
local name = player:get_player_name()
2017-07-24 18:19:24 +02:00
if not name then
return
2017-06-09 13:39:06 +02:00
end
local msg
2019-03-08 20:22:01 +01:00
if reason.type == "node_damage" then
local pos = player:get_pos()
-- Check multiple nodes because players occupy multiple nodes
-- (we add one additional node because the check may fail if the player was
-- just barely touching the node with the head)
local posses = { pos, {x=pos.x,y=pos.y+1,z=pos.z}, {x=pos.x,y=pos.y+2,z=pos.z}}
2019-03-08 21:59:16 +01:00
local highest_damage = 0
local highest_damage_def = nil
-- Show message for node that dealt the most damage
2019-03-08 20:22:01 +01:00
for p=1, #posses do
2019-03-08 21:59:16 +01:00
local def = minetest.registered_nodes[minetest.get_node(posses[p]).name]
local dmg = def.damage_per_second
if dmg and dmg > highest_damage then
highest_damage = dmg
highest_damage_def = def
end
end
if highest_damage_def and highest_damage_def._mcl_node_death_message then
local field = highest_damage_def._mcl_node_death_message
local field_msg
if type(field) == "table" then
field_msg = field[math.random(1, #field)]
else
field_msg = field
2019-03-08 20:22:01 +01:00
end
2019-03-08 21:59:16 +01:00
msg = string.format(field_msg, name)
2019-03-08 20:22:01 +01:00
end
elseif reason.type == "drown" then
2017-06-09 13:39:06 +02:00
msg = dmsg("drown", name)
2019-03-08 20:22:01 +01:00
elseif reason.type == "punch" then
-- Punches
local hitter = reason.object
local hittername, hittertype, hittersubtype, shooter
-- Unknown hitter
if 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", name, hittername)
else
msg = dmsg("murder_any", name)
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", name, hittername)
elseif hittersubtype ~= nil and hittersubtype ~= "" then
msg = mmsg(hittersubtype, name)
else
msg = dmsg("murder_any", name)
end
-- Arrow
elseif hitter:get_luaentity().name == "mcl_bows:arrow_entity" or hitter:get_luaentity().name == "mobs_mc:arrow_entity" then
local shooter
if hitter:get_luaentity()._shooter then
shooter = hitter:get_luaentity()._shooter
end
if shooter == nil then
msg = dmsg("arrow", name)
elseif shooter:is_player() then
msg = dmsg("arrow_name", name, shooter:get_player_name())
elseif shooter:get_luaentity()._cmi_is_mob then
if shooter:get_luaentity().nametag ~= "" then
msg = dmsg("arrow_name", name, shooter:get_player_name())
2017-07-24 20:57:23 +02:00
else
msg = dmsg("arrow", name)
end
2019-03-08 20:22:01 +01:00
else
msg = dmsg("arrow", name)
end
-- Blaze fireball
elseif hitter:get_luaentity().name == "mobs_mc:blaze_fireball" then
if hitter:get_luaentity()._shot_from_dispenser then
2017-07-24 19:53:03 +02:00
msg = dmsg("fire_charge", name)
2019-03-08 20:22:01 +01:00
else
msg = dmsg("blaze_fireball", name)
2017-07-24 18:19:24 +02:00
end
2019-03-08 20:22:01 +01:00
-- Ghast fireball
elseif hitter:get_luaentity().name == "mobs_monster:fireball" then
msg = dmsg("ghast_fireball", name)
end
-- Falling
elseif reason.type == "fall" then
msg = dmsg("fall", name)
-- Other
elseif reason.type == "set_hp" then
if last_damages[name] and last_damages[name].custom then
msg = last_damages[name].message
2017-07-24 18:19:24 +02:00
end
end
2019-03-08 20:22:01 +01:00
if not msg then
msg = dmsg("other", name)
2017-07-24 18:19:24 +02:00
end
2019-03-08 20:22:01 +01:00
minetest.chat_send_all(msg)
2017-07-24 18:19:24 +02:00
end
end)
local start_damage_reset_countdown = function (player)
minetest.after(1, function(playername)
2019-03-08 20:22:01 +01:00
-- FIXME: Fix race condition with many damages in quick succession
if last_damages[playername] and last_damages[playername].custom then
last_damages[playername] = nil
end
end, player:get_player_name())
end
2017-07-24 18:19:24 +02:00
2019-03-08 20:22:01 +01:00
-- To be called BEFORE damaging a player via set_hp. The next time the player dies due to a set_hp,
-- the message will be shown. This must happen within one second, otherwise it won't work.
function mcl_death_messages.player_damage(player, message)
last_damages[player:get_player_name()] = { custom = true, message = message }
start_damage_reset_countdown(player)
end
2019-03-08 21:59:16 +01:00