Fix handheld maps not displaying in Minetest 5.5.0

The function dynamic_add_media() was changed in incompatible ways in
several minor versions of Minetest, breaking the display of handheld
maps in Minetest 5.5.0. This patch makes handheld maps display there.

The function was blocking with one argument in Minetest 5.3. It was also
blocking in Minetest 5.4, but took an additional argument for a function
to execute once the media had been received. Calling dynamic_add_media()
with a single argument had been deprecated; a function that did nothing
was provided in mcl_maps to satisfy the changed argument requirements.

In Minetest 5.5, dynamic_add_media() was changed to non-blocking. This
introduced a race condition in mcl_maps, where a client often tried to
display a map before it had received the map texture from the server.

Opening an issue on the Minetest issue tracker led to it being closed in
about 20 minutes: <https://github.com/minetest/minetest/issues/11997>
This commit is contained in:
Nils Dagsson Moskopp 2022-02-20 01:04:04 +01:00 committed by cora
parent 3cfa41de6d
commit 6e3f22c1ca
1 changed files with 15 additions and 3 deletions

View File

@ -147,12 +147,24 @@ function mcl_maps.load_map(id)
local texture = "mcl_maps_map_texture_" .. id .. ".tga" local texture = "mcl_maps_map_texture_" .. id .. ".tga"
if not loaded_maps[id] then if not loaded_maps[id] then
if not minetest.features.dynamic_add_media_table then
-- minetest.dynamic_add_media() blocks in
-- Minetest 5.3 and 5.4 until media loads
loaded_maps[id] = true loaded_maps[id] = true
dynamic_add_media(map_textures_path .. texture, function() end) dynamic_add_media(map_textures_path .. texture, function() end)
else
-- minetest.dynamic_add_media() never blocks
-- in Minetest 5.5, callback runs after load
dynamic_add_media(map_textures_path .. texture, function()
loaded_maps[id] = true
end)
end
end end
if loaded_maps[id] then
return texture return texture
end end
end
function mcl_maps.load_map_item(itemstack) function mcl_maps.load_map_item(itemstack)
return mcl_maps.load_map(itemstack:get_meta():get_string("mcl_maps:id")) return mcl_maps.load_map(itemstack:get_meta():get_string("mcl_maps:id"))