diff options
| author | Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | 2013-12-15 05:35:11 -0500 | 
|---|---|---|
| committer | Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | 2013-12-15 05:40:26 -0500 | 
| commit | 53f6e67399154c5b104bdd583668fdaf7bb110d1 (patch) | |
| tree | 83d3bdb8d522519c25651c9e653b73b82f00e8f7 | |
| parent | 2481c06bf0214c3a0723e31c05166ac9983eef77 (diff) | |
local-ize a few more functions
| -rw-r--r-- | autoplace_tubes.lua | 28 | ||||
| -rw-r--r-- | item_transport.lua | 254 | 
2 files changed, 142 insertions, 140 deletions
| diff --git a/autoplace_tubes.lua b/autoplace_tubes.lua index cbca2ba..7f47488 100644 --- a/autoplace_tubes.lua +++ b/autoplace_tubes.lua @@ -1,24 +1,13 @@  -- autorouting for pneumatic tubes -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 - -function in_table(table,element) +local function in_table(table,element)  	for _,el in ipairs(table) do  		if el==element then return true end  	end  	return false  end -function is_tube(nodename) +local function is_tube(nodename)  	return in_table(tubenodes,nodename)  end @@ -84,7 +73,7 @@ local function nodeside(node, tubedir)      minetest.log("error", "nodeside has been confused by its parameters; see pipeworks autoplace_tubes.lua, line 78")  end -function tube_autoroute(pos) +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 @@ -135,6 +124,17 @@ function tube_autoroute(pos)  	local nctr = minetest.get_node(pos)  end +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 +  minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)  	if minetest.registered_items[newnode.name]  	  and minetest.registered_items[newnode.name].tube diff --git a/item_transport.lua b/item_transport.lua index 632919a..93e9580 100644 --- a/item_transport.lua +++ b/item_transport.lua @@ -29,6 +29,14 @@ local fakePlayer = {      -- perhaps a custom metaclass that errors specially when fakePlayer.<property> is not found?  } +local function tube_item(pos, item) +	-- Take item in any format +	local stack = ItemStack(item) +	local obj = minetest.add_entity(pos, "pipeworks:tubed_item") +	obj:get_luaentity():set_item(stack:to_string()) +	return obj +end +  -- adding two tube functions  -- can_remove(pos,node,stack,dir) returns true if an item can be removed from that stack on that node  -- remove_items(pos,node,stack,dir,count) removes count items and returns them @@ -37,7 +45,7 @@ local fakePlayer = {  -- sname = the current name to allow for, or nil if it allows anything -function grabAndFire(frominv,frominvname,frompos,fromnode,sname,tube,idef,dir,all) +local function grabAndFire(frominv,frominvname,frompos,fromnode,sname,tube,idef,dir,all)      for spos,stack in ipairs(frominv:get_list(frominvname)) do          if ( sname == nil and stack:get_name() ~= "") or stack:get_name()==sname then              local doRemove = true @@ -204,18 +212,129 @@ minetest.register_node("pipeworks:mese_filter", {  end,  }) -function tube_item(pos, item) -	-- Take item in any format -	local stack = ItemStack(item) -	local obj = minetest.add_entity(pos, "pipeworks:tubed_item") -	obj:get_luaentity():set_item(stack:to_string()) -	return obj -end -  local function roundpos(pos)  	return {x=math.floor(pos.x+0.5),y=math.floor(pos.y+0.5),z=math.floor(pos.z+0.5)}  end +local function addVect(pos,vect) +	return {x=pos.x+vect.x,y=pos.y+vect.y,z=pos.z+vect.z} +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}} + +local function notvel(tbl,vel) +	local 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 + +local function go_next(pos,velocity,stack) +	local chests={} +	local tubes={} +	local cnode=minetest.get_node(pos) +	local cmeta=minetest.get_meta(pos) +	local node +	local meta +	local tubelike +	local tube_receiver +	local len=1 +	local n +	local can_go +	local speed=math.abs(velocity.x+velocity.y+velocity.z) +	local vel={x=velocity.x/speed,y=velocity.y/speed,z=velocity.z/speed,speed=speed} +	if speed>=4.1 then +		speed=4 +	elseif speed>=1.1 then +		speed=speed-0.1 +	else +		speed=1 +	end +	vel.speed=speed +	if minetest.registered_nodes[cnode.name] and 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=notvel(adjlist,vel) +	end +	for _,vect in ipairs(can_go) do +		npos=addVect(pos,vect) +		node=minetest.get_node(npos) +		tube_receiver=minetest.get_item_group(node.name,"tubedevice_receiver") +		meta=minetest.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 +			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 +		if tubes[1]==nil then +			return 0 +		else +			local i=1 +			repeat +				if tubes[i]==nil then break end +				i=i+1 +			until false +			n=meta:get_int("tubedir")+1 +			repeat +				if n>=i then +					n=n-i+1 +				else +					break +				end +			until false +			if pipeworks.enable_cyclic_mode then +				meta:set_int("tubedir",n) +			end +			velocity.x=tubes[n].vect.x*vel.speed +			velocity.y=tubes[n].vect.y*vel.speed +			velocity.z=tubes[n].vect.z*vel.speed +		end +	else +		local i=1 +		repeat +			if chests[i]==nil then break end +			i=i+1 +		until false +		n=meta:get_int("tubedir")+1 +		repeat +			if n>=i then +				n=n-i+1 +			else +				break +			end +		until false +		if pipeworks.enable_cyclic_mode then +			meta:set_int("tubedir",n) +		end +		velocity.x=chests[n].vect.x*speed +		velocity.y=chests[n].vect.y*speed +		velocity.z=chests[n].vect.z*speed +	end +	return 1 +end +  minetest.register_entity("pipeworks:tubed_item", {  	initial_properties = {  		hp_max = 1, @@ -383,121 +502,4 @@ end  }) -local function addVect(pos,vect) -	return {x=pos.x+vect.x,y=pos.y+vect.y,z=pos.z+vect.z} -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) -	local 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) -	local chests={} -	local tubes={} -	local cnode=minetest.get_node(pos) -	local cmeta=minetest.get_meta(pos) -	local node -	local meta -	local tubelike -	local tube_receiver -	local len=1 -	local n -	local can_go -	local speed=math.abs(velocity.x+velocity.y+velocity.z) -	local vel={x=velocity.x/speed,y=velocity.y/speed,z=velocity.z/speed,speed=speed} -	if speed>=4.1 then -		speed=4 -	elseif speed>=1.1 then -		speed=speed-0.1 -	else -		speed=1 -	end -	vel.speed=speed -	if minetest.registered_nodes[cnode.name] and 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=notvel(adjlist,vel) -	end -	for _,vect in ipairs(can_go) do -		npos=addVect(pos,vect) -		node=minetest.get_node(npos) -		tube_receiver=minetest.get_item_group(node.name,"tubedevice_receiver") -		meta=minetest.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 -			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 -		if tubes[1]==nil then -			return 0 -		else -			local i=1 -			repeat -				if tubes[i]==nil then break end -				i=i+1 -			until false -			n=meta:get_int("tubedir")+1 -			repeat -				if n>=i then -					n=n-i+1 -				else -					break -				end -			until false -			if pipeworks.enable_cyclic_mode then -				meta:set_int("tubedir",n) -			end -			velocity.x=tubes[n].vect.x*vel.speed -			velocity.y=tubes[n].vect.y*vel.speed -			velocity.z=tubes[n].vect.z*vel.speed -		end -	else -		local i=1 -		repeat -			if chests[i]==nil then break end -			i=i+1 -		until false -		n=meta:get_int("tubedir")+1 -		repeat -			if n>=i then -				n=n-i+1 -			else -				break -			end -		until false -		if pipeworks.enable_cyclic_mode then -			meta:set_int("tubedir",n) -		end -		velocity.x=chests[n].vect.x*speed -		velocity.y=chests[n].vect.y*speed -		velocity.z=chests[n].vect.z*speed -	end -	return 1 -end | 
