Changed mese tubes: you can now choose if items should not go in a direction.
authorNovatux <nathanael.courant@laposte.net>
Sat, 19 Jan 2013 18:11:28 +0000 (19:11 +0100)
committerNovatux <nathanael.courant@laposte.net>
Sat, 19 Jan 2013 18:11:28 +0000 (19:11 +0100)
item_transport.lua
tubes.lua

index bed8f319f2747259b1df567fe65cc8a2bb77844f..7cc2853c6c4222c5dcadd712dd2c3a7e9b91e700 100644 (file)
@@ -273,6 +273,14 @@ end
 
 adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}}
 
+function notvel(tbl,vel)
+       tbl2={}
+       for _,val in ipairs(tbl) do
+               if val.x~=-vel.x or val.y~=-vel.y or val.z~=-vel.z then table.insert(tbl2,val) end
+       end
+       return tbl2
+end
+
 function go_next(pos,velocity,stack)
        --print(dump(pos))
        local chests={}
@@ -299,39 +307,37 @@ function go_next(pos,velocity,stack)
        if minetest.registered_nodes[cnode.name].tube and minetest.registered_nodes[cnode.name].tube.can_go then
                can_go=minetest.registered_nodes[cnode.name].tube.can_go(pos,node,vel,stack)
        else
-               can_go=adjlist
+               can_go=notvel(adjlist,vel)
        end
        for _,vect in ipairs(can_go) do
-               if vect.x~=-vel.x or vect.y~=-vel.y or vect.z~=-vel.z then
-                       npos=addVect(pos,vect)
-                       node=minetest.env:get_node(npos)
-                       tube_receiver=minetest.get_item_group(node.name,"tubedevice_receiver")
-                       --tubelike=minetest.get_item_group(node.name,"tubelike")
-                       meta=minetest.env:get_meta(npos)
-                       tubelike=meta:get_int("tubelike")
-                       if tube_receiver==1 then
-                               if minetest.registered_nodes[node.name].tube and
-                                       minetest.registered_nodes[node.name].tube.can_insert and
-                                       minetest.registered_nodes[node.name].tube.can_insert(npos,node,stack,vect) then
-                                       local i=1
-                                       repeat
-                                               if chests[i]==nil then break end
-                                               i=i+1
-                                       until false
-                                       chests[i]={}
-                                       chests[i].pos=npos
-                                       chests[i].vect=vect
-                               end
-                       elseif tubelike==1 then
+               npos=addVect(pos,vect)
+               node=minetest.env:get_node(npos)
+               tube_receiver=minetest.get_item_group(node.name,"tubedevice_receiver")
+               --tubelike=minetest.get_item_group(node.name,"tubelike")
+               meta=minetest.env:get_meta(npos)
+               tubelike=meta:get_int("tubelike")
+               if tube_receiver==1 then
+                       if minetest.registered_nodes[node.name].tube and
+                               minetest.registered_nodes[node.name].tube.can_insert and
+                               minetest.registered_nodes[node.name].tube.can_insert(npos,node,stack,vect) then
                                local i=1
                                repeat
-                                       if tubes[i]==nil then break end
+                                       if chests[i]==nil then break end
                                        i=i+1
                                until false
-                               tubes[i]={}
-                               tubes[i].pos=npos
-                               tubes[i].vect=vect
+                               chests[i]={}
+                               chests[i].pos=npos
+                               chests[i].vect=vect
                        end
+               elseif tubelike==1 then
+                       local i=1
+                       repeat
+                               if tubes[i]==nil then break end
+                               i=i+1
+                       until false
+                       tubes[i]={}
+                       tubes[i].pos=npos
+                       tubes[i].vect=vect
                end
        end
        if chests[1]==nil then--no chests found
