map_saving.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. local function save_node() end
  2. local get_inventory = minetest.get_inventory
  3. local hash_node_position = minetest.hash_node_position
  4. minetest.register_on_placenode(function(pos, newnode, player, oldnode)
  5. local pl_name = player:get_player_name()
  6. local arena = arena_lib.get_arena_by_player(pl_name)
  7. if arena_lib.get_mod_by_player(pl_name) ~= "skywars" then return end
  8. save_node(arena, pos, oldnode)
  9. if not arena then
  10. arena = skywars.get_arena_by_pos(pos)
  11. if arena and arena.enabled then
  12. save_node(arena, pos, oldnode)
  13. end
  14. end
  15. end)
  16. minetest.register_on_dignode(function(pos, oldnode, player)
  17. local pl_name = player:get_player_name()
  18. local arena = arena_lib.get_arena_by_player(pl_name)
  19. if arena_lib.get_mod_by_player(pl_name) ~= "skywars" then return end
  20. save_node(arena, pos, oldnode)
  21. if arena == nil then
  22. arena = skywars.get_arena_by_pos(pos)
  23. if arena and arena.enabled then
  24. save_node(arena, pos, oldnode)
  25. end
  26. end
  27. end)
  28. -- Minetest functions overrides.
  29. local set_node = minetest.set_node
  30. local get_node = minetest.get_node
  31. function minetest.set_node(pos, node)
  32. local arena = skywars.get_arena_by_pos(pos)
  33. local oldnode = get_node(pos)
  34. if arena and arena.enabled then
  35. save_node(arena, pos, oldnode)
  36. end
  37. return set_node(pos, node)
  38. end
  39. function minetest.add_node(pos, node)
  40. minetest.set_node(pos, node)
  41. end
  42. function minetest.remove_node(pos)
  43. minetest.set_node(pos, {name="air"})
  44. end
  45. local swap_node = minetest.swap_node
  46. function minetest.swap_node(pos, node)
  47. local arena = skywars.get_arena_by_pos(pos)
  48. local oldnode = minetest.get_node(pos)
  49. if arena and arena.enabled then
  50. save_node(arena, pos, oldnode)
  51. end
  52. return swap_node(pos, node)
  53. end
  54. function skywars.save_nodes_with_inventories(arena)
  55. skywars.load_mapblocks(arena)
  56. local maps = skywars.load_table("maps")
  57. local manip = minetest.get_voxel_manip()
  58. local emerged_pos1, emerged_pos2 = manip:read_from_map(arena.min_pos, arena.max_pos)
  59. local emerged_area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2})
  60. local original_area = VoxelArea:new({MinEdge=arena.min_pos, MaxEdge=arena.max_pos})
  61. local get_inventory = minetest.get_inventory
  62. local hash_node_position = minetest.hash_node_position
  63. local get_node = minetest.get_node
  64. initialize_map_data(maps, arena)
  65. local map = maps[arena.name]
  66. map.always_to_be_reset_nodes = {}
  67. map.changed_nodes = {}
  68. -- Saving every node with an inventory.
  69. for i in emerged_area:iterp(emerged_pos1, emerged_pos2) do
  70. local node_pos = emerged_area:position(i)
  71. local hash_pos = hash_node_position(node_pos)
  72. local location = {type = "node", pos = node_pos}
  73. if original_area:containsp(node_pos) and get_inventory(location) then
  74. local node = get_node(node_pos)
  75. map.always_to_be_reset_nodes[hash_pos] = true
  76. map.changed_nodes[hash_pos] = node
  77. end
  78. end
  79. skywars.overwrite_table("maps", maps)
  80. end
  81. function save_node(arena, pos, node)
  82. local maps = skywars.load_table("maps")
  83. local hash_pos = hash_node_position(vector.round(pos))
  84. if not arena then return end
  85. initialize_map_data(maps, arena)
  86. -- If this node has not been changed yet then save it.
  87. if not maps[arena.name].changed_nodes[hash_pos] then
  88. maps[arena.name].changed_nodes[hash_pos] = node
  89. skywars.overwrite_table("maps", maps)
  90. end
  91. end
  92. function initialize_map_data(maps, arena)
  93. if not maps then maps = {} end
  94. if not maps[arena.name] then maps[arena.name] = {} end
  95. if not maps[arena.name].changed_nodes then maps[arena.name].changed_nodes = {} end
  96. if not maps[arena.name].always_to_be_reset_nodes then maps[arena.name].always_to_be_reset_nodes = {} end
  97. end