map_utils.lua 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. local get_player_by_name = minetest.get_player_by_name
  2. function skywars.kill_players_out_map(arena)
  3. for pl_name in pairs(arena.players) do
  4. local player = get_player_by_name(pl_name)
  5. local pl_pos = player:get_pos()
  6. local min_pos = vector.add(arena.min_pos, 5)
  7. local max_pos = vector.subtract(arena.max_pos, 5)
  8. local map_area = VoxelArea:new{MinEdge = min_pos, MaxEdge = max_pos}
  9. if not map_area:contains(pl_pos.x, pl_pos.y, pl_pos.z) then
  10. player:set_hp(0)
  11. end
  12. end
  13. end
  14. function skywars.load_mapblocks(arena)
  15. minetest.load_area(arena.min_pos, arena.max_pos)
  16. minetest.emerge_area(arena.min_pos, arena.max_pos)
  17. end
  18. function skywars.iterate_area_nodes(min_pos, max_pos, func)
  19. local get_node = minetest.get_node
  20. for x = 1, max_pos.x - min_pos.x do
  21. for y = 1, max_pos.y - min_pos.y do
  22. for z = 1, max_pos.z - min_pos.z do
  23. local node_pos = {
  24. x = min_pos.x+x,
  25. y = min_pos.y+y,
  26. z = min_pos.z+z
  27. }
  28. local node = get_node(node_pos)
  29. local func_result = func(node, node_pos)
  30. if func_result then return func_result end
  31. end
  32. end
  33. end
  34. end