diff --git a/mesecons_detector/doc/nodedetector/description.html b/mesecons_detector/doc/nodedetector/description.html index ee8c09d..4c62359 100644 --- a/mesecons_detector/doc/nodedetector/description.html +++ b/mesecons_detector/doc/nodedetector/description.html @@ -1,8 +1,11 @@ The node detector is a receptor. It changes its state when either any node or a specific node is detected. Right-click it to set a nodename to scan for. -It can also receive digiline signals. You can either send "GET" and it will -respond with the detected nodename or you can send any other string and it will -set this string as the node to scan for. +It can also receive digiline signals. For example, you can send +{distance=4, scanname="default:dirt"} +to set distance to 4 and scan for dirt. You can omit either parameter. +There is also a command parameter: {command="get"} will respond +with the detected nodename and {command="scan"} will respond with +a boolean using the distance and nodename of the detector. Nodenames must include the mod they reside in, so for instance default:dirt, not just dirt. The distance parameter specifies how many blocks are between the node detector and the node to detect. Automatic scanning with Mesecons output only works when the detector is in an active block, but Digilines queries always work. diff --git a/mesecons_detector/init.lua b/mesecons_detector/init.lua index fc7d4c3..cdc7f92 100644 --- a/mesecons_detector/init.lua +++ b/mesecons_detector/init.lua @@ -189,28 +189,49 @@ local function node_detector_scan(pos) (frontname ~= "air" and frontname ~= "ignore" and scanname == "") end +local function node_detector_send_node_name(pos, node, channel, meta) + local distance = meta:get_int("distance") + local distance_max = mesecon.setting("node_detector_distance_max", 10) + if distance < 0 then distance = 0 end + if distance > distance_max then distance = distance_max end + local nodename = minetest.get_node( + vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1)) + ).name + + digiline:receptor_send(pos, digiline.rules.default, channel, nodename) +end + -- set player name when receiving a digiline signal on a specific channel local node_detector_digiline = { effector = { action = function(pos, node, channel, msg) local meta = minetest.get_meta(pos) - local distance = meta:get_int("distance") - local distance_max = mesecon.setting("node_detector_distance_max", 10) - if distance < 0 then distance = 0 end - if distance > distance_max then distance = distance_max end - if channel ~= meta:get_string("digiline_channel") then return end - if msg == GET_COMMAND then - local nodename = minetest.get_node( - vector.subtract(pos, vector.multiply(minetest.facedir_to_dir(node.param2), distance + 1)) - ).name - - digiline:receptor_send(pos, digiline.rules.default, channel, nodename) + if type(msg) == "table" then + if msg.distance or msg.scanname then + if msg.distance then + meta:set_string("distance", msg.distance) + end + if msg.scanname then + meta:set_string("scanname", msg.scanname) + end + node_detector_make_formspec(pos) + end + if msg.command == "get" then + node_detector_send_node_name(pos, node, channel, meta) + elseif msg.command == "scan" then + local result = node_detector_scan(pos) + digiline:receptor_send(pos, digiline.rules.default, channel, result) + end else - meta:set_string("scanname", msg) - node_detector_make_formspec(pos) + if msg == GET_COMMAND then + node_detector_send_node_name(pos, node, channel, meta) + else + meta:set_string("scanname", msg) + node_detector_make_formspec(pos) + end end end, },