Add 6d tubes, cleanup code a bit
authorNovatux <nathanael.courant@laposte.net>
Tue, 31 Dec 2013 06:36:04 +0000 (07:36 +0100)
committerNovatux <nathanael.courant@laposte.net>
Tue, 31 Dec 2013 12:54:13 +0000 (13:54 +0100)
autoplace_tubes.lua
models.lua
tubes.lua

index ba181c013657e48cfaa8f3bd0fa9b68bcf4c32cb..874b3e676944ff395fac82ddb0f9fbc39a794243 100644 (file)
@@ -69,6 +69,9 @@ local function nodeside(node, tubedir)
        minetest.log("error", "nodeside has been confused by its parameters; see pipeworks autoplace_tubes.lua, line 78")
 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)
@@ -105,13 +108,25 @@ local function tube_autoroute(pos)
 
        -- all sides checked, now figure which tube to use.
 
-       local nsurround = ""
-       for i,n in ipairs(active) do
-               nsurround = nsurround .. n
+       local nodedef = minetest.registered_nodes[nctr.name]
+       local basename = nodedef.basename
+       local newname
+       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
-       local newname = string.sub(nctr.name, 1, -7)..nsurround
-       if newname == nctr.name then return end
-       nctr.name = newname
        minetest.swap_node(pos, nctr)
 end
 
index f8ca219d1ea8e8f98a29790dec505af94ecdd5bc..5cf55364fc00945639fee4a375c5f6fbcbcaa466 100644 (file)
@@ -123,6 +123,8 @@ pipeworks.tube_backstub = {
        { -9/64, -9/64, -9/64,   9/64, 9/64, 32/64 },   -- tube segment against -Z face
 } 
 
+pipeworks.tube_boxes = {pipeworks.tube_leftstub, pipeworks.tube_rightstub, pipeworks.tube_bottomstub, pipeworks.tube_topstub, pipeworks.tube_frontstub, pipeworks.tube_backstub}
+
 pipeworks.tube_selectboxes = {
        { -32/64,  -10/64,  -10/64,  10/64,  10/64,  10/64 },
        { -10/64 ,  -10/64,  -10/64, 32/64,  10/64,  10/64 },
index 7e65d5b1a165fc50af729d778b0e704b43bc4888..929ed97983fd169b786ca0d70077b5cac48d9795 100644 (file)
--- a/tubes.lua
+++ b/tubes.lua
@@ -6,105 +6,42 @@ minetest.register_alias("pipeworks:tube", "pipeworks:tube_000000")
 
 -- now, a function to define the tubes
 
-local outboxes = {}
-local outsel = {}
-local outimgs = {}
-
-pipeworks.register_tube = function(name, desc, plain, noctrs, ends, short, inv, special)
-
-for xm = 0, 1 do
-for xp = 0, 1 do
-for ym = 0, 1 do
-for yp = 0, 1 do
-for zm = 0, 1 do
-for zp = 0, 1 do
-
-       outboxes = {}
-       outsel = {}
-       outimgs = {}
-
-       if yp==1 then
-               pipeworks.add_node_box(outboxes, pipeworks.tube_topstub)
-               table.insert(outsel, pipeworks.tube_selectboxes[4])
-               table.insert(outimgs, noctrs[4])
-       else
-               table.insert(outimgs, plain[4])
-       end
-       if ym==1 then
-               pipeworks.add_node_box(outboxes, pipeworks.tube_bottomstub)
-               table.insert(outsel, pipeworks.tube_selectboxes[3])
-               table.insert(outimgs, noctrs[3])
-       else
-               table.insert(outimgs, plain[3])
-       end
-       if xp==1 then
-               pipeworks.add_node_box(outboxes, pipeworks.tube_rightstub)
-               table.insert(outsel, pipeworks.tube_selectboxes[2])
-               table.insert(outimgs, noctrs[2])
-       else
-               table.insert(outimgs, plain[2])
-       end
-       if xm==1 then
-               pipeworks.add_node_box(outboxes, pipeworks.tube_leftstub)
-               table.insert(outsel, pipeworks.tube_selectboxes[1])
-               table.insert(outimgs, noctrs[1])
-       else
-               table.insert(outimgs, plain[1])
-       end
-       if zp==1 then
-               pipeworks.add_node_box(outboxes, pipeworks.tube_backstub)
-               table.insert(outsel, pipeworks.tube_selectboxes[6])
-               table.insert(outimgs, noctrs[6])
-       else
-               table.insert(outimgs, plain[6])
-       end
-       if zm==1 then
-               pipeworks.add_node_box(outboxes, pipeworks.tube_frontstub)
-               table.insert(outsel, pipeworks.tube_selectboxes[5])
-               table.insert(outimgs, noctrs[5])
-       else
-               table.insert(outimgs, plain[5])
-       end
+--local outboxes = {}
+--local outsel = {}
+--local outimgs = {}
 
-       local jx = xp+xm
-       local jy = yp+ym
-       local jz = zp+zm
+local REGISTER_COMPATIBILITY = true
 
-       if (jx+jy+jz) == 1 then
-               if xm == 1 then 
-                       table.remove(outimgs, 3)
-                       table.insert(outimgs, 3, ends[3])
-               end
-               if xp == 1 then 
-                       table.remove(outimgs, 4)
-                       table.insert(outimgs, 4, ends[4])
-               end
-               if ym == 1 then 
-                       table.remove(outimgs, 1)
-                       table.insert(outimgs, 1, ends[1])
-               end
-               if xp == 1 then 
-                       table.remove(outimgs, 2)
-                       table.insert(outimgs, 2, ends[2])
-               end
-               if zm == 1 then 
-                       table.remove(outimgs, 5)
-                       table.insert(outimgs, 5, ends[5])
-               end
-               if zp == 1 then 
-                       table.remove(outimgs, 6)
-                       table.insert(outimgs, 6, ends[6])
-               end
+local stv = {1, 3, 5, 2, 4, 6}
+local vti = {4, 3, 2, 1, 6, 5}
+
+local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, ends, short, inv, special, connects, style)
+       local outboxes = {}
+       local outsel = {}
+       local outimgs = {}
+       
+       for i = 1, 6 do
+               outimgs[vti[i]] = plain[i]
+       end
+       
+       for _, side in ipairs(connects) do
+               local v = stv[side+1]
+               pipeworks.add_node_box(outboxes, pipeworks.tube_boxes[v])
+               table.insert(outsel, pipeworks.tube_selectboxes[v])
+               outimgs[vti[v]] = noctrs[v]
        end
 