index 90e6ecf81ab2b40431f0590edebc7899bff70c4a..0061f5add8831212cdb10ed722eb746c950c0baf 100644 (file)
--- a/tubes.lua
+++ b/tubes.lua
@@ -278,17 +278,23 @@ register_tube("pipeworks:mese_tube","Mese pneumatic tube segment",mese_plain_tex
                local found=false
                local name=stack:get_name()
                for i,vect in ipairs(meseadjlist) do
-                       for _,st in ipairs(inv:get_list("line"..tostring(i))) do
-                               if st:get_name()==name then
-                                       found=true
-                                       table.insert(tbl,vect)
+                       if meta:get_int("l"..tostring(i).."s")==1 then
+                               for _,st in ipairs(inv:get_list("line"..tostring(i))) do
+                                       if st:get_name()==name then
+                                               found=true
+                                               table.insert(tbl,vect)
+                                               break
+                                       end
                                end
                        end
                end
                if found==false then
                        for i,vect in ipairs(meseadjlist) do
-                               if inv:is_empty("line"..tostring(i)) then
-                                       table.insert(tbl,vect)
+                               if meta:get_int("l"..tostring(i).."s")==1 then
+                                       if inv:is_empty("line"..tostring(i)) then
+                                               table.insert(tbl,vect)
+                                               break
+                                       end
                                end
                        end
                end
@@ -296,26 +302,64 @@ register_tube("pipeworks:mese_tube","Mese pneumatic tube segment",mese_plain_tex
        end},
        on_construct = function(pos)
                local meta = minetest.env:get_meta(pos)
+               local inv = meta:get_inventory()
+               for i=1,6 do
+                       meta:set_int("l"..tostring(i).."s",1)
+                       inv:set_size("line"..tostring(i), 6*1)
+               end
                meta:set_string("formspec",
                                "size[8,11]"..
-                               "list[current_name;line1;1,0;7,1;]"..
-                               "list[current_name;line2;1,1;7,1;]"..
-                               "list[current_name;line3;1,2;7,1;]"..
-                               "list[current_name;line4;1,3;7,1;]"..
-                               "list[current_name;line5;1,4;7,1;]"..
-                               "list[current_name;line6;1,5;7,1;]"..
+                               "list[current_name;line1;1,0;6,1;]"..
+                               "list[current_name;line2;1,1;6,1;]"..
+                               "list[current_name;line3;1,2;6,1;]"..
+                               "list[current_name;line4;1,3;6,1;]"..
+                               "list[current_name;line5;1,4;6,1;]"..
+                               "list[current_name;line6;1,5;6,1;]"..
                                "image[0,0;1,1;white.png]"..
                                "image[0,1;1,1;black.png]"..
                                "image[0,2;1,1;green.png]"..
                                "image[0,3;1,1;yellow.png]"..
                                "image[0,4;1,1;blue.png]"..
                                "image[0,5;1,1;red.png]"..
+                               "button[7,0;1,1;button1;On]"..
+                               "button[7,1;1,1;button2;On]"..
+                               "button[7,2;1,1;button3;On]"..
+                               "button[7,3;1,1;button4;On]"..
+                               "button[7,4;1,1;button5;On]"..
+                               "button[7,5;1,1;button6;On]"..
                                "list[current_player;main;0,7;8,4;]")
                meta:set_string("infotext", "Mese pneumatic tube")
-               local inv = meta:get_inventory()
+       end,
+       on_receive_fields=function(pos,formname,fields,sender)
+               local meta=minetest.env:get_meta(pos)
+               local i
+               for key,_ in pairs(fields) do i=key end
+               i=string.sub(i,-1)
+               newstate=1-meta:get_int("l"..i.."s")
+               meta:set_int("l"..i.."s",newstate)
+               local frm="size[8,11]"..
+                               "list[current_name;line1;1,0;6,1;]"..
+                               "list[current_name;line2;1,1;6,1;]"..
+                               "list[current_name;line3;1,2;6,1;]"..
+                               "list[current_name;line4;1,3;6,1;]"..
+                               "list[current_name;line5;1,4;6,1;]"..
+                               "list[current_name;line6;1,5;6,1;]"..
+                               "image[0,0;1,1;white.png]"..
+                               "image[0,1;1,1;black.png]"..
+                               "image[0,2;1,1;green.png]"..
+                               "image[0,3;1,1;yellow.png]"..
+                               "image[0,4;1,1;blue.png]"..
+                               "image[0,5;1,1;red.png]"
                for i=1,6 do
-                       inv:set_size("line"..tostring(i), 7*1)
+                       local st=meta:get_int("l"..tostring(i).."s")
+                       if st==0 then
+                               frm=frm.."button[7,"..tostring(i-1)..";1,1;button"..tostring(i)..";Off]"
+                       else
+                               frm=frm.."button[7,"..tostring(i-1)..";1,1;button"..tostring(i)..";On]"
+                       end
                end
+               frm=frm.."list[current_player;main;0,7;8,4;]"
+               meta:set_string("formspec",frm)
        end,
        can_dig = function(pos,player)
                local meta = minetest.env:get_meta(pos);
@@ -336,7 +380,7 @@ register_tube("pipeworks:detector_tube_on","Detector tube segment on (you hacker
                local nitems=meta:get_int("nitems")+1
                meta:set_int("nitems", nitems)
                minetest.after(0.1,minetest.registered_nodes[name].item_exit,pos)
-               return meseadjlist
+               return notvel(meseadjlist,velocity)
        end},
        groups={mesecon=2,not_in_creative_inventory=1},
        drop="pipeworks:detector_tube_off_000000",
@@ -366,7 +410,7 @@ register_tube("pipeworks:detector_tube_off","Detector tube segment",detector_pla
                local name = minetest.env:get_node(pos).name
                minetest.env:set_node(pos,{name=string.gsub(name,"off","on")})
                mesecon:receptor_on(pos,mesecons_rules)
-               return meseadjlist
+               return notvel(meseadjlist,velocity)
        end},
        groups={mesecon=2},
        mesecons={receptor={state="off",
@@ -376,7 +420,7 @@ register_tube("pipeworks:accelerator_tube","Accelerator pneumatic tube segment",
                short_texture,inv_texture,
                {tube={can_go=function(pos,node,velocity,stack)
                        velocity.speed=velocity.speed+1
-                       return meseadjlist
+                       return notvel(meseadjlist,velocity)
                end}})
 
 modpath=minetest.get_modpath("pipeworks")