Add workaround for HUD race conditions

This commit is contained in:
luk3yx 2021-04-06 11:34:58 +12:00
parent 1d2be8a8a7
commit 057d6ab4e3
1 changed files with 33 additions and 1 deletions

View File

@ -302,6 +302,19 @@ local function compare_elems(old_elem, new_elem)
return false, differences
end
local function reshow_hud(name, formname, data)
if not hud_elems[name] or hud_elems[name][formname] ~= data then
return
end
data[3] = nil
local fs = data[4]
if fs then
data[4] = nil
hud_fs.show_hud(name, formname, fs)
end
end
local scales = {}
local z_indexes = {}
function hud_fs.show_hud(player, formname, formspec)
@ -323,8 +336,15 @@ function hud_fs.show_hud(player, formname, formspec)
data = {{}, {}}
hud_elems[name][formname] = data
end
local ids, elems = data[1], data[2]
local proto_ver = info.protocol_version
-- Work around client-side race conditions in MT <= 5.4.0
if proto_ver < 40 and data[3] then
data[4] = formspec
return
end
local ids, elems = data[1], data[2]
local new_elems = render(formspec, proto_ver, scales[formname],
z_indexes[formname])
@ -392,6 +412,12 @@ function hud_fs.show_hud(player, formname, formspec)
elems[i] = elem
end
-- Block future HUD modifications if the new HUD isn't empty
if new_elems[1] then
data[3] = true
minetest.after(0.05, reshow_hud, name, formname, data)
end
if DEBUG then
minetest.chat_send_player(name, "[DEBUG] Sent " ..
resend_packets .. " packet(s) resending entire HUD")
@ -438,6 +464,12 @@ function hud_fs.show_hud(player, formname, formspec)
removed = removed + 1
end
-- Only block future HUD modifications if any elements have been added
if proto_ver < 40 and added > 0 then
data[3] = true
minetest.after(0.05, reshow_hud, name, formname, data)
end
if DEBUG then
local packets = modify_packets + replaced * 2 + added + removed
minetest.chat_send_player(name, "[DEBUG] Sent " .. packets ..