periodically remove one water node next to each "on" pump that's also flowing

This should make it work more or less correctly with finite water.

also, fix a bug where a blocked spigot still looks like its pouring, and check
for blockages on every step.
This commit is contained in:
Vanessa Ezekowitz 2013-05-10 15:59:56 -04:00
parent 8f12d18b1d
commit b0d92dd358
1 changed files with 12 additions and 9 deletions

View File

@ -14,7 +14,10 @@ local check4liquids = function(pos)
{x=pos.x,y=pos.y,z=pos.z+1}, } {x=pos.x,y=pos.y,z=pos.z+1}, }
for i =1,6 do for i =1,6 do
local name = minetest.env:get_node(coords[i]).name local name = minetest.env:get_node(coords[i]).name
if string.find(name,'water') then return true end if string.find(name,'water') then
minetest.env:remove_node(coords[i])
return true
end
end end
return false return false
end end
@ -67,7 +70,8 @@ end
local update_outlet = function(pos) local update_outlet = function(pos)
local top = minetest.env:get_node({x=pos.x,y=pos.y+1,z=pos.z}).name local top = minetest.env:get_node({x=pos.x,y=pos.y+1,z=pos.z}).name
if string.find(top,'_loaded') then if string.find(top,'_loaded') then
if minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name == 'air' then local name = minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name
if name == 'air' or name == "default:water_source" or name == "default:water_flowing" then
minetest.env:add_node({x=pos.x,y=pos.y-1,z=pos.z},{name='default:water_source'}) minetest.env:add_node({x=pos.x,y=pos.y-1,z=pos.z},{name='default:water_source'})
end end
elseif minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name == 'default:water_source' then elseif minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name == 'default:water_source' then
@ -81,14 +85,13 @@ local spigot_check = function(pos,node)
dbg(fdir..' checking '..minetest.pos_to_string(check[fdir+1])..' for spigot at '..minetest.pos_to_string(pos)) dbg(fdir..' checking '..minetest.pos_to_string(check[fdir+1])..' for spigot at '..minetest.pos_to_string(pos))
local top = minetest.env:get_node(check[fdir+1]).name local top = minetest.env:get_node(check[fdir+1]).name
dbg('found '..top) dbg('found '..top)
if string.find(top,'_loaded') then local name = minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name
minetest.env:add_node({x=pos.x,y=pos.y,z=pos.z},{name='pipeworks:spigot_pouring', param2 = fdir}) if string.find(top,'_loaded') and (name == 'air' or name == "default:water_source" or name == "default:water_flowing") then
if minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name == 'air' then minetest.env:add_node({x=pos.x,y=pos.y-1,z=pos.z},{name='default:water_source'})
minetest.env:add_node({x=pos.x,y=pos.y-1,z=pos.z},{name='default:water_source'}) minetest.env:add_node({x=pos.x,y=pos.y,z=pos.z},{name='pipeworks:spigot_pouring', param2 = fdir})
end
else else
minetest.env:add_node({x=pos.x,y=pos.y,z=pos.z},{name='pipeworks:spigot', param2 = fdir}) minetest.env:add_node({x=pos.x,y=pos.y,z=pos.z},{name='pipeworks:spigot', param2 = fdir})
if minetest.env:get_node({x=pos.x,y=pos.y-1,z=pos.z}).name == 'default:water_source' then if name == 'air' or name == "default:water_source" or name == "default:water_flowing" then
minetest.env:remove_node({x=pos.x,y=pos.y-1,z=pos.z}) minetest.env:remove_node({x=pos.x,y=pos.y-1,z=pos.z})
end end
end end