mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-17 16:41:06 +01:00
Fix minor race condition in mcl_death_messages
This commit is contained in:
parent
636ff60c68
commit
086b29f08c
1 changed files with 18 additions and 10 deletions
|
@ -206,7 +206,7 @@ minetest.register_on_dieplayer(function(player, reason)
|
||||||
msg = dmsg("fall", name)
|
msg = dmsg("fall", name)
|
||||||
-- Other
|
-- Other
|
||||||
elseif reason.type == "set_hp" then
|
elseif reason.type == "set_hp" then
|
||||||
if last_damages[name] and last_damages[name].custom then
|
if last_damages[name] then
|
||||||
msg = last_damages[name].message
|
msg = last_damages[name].message
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -214,22 +214,30 @@ minetest.register_on_dieplayer(function(player, reason)
|
||||||
msg = dmsg("other", name)
|
msg = dmsg("other", name)
|
||||||
end
|
end
|
||||||
minetest.chat_send_all(msg)
|
minetest.chat_send_all(msg)
|
||||||
|
last_damages[name] = nil
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local start_damage_reset_countdown = function (player)
|
-- dmg_sequence_number is used to discard old damage events
|
||||||
minetest.after(1, function(playername)
|
local dmg_sequence_number = 0
|
||||||
-- FIXME: Fix race condition with many damages in quick succession
|
local start_damage_reset_countdown = function (player, sequence_number)
|
||||||
if last_damages[playername] and last_damages[playername].custom then
|
minetest.after(1, function(playername, sequence_number)
|
||||||
|
if last_damages[playername] and last_damages[playername].sequence_number == sequence_number then
|
||||||
last_damages[playername] = nil
|
last_damages[playername] = nil
|
||||||
end
|
end
|
||||||
end, player:get_player_name())
|
end, player:get_player_name(), sequence_number)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- To be called BEFORE damaging a player via set_hp. The next time the player dies due to a set_hp,
|
-- Send a custom death mesage when damaging a player via set_hp.
|
||||||
-- the message will be shown. This must happen within one second, otherwise it won't work.
|
-- To be called directly BEFORE damaging a player via set_hp.
|
||||||
|
-- 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 mcl_death_messages.player_damage(player, message)
|
function mcl_death_messages.player_damage(player, message)
|
||||||
last_damages[player:get_player_name()] = { custom = true, message = message }
|
last_damages[player:get_player_name()] = { message = message, sequence_number = dmg_sequence_number }
|
||||||
start_damage_reset_countdown(player)
|
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
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue