forked from mtcontrib/pipeworks
new flow logic: abms.lua: refactor ABM logic into new master ABM, make balance_pressure() take current pressure and return new pressure
This commit is contained in:
parent
608a9a6980
commit
016f9de82f
|
@ -16,7 +16,7 @@ local flowlogic = pipeworks.flowlogic
|
||||||
|
|
||||||
-- register node list for the main logic function.
|
-- register node list for the main logic function.
|
||||||
-- see flowlogic.run() in abms.lua.
|
-- see flowlogic.run() in abms.lua.
|
||||||
--[[
|
|
||||||
local register_flowlogic_abm = function(nodename)
|
local register_flowlogic_abm = function(nodename)
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
nodenames = { nodename },
|
nodenames = { nodename },
|
||||||
|
@ -27,12 +27,13 @@ local register_flowlogic_abm = function(nodename)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
]]
|
register.flowlogic = register_flowlogic_abm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- register a node name for the pressure balancing ABM.
|
-- register a node name for the pressure balancing ABM.
|
||||||
-- currently this only exists as a per-node function to allow nodes to be registered outside pipeworks.
|
-- currently this only exists as a per-node function to allow nodes to be registered outside pipeworks.
|
||||||
|
--[[
|
||||||
local register_abm_balance = function(nodename)
|
local register_abm_balance = function(nodename)
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
nodenames = { nodename },
|
nodenames = { nodename },
|
||||||
|
@ -44,6 +45,7 @@ local register_abm_balance = function(nodename)
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
register.balance = register_abm_balance
|
register.balance = register_abm_balance
|
||||||
|
]]
|
||||||
|
|
||||||
-- register a node for the input ABM.
|
-- register a node for the input ABM.
|
||||||
-- intakefn is run on the node to determine how much water can be taken (and update it's environment accordingly).
|
-- intakefn is run on the node to determine how much water can be taken (and update it's environment accordingly).
|
||||||
|
|
|
@ -65,17 +65,30 @@ local get_pressure_access = function(pos)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
flowlogic.balance_pressure = function(pos, node)
|
|
||||||
-- debuglog("balance_pressure() "..node.name.." at "..pos.x.." "..pos.y.." "..pos.z)
|
|
||||||
-- check the pressure of all nearby nodes, and average it out.
|
|
||||||
-- for the moment, only balance neighbour nodes if it already has a pressure value.
|
|
||||||
-- XXX: maybe this could be used to add fluid behaviour to other mod's nodes too?
|
|
||||||
|
|
||||||
-- unconditionally include self in nodes to average over
|
|
||||||
local pressure = get_pressure_access(pos)
|
flowlogic.run = function(pos, node)
|
||||||
local currentpressure = pressure.get()
|
-- get the current pressure value.
|
||||||
|
local nodepressure = get_pressure_access(pos)
|
||||||
|
local currentpressure = nodepressure.get()
|
||||||
|
|
||||||
|
-- balance pressure with neighbours
|
||||||
|
currentpressure = flowlogic.balance_pressure(pos, node, currentpressure)
|
||||||
|
|
||||||
|
-- set the new pressure
|
||||||
|
nodepressure.set(currentpressure)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
flowlogic.balance_pressure = function(pos, node, currentpressure)
|
||||||
|
-- debuglog("balance_pressure() "..node.name.." at "..pos.x.." "..pos.y.." "..pos.z)
|
||||||
|
-- check the pressure of all nearby flowable nodes, and average it out.
|
||||||
|
|
||||||
-- pressure handles to average over
|
-- pressure handles to average over
|
||||||
local connections = { pressure }
|
local connections = {}
|
||||||
|
-- unconditionally include self in nodes to average over.
|
||||||
|
-- result of averaging will be returned as new pressure for main flow logic callback
|
||||||
local totalv = currentpressure
|
local totalv = currentpressure
|
||||||
local totalc = 1
|
local totalc = 1
|
||||||
|
|
||||||
|
@ -99,6 +112,8 @@ flowlogic.balance_pressure = function(pos, node)
|
||||||
for _, target in ipairs(connections) do
|
for _, target in ipairs(connections) do
|
||||||
target.set(average)
|
target.set(average)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return average
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ register.simple = function(nodename)
|
||||||
pipeworks.flowables.list.simple[nodename] = true
|
pipeworks.flowables.list.simple[nodename] = true
|
||||||
table.insert(pipeworks.flowables.list.simple_nodenames, nodename)
|
table.insert(pipeworks.flowables.list.simple_nodenames, nodename)
|
||||||
if pipeworks.toggles.pressure_logic then
|
if pipeworks.toggles.pressure_logic then
|
||||||
abmregister.balance(nodename)
|
abmregister.flowlogic(nodename)
|
||||||
end
|
end
|
||||||
regwarning("simple", nodename)
|
regwarning("simple", nodename)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user