From 34942339c7588cbaf3cbaab3facbe57feaa00e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Fri, 29 Sep 2023 22:31:13 +0200 Subject: [PATCH] Fix bed night skip race condition (#3067) --- mods/beds/functions.lua | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index 99e4dd72..0668976e 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -181,6 +181,26 @@ function beds.skip_night() minetest.set_timeofday(0.23) end +local update_scheduled = false +local function schedule_update() + if update_scheduled then + -- there already is an update scheduled; don't schedule more to prevent races + return + end + update_scheduled = true + minetest.after(2, function() + update_scheduled = false + if not is_sp then + update_formspecs(is_night_skip_enabled()) + end + if is_night_skip_enabled() then + -- skip the night and let all players stand up + beds.skip_night() + beds.kick_players() + end + end) +end + function beds.on_rightclick(pos, player) local name = player:get_player_name() local ppos = player:get_pos() @@ -206,17 +226,8 @@ function beds.on_rightclick(pos, player) update_formspecs(false) end - -- skip the night and let all players stand up if check_in_beds() then - minetest.after(2, function() - if not is_sp then - update_formspecs(is_night_skip_enabled()) - end - if is_night_skip_enabled() then - beds.skip_night() - beds.kick_players() - end - end) + schedule_update() end end @@ -249,13 +260,7 @@ minetest.register_on_leaveplayer(function(player) lay_down(player, nil, nil, false, true) beds.player[name] = nil if check_in_beds() then - minetest.after(2, function() - update_formspecs(is_night_skip_enabled()) - if is_night_skip_enabled() then - beds.skip_night() - beds.kick_players() - end - end) + schedule_update() end end)