	local m = peripheral.find "modem"
local CHAN = 7101
m.open(CHAN)

local function send(ms) m.transmit(CHAN, CHAN, ms) end

local function receive()
	while true do
		local _, _, c, rc, ms = os.pullEvent "modem_message"
		if type(ms) == "table" then
			return ms
		end
	end
end

local nodes = {}

parallel.waitForAny(function()
	send { "ping" }
	while true do
		local ty, id = unpack(receive())
		if ty == "pong" then
			print(id, "detected")
			table.insert(nodes, id)
		end
	end
end, function() sleep(0.5) end)

local d_min = {202, 65, 231}
local d_max = {202 + 63, 65 + 63, 231 + 63}
local block = "botania:managlass"

local eqn = ...
local fn, err = load(("local x, y, z = ...; return %s"):format(eqn), "=eqn", "t", math)
if not fn then error("syntax error: " .. err, 0) end

print(#nodes, "nodes are available")

local x_range = d_max[1] - d_min[1] + 1
local split = math.floor(x_range / #nodes)

local commands = {}
local x_acc = d_min[1]
for k, v in ipairs(nodes) do
	local x_size = split
	if k == #nodes then
		x_size = x_range - ((#nodes - 1) * split)
	end
	local t = x_acc
	x_acc = x_acc + x_size
	send {"plot", {
		x_min = d_min[1], x_max = d_max[1],
		y_min = d_min[2], y_max = d_max[2],
		z_min = d_min[3], z_max = d_max[3],
		x_mod = #nodes, x_mod_eq = k - 1,
		block = block,
		equation = eqn,
		id = v,
		f_min = d_min,
		f_max = d_max
	}}
end

local responses = {}
while #responses ~= #nodes do
	local m = receive()
	if m[1] == "response" then
		table.insert(responses, m[2])
		print("response from", m[2].id, m[2].response)
	end
end

print "Plot plotted."