mirror of
				https://github.com/minetest-mods/mesecons.git
				synced 2025-11-03 20:45:26 +01:00 
			
		
		
		
	Add digiline commands for operating node detector (#472)
This commit is contained in:
		@@ -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
 | 
			
		||||
<code>{distance=4, scanname="default:dirt"}</code>
 | 
			
		||||
to set distance to 4 and scan for dirt. You can omit either parameter.
 | 
			
		||||
There is also a command parameter: <code>{command="get"}</code> will respond
 | 
			
		||||
with the detected nodename and <code>{command="scan"}</code> 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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
	},
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user