Remove disconnected machines after cable is destructed

This commit is contained in:
mrkubax10 2023-11-14 20:49:05 +01:00
parent 42130c90a7
commit 5ea9002630
2 changed files with 71 additions and 50 deletions

98
api.lua
View File

@ -289,10 +289,11 @@ local function clampFlow(pos,flow)
return math.min(flow,newFlow) return math.min(flow,newFlow)
end end
-- \brief Creates network map starting from node at pos -- \brief Creates network map starting from node at pos, optionally omitting node at omit
-- \param pos vector -- \param pos vector
-- \param (optional) omit Vector
-- \returns table with network map -- \returns table with network map
industrialtest.api.createNetworkMap=function(pos) industrialtest.api.createNetworkMap=function(pos,omit)
local workers={} local workers={}
local map={} local map={}
local connections=industrialtest.api.getConnections(pos,"i") local connections=industrialtest.api.getConnections(pos,"i")
@ -302,22 +303,24 @@ industrialtest.api.createNetworkMap=function(pos)
local serializedSourcePos=pos.x..","..pos.y..","..pos.z local serializedSourcePos=pos.x..","..pos.y..","..pos.z
local visitedNodes={[serializedSourcePos]=true} local visitedNodes={[serializedSourcePos]=true}
for _,conn in ipairs(connections) do for _,conn in ipairs(connections) do
visitedNodes[conn.x..","..conn.y..","..conn.z]=true if not omit or conn.x~=omit.x or conn.y~=omit.y or conn.z~=omit.z then
addNodeToNetwork(conn,pos) visitedNodes[conn.x..","..conn.y..","..conn.z]=true
local def=minetest.registered_nodes[minetest.get_node(conn).name] addNodeToNetwork(conn,pos)
if def.groups._industrialtest_cable then local def=minetest.registered_nodes[minetest.get_node(conn).name]
table.insert(workers,{ if def.groups._industrialtest_cable then
position=conn, table.insert(workers,{
distance=1, position=conn,
flow=def._industrialtest_cableFlow distance=1,
}) flow=def._industrialtest_cableFlow
else })
local meta=minetest.get_meta(conn) else
table.insert(map,{ local meta=minetest.get_meta(conn)
position=conn, table.insert(map,{
distance=0, position=conn,
flow=meta:get_int("industrialtest.powerFlow") distance=0,
}) flow=meta:get_int("industrialtest.powerFlow")
})
end
end end
end end
while #workers>0 do while #workers>0 do
@ -331,34 +334,36 @@ industrialtest.api.createNetworkMap=function(pos)
local directionAssigned=false local directionAssigned=false
local foundNewNode=false local foundNewNode=false
for _,conn in ipairs(connections) do for _,conn in ipairs(connections) do
local serializedPos=conn.x..","..conn.y..","..conn.z if not omit or conn.x~=omit.x or conn.y~=omit.y or conn.z~=omit.z then
if not visitedNodes[serializedPos] then local serializedPos=conn.x..","..conn.y..","..conn.z
local def=minetest.registered_nodes[minetest.get_node(conn).name] if not visitedNodes[serializedPos] then
visitedNodes[serializedPos]=true local def=minetest.registered_nodes[minetest.get_node(conn).name]
foundNewNode=true visitedNodes[serializedPos]=true
addNodeToNetwork(conn,pos) foundNewNode=true
if def.groups._industrialtest_cable then addNodeToNetwork(conn,pos)
if directionAssigned then if def.groups._industrialtest_cable then
table.insert(workers,{ if directionAssigned then
table.insert(workers,{
position=conn,
distance=worker.distance+1,
flow=clampFlow(conn,worker.flow)
})
else
worker.position=conn
worker.distance=worker.distance+1
worker.flow=clampFlow(conn,worker.flow)
directionAssigned=true
end
else
table.insert(map,{
position=conn, position=conn,
distance=worker.distance+1, distance=worker.distance,
flow=clampFlow(conn,worker.flow) flow=clampFlow(conn,worker.flow)
}) })
else if #connections==1 then
worker.position=conn table.remove(workers,i)
worker.distance=worker.distance+1 break
worker.flow=clampFlow(conn,worker.flow) end
directionAssigned=true
end
else
table.insert(map,{
position=conn,
distance=worker.distance,
flow=clampFlow(conn,worker.flow)
})
if #connections==1 then
table.remove(workers,i)
break
end end
end end
end end
@ -389,12 +394,13 @@ industrialtest.api.removeNodeFromNetwork=function(pos,nodePos)
end end
end end
-- \brief Creates network map and writes it to node metadata at pos -- \brief Creates network map and writes it to node metadata at pos, optionally omitting node at omit
-- \param pos Vector -- \param pos Vector
-- \param (optional) omit Vector
-- \returns nil -- \returns nil
industrialtest.api.createNetworkMapForNode=function(pos) industrialtest.api.createNetworkMapForNode=function(pos,omit)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local network=industrialtest.api.createNetworkMap(pos) local network=industrialtest.api.createNetworkMap(pos,omit)
meta:set_string("industrialtest.network",minetest.serialize(network)) meta:set_string("industrialtest.network",minetest.serialize(network))
end end

View File

@ -21,15 +21,29 @@ cable.onConstruct=function(pos)
local connections=industrialtest.api.getConnections(pos) local connections=industrialtest.api.getConnections(pos)
for _,conn in ipairs(connections) do for _,conn in ipairs(connections) do
local meta=minetest.get_meta(conn) local meta=minetest.get_meta(conn)
local networks=industrialtest.api.isAttachedToNetwork(meta) if industrialtest.api.isNetworkMaster(meta) then
if networks then industrialtest.api.createNetworkMapForNode(conn)
for _,network in ipairs(networks) do else
industrialtest.api.createNetworkMapForNode(network) local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
industrialtest.api.createNetworkMapForNode(network)
end
end end
end end
end end
end end
cable.onDestruct=function(pos)
local meta=minetest.get_meta(pos)
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
industrialtest.api.createNetworkMapForNode(network,pos)
end
end
end
local function registerCable(name,displayName,size,flow,registerInsulated) local function registerCable(name,displayName,size,flow,registerInsulated)
local definition={ local definition={
description=S(displayName.." Cable"), description=S(displayName.." Cable"),
@ -104,6 +118,7 @@ local function registerCable(name,displayName,size,flow,registerInsulated)
"group:_industrialtest_cable" "group:_industrialtest_cable"
}, },
on_construct=cable.onConstruct, on_construct=cable.onConstruct,
on_destruct=cable.onDestruct,
_industrialtest_cableFlow=flow _industrialtest_cableFlow=flow
} }
if industrialtest.mtgAvailable then if industrialtest.mtgAvailable then