microexpansion/modules/network/init.lua

113 lines
2.6 KiB
Lua

local me = microexpansion
me.networks = {}
local networks = me.networks
local path = microexpansion.get_module_path("network")
-- load Resources
dofile(path.."/network.lua") -- Network Management
-- generate iterator to find all connected nodes
function me.connected_nodes(start_pos)
-- nodes to be checked
local open_list = {start_pos}
-- nodes that were checked
local closed_set = {}
-- local connected nodes function to reduce table lookups
local adjacent_connected_nodes = me.network.adjacent_connected_nodes
-- return the generated iterator
return function ()
-- start looking for next pos
local open = false
-- pos to be checked
local current_pos
-- find next unclosed
while not open do
-- get unchecked pos
current_pos = table.remove(open_list)
-- none are left
if current_pos == nil then return end
-- assume it's open
open = true
-- check the closed positions
for _,closed in pairs(closed_set) do
-- if current is unclosed
if vector.equals(closed,current_pos) then
--found one was closed
open = false
end
end
end
-- get all connected nodes
local next_pos = adjacent_connected_nodes(current_pos)
-- iterate through them
for _,p in pairs(next_pos) do
-- mark position to be checked
table.insert(open_list,p)
end
-- add this one to the closed set
table.insert(closed_set,current_pos)
-- return the one to be checked
return current_pos
end
end
-- get network connected to position
function me.get_connected_network(start_pos)
for npos in me.connected_nodes(start_pos) do
if me.get_node(npos).name == "microexpansion:ctrl" then
local network = me.get_network(npos)
if network then
return network,npos
end
end
end
end
function me.update_connected_machines(start_pos)
print("updating connected machines")
for npos in me.connected_nodes(start_pos) do
me.update_node(npos)
end
end
function me.get_network(pos)
for i,net in pairs(networks) do
if net.controller_pos then
if vector.equals(pos, net.controller_pos) then
return net,i
end
end
end
end
dofile(path.."/ctrl.lua") -- Controller/wires
-- load networks
function me.load()
local res = io.open(me.worldpath.."/microexpansion.txt", "r")
if res then
res = minetest.deserialize(res:read("*all"))
if type(res) == "table" then
for _,n in pairs(res.networks) do
table.insert(networks,me.network:new(n))
end
end
end
end
-- load now
me.load()
-- save networks
function me.save()
local data = {
networks = networks,
}
io.open(me.worldpath.."/microexpansion.txt", "w"):write(minetest.serialize(data))
end
-- save on server shutdown
minetest.register_on_shutdown(me.save)