local network = { allow_blackhole = false, } local nodes = {} local active_node = {} function network.register(addr, callback) if nodes[addr] ~= nil then error("Address "..addr.." already registered!") end nodes[addr] = callback active_node = {} table.insert(active_node, addr) end function network.deregister(addr) nodes[addr] = nil end function network.send(addr, port, msg) local callback = nodes[addr] if callback == nil then if not network.allow_blackhole then error("Send message to offline node: "..tostring(addr)) end return nil end local current_node = active_node[#active_node] -- Push target onto node-stack table.insert(active_node, addr) -- print("Sending from "..current_node.." to "..addr..": "..msg) -- print(require("inspect").inspect(active_node)) callback("modem_message", addr, current_node, port, 0, msg) -- Remove again active_node[#active_node] = nil end function network.broadcast(port, msg) local current_node = active_node[#active_node] -- print("Broadcasting from "..current_node) for addr in pairs(nodes) do if addr ~= current_node then network.send(addr, port, msg) end end end function network.set_scene(addr) active_node = {} table.insert(active_node, addr) end function network.get_scene(addr) return active_node[#active_node] end return network