init.lua 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. local modname = minetest.get_current_modname()
  2. local build_helper_node = modname .. ":node"
  3. local KEY = "aux1"
  4. local TIMEOUT = 0.25
  5. local DEFAULT_RANGE = 4
  6. minetest.register_node(build_helper_node, {
  7. description = "Build helper",
  8. groups = {not_in_creative_inventory = 1},
  9. drawtype = "airlike",
  10. paramtype = "light",
  11. pointable = true,
  12. walkable = false,
  13. on_construct = function(pos)
  14. local timer = minetest.get_node_timer(pos)
  15. timer:start(TIMEOUT)
  16. end,
  17. on_timer = function(pos)
  18. minetest.set_node(pos, {name = "air"})
  19. end,
  20. })
  21. local function get_range(player)
  22. local wield = player:get_wielded_item()
  23. local def = wield:get_definition()
  24. if def then
  25. return def.range or DEFAULT_RANGE
  26. else
  27. return DEFAULT_RANGE
  28. end
  29. end
  30. local function get_pointed_thing(player)
  31. local pos = player:get_pos()
  32. local eye_height = player:get_properties().eye_height
  33. pos.y = pos.y + eye_height
  34. local lookdir = vector.multiply(player:get_look_dir(), get_range(player))
  35. local raycast = Raycast(pos, vector.add(pos, lookdir))
  36. local next = raycast:next()
  37. if next and next.ref == player then
  38. next = raycast:next()
  39. end
  40. return next
  41. end
  42. local function place_build_help(player)
  43. local pointed_thing = get_pointed_thing(player)
  44. if not pointed_thing or pointed_thing.type ~= "node" then
  45. return
  46. end
  47. local above = pointed_thing.above
  48. local under = pointed_thing.under
  49. local abovenode = minetest.get_node(above)
  50. local undernode = minetest.get_node(under)
  51. if (abovenode.name == "air") and undernode.name ~= build_helper_node then
  52. minetest.place_node(above, {name = build_helper_node})
  53. elseif undernode.name == build_helper_node then
  54. local timer = minetest.get_node_timer(under)
  55. timer:start(TIMEOUT)
  56. end
  57. end
  58. local timer = 0
  59. minetest.register_globalstep(function(dtime)
  60. timer = timer + dtime
  61. if true or timer > 0.25 then
  62. timer = 0
  63. for i, player in ipairs(minetest.get_connected_players()) do
  64. local ctrl = player:get_player_control()
  65. if ctrl[KEY] then
  66. place_build_help(player)
  67. end
  68. end
  69. end
  70. end)
  71. minetest.register_lbm({
  72. label = "Build helper disappearing",
  73. name = modname .. ":remove_build_helpers",
  74. nodenames = {build_helper_node},
  75. run_at_every_load = true,
  76. action = function(pos, node)
  77. minetest.set_node(pos, {name = "air"})
  78. end
  79. })