rewrote autoplacement code to make it more aware of filters,

autocrafter, nodebreaker, deployer, and made sure each item will only
initiate a connection to those sides which can accept such.  Fixed
various autorouting bugs as I ran across them.  Autorouting for various
devices is now:

filters: left and right sides only
nodebreaker, deployer:  back only
autocrafter:  all six sides
chests:  top, bottom, left, right, back (not front)
furnace: bottom, left, right, back (not the top or front)
This commit is contained in:
Vanessa Ezekowitz 2013-06-23 21:36:13 -04:00
parent 5537257185
commit 3a0fd39bf6
5 changed files with 269 additions and 98 deletions

View File

@ -71,11 +71,15 @@ minetest.register_node("pipeworks:autocrafter",{
local meta = minetest.env:get_meta(pos); local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory() local inv = meta:get_inventory()
return (inv:is_empty("src") and inv:is_empty("recipe") and inv:is_empty("dst")) return (inv:is_empty("src") and inv:is_empty("recipe") and inv:is_empty("dst"))
end}) end,
after_place_node = tube_scanforobjects,
after_dig_node = tube_scanforobjects,
})
minetest.register_abm({nodenames={"pipeworks:autocrafter"},interval=1,chance=1, minetest.register_abm({nodenames={"pipeworks:autocrafter"},interval=1,chance=1,
action=function(pos,node) action=function(pos,node)
local meta=minetest.env:get_meta(pos) local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
autocraft(inv) autocraft(inv)
end}) end
})

View File

