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 inv = meta:get_inventory()
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,
action=function(pos,node)
local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory()
autocraft(inv)
end})
end
})

View File

@ -32,6 +32,8 @@ end
-- autorouting for pneumatic tubes
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 , y=pos.y-1, z=pos.z })
@ -53,37 +55,187 @@ function is_tube(nodename)
end
function tube_autoroute(pos)
nctr = minetest.env:get_node(pos)
--print ("minetest.get_item_group("..nctr.name..',"tubedevice") == '..minetest.get_item_group(nctr.name, "tubedevice"))
if (is_tube(nctr.name) == nil)
and minetest.get_item_group(nctr.name, "tubedevice") ~= 1 then return end
local pxm=0
local pxp=0
local pym=0
local pyp=0
local pzm=0
local pzp=0
pxm=0
pxp=0
pym=0
pyp=0
pzm=0
pzp=0
local nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y , z=pos.z })
local nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y , z=pos.z })
local nym = minetest.env:get_node({ x=pos.x , y=pos.y-1, z=pos.z })
local nyp = minetest.env:get_node({ x=pos.x , y=pos.y+1, z=pos.z })
local nzm = minetest.env:get_node({ x=pos.x , y=pos.y , z=pos.z-1 })
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 })
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 })
local nctr = minetest.env:get_node(pos)
if is_tube(nxm.name)
or minetest.get_item_group(nxm.name, "tubedevice") == 1 then pxm=1 end
if is_tube(nxp.name)
or minetest.get_item_group(nxp.name, "tubedevice") == 1 then pxp=1 end
if is_tube(nym.name)
or minetest.get_item_group(nym.name, "tubedevice") == 1 then pym=1 end
if is_tube(nyp.name)
or minetest.get_item_group(nyp.name, "tubedevice") == 1 then pyp=1 end
if is_tube(nzm.name)
or minetest.get_item_group(nzm.name, "tubedevice") == 1 then pzm=1 end
if is_tube(nzp.name)
or minetest.get_item_group(nzp.name, "tubedevice") == 1 then pzp=1 end
-- handle the tubes themselves
if is_tube(nxm.name) then pxm=1 end
if is_tube(nxp.name) then pxp=1 end
if is_tube(nym.name) then pym=1 end
if is_tube(nyp.name) then pyp=1 end
if is_tube(nzm.name) then pzm=1 end
if is_tube(nzp.name) then pzp=1 end
-- handle regular filters
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
if is_tube(nctr.name) then

View File

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

View File

@ -33,6 +33,9 @@ minetest.register_node("pipeworks:filter", {
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)
minetest.registered_nodes[node.name].on_punch(pos,node,nil)
end}},
@ -125,6 +128,12 @@ minetest.register_node("pipeworks:mese_filter", {
local inv = meta:get_inventory()
return inv:is_empty("main")
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)
minetest.registered_nodes[node.name].on_punch(pos,node,nil)
end}},

View File

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