1 local S
= minetest
.get_translator("mcl_death_messages")
2 local N
= function(s
) return s
end
4 mcl_death_messages
= {}
9 N("@1 was fatally hit by an arrow."),
10 N("@1 has been killed by an arrow."),
13 N("@1 was shot by an arrow from @2."),
15 ["arrow_skeleton"] = {
16 N("@1 was shot by an arrow from a skeleton."),
19 N("@1 was shot by an arrow from a stray."),
21 ["arrow_illusioner"] = {
22 N("@1 was shot by an arrow from an illusioner."),
25 N("@1 was shot by an arrow."),
28 N("@1 forgot to breathe."),
30 N("@1 ran out of oxygen."),
33 N("@1 was killed by @2."),
39 N("@1 was killed by a mob."),
41 ["blaze_fireball"] = {
42 N("@1 was burned to death by a blaze's fireball."),
43 N("@1 was killed by a fireball from a blaze."),
46 N("@1 was burned by a fire charge."),
48 ["ghast_fireball"] = {
49 N("A ghast scared @1 to death."),
50 N("@1 has been fireballed by a ghast."),
53 N("@1 fell from a high cliff."),
54 N("@1 took fatal fall damage."),
55 N("@1 fell victim to gravity."),
63 ["mobs_mc:zombie"] = N("@1 was killed by a zombie."),
64 ["mobs_mc:baby_zombie"] = N("@1 was killed by a baby zombie."),
65 ["mobs_mc:blaze"] = N("@1 was killed by a blaze."),
66 ["mobs_mc:slime"] = N("@1 was killed by a slime."),
67 ["mobs_mc:witch"] = N("@1 was killed by a witch."),
68 ["mobs_mc:magma_cube_tiny"] = N("@1 was killed by a magma cube."),
69 ["mobs_mc:magma_cube_small"] = N("@1 was killed by a magma cube."),
70 ["mobs_mc:magma_cube_big"] = N("@1 was killed by a magma cube."),
71 ["mobs_mc:wolf"] = N("@1 was killed by a wolf."),
72 ["mobs_mc:cat"] = N("@1 was killed by a cat."),
73 ["mobs_mc:ocelot"] = N("@1 was killed by an ocelot."),
74 ["mobs_mc:enderdragon"] = N("@1 was killed by an ender dragon."),
75 ["mobs_mc:wither"] = N("@1 was killed by a wither."),
76 ["mobs_mc:enderman"] = N("@1 was killed by an enderman."),
77 ["mobs_mc:endermite"] = N("@1 was killed by an endermite."),
78 ["mobs_mc:ghast"] = N("@1 was killed by a ghast."),
79 ["mobs_mc:guardian_elder"] = N("@1 was killed by an elder guardian."),
80 ["mobs_mc:guardian"] = N("@1 was killed by a guardian."),
81 ["mobs_mc:iron_golem"] = N("@1 was killed by an iron golem."),
82 ["mobs_mc:polar_bear"] = N("@1 was killed by a polar_bear."),
83 ["mobs_mc:killer_bunny"] = N("@1 was killed by a killer bunny."),
84 ["mobs_mc:shulker"] = N("@1 was killed by a shulker."),
85 ["mobs_mc:silverfish"] = N("@1 was killed by a silverfish."),
86 ["mobs_mc:skeleton"] = N("@1 was killed by a skeleton."),
87 ["mobs_mc:stray"] = N("@1 was killed by a stray."),
88 ["mobs_mc:slime_tiny"] = N("@1 was killed by a slime."),
89 ["mobs_mc:slime_small"] = N("@1 was killed by a slime."),
90 ["mobs_mc:slime_big"] = N("@1 was killed by a slime."),
91 ["mobs_mc:spider"] = N("@1 was killed by a spider."),
92 ["mobs_mc:cave_spider"] = N("@1 was killed by a cave spider."),
93 ["mobs_mc:vex"] = N("@1 was killed by a vex."),
94 ["mobs_mc:evoker"] = N("@1 was killed by an evoker."),
95 ["mobs_mc:illusioner"] = N("@1 was killed by an illusioner."),
96 ["mobs_mc:vindicator"] = N("@1 was killed by a vindicator."),
97 ["mobs_mc:villager_zombie"] = N("@1 was killed by a zombie villager."),
98 ["mobs_mc:husk"] = N("@1 was killed by a husk."),
99 ["mobs_mc:baby_husk"] = N("@1 was killed by a baby husk."),
100 ["mobs_mc:pigman"] = N("@1 was killed by a zombie pigman."),
101 ["mobs_mc:baby_pigman"] = N("@1 was killed by a baby zombie pigman."),
104 -- Select death message
105 local dmsg
= function(mtype
, ...)
106 local r
= math
.random(1, #msgs
[mtype
])
107 return S(msgs
[mtype
][r
], ...)
110 -- Select death message for death by mob
111 local mmsg
= function(mtype
, ...)
112 if mobkills
[mtype
] then
113 return S(mobkills
[mtype
], ...)
115 return dmsg("mob_kill", ...)
119 local last_damages
= { }
121 minetest
.register_on_dieplayer(function(player
, reason
)
123 local message
= minetest
.settings
:get_bool("mcl_showDeathMessages")
124 if message
== nil then
128 local name
= player
:get_player_name()
133 if last_damages
[name
] then
135 msg
= last_damages
[name
].message
136 elseif reason
.type == "node_damage" then
137 local pos
= player
:get_pos()
138 -- Check multiple nodes because players occupy multiple nodes
139 -- (we add one additional node because the check may fail if the player was
140 -- just barely touching the node with the head)
141 local posses
= { pos
, {x
=pos
.x
,y
=pos
.y
+1,z
=pos
.z
}, {x
=pos
.x
,y
=pos
.y
+2,z
=pos
.z
}}
142 local highest_damage
= 0
143 local highest_damage_def
= nil
144 -- Show message for node that dealt the most damage
146 local def
= minetest
.registered_nodes
[minetest
.get_node(posses
[p
]).name
]
147 local dmg
= def
.damage_per_second
148 if dmg
and dmg
> highest_damage
then
150 highest_damage_def
= def
153 if highest_damage_def
and highest_damage_def
._mcl_node_death_message
then
154 local field
= highest_damage_def
._mcl_node_death_message
156 if type(field
) == "table" then
157 field_msg
= field
[math
.random(1, #field
)]
162 if highest_damage_def
.mod_origin
then
163 textdomain
= highest_damage_def
.mod_origin
165 textdomain
= "mcl_death_messages"
167 -- We assume the textdomain of the death message in the node definition
168 -- equals the modname.
169 msg
= minetest
.translate(textdomain
, field_msg
, name
)
171 elseif reason
.type == "drown" then
172 msg
= dmsg("drown", name
)
173 elseif reason
.type == "punch" then
175 local hitter
= reason
.object
176 local hittername
, hittertype
, hittersubtype
, shooter
178 if last_damages
[name
] then
179 msg
= last_damages
[name
].message
181 elseif hitter
== nil then
182 msg
= dmsg("murder_any", name
)
184 elseif hitter
:is_player() then
185 hittername
= hitter
:get_player_name()
186 if hittername
~= nil then
187 msg
= dmsg("murder", name
, hittername
)
189 msg
= dmsg("murder_any", name
)
191 -- Mob (according to Common Mob Interface)
192 elseif hitter
:get_luaentity()._cmi_is_mob
then
193 if hitter
:get_luaentity().nametag
and hitter
:get_luaentity().nametag
~= "" then
194 hittername
= hitter
:get_luaentity().nametag
196 hittersubtype
= hitter
:get_luaentity().name
198 msg
= dmsg("murder", name
, hittername
)
199 elseif hittersubtype
~= nil and hittersubtype
~= "" then
200 msg
= mmsg(hittersubtype
, name
)
202 msg
= dmsg("murder_any", name
)
205 elseif hitter
:get_luaentity().name
== "mcl_bows:arrow_entity" or hitter
:get_luaentity().name
== "mobs_mc:arrow_entity" then
207 if hitter
:get_luaentity()._shooter
then
208 shooter
= hitter
:get_luaentity()._shooter
211 local s_ent
= shooter
and shooter
:get_luaentity()
212 if shooter
== nil then
213 msg
= dmsg("arrow", name
)
214 elseif shooter
:is_player() then
215 msg
= dmsg("arrow_name", name
, shooter
:get_player_name())
216 elseif s_ent
and s_ent
._cmi_is_mob
then
217 if s_ent
.nametag
~= "" then
218 msg
= dmsg("arrow_name", name
, shooter
:get_player_name())
219 elseif s_ent
.name
== "mobs_mc:skeleton" then
220 msg
= dmsg("arrow_skeleton", name
)
221 elseif s_ent
.name
== "mobs_mc:stray" then
222 msg
= dmsg("arrow_stray", name
)
223 elseif s_ent
.name
== "mobs_mc:illusioner" then
224 msg
= dmsg("arrow_illusioner", name
)
226 msg
= dmsg("arrow_mob", name
)
229 msg
= dmsg("arrow", name
)
232 elseif hitter
:get_luaentity().name
== "mobs_mc:blaze_fireball" then
233 if hitter
:get_luaentity()._shot_from_dispenser
then
234 msg
= dmsg("fire_charge", name
)
236 msg
= dmsg("blaze_fireball", name
)
239 elseif hitter
:get_luaentity().name
== "mobs_monster:fireball" then
240 msg
= dmsg("ghast_fireball", name
)
243 elseif reason
.type == "fall" then
244 msg
= dmsg("fall", name
)
246 elseif reason
.type == "set_hp" then
247 if last_damages
[name
] then
248 msg
= last_damages
[name
].message
252 msg
= dmsg("other", name
)
254 minetest
.chat_send_all(msg
)
255 last_damages
[name
] = nil
259 -- dmg_sequence_number is used to discard old damage events
260 local dmg_sequence_number
= 0
261 local start_damage_reset_countdown
= function (player
, sequence_number
)
262 minetest
.after(1, function(playername
, sequence_number
)
263 if last_damages
[playername
] and last_damages
[playername
].sequence_number
== sequence_number
then
264 last_damages
[playername
] = nil
266 end, player
:get_player_name(), sequence_number
)
269 -- Send a custom death mesage when damaging a player via set_hp or punch.
270 -- To be called directly BEFORE damaging a player via set_hp or punch.
271 -- The next time the player dies due to a set_hp, the message will be shown.
272 -- The player must die via set_hp within 0.1 seconds, otherwise the message will be discarded.
273 function mcl_death_messages
.player_damage(player
, message
)
274 last_damages
[player
:get_player_name()] = { message
= message
, sequence_number
= dmg_sequence_number
}
275 start_damage_reset_countdown(player
, dmg_sequence_number
)
276 dmg_sequence_number
= dmg_sequence_number
+ 1
277 if dmg_sequence_number
>= 65535 then
278 dmg_sequence_number
= 0