mark.lua 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. --[[
  2. Tube Library
  3. ============
  4. Copyright (C) 2017-2020 Joachim Stolberg
  5. Code derived from wordedit (sfan5, Anthony Zhang (Uberi/Temperest), and Brett O'Donnell (cornernote))
  6. AGPL v3
  7. See LICENSE.txt for more information
  8. mark.lua:
  9. ]]--
  10. local marker_region = {}
  11. function tubelib.unmark_region(name)
  12. if marker_region[name] ~= nil then --marker already exists
  13. --wip: make the area stay loaded somehow
  14. for _, entity in ipairs(marker_region[name]) do
  15. entity:remove()
  16. end
  17. marker_region[name] = nil
  18. end
  19. end
  20. function tubelib.mark_region(name, pos1, pos2)
  21. tubelib.unmark_region(name)
  22. local thickness = 0.2
  23. local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2
  24. local markers = {}
  25. --XY plane markers
  26. for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do
  27. local marker = minetest.add_entity({x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z}, "tubelib:region_cube")
  28. if marker ~= nil then
  29. marker:set_properties({
  30. visual_size={x=sizex * 2, y=sizey * 2},
  31. collisionbox = {-sizex, -sizey, -thickness, sizex, sizey, thickness},
  32. })
  33. marker:get_luaentity().player_name = name
  34. table.insert(markers, marker)
  35. end
  36. end
  37. --YZ plane markers
  38. for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do
  39. local marker = minetest.add_entity({x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5}, "tubelib:region_cube")
  40. if marker ~= nil then
  41. marker:set_properties({
  42. visual_size={x=sizez * 2, y=sizey * 2},
  43. collisionbox = {-thickness, -sizey, -sizez, thickness, sizey, sizez},
  44. })
  45. marker:setyaw(math.pi / 2)
  46. marker:get_luaentity().player_name = name
  47. table.insert(markers, marker)
  48. end
  49. end
  50. marker_region[name] = markers
  51. end
  52. function tubelib.switch_region(name, pos1, pos2)
  53. if marker_region[name] ~= nil then --marker already exists
  54. tubelib.unmark_region(name)
  55. else
  56. tubelib.mark_region(name, pos1, pos2)
  57. end
  58. end
  59. minetest.register_entity(":tubelib:region_cube", {
  60. initial_properties = {
  61. visual = "upright_sprite",
  62. visual_size = {x=1.1, y=1.1},
  63. textures = {"tubelib_cube.png"},
  64. use_texture_alpha = true,
  65. visual_size = {x=10, y=10},
  66. physical = false,
  67. },
  68. on_step = function(self, dtime)
  69. if marker_region[self.player_name] == nil then
  70. self.object:remove()
  71. return
  72. end
  73. end,
  74. on_punch = function(self, hitter)
  75. tubelib.unmark_region(self.player_name)
  76. end,
  77. })