local player_to_id_text = {} -- Storage of players so the mod knows what huds to update minetest.register_globalstep(function(dtime) -- This will run every tick, so around 20 times/second for _, player in ipairs(minetest:get_connected_players()) do -- Do everything below for each player in-game local lookat = get_looking_node(player) -- Get the node they're looking at if lookat then player:hud_change(player_to_id_text[player], "text", describe_node(lookat)) -- If they are looking at something, display that else player:hud_change(player_to_id_text[player], "text", "") -- If they are not looking at anything, do not display the text end end end) minetest.register_on_joinplayer(function(player) -- Add the hud to all players player_to_id_text[player] = player:hud_add({ hud_elem_type = "text", text = "test", number = 0xffffff, direction = 2, position = {x = 0.5, y = 0.1}, alignment = {x = -0.5, y = 0} }) end) function get_looking_node(player) -- Return the node the given player is looking at or nil local lookat for i = 0, 10 do -- 10 is the maximum distance you can point to things in creative mode by default local lookvector = -- This variable will store what node we might be looking at vector.add( -- This add function corrects for the players approximate height vector.add( -- This add function applies the camera's position to the look vector vector.multiply( -- This multiply function adjusts the distance from the camera by the iteration of the loop we're in player:get_look_dir(), i -- Goes from 0 to 10 ), player:get_pos() ), vector.new(0, 1.5, 0) ) lookat = minetest.get_node_or_nil( -- This actually gets the node we might be looking at lookvector ) or lookat if lookat ~= nil and lookat.name ~= "air" and lookat.name ~= "walking_light:light" then break else lookat = nil end -- If we *are* looking at something, stop the loop and continue end return lookat end function describe_node(node) -- Return a string that describes the node and mod local mod, nodename = minetest.registered_nodes[node.name].mod_origin, minetest.registered_nodes[node.name].description mod = remove_unneeded(capitalize(mod)) nodename = remove_unneeded(capitalize(nodename)) return "Name: " .. nodename .. "\n" .. "Mod: " .. mod .. "\n" end function remove_unneeded(str) -- Remove characters like '-' and '_' to make the string look better return str:gsub("[_-]", " ") end function capitalize(str) -- Capitalize every word in a string, looks good for node names return string.gsub(" "..str, "%W%l", string.upper):sub(2) end