forked from mtcontrib/pipeworks
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:
parent
5537257185
commit
3a0fd39bf6
@ -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
|
||||||
|
})
|
||||||
|
208
autoplace.lua
208
autoplace.lua
@ -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
|
||||||
|
140
compat.lua
140
compat.lua
@ -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)
|
||||||
|
@ -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}},
|
||||||
|
@ -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,
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user