pointed_node.lua 2.1 KB

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