safe.lua 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. local safe_region_callback = {}
  2. local safe_region_param = {}
  3. local function check_region(name, param)
  4. local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] --obtain positions
  5. if pos1 == nil or pos2 == nil then
  6. worldedit.player_notify(name, "no region selected")
  7. return nil
  8. end
  9. return worldedit.volume(pos1, pos2)
  10. end
  11. --`callback` is a callback to run when the user confirms
  12. --`nodes_needed` is a function accepting `param`, `pos1`, and `pos2` to calculate the number of nodes needed
  13. local function safe_region(callback, nodes_needed)
  14. --default node volume calculation
  15. nodes_needed = nodes_needed or check_region
  16. return function(name, param)
  17. --check if the operation applies to a safe number of nodes
  18. local count = nodes_needed(name, param)
  19. if count == nil then return end --invalid command
  20. if count < 10000 then
  21. return callback(name, param)
  22. end
  23. --save callback to call later
  24. safe_region_callback[name], safe_region_param[name] = callback, param
  25. worldedit.player_notify(name, "WARNING: this operation could affect up to " .. count .. " nodes; type //y to continue or //n to cancel")
  26. end
  27. end
  28. local function reset_pending(name)
  29. safe_region_callback[name], safe_region_param[name] = nil, nil
  30. end
  31. minetest.register_chatcommand("/y", {
  32. params = "",
  33. description = "Confirm a pending operation",
  34. func = function(name)
  35. local callback, param = safe_region_callback[name], safe_region_param[name]
  36. if not callback then
  37. worldedit.player_notify(name, "no operation pending")
  38. return
  39. end
  40. safe_region_callback[name], safe_region_param[name] = nil, nil --reset pending operation
  41. callback(name, param)
  42. end,
  43. })
  44. minetest.register_chatcommand("/n", {
  45. params = "",
  46. description = "Confirm a pending operation",
  47. func = function(name)
  48. if not safe_region_callback[name] then
  49. worldedit.player_notify(name, "no operation pending")
  50. return
  51. end
  52. safe_region_callback[name], safe_region_param[name] = nil, nil
  53. end,
  54. })
  55. return safe_region, check_region, reset_pending