Update helptext of obsidian
[MineClone/MineClone2.git] / mods / HUD / mcl_death_messages / init.lua
blobdfc5191a666d271fd26fa177d09e6aa7611748f4
1 local S = minetest.get_translator("mcl_death_messages")
2 local N = function(s) return s end
4 mcl_death_messages = {}
6 -- Death messages
7 local msgs = {
8 ["arrow"] = {
9 N("@1 was fatally hit by an arrow."),
10 N("@1 has been killed by an arrow."),
12 ["arrow_name"] = {
13 N("@1 was shot by an arrow from @2."),
15 ["arrow_skeleton"] = {
16 N("@1 was shot by an arrow from a skeleton."),
18 ["arrow_stray"] = {
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."),
24 ["arrow_mob"] = {
25 N("@1 was shot by an arrow."),
27 ["drown"] = {
28 N("@1 forgot to breathe."),
29 N("@1 drowned."),
30 N("@1 ran out of oxygen."),
32 ["murder"] = {
33 N("@1 was killed by @2."),
35 ["murder_any"] = {
36 N("@1 was killed."),
38 ["mob_kill"] = {
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."),
45 ["fire_charge"] = {
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."),
52 ["fall"] = {
53 N("@1 fell from a high cliff."),
54 N("@1 took fatal fall damage."),
55 N("@1 fell victim to gravity."),
57 ["other"] = {
58 N("@1 died."),
62 local mobkills = {
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], ...)
114 else
115 return dmsg("mob_kill", ...)
119 local last_damages = { }
121 minetest.register_on_dieplayer(function(player, reason)
122 -- Death message
123 local message = minetest.settings:get_bool("mcl_showDeathMessages")
124 if message == nil then
125 message = true
127 if message then
128 local name = player:get_player_name()
129 if not name then
130 return
132 local msg
133 if last_damages[name] then
134 -- custom message
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
145 for p=1, #posses do
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
149 highest_damage = dmg
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
155 local field_msg
156 if type(field) == "table" then
157 field_msg = field[math.random(1, #field)]
158 else
159 field_msg = field
161 local textdomain
162 if highest_damage_def.mod_origin then
163 textdomain = highest_damage_def.mod_origin
164 else
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
174 -- Punches
175 local hitter = reason.object
176 local hittername, hittertype, hittersubtype, shooter
177 -- Custom message
178 if last_damages[name] then
179 msg = last_damages[name].message
180 -- Unknown hitter
181 elseif hitter == nil then
182 msg = dmsg("murder_any", name)
183 -- Player
184 elseif hitter:is_player() then
185 hittername = hitter:get_player_name()
186 if hittername ~= nil then
187 msg = dmsg("murder", name, hittername)
188 else
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
197 if hittername then
198 msg = dmsg("murder", name, hittername)
199 elseif hittersubtype ~= nil and hittersubtype ~= "" then
200 msg = mmsg(hittersubtype, name)
201 else
202 msg = dmsg("murder_any", name)
204 -- Arrow
205 elseif hitter:get_luaentity().name == "mcl_bows:arrow_entity" or hitter:get_luaentity().name == "mobs_mc:arrow_entity" then
206 local shooter
207 if hitter:get_luaentity()._shooter then
208 shooter = hitter:get_luaentity()._shooter
210 local is_mob = false
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)
225 else
226 msg = dmsg("arrow_mob", name)
228 else
229 msg = dmsg("arrow", name)
231 -- Blaze fireball
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)
235 else
236 msg = dmsg("blaze_fireball", name)
238 -- Ghast fireball
239 elseif hitter:get_luaentity().name == "mobs_monster:fireball" then
240 msg = dmsg("ghast_fireball", name)
242 -- Falling
243 elseif reason.type == "fall" then
244 msg = dmsg("fall", name)
245 -- Other
246 elseif reason.type == "set_hp" then
247 if last_damages[name] then
248 msg = last_damages[name].message
251 if not msg then
252 msg = dmsg("other", name)
254 minetest.chat_send_all(msg)
255 last_damages[name] = nil
257 end)
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