From 1a9704f1845fa6d6a4d926a4a3f7d85b5b6a8979 Mon Sep 17 00:00:00 2001
From: coil <51716565+coil0@users.noreply.github.com>
Date: Wed, 21 Aug 2019 20:52:33 +0000
Subject: [PATCH] Add digiline commands for operating node detector (#472)
---
.../doc/nodedetector/description.html | 9 ++--
mesecons_detector/init.lua | 47 ++++++++++++++-----
2 files changed, 40 insertions(+), 16 deletions(-)
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,
},