@ -32,6 +32,8 @@ end
-- autorouting for pneumatic tubes -- autorouting for pneumatic tubes
function tube_scanforobjects(pos) function tube_scanforobjects(pos)
if pos == nil then return end
print("tubes_scanforobjects called at pos "..dump(pos))
tube_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }) tube_autoroute({ x=pos.x-1, y=pos.y , z=pos.z })
tube_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }) tube_autoroute({ x=pos.x+1, y=pos.y , z=pos.z })
tube_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }) tube_autoroute({ x=pos.x , y=pos.y-1, z=pos.z })
@ -53,37 +55,187 @@ function is_tube(nodename)
end end
function tube_autoroute(pos) function tube_autoroute(pos)
nctr = minetest.env:get_node(pos) local pxm=0
--print ("minetest.get_item_group("..nctr.name..',"tubedevice") == '..minetest.get_item_group(nctr.name, "tubedevice")) local pxp=0
if (is_tube(nctr.name) == nil) local pym=0
and minetest.get_item_group(nctr.name, "tubedevice") ~= 1 then return end local pyp=0
local pzm=0
local pzp=0
pxm=0 local nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y , z=pos.z })
pxp=0 local nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y , z=pos.z })
pym=0 local nym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z })
pyp=0 local nyp = minetest.env:get_node({ x=pos.x , y=pos.y+1, z=pos.z })
pzm=0 local nzm = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z-1 })
pzp=0 local nzp = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z+1 })
nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y , z=pos.z }) local nctr = minetest.env:get_node(pos)
nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y , z=pos.z })
nym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z })
nyp = minetest.env:get_node({ x=pos.x , y=pos.y+1, z=pos.z })
nzm = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z-1 })
nzp = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z+1 })
if is_tube(nxm.name) -- handle the tubes themselves
or minetest.get_item_group(nxm.name, "tubedevice") == 1 then pxm=1 end
if is_tube(nxp.name) if is_tube(nxm.name) then pxm=1 end
or minetest.get_item_group(nxp.name, "tubedevice") == 1 then pxp=1 end if is_tube(nxp.name) then pxp=1 end
if is_tube(nym.name) if is_tube(nym.name) then pym=1 end
or minetest.get_item_group(nym.name, "tubedevice") == 1 then pym=1 end if is_tube(nyp.name) then pyp=1 end
if is_tube(nyp.name) if is_tube(nzm.name) then pzm=1 end
or minetest.get_item_group(nyp.name, "tubedevice") == 1 then pyp=1 end if is_tube(nzp.name) then pzp=1 end
if is_tube(nzm.name)
or minetest.get_item_group(nzm.name, "tubedevice") == 1 then pzm=1 end -- handle regular filters
if is_tube(nzp.name)
or minetest.get_item_group(nzp.name, "tubedevice") == 1 then pzp=1 end if string.find(nxm.name, "pipeworks:filter") ~= nil
and (nxm.param2 == 0 or nxm.param2 == 2) then
pxm=1 end
if string.find(nxp.name, "pipeworks:filter") ~= nil
and (nxp.param2 == 0 or nxp.param2 == 2) then
pxp=1 end
if string.find(nzm.name, "pipeworks:filter") ~= nil
and (nzm.param2 == 1 or nzm.param2 == 3) then
pzm=1 end
if string.find(nzp.name, "pipeworks:filter") ~= nil
and (nzp.param2 == 1 or nzp.param2 == 3) then
pzp=1 end
-- handle mese filters
if string.find(nxm.name, "pipeworks:mese_filter") ~= nil
and (nxm.param2 == 0 or nxm.param2 == 2) then
pxm=1 end
if string.find(nxp.name, "pipeworks:mese_filter") ~= nil
and (nxp.param2 == 0 or nxp.param2 == 2) then
pxp=1 end
if string.find(nzm.name, "pipeworks:mese_filter") ~= nil
and (nzm.param2 == 1 or nzm.param2 == 3) then
pzm=1 end
if string.find(nzp.name, "pipeworks:mese_filter") ~= nil
and (nzp.param2 == 1 or nzp.param2 == 3) then
pzp=1 end
-- handle deployers
if string.find(nxm.name, "pipeworks:deployer_") ~= nil
and nxm.param2 == 1 then
pxm=1 end
if string.find(nxp.name, "pipeworks:deployer_") ~= nil
and nxp.param2 == 3 then
pxp=1 end
if string.find(nzm.name, "pipeworks:deployer_") ~= nil
and nzm.param2 == 0 then
pzm=1 end
if string.find(nzp.name, "pipeworks:deployer_") ~= nil
and nzp.param2 == 2 then
pzp=1 end
--node breakers
if string.find(nxm.name, "pipeworks:nodebreaker_") ~= nil
and nxm.param2 == 1 then
pxm=1 end
if string.find(nxp.name, "pipeworks:nodebreaker_") ~= nil
and nxp.param2 == 3 then
pxp=1 end
if string.find(nzm.name, "pipeworks:nodebreaker_") ~= nil
and nzm.param2 == 0 then
pzm=1 end
if string.find(nzp.name, "pipeworks:nodebreaker_") ~= nil
and nzp.param2 == 2 then
pzp=1 end
-- autocrafter
if string.find(nxm.name, "pipeworks:autocrafter") ~= nil then pxm = 1 end
if string.find(nxp.name, "pipeworks:autocrafter") ~= nil then pxp = 1 end
if string.find(nym.name, "pipeworks:autocrafter") ~= nil then pym = 1 end
if string.find(nyp.name, "pipeworks:autocrafter") ~= nil then pyp = 1 end
if string.find(nzm.name, "pipeworks:autocrafter") ~= nil then pzm = 1 end
if string.find(nzp.name, "pipeworks:autocrafter") ~= nil then pzp = 1 end
--chests
-- check for left/right connects
if string.find(nxm.name, "default:chest") ~= nil
and (nxm.param2 == 0 or nxm.param2 == 2) then
pxm=1 end
if string.find(nxp.name, "default:chest") ~= nil
and (nxp.param2 == 0 or nxp.param2 == 2) then
pxp=1 end
if string.find(nzm.name, "default:chest") ~= nil
and (nzm.param2 == 1 or nzm.param2 == 3) then
pzm=1 end
if string.find(nzp.name, "default:chest") ~= nil
and (nzp.param2 == 1 or nzp.param2 == 3) then
pzp=1 end
-- check for backside connects
if string.find(nxm.name, "default:chest") ~= nil
and nxm.param2 == 1 then
pxm = 1 end
if string.find(nxp.name, "default:chest") ~= nil
and nxp.param2 == 3 then
pxp = 1 end
if string.find(nzm.name, "default:chest") ~= nil
and nzm.param2 == 0 then
pzm = 1 end
if string.find(nzp.name, "default:chest") ~= nil
and nzp.param2 == 2 then
pzp = 1 end
-- check for top/bottom connections
if string.find(nym.name, "default:chest") ~= nil then pym = 1 end
if string.find(nyp.name, "default:chest") ~= nil then pyp = 1 end
-- does not scan for the front side of the node.
--chests
-- check for left/right connects
if string.find(nxm.name, "default:furnace") ~= nil
and (nxm.param2 == 0 or nxm.param2 == 2) then
pxm=1 end
if string.find(nxp.name, "default:furnace") ~= nil
and (nxp.param2 == 0 or nxp.param2 == 2) then
pxp=1 end
if string.find(nzm.name, "default:furnace") ~= nil
and (nzm.param2 == 1 or nzm.param2 == 3) then
pzm=1 end
if string.find(nzp.name, "default:furnace") ~= nil
and (nzp.param2 == 1 or nzp.param2 == 3) then
pzp=1 end
-- check for backside connects
if string.find(nxm.name, "default:furnace") ~= nil
and nxm.param2 == 1 then
pxm = 1 end
if string.find(nxp.name, "default:furnace") ~= nil
and nxp.param2 == 3 then
pxp = 1 end
if string.find(nzm.name, "default:furnace") ~= nil
and nzm.param2 == 0 then
pzm = 1 end
if string.find(nzp.name, "default:furnace") ~= nil
and nzp.param2 == 2 then
pzp = 1 end
-- check for bottom connection
if string.find(nyp.name, "default:furnace") ~= nil then pyp = 1 end
-- does not scan for the front or top side of the node.
-- Apply the final routing decisions to the existing tube (if any)
nsurround = pxm..pxp..pym..pyp..pzm..pzp nsurround = pxm..pxp..pym..pyp..pzm..pzp
if is_tube(nctr.name) then if is_tube(nctr.name) then

