2012-08-24 19:39:29 +02:00
|
|
|
-- autorouting for pneumatic tubes
|
|
|
|
|
2013-12-15 11:35:11 +01:00
|
|
|
local function in_table(table,element)
|
2013-01-16 20:16:14 +01:00
|
|
|
for _,el in ipairs(table) do
|
|
|
|
if el==element then return true end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
2013-12-15 11:35:11 +01:00
|
|
|
local function is_tube(nodename)
|
2013-12-15 11:53:11 +01:00
|
|
|
return in_table(pipeworks.tubenodes,nodename)
|
2013-01-16 20:16:14 +01:00
|
|
|
end
|
|
|
|
|
Multiple updates:
1) Refactor autoplace,
There was a lot of redundant code and like a dozen unneccessary string
scans for every node next to every tube placed! I put it all into
indexed tables and loops instead of bizarre and unexplainable variable
names and copy and pasted code. There was also no support for notifying
a chest when an item has been taken from it by a filter, so I added
something for that.
I also thought it prudent to fall back on the
allow_metadata_inventory_take function should a special can_remove not
exist. In fact if can_insert doesn't exist, it calls
allow_metadata_inventory_put instead.
I also added a thing for allowing pipes to attach to nodes of other
modules, without having to hard code type all those node names into
autoplace.lua. Basically node.tube.collects(i,param2) and i is the
direction from the pipe and param2 is the param2 of what it's pointing
at.
I also abstracted the inscrutable correlation between i and
param2 by trial and error (and the paramwand mod) into understandable
functions. There was no pipeworks namespace so I created it, and put
these functions into pipeworks.collects (as distinguished from a
node.tube.collects function, which uses those functions)
And now it's too late to cart my old clothes to the thrift store,
dangit.
2) My "node.tube.collects" idea might be redundant with the
node.tube.connect_sides thing, though possibly more versatile so I'll
leave it in.
3) I was using node.tube.connects and fancy functions for checking if it's
the sides or top or whatnot, and this connect_side thing came in. This
should make both my way and the way using connect_side work.
Also removed some debugging cruft
2013-10-15 05:45:07 +02:00
|
|
|
if pipeworks == nil then
|
2013-12-21 11:11:36 +01:00
|
|
|
pipeworks = {}
|
Multiple updates:
1) Refactor autoplace,
There was a lot of redundant code and like a dozen unneccessary string
scans for every node next to every tube placed! I put it all into
indexed tables and loops instead of bizarre and unexplainable variable
names and copy and pasted code. There was also no support for notifying
a chest when an item has been taken from it by a filter, so I added
something for that.
I also thought it prudent to fall back on the
allow_metadata_inventory_take function should a special can_remove not
exist. In fact if can_insert doesn't exist, it calls
allow_metadata_inventory_put instead.
I also added a thing for allowing pipes to attach to nodes of other
modules, without having to hard code type all those node names into
autoplace.lua. Basically node.tube.collects(i,param2) and i is the
direction from the pipe and param2 is the param2 of what it's pointing
at.
I also abstracted the inscrutable correlation between i and
param2 by trial and error (and the paramwand mod) into understandable
functions. There was no pipeworks namespace so I created it, and put
these functions into pipeworks.collects (as distinguished from a
node.tube.collects function, which uses those functions)
And now it's too late to cart my old clothes to the thrift store,
dangit.
2) My "node.tube.collects" idea might be redundant with the
node.tube.connect_sides thing, though possibly more versatile so I'll
leave it in.
3) I was using node.tube.connects and fancy functions for checking if it's
the sides or top or whatnot, and this connect_side thing came in. This
should make both my way and the way using connect_side work.
Also removed some debugging cruft
2013-10-15 05:45:07 +02:00
|
|
|
end
|
|
|
|
|
2013-07-19 07:36:55 +02:00
|
|
|
--a function for determining which side of the node we are on
|
Multiple updates:
1) Refactor autoplace,
There was a lot of redundant code and like a dozen unneccessary string
scans for every node next to every tube placed! I put it all into
indexed tables and loops instead of bizarre and unexplainable variable
names and copy and pasted code. There was also no support for notifying
a chest when an item has been taken from it by a filter, so I added
something for that.
I also thought it prudent to fall back on the
allow_metadata_inventory_take function should a special can_remove not
exist. In fact if can_insert doesn't exist, it calls
allow_metadata_inventory_put instead.
I also added a thing for allowing pipes to attach to nodes of other
modules, without having to hard code type all those node names into
autoplace.lua. Basically node.tube.collects(i,param2) and i is the
direction from the pipe and param2 is the param2 of what it's pointing
at.
I also abstracted the inscrutable correlation between i and
param2 by trial and error (and the paramwand mod) into understandable
functions. There was no pipeworks namespace so I created it, and put
these functions into pipeworks.collects (as distinguished from a
node.tube.collects function, which uses those functions)
And now it's too late to cart my old clothes to the thrift store,
dangit.
2) My "node.tube.collects" idea might be redundant with the
node.tube.connect_sides thing, though possibly more versatile so I'll
leave it in.
3) I was using node.tube.connects and fancy functions for checking if it's
the sides or top or whatnot, and this connect_side thing came in. This
should make both my way and the way using connect_side work.
Also removed some debugging cruft
2013-10-15 05:45:07 +02:00
|
|
|
local function nodeside(node, tubedir)
|
2013-12-11 03:39:47 +01:00
|
|
|
if not tubedir or
|
|
|
|
not node or
|
|
|
|
not (type(node.param2) == "number" and node.param2 > 0 and node.param2 < 23) then
|
|
|
|
return "back"
|
|
|
|
end
|
2013-12-11 03:18:29 +01:00
|
|
|
|
2013-12-21 11:11:36 +01:00
|
|
|
--get a vector pointing back
|
|
|
|
local backdir = minetest.facedir_to_dir(node.param2)
|
|
|
|
|
|
|
|
--check whether the vector is equivalent to the tube direction; if it is, the tube's on the backside
|
|
|
|
if backdir.x == tubedir.x and backdir.y == tubedir.y and backdir.z == tubedir.z then
|
|
|
|
return "back"
|
|
|
|
end
|
|
|
|
|
|
|
|
--check whether the vector is antiparallel with the tube direction; that indicates the front
|
|
|
|
if backdir.x == -tubedir.x and backdir.y == -tubedir.y and backdir.z == -tubedir.z then
|
|
|
|
return "front"
|
|
|
|
end
|
|
|
|
|
|
|
|
--facedir is defined in terms of the top-bottom axis of the node; we'll take advantage of that
|
|
|
|
local topdir = ({[0]={x=0, y=1, z=0},
|
|
|
|
{x=0, y=0, z=1},
|
|
|
|
{x=0, y=0, z=-1},
|
|
|
|
{x=1, y=0, z=0},
|
|
|
|
{x=-1, y=0, z=0},
|
|
|
|
{x=0, y=-1, z=0}})[math.floor(node.param2/4)]
|
|
|
|
|
|
|
|
--is this the top?
|
|
|
|
if topdir.x == tubedir.x and topdir.y == tubedir.y and topdir.z == tubedir.z then
|
|
|
|
return "top"
|
|
|
|
end
|
|
|
|
|
|
|
|
--or the bottom?
|
|
|
|
if topdir.x == -tubedir.x and topdir.y == -tubedir.y and topdir.z == -tubedir.z then
|
|
|
|
return "bottom"
|
|
|
|
end
|
|
|
|
|
|
|
|
--we shall apply some maths to obtain the right-facing vector
|
|
|
|
local rightdir = {x=topdir.y*backdir.z - backdir.y*topdir.z,
|
|
|
|
y=topdir.z*backdir.x - backdir.z*topdir.x,
|
|
|
|
z=topdir.x*backdir.y - backdir.x*topdir.y}
|
|
|
|
|
|
|
|
--is this the right side?
|
|
|
|
if rightdir.x == tubedir.x and rightdir.y == tubedir.y and rightdir.z == tubedir.z then
|
|
|
|
return "right"
|
|
|
|
end
|
|
|
|
|
|
|
|
--or the left?
|
|
|
|
if rightdir.x == -tubedir.x and rightdir.y == -tubedir.y and rightdir.z == -tubedir.z then
|
|
|
|
return "left"
|
|
|
|
end
|
|
|
|
|
|
|
|
--we should be done by now; initiate panic mode
|
|
|
|
minetest.log("error", "nodeside has been confused by its parameters; see pipeworks autoplace_tubes.lua, line 78")
|
Multiple updates:
1) Refactor autoplace,
There was a lot of redundant code and like a dozen unneccessary string
scans for every node next to every tube placed! I put it all into
indexed tables and loops instead of bizarre and unexplainable variable
names and copy and pasted code. There was also no support for notifying
a chest when an item has been taken from it by a filter, so I added
something for that.
I also thought it prudent to fall back on the
allow_metadata_inventory_take function should a special can_remove not
exist. In fact if can_insert doesn't exist, it calls
allow_metadata_inventory_put instead.
I also added a thing for allowing pipes to attach to nodes of other
modules, without having to hard code type all those node names into
autoplace.lua. Basically node.tube.collects(i,param2) and i is the
direction from the pipe and param2 is the param2 of what it's pointing
at.
I also abstracted the inscrutable correlation between i and
param2 by trial and error (and the paramwand mod) into understandable
functions. There was no pipeworks namespace so I created it, and put
these functions into pipeworks.collects (as distinguished from a
node.tube.collects function, which uses those functions)
And now it's too late to cart my old clothes to the thrift store,
dangit.
2) My "node.tube.collects" idea might be redundant with the
node.tube.connect_sides thing, though possibly more versatile so I'll
leave it in.
3) I was using node.tube.connects and fancy functions for checking if it's
the sides or top or whatnot, and this connect_side thing came in. This
should make both my way and the way using connect_side work.
Also removed some debugging cruft
2013-10-15 05:45:07 +02:00
|
|
|
end
|
|
|
|
|
2013-12-15 11:35:11 +01:00
|
|
|
local function tube_autoroute(pos)
|
Multiple updates:
1) Refactor autoplace,
There was a lot of redundant code and like a dozen unneccessary string
scans for every node next to every tube placed! I put it all into
indexed tables and loops instead of bizarre and unexplainable variable
names and copy and pasted code. There was also no support for notifying
a chest when an item has been taken from it by a filter, so I added
something for that.
I also thought it prudent to fall back on the
allow_metadata_inventory_take function should a special can_remove not
exist. In fact if can_insert doesn't exist, it calls
allow_metadata_inventory_put instead.
I also added a thing for allowing pipes to attach to nodes of other
modules, without having to hard code type all those node names into
autoplace.lua. Basically node.tube.collects(i,param2) and i is the
direction from the pipe and param2 is the param2 of what it's pointing
at.
I also abstracted the inscrutable correlation between i and
param2 by trial and error (and the paramwand mod) into understandable
functions. There was no pipeworks namespace so I created it, and put
these functions into pipeworks.collects (as distinguished from a
node.tube.collects function, which uses those functions)
And now it's too late to cart my old clothes to the thrift store,
dangit.
2) My "node.tube.collects" idea might be redundant with the
node.tube.connect_sides thing, though possibly more versatile so I'll
leave it in.
3) I was using node.tube.connects and fancy functions for checking if it's
the sides or top or whatnot, and this connect_side thing came in. This
should make both my way and the way using connect_side work.
Also removed some debugging cruft
2013-10-15 05:45:07 +02:00
|
|
|
local active = {0, 0, 0, 0, 0, 0}
|
2013-12-21 11:11:36 +01:00
|
|
|
local nctr = minetest.get_node(pos)
|
|
|
|
if not is_tube(nctr.name) then return end
|
|
|
|
|
|
|
|
local adjustments = {
|
|
|
|
{ x=-1, y=0, z=0 },
|
|
|
|
{ x=1, y=0, z=0 },
|
|
|
|
{ x=0, y=-1, z=0 },
|
|
|
|
{ x=0, y=1, z=0 },
|
|
|
|
{ x=0, y=0, z=-1 },
|
|
|
|
{ x=0, y=0, z=1 }
|
|
|
|
}
|
|
|
|
-- xm = 1, xp = 2, ym = 3, yp = 4, zm = 5, zp = 6
|
|
|
|
|
|
|
|
local positions = {}
|
|
|
|
local nodes = {}
|
|
|
|
for i,adj in ipairs(adjustments) do
|
|
|
|
positions[i] = {x=pos.x+adj.x, y=pos.y+adj.y, z=pos.z+adj.z}
|
|
|
|
nodes[i] = minetest.get_node(positions[i])
|
|
|
|
end
|
|
|
|
|
|
|
|
for i,node in ipairs(nodes) do
|
|
|
|
local idef = minetest.registered_nodes[node.name]
|
|
|
|
-- handle the tubes themselves
|
|
|
|
if is_tube(node.name) then
|
|
|
|
active[i] = 1
|
|
|
|
-- handle new style connectors
|
|
|
|
elseif idef.tube and idef.tube.connect_sides then
|
|
|
|
local dir = adjustments[i]
|
|
|
|
if idef.tube.connect_sides[nodeside(node, {x=-dir.x, y=-dir.y, z=-dir.z})] then active[i] = 1 end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- all sides checked, now figure which tube to use.
|
Multiple updates:
1) Refactor autoplace,
There was a lot of redundant code and like a dozen unneccessary string
scans for every node next to every tube placed! I put it all into
indexed tables and loops instead of bizarre and unexplainable variable
names and copy and pasted code. There was also no support for notifying
a chest when an item has been taken from it by a filter, so I added
something for that.
I also thought it prudent to fall back on the
allow_metadata_inventory_take function should a special can_remove not
exist. In fact if can_insert doesn't exist, it calls
allow_metadata_inventory_put instead.
I also added a thing for allowing pipes to attach to nodes of other
modules, without having to hard code type all those node names into
autoplace.lua. Basically node.tube.collects(i,param2) and i is the
direction from the pipe and param2 is the param2 of what it's pointing
at.
I also abstracted the inscrutable correlation between i and
param2 by trial and error (and the paramwand mod) into understandable
functions. There was no pipeworks namespace so I created it, and put
these functions into pipeworks.collects (as distinguished from a
node.tube.collects function, which uses those functions)
And now it's too late to cart my old clothes to the thrift store,
dangit.
2) My "node.tube.collects" idea might be redundant with the
node.tube.connect_sides thing, though possibly more versatile so I'll
leave it in.
3) I was using node.tube.connects and fancy functions for checking if it's
the sides or top or whatnot, and this connect_side thing came in. This
should make both my way and the way using connect_side work.
Also removed some debugging cruft
2013-10-15 05:45:07 +02:00
|
|
|
|
2013-12-15 10:35:59 +01:00
|
|
|
local nsurround = ""
|
|
|
|
for i,n in ipairs(active) do
|
|
|
|
nsurround = nsurround .. n
|
|
|
|
end
|
2013-12-21 11:11:36 +01:00
|
|
|
local newname = string.sub(nctr.name, 1, -7)..nsurround
|
2013-12-15 10:35:59 +01:00
|
|
|
if newname == nctr.name then return end
|
|
|
|
nctr.name = newname
|
2013-12-21 11:11:36 +01:00
|
|
|
minetest.swap_node(pos, nctr)
|
2012-08-24 19:39:29 +02:00
|
|
|
end
|
2013-11-26 06:23:14 +01:00
|
|
|
|
2013-12-15 11:35:11 +01:00
|
|
|
function pipeworks.scan_for_tube_objects(pos)
|
|
|
|
if pos == nil then return end
|
|
|
|
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 })
|
|
|
|
tube_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 })
|
|
|
|
tube_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 })
|
|
|
|
tube_autoroute(pos)
|
|
|
|
end
|
|
|
|
|
2013-11-26 06:23:14 +01:00
|
|
|
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
|
|
|
|
if minetest.registered_items[newnode.name]
|
2013-11-26 06:46:36 +01:00
|
|
|
and minetest.registered_items[newnode.name].tube
|
|
|
|
and minetest.registered_items[newnode.name].tube.connect_sides then
|
2013-12-15 08:53:10 +01:00
|
|
|
pipeworks.scan_for_tube_objects(pos)
|
2013-11-26 06:23:14 +01:00
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
minetest.register_on_dignode(function(pos, oldnode, digger)
|
|
|
|
if minetest.registered_items[oldnode.name]
|
2013-11-26 06:46:36 +01:00
|
|
|
and minetest.registered_items[oldnode.name].tube
|
|
|
|
and minetest.registered_items[oldnode.name].tube.connect_sides then
|
2013-12-15 08:53:10 +01:00
|
|
|
pipeworks.scan_for_tube_objects(pos)
|
2013-11-26 06:23:14 +01:00
|
|
|
end
|
|
|
|
end)
|
|
|
|
|