-       local tname = xm..xp..ym..yp..zm..zp
+       if #connects == 1 then
+               local v = stv[(connects[1]+3)%6+1]
+               outimgs[vti[v]] = ends[v]
+       end
 
        local tgroups = {snappy=3, tube=1, not_in_creative_inventory=1}
-       local tubedesc = desc.." ("..tname..")... You hacker, you."
+       local tubedesc = desc.." "..dump(connects).."... You hacker, you."
        local iimg=plain[1]
        local wscale = {x=1,y=1,z=1}
 
-       if tname == "000000" then
+       if #connects == 0 then
                tgroups = {snappy=3, tube=1}
                tubedesc = desc
                iimg=inv
@@ -141,7 +78,9 @@ for zp = 0, 1 do
                sounds = default.node_sound_wood_defaults(),
                walkable = true,
                stack_max = 99,
-               drop = name.."_000000",
+               basename = name,
+               style = style,
+               drop = name.."_"..dropname,
                tubelike=1,
                tube = {connect_sides={front=1, back=1, left=1, right=1, top=1, bottom=1}},
                on_construct = function(pos)
@@ -164,6 +103,9 @@ for zp = 0, 1 do
                        end
                end
        }
+       if style == "6d" then
+               nodedef.paramtype2 = "facedir"
+       end
        
        if special==nil then special={} end
 
@@ -191,13 +133,85 @@ for zp = 0, 1 do
        if string.find(name, "pipeworks:") then prefix = "" end
 
        minetest.register_node(prefix..name.."_"..tname, nodedef)
-
-end
-end
-end
 end
+
+pipeworks.register_tube = function(name, desc, plain, noctrs, ends, short, inv, special, old_registration)
+
+if old_registration then
+       for xm = 0, 1 do
+       for xp = 0, 1 do
+       for ym = 0, 1 do
+       for yp = 0, 1 do
+       for zm = 0, 1 do
+       for zp = 0, 1 do
+               local connects = {}
+               if xm == 1 then
+                       connects[#connects+1] = 0
+               end
+               if xp == 1 then
+                       connects[#connects+1] = 3
+               end
+               if ym == 1 then
+                       connects[#connects+1] = 1
+               end
+               if yp == 1 then
+                       connects[#connects+1] = 4
+               end
+               if zm == 1 then
+                       connects[#connects+1] = 2
+               end
+               if zp == 1 then
+                       connects[#connects+1] = 5
+               end
+               local tname = xm..xp..ym..yp..zm..zp
+               register_one_tube(name, tname, "000000", desc, plain, noctrs, ends, short, inv, special, connects, "old")
+       end
+       end
+       end
+       end
+       end
+       end
+else
+       local cconnects = {{}, {0}, {0, 3}, {0, 1}, {0, 1, 2}, {0, 1, 3}, {0, 1, 2, 3}, {0, 1, 3, 4}, {0, 1, 2, 3, 4}, {0, 1, 2, 3, 4, 5}}
+       for index, connects in ipairs(cconnects) do
+               register_one_tube(name, tostring(index), "1", desc, plain, noctrs, ends, short, inv, special, connects, "6d")
+       end
+       if REGISTER_COMPATIBILITY then
+               local cname = name.."_compatibility"
+               minetest.register_node(cname, {
+                       drawtype = "airlike",
+                       style = "6d",
+                       basename = name,
+                       groups = {not_in_creative_inventory = 1, tube_to_update = 1}
+               })
+               table.insert(pipeworks.tubenodes,cname)
+               for xm = 0, 1 do
+               for xp = 0, 1 do
+               for ym = 0, 1 do
+               for yp = 0, 1 do
+               for zm = 0, 1 do
+               for zp = 0, 1 do
+                       local tname = xm..xp..ym..yp..zm..zp
+                       minetest.register_alias(name.."_"..tname, cname)
+               end
+               end
+               end
+               end
+               end
+               end
+       end
 end
 end
+
+if REGISTER_COMPATIBILITY then
+       minetest.register_abm({
+               nodenames = {"group:tube_to_update"},
+               interval = 1,
+               chance = 1,
+               action = function(pos, node, active_object_count, active_object_count_wider)
+                       pipeworks.scan_for_tube_objects(pos)
+               end
+       })
 end
 
 -- now let's actually call that function to get the real work done!
@@ -321,7 +335,7 @@ if pipeworks.enable_mese_tube then
                        return (inv:is_empty("line1") and inv:is_empty("line2") and inv:is_empty("line3") and
                                inv:is_empty("line4") and inv:is_empty("line5") and inv:is_empty("line6"))
                end
-       })
+       }, true)
 end
 
 if pipeworks.enable_detector_tube then