View File

@ -10,9 +10,9 @@ function clone_node(name)
end end
furnace=clone_node("default:furnace") furnace=clone_node("default:furnace")
furnace.groups.tubedevice=1 furnace.groups.tubedevice=1
furnace.groups.tubedevice_receiver=1 furnace.groups.tubedevice_receiver=1
furnace.tube={insert_object=function(pos,node,stack,direction) furnace.tube={insert_object = function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos) local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
if direction.y==1 then if direction.y==1 then
@ -21,73 +21,79 @@ furnace.tube={insert_object=function(pos,node,stack,direction)
return inv:add_item("src",stack) return inv:add_item("src",stack)
end end
end, end,
can_insert=function(pos,node,stack,direction) can_insert=function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos) local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
if direction.y==1 then if direction.y==1 then
return inv:room_for_item("fuel",stack) return inv:room_for_item("fuel",stack)
elseif direction.y==-1 then elseif direction.y==-1 then
return inv:room_for_item("src",stack) return inv:room_for_item("src",stack)
else else
return 0 return 0
end end
end, end,
input_inventory="dst"} input_inventory="dst"}
furnace.after_place_node= function(pos) furnace.after_place_node= function(pos)
tube_scanforobjects(pos) tube_scanforobjects(pos)
end end
furnace.after_dig_node = function(pos) furnace.after_dig_node = function(pos)
tube_scanforobjects(pos) tube_scanforobjects(pos)
end end
minetest.register_node(":default:furnace",furnace) minetest.register_node(":default:furnace",furnace)
furnace=clone_node("default:furnace_active") furnace=clone_node("default:furnace_active")
furnace.groups.tubedevice=1 furnace.groups.tubedevice=1
furnace.groups.tubedevice_receiver=1 furnace.groups.tubedevice_receiver=1
furnace.tube={insert_object=function(pos,node,stack,direction) furnace.tube={insert_object=function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos) local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
if direction.y==1 then if direction.y==1 then
return inv:add_item("fuel",stack) return inv:add_item("fuel",stack)
else else
return inv:add_item("src",stack) return inv:add_item("src",stack)
end end
end, end,
can_insert=function(pos,node,stack,direction) can_insert=function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos) local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
if direction.y==1 then if direction.y==1 then
return inv:room_for_item("fuel",stack) return inv:room_for_item("fuel",stack)
elseif direction.y==-1 then elseif direction.y==-1 then
return inv:room_for_item("src",stack) return inv:room_for_item("src",stack)
else else
return 0 return 0
end end
end, end,
input_inventory="dst"} input_inventory="dst"}
furnace.after_place_node= function(pos) furnace.after_place_node= function(pos)
tube_scanforobjects(pos) tube_scanforobjects(pos)
end end
furnace.after_dig_node = function(pos) furnace.after_dig_node = function(pos)
tube_scanforobjects(pos) tube_scanforobjects(pos)
end end
minetest.register_node(":default:furnace_active",furnace) minetest.register_node(":default:furnace_active",furnace)
chest=clone_node("default:chest") chest=clone_node("default:chest")
chest.groups.tubedevice=1 chest.groups.tubedevice=1
chest.groups.tubedevice_receiver=1 chest.groups.tubedevice_receiver=1
chest.tube={insert_object=function(pos,node,stack,direction) chest.tube={insert_object = function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos) local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
return inv:add_item("main",stack) return inv:add_item("main",stack)
end, end,
can_insert=function(pos,node,stack,direction) can_insert=function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos) local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
return inv:room_for_item("main",stack) return inv:room_for_item("main",stack)
end, end,
input_inventory="main"} input_inventory="main"}
chest.after_place_node = tube_scanforobjects(pos) chest.after_place_node = function(pos)
chest.after_dig_node = tube_scanforobjects tube_scanforobjects(pos)
end
chest.after_dig_node = function(pos)
tube_scanforobjects(pos)
end
minetest.register_node(":default:chest",chest) minetest.register_node(":default:chest",chest)

