summaryrefslogtreecommitdiff
path: root/pipeworks/autoplace_tubes.lua
diff options
context:
space:
mode:
authorVanessa Ezekowitz <vanessaezekowitz@gmail.com>2016-04-01 20:02:19 -0400
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>2016-04-01 21:09:33 -0400
commitda66780a569712c23ae4f2996cfb4608a9f9d69d (patch)
tree217556029a78bc23ad4564720afc86de97228a04 /pipeworks/autoplace_tubes.lua
parent615b22df4d423aded3613db7716943a2f389b047 (diff)
downloaddreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.gz
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.bz2
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.xz
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.zip
copy all standard Dreambuilder mods in from the old subgame
(exactly as last supplied there, updates to these mods will follow later)
Diffstat (limited to 'pipeworks/autoplace_tubes.lua')
-rw-r--r--pipeworks/autoplace_tubes.lua122
1 files changed, 122 insertions, 0 deletions
diff --git a/pipeworks/autoplace_tubes.lua b/pipeworks/autoplace_tubes.lua
new file mode 100644
index 0000000..280bd60
--- /dev/null
+++ b/pipeworks/autoplace_tubes.lua
@@ -0,0 +1,122 @@
+-- autorouting for pneumatic tubes
+
+local function is_tube(nodename)
+ return table.contains(pipeworks.tubenodes, nodename)
+end
+
+--a function for determining which side of the node we are on
+local function nodeside(node, tubedir)
+ if node.param2 < 0 or node.param2 > 23 then
+ node.param2 = 0
+ end
+
+ local backdir = minetest.facedir_to_dir(node.param2)
+ local back = vector.dot(backdir, tubedir)
+ if back == 1 then
+ return "back"
+ elseif back == -1 then
+ return "front"
+ end
+
+ local topdir = minetest.facedir_to_top_dir(node.param2)
+ local top = vector.dot(topdir, tubedir)
+ if top == 1 then
+ return "top"
+ elseif top == -1 then
+ return "bottom"
+ end
+
+ local rightdir = minetest.facedir_to_right_dir(node.param2)
+ local right = vector.dot(rightdir, tubedir)
+ if right == 1 then
+ return "right"
+ else
+ return "left"
+ end
+end
+
+local vts = {0, 3, 1, 4, 2, 5}
+local tube_table = {[0] = 1, 2, 2, 4, 2, 4, 4, 5, 2, 3, 4, 6, 4, 6, 5, 7, 2, 4, 3, 6, 4, 5, 6, 7, 4, 6, 6, 8, 5, 7, 7, 9, 2, 4, 4, 5, 3, 6, 6, 7, 4, 6, 5, 7, 6, 8, 7, 9, 4, 5, 6, 7, 6, 7, 8, 9, 5, 7, 7, 9, 7, 9, 9, 10}
+local tube_table_facedirs = {[0] = 0, 0, 5, 0, 3, 4, 3, 0, 2, 0, 2, 0, 6, 4, 3, 0, 7, 12, 5, 12, 7, 4, 5, 5, 18, 20, 16, 0, 7, 4, 7, 0, 1, 8, 1, 1, 1, 13, 1, 1, 10, 8, 2, 2, 17, 4, 3, 6, 9, 9, 9, 9, 21, 13, 1, 1, 10, 10, 11, 2, 19, 4, 3, 0}
+local function tube_autoroute(pos)
+ local active = {0, 0, 0, 0, 0, 0}
+ 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] = vector.add(pos, adj)
+ 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 and idef.tube and idef.tube.connect_sides then
+ local dir = adjustments[i]
+ if idef.tube.connect_sides[nodeside(node, vector.multiply(dir, -1))] then
+ active[i] = 1
+ end
+ end
+ end
+
+ -- all sides checked, now figure which tube to use.
+
+ local nodedef = minetest.registered_nodes[nctr.name]
+ local basename = nodedef.basename
+ if nodedef.style == "old" then
+ local nsurround = ""
+ for i, n in ipairs(active) do
+ nsurround = nsurround..n
+ end
+ nctr.name = basename.."_"..nsurround
+ elseif nodedef.style == "6d" then
+ local s = 0
+ for i, n in ipairs(active) do
+ if n == 1 then
+ s = s + 2^vts[i]
+ end
+ end
+ nctr.name = basename.."_"..tube_table[s]
+ nctr.param2 = tube_table_facedirs[s]
+ end
+ minetest.swap_node(pos, nctr)
+end
+
+function pipeworks.scan_for_tube_objects(pos)
+ for side = 0, 6 do
+ tube_autoroute(vector.add(pos, directions.side_to_dir(side)))
+ end
+end
+
+function pipeworks.after_place(pos)
+ pipeworks.scan_for_tube_objects(pos)
+end
+
+function pipeworks.after_dig(pos)
+ pipeworks.scan_for_tube_objects(pos)
+end
+
+if minetest.get_modpath("mesecons_mvps") then
+ mesecon.register_on_mvps_move(function(moved_nodes)
+ for _, n in ipairs(moved_nodes) do
+ pipeworks.scan_for_tube_objects(n.pos)
+ pipeworks.scan_for_tube_objects(n.oldpos)
+ end
+ end)
+end
+