Remove disconnected machines after cable is destructed
This commit is contained in:
parent
42130c90a7
commit
5ea9002630
98
api.lua
98
api.lua
@ -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
|
||||||
|
|
||||||
|
23
cables.lua
23
cables.lua
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user