View File

@ -33,6 +33,9 @@ minetest.register_node("pipeworks:filter", {
after_place_node = function(pos) after_place_node = function(pos)
tube_scanforobjects(pos) tube_scanforobjects(pos)
end, end,
after_dig_node = function(pos)
tube_scanforobjects(pos)
end,
mesecons={effector={action_on=function(pos,node) mesecons={effector={action_on=function(pos,node)
minetest.registered_nodes[node.name].on_punch(pos,node,nil) minetest.registered_nodes[node.name].on_punch(pos,node,nil)
end}}, end}},
@ -125,6 +128,12 @@ minetest.register_node("pipeworks:mese_filter", {
local inv = meta:get_inventory() local inv = meta:get_inventory()
return inv:is_empty("main") return inv:is_empty("main")
end, end,
after_place_node = function(pos)
tube_scanforobjects(pos)
end,
after_dig_node = function(pos)
tube_scanforobjects(pos)
end,
mesecons={effector={action_on=function(pos,node) mesecons={effector={action_on=function(pos,node)
minetest.registered_nodes[node.name].on_punch(pos,node,nil) minetest.registered_nodes[node.name].on_punch(pos,node,nil)
end}}, end}},

View File

@ -108,4 +108,4 @@ minetest.register_node("pipeworks:nodebreaker_on", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
after_place_node = tube_scanforobjects, after_place_node = tube_scanforobjects,
after_dig_node = tube_scanforobjects, after_dig_node = tube_scanforobjects,
}) })