+ GREATLY reduced arena reset duration

+ Using VoxelManip to detect the nodes with an inventory on enable
master
Giov4 2021-02-04 15:54:20 +01:00
parent 12986e69ff
commit 5a9f31ffb0
3 changed files with 36 additions and 21 deletions

View File

@ -167,10 +167,12 @@ arena_lib.on_enable("skywars", function(arena, pl_name)
if not fast_enable then
skywars.print_msg(pl_name, skywars.T("The enabling process may take a few moments, please wait..."))
skywars.save_nodes_with_inventories(arena)
else
-- arena_lib, usually, sends this message using pl_name passed in the enable function.
-- but, since there's a "@" at the end of it, it won't get recognized.
skywars.print_msg(pl_name, arena_lib_translator("Arena @1 successfully enabled", arena.name))
end
skywars.print_msg(pl_name, arena_lib_translator("Arena @1 successfully enabled", arena.name))
return true
end)

View File

@ -1,6 +1,9 @@
local function delete_drops() end
local function async_reset_map() end
local function reset_node_inventory() end
local deserialize = minetest.deserialize
local add_node = minetest.add_node
local get_node = minetest.get_node
local on_step = minetest.registered_entities["__builtin:item"].on_step
minetest.registered_entities["__builtin:item"].match_id = -2
@ -59,8 +62,8 @@ function async_reset_map(arena, debug, recursive_data)
arena.is_resetting = true
for serialized_pos, node in pairs(original_nodes_to_reset) do
if current_index > last_index then
local pos = minetest.deserialize(serialized_pos)
minetest.add_node(pos, node)
local pos = deserialize(serialized_pos)
add_node(pos, node)
reset_node_inventory(pos)
end
-- If more than nodes_per_tick nodes have been reset this cycle.
@ -95,8 +98,8 @@ function async_reset_map(arena, debug, recursive_data)
end
local old_node = original_nodes_to_reset[serialized_pos]
local pos = minetest.deserialize(serialized_pos)
local current_node = minetest.get_node(pos)
local pos = deserialize(serialized_pos)
local current_node = get_node(pos)
local is_old_node_still_reset = (current_node.name == old_node.name)
-- Checking if the node was modified again DURING the reset process but

View File

@ -68,26 +68,41 @@ end
function skywars.save_nodes_with_inventories(arena)
local maps = skywars.load_table("maps")
skywars.load_mapblocks(arena)
local maps = skywars.load_table("maps")
local manip = minetest.get_voxel_manip()
local emerged_pos1, emerged_pos2 = manip:read_from_map(arena.min_pos, arena.max_pos)
local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2})
local nodes = manip:get_data()
local get_inventory = minetest.get_inventory
local get_name_from_content_id = minetest.get_name_from_content_id
local serialize = minetest.serialize
local get_node = minetest.get_node
initialize_map_data(maps, arena)
maps[arena.name].always_to_be_reset_nodes = {}
skywars.overwrite_table("maps", maps)
skywars.iterate_area_nodes(arena.min_pos, arena.max_pos, function(node, node_pos)
-- Saving every node with an inventory.
for i in area:iterp(emerged_pos1, emerged_pos2) do
local node_pos = area:position(i)
local location = {type="node", pos=node_pos}
local node_inv = minetest.get_inventory(location)
if node_inv then
save_node(arena, node_pos, node, "has_inventory")
if get_inventory(location) then
local node = get_node(node_pos)
local serialized_pos = serialize(node_pos)
maps[arena.name].always_to_be_reset_nodes[serialized_pos] = true
maps[arena.name].changed_nodes[serialized_pos] = node
end
end)
end
skywars.overwrite_table("maps", maps)
end
function save_node(arena, pos, node, has_inventory)
function save_node(arena, pos, node)
local maps = skywars.load_table("maps")
local serialized_pos = minetest.serialize(pos)
@ -97,13 +112,8 @@ function save_node(arena, pos, node, has_inventory)
-- If this block has not been changed yet then save it.
if maps[arena.name].changed_nodes[serialized_pos] == nil then
maps[arena.name].changed_nodes[serialized_pos] = node
skywars.overwrite_table("maps", maps)
end
if has_inventory then
maps[arena.name].always_to_be_reset_nodes[serialized_pos] = true
end
skywars.overwrite_table("maps", maps)
end