diff --git a/_arena_lib/arena_callbacks.lua b/_arena_lib/arena_callbacks.lua index afd4f45..4586e9c 100644 --- a/_arena_lib/arena_callbacks.lua +++ b/_arena_lib/arena_callbacks.lua @@ -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) diff --git a/_map_handler/map_reset.lua b/_map_handler/map_reset.lua index d9d284d..0c581bc 100644 --- a/_map_handler/map_reset.lua +++ b/_map_handler/map_reset.lua @@ -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 diff --git a/_map_handler/map_saving.lua b/_map_handler/map_saving.lua index 39ba560..e03f480 100644 --- a/_map_handler/map_saving.lua +++ b/_map_handler/map_saving.lua @@ -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