| | |
| | | return cable_tier[name] |
| | | end |
| | | |
| | | local function clear_networks(pos) |
| | | local function check_connections(pos) |
| | | -- Build a table of all machines |
| | | local machines = {} |
| | | for tier,list in pairs(technic.machines) do |
| | | for k,v in pairs(list) do |
| | | machines[k] = v |
| | | end |
| | | end |
| | | local connections = {} |
| | | local positions = { |
| | | {x=pos.x+1, y=pos.y, z=pos.z}, |
| | | {x=pos.x-1, y=pos.y, z=pos.z}, |
| | |
| | | {x=pos.x, y=pos.y, z=pos.z+1}, |
| | | {x=pos.x, y=pos.y, z=pos.z-1}} |
| | | for _,connected_pos in pairs(positions) do |
| | | local name = minetest.get_node(connected_pos).name |
| | | if machines[name] or technic.get_cable_tier(name) then |
| | | table.insert(connections,connected_pos) |
| | | end |
| | | end |
| | | return connections |
| | | end |
| | | |
| | | local function clear_networks(pos) |
| | | local node = minetest.get_node(pos) |
| | | local meta = minetest.get_meta(pos) |
| | | local placed = node.name ~= "air" |
| | | local positions = check_connections(pos) |
| | | if #positions < 1 then return end |
| | | local dead_end = #positions == 1 |
| | | for _,connected_pos in pairs(positions) do |
| | | local net = technic.cables[minetest.hash_node_position(connected_pos)] |
| | | if net and technic.networks[net] then |
| | | for _,v in pairs(technic.networks[net].all_nodes) do |
| | | local pos1 = minetest.hash_node_position(v) |
| | | technic.cables[pos1] = nil |
| | | if dead_end and placed then |
| | | -- Dead end placed, add it to the network |
| | | -- Get the network |
| | | local network_id = technic.cables[minetest.hash_node_position(positions[1])] |
| | | if not network_id then |
| | | -- We're evidently not on a network, nothing to add ourselves to |
| | | return |
| | | end |
| | | local sw_pos = minetest.get_position_from_hash(network_id) |
| | | sw_pos.y = sw_pos.y + 1 |
| | | local network = technic.networks[network_id] |
| | | local tier = network.tier |
| | | |
| | | -- Actually add it to the (cached) network |
| | | -- This is similar to check_node_subp |
| | | technic.cables[minetest.hash_node_position(pos)] = network_id |
| | | pos.visited = 1 |
| | | if technic.is_tier_cable(name, tier) then |
| | | table.insert(network.all_nodes,pos) |
| | | elseif technic.machines[tier][node.name] then |
| | | meta:set_string(tier.."_network",minetest.pos_to_string(sw_pos)) |
| | | if technic.machines[tier][node.name] == technic.producer then |
| | | table.insert(network.PR_nodes,pos) |
| | | elseif technic.machines[tier][node.name] == technic.receiver then |
| | | table.insert(network.RE_nodes,pos) |
| | | elseif technic.machines[tier][node.name] == technic.producer_receiver then |
| | | table.insert(network.PR_nodes,pos) |
| | | table.insert(network.RE_nodes,pos) |
| | | elseif technic.machines[tier][node.name] == "SPECIAL" and |
| | | (pos.x ~= sw_pos.x or pos.y ~= sw_pos.y or pos.z ~= sw_pos.z) and |
| | | from_below then |
| | | table.insert(network.SP_nodes,pos) |
| | | elseif technic.machines[tier][node.name] == technic.battery then |
| | | table.insert(network.BA_nodes,pos) |
| | | end |
| | | end |
| | | elseif dead_end and not placed then |
| | | -- Dead end removed, remove it from the network |
| | | -- Get the network |
| | | local network_id = technic.cables[minetest.hash_node_position(positions[1])] |
| | | if not network_id then |
| | | -- We're evidently not on a network, nothing to add ourselves to |
| | | return |
| | | end |
| | | local network = technic.networks[network_id] |
| | | |
| | | -- Search for and remove machine |
| | | technic.cables[minetest.hash_node_position(pos)] = nil |
| | | for tblname,table in pairs(network) do |
| | | if tblname ~= "tier" then |
| | | for machinenum,machine in pairs(table) do |
| | | if machine.x == pos.x |
| | | and machine.y == pos.y |
| | | and machine.z == pos.z then |
| | | table[machinenum] = nil |
| | | end |
| | | end |
| | | end |
| | | end |
| | | else |
| | | -- Not a dead end, so the whole network needs to be recalculated |
| | | for _,v in pairs(technic.networks[net].all_nodes) do |
| | | local pos1 = minetest.hash_node_position(v) |
| | | technic.cables[pos1] = nil |
| | | end |
| | | technic.networks[net] = nil |
| | | end |
| | | technic.networks[net] = nil |
| | | end |
| | | end |
| | | end |