+ GREATLY reduced arena reset duration
+ Using VoxelManip to detect the nodes with an inventory on enablemaster
parent
12986e69ff
commit
5a9f31ffb0
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue