Replace getpos() with get_pos()
[MineClone/MineClone2.git] / mods / HUD / mcl_death_messages / init.lua
blob00f39ac44036f432417b0c0822a49ea308ceb882
1 mcl_death_messages = {}
3 -- Death messages
4 local msgs = {
5 ["arrow"] = {
6 "%s was fatally hit by an arrow.",
7 "%s has been killed with an arrow.",
8 },
9 ["arrow_name"] = {
10 "%s was shot by an arrow from %s.",
12 ["fire"] = {
13 "%s has been cooked crisp.",
14 "%s felt the burn.",
15 "%s died in the flames.",
16 "%s died in a fire.",
18 ["lava"] = {
19 "%s melted in lava.",
20 "%s took a bath in a hot lava tub.",
21 "%s died in lava.",
22 "%s could not survive in lava.",
24 ["drown"] = {
25 "%s forgot to breathe.",
26 "%s drowned.",
27 "%s ran out of oxygen.",
29 ["starve"] = {
30 "%s starved.",
32 ["murder"] = {
33 "%s was killed by %s.",
35 ["mob_kill"] = {
36 "%s was killed by a mob.",
38 ["blaze_fireball"] = {
39 "%s was burned to death by a blaze's fireball.",
40 "%s was killed by a fireball from a blaze.",
42 ["fire_charge"] = {
43 "%s was hit by a fire charge.",
45 ["ghast_fireball"] = {
46 "A ghast scared %s to death.",
47 "%s has been fireballed by a ghast.",
49 ["fall_damage"] = {
50 "%s fell from a high cliff.",
51 "%s took fatal fall damage.",
52 "%s fell victim to gravity.",
54 ["other"] = {
55 "%s died.",
59 local mobkills = {
60 ["mobs_mc:zombie"] = "%s was killed by a zombie.",
61 ["mobs_mc:baby_zombie"] = "%s was killed by a baby zombie.",
62 ["mobs_mc:blaze"] = "%s was killed by a blaze.",
63 ["mobs_mc:slime"] = "%s was killed by a slime.",
64 ["mobs_mc:witch"] = "%s was killed by a witch.",
65 ["mobs_mc:magma_cube_tiny"] = "%s was killed by a magma cube.",
66 ["mobs_mc:magma_cube_small"] = "%s was killed by a magma cube.",
67 ["mobs_mc:magma_cube_big"] = "%s was killed by a magma cube.",
68 ["mobs_mc:wolf"] = "%s was killed by a wolf.",
69 ["mobs_mc:cat"] = "%s was killed by a cat.",
70 ["mobs_mc:ocelot"] = "%s was killed by an ocelot.",
71 ["mobs_mc:ender_dragon"] = "%s was killed by an ender dragon.",
72 ["mobs_mc:wither"] = "%s was killed by a wither.",
73 ["mobs_mc:enderman"] = "%s was killed by an enderman.",
74 ["mobs_mc:endermite"] = "%s was killed by an endermite.",
75 ["mobs_mc:ghast"] = "%s was killed by a ghast.",
76 ["mobs_mc:guardian_elder"] = "%s was killed by an elder guardian.",
77 ["mobs_mc:guardian"] = "%s was killed by a guardian.",
78 ["mobs_mc:iron_golem"] = "%s was killed by an iron golem.",
79 ["mobs_mc:polar_bear"] = "%s was killed by a polar_bear.",
80 ["mobs_mc:killer_bunny"] = "%s was killed by a killer bunny.",
81 ["mobs_mc:shulker"] = "%s was killed by a shulker.",
82 ["mobs_mc:silverfish"] = "%s was killed by a silverfish.",
83 ["mobs_mc:skeleton"] = "%s was killed by a skeleton.",
84 ["mobs_mc:stray"] = "%s was killed by a stray.",
85 ["mobs_mc:slime_tiny"] = "%s was killed by a slime.",
86 ["mobs_mc:slime_small"] = "%s was killed by a slime.",
87 ["mobs_mc:slime_big"] = "%s was killed by a slime.",
88 ["mobs_mc:spider"] = "%s was killed by a spider.",
89 ["mobs_mc:cave_spider"] = "%s was killed by a cave spider.",
90 ["mobs_mc:vex"] = "%s was killed by a vex.",
91 ["mobs_mc:evoker"] = "%s was killed by an evoker.",
92 ["mobs_mc:illusioner"] = "%s was killed by an illusioner.",
93 ["mobs_mc:vindicator"] = "%s was killed by a vindicator.",
94 ["mobs_mc:villager_zombie"] = "%s was killed by a zombie villager.",
95 ["mobs_mc:husk"] = "%s was killed by a husk.",
96 ["mobs_mc:baby_husk"] = "%s was killed by a baby husk.",
97 ["mobs_mc:pigman"] = "%s was killed by a zombie pigman.",
98 ["mobs_mc:baby_pigman"] = "%s was killed by a baby zombie pigman.",
101 -- Select death message
102 local dmsg = function(mtype, ...)
103 local r = math.random(1, #msgs[mtype])
104 return string.format(msgs[mtype][r], ...)
107 -- Select death message for death by mob
108 local mmsg = function(mtype, ...)
109 if mobkills[mtype] then
110 return string.format(mobkills[mtype], ...)
111 else
112 return dmsg("mob_kill", ...)
116 local last_damages = { }
118 minetest.register_on_dieplayer(function(player)
119 -- Death message
120 local message = minetest.settings:get_bool("mcl_showDeathMessages")
121 if message == nil then message = true end
122 if message then
123 local name = player:get_player_name()
124 if not name then
125 return
128 local node = minetest.registered_nodes[minetest.get_node(player:get_pos()).name]
129 local msg
130 -- Lava
131 if minetest.get_item_group(node.name, "lava") ~= 0 then
132 msg = dmsg("lava", name)
133 -- Drowning
134 elseif player:get_breath() == 0 then
135 msg = dmsg("drown", name)
136 -- Fire
137 elseif minetest.get_item_group(node.name, "fire") ~= 0 then
138 msg = dmsg("fire", name)
139 -- Other
140 else
141 -- Killed by entity
142 if last_damages[name] then
143 -- Mob
144 if last_damages[name].hittertype == "mob" then
145 if last_damages[name].hittername then
146 msg = dmsg("murder", name, last_damages[name].hittername)
147 else
148 msg = mmsg(last_damages[name].hittersubtype, name)
150 -- Player
151 elseif last_damages[name].hittertype == "player" then
152 if last_damages[name].hittername == name then
153 -- Workaround when player somehow punches self. Caused by creeper explosions in mobs mod.
154 -- FIXME: Remove when self-punching is no longer buggy.
155 msg = dmsg("other", name)
156 else
157 msg = dmsg("murder", name, last_damages[name].hittername)
159 -- Arrow
160 elseif last_damages[name].hittertype == "arrow" then
161 if last_damages[name].shooter == nil then
162 msg = dmsg("arrow", name)
163 elseif last_damages[name].shooter:is_player() then
164 msg = dmsg("arrow_name", name, last_damages[name].shooter:get_player_name())
165 elseif last_damages[name].shooter:get_luaentity()._cmi_is_mob then
166 if last_damages[name].shooter:get_luaentity().nametag ~= "" then
167 msg = dmsg("arrow_name", name, last_damages[name].shooter:get_player_name())
168 else
169 msg = dmsg("arrow", name)
171 else
172 msg = dmsg("arrow", name)
174 -- Fireball
175 elseif last_damages[name].hittertype == "blaze_fireball" then
176 msg = dmsg("blaze_fireball", name)
177 elseif last_damages[name].hittertype == "ghast_fireball" then
178 msg = dmsg("ghast_fireball", name)
179 elseif last_damages[name].hittertype == "fire_charge" then
180 msg = dmsg("fire_charge", name)
181 -- Custom death message
182 elseif last_damages[name].custom then
183 msg = last_damages[name].message
185 -- Other reason
186 else
187 msg = dmsg("other", name)
190 if msg then
191 minetest.chat_send_all(msg)
194 end)
196 local start_damage_reset_countdown = function (player)
197 minetest.after(1, function(playername)
198 last_damages[playername] = nil
199 end, player:get_player_name())
202 minetest.register_on_punchplayer(function(player, hitter)
203 if not player or not player:is_player() or not hitter then
204 return
206 local msg
207 local hittername, hittertype, hittersubtype, shooter
208 -- Player
209 if hitter:is_player() then
210 hittername = hitter:get_player_name()
211 hittertype = "player"
212 -- Mob (according to Common Mob Interface)
213 elseif hitter:get_luaentity()._cmi_is_mob then
214 if hitter:get_luaentity().nametag and hitter:get_luaentity().nametag ~= "" then
215 hittername = hitter:get_luaentity().nametag
217 hittertype = "mob"
218 hittersubtype = hitter:get_luaentity().name
219 -- Arrow
220 elseif hitter:get_luaentity().name == "mcl_bows:arrow_entity" or hitter:get_luaentity().name == "mobs_mc:arrow_entity" then
221 hittertype = "arrow"
222 if hitter:get_luaentity()._shooter then
223 shooter = hitter:get_luaentity()._shooter
225 -- Blaze fireball
226 elseif hitter:get_luaentity().name == "mobs_mc:blaze_fireball" then
227 if hitter:get_luaentity()._shot_from_dispenser then
228 hittertype = "fire_charge"
229 else
230 hittertype = "blaze_fireball"
232 -- Ghast fireball
233 elseif hitter:get_luaentity().name == "mobs_monster:fireball" then
234 hittertype = "ghast_fireball"
235 else
236 return
239 last_damages[player:get_player_name()] = { shooter = shooter, hittername = hittername, hittertype = hittertype, hittersubtype = hittersubtype }
240 start_damage_reset_countdown(player)
241 end)
243 -- To be called BEFORE damaging a player. If the player died, then message will be used as the death message.
244 function mcl_death_messages.player_damage(player, message)
245 last_damages[player:get_player_name()] = { custom = true, message = message }
246 start_damage_reset_countdown(player)