pointed_node.lua 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. local MT = minetest
  2. local vMod = vm_lighting_wand
  3. -- returns a noderef only if its still registered (uninstalled mod)
  4. local get_registered_node = function(pos)
  5. local node = MT.get_node_or_nil(pos)
  6. return MT.registered_nodes[node.name] ~= nil and MT.registered_nodes[node.name] or nil
  7. end
  8. local check_groups = function(groups)
  9. if groups == nil then
  10. return true
  11. end
  12. for group, _ in pairs(groups) do
  13. if vMod.is_ignored_group(group) ~= nil then
  14. return false
  15. end
  16. end
  17. return true
  18. end
  19. -- given a player will return where ever the crosshair is pointing upto range limit
  20. vMod.get_pointed_node = function(player, objects, sneak, range)
  21. local result
  22. local eye_height = player:get_properties().eye_height or 1.625
  23. local eye_offset = player:get_eye_offset()
  24. local eye_pos = {
  25. x = eye_offset.x * 0.1,
  26. y = eye_height + eye_offset.y,
  27. z = eye_offset.z * 0.1
  28. }
  29. local pos = vector.add(player:get_pos(), eye_pos)
  30. local dir = player:get_look_dir()
  31. sneak = sneak and player:get_player_control().sneak or false
  32. objects = objects or false
  33. local ray = MT.raycast(pos, vector.add(pos, vector.multiply(dir, range)), objects, sneak)
  34. for pointed_thing in ray do
  35. local node_under = get_registered_node(pointed_thing.under)
  36. -- we found a node, check its not ignored
  37. if node_under ~= nil then
  38. if not vMod.is_ignored_drawtype(node_under.drawtype) and not vMod.is_ignored_name(node_under.name) then
  39. if check_groups(node_under.groups) then
  40. result = {
  41. pos_under = pointed_thing.under,
  42. pos_above = pointed_thing.above,
  43. node_under = node_under,
  44. node_above = get_registered_node(pointed_thing.above)
  45. }
  46. break
  47. end
  48. end
  49. else
  50. -- looks like we found a unknown node - uninstalled mod
  51. result = {
  52. pos_under = pointed_thing.under,
  53. pos_above = pointed_thing.above,
  54. node_under = nil,
  55. node_above = get_registered_node(pointed_thing.above)
  56. }
  57. break
  58. end
  59. end
  60. return result
  61. end