diff options
| -rw-r--r-- | item_transport.lua | 58 | ||||
| -rw-r--r-- | tubes.lua | 78 | 
2 files changed, 93 insertions, 43 deletions
| diff --git a/item_transport.lua b/item_transport.lua index bed8f31..7cc2853 100644 --- a/item_transport.lua +++ b/item_transport.lua @@ -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 @@ -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") | 
