From 315f9dee59d5f68a1860a152e308ca3abb151514 Mon Sep 17 00:00:00 2001
From: Novatux <nathanael.courant@laposte.net>
Date: Mon, 14 Jan 2013 18:36:28 +0100
Subject: Updated the last version of item_transport

---
 item_transport.lua              | 126 +++++++++++++++++++++++-----------------
 textures/default_chest_side.png | Bin 0 -> 691 bytes
 2 files changed, 74 insertions(+), 52 deletions(-)
 create mode 100644 textures/default_chest_side.png

diff --git a/item_transport.lua b/item_transport.lua
index aad3d85..9f7f726 100644
--- a/item_transport.lua
+++ b/item_transport.lua
@@ -1,9 +1,13 @@
-minetest.register_craftitem(":item_transport:filter", {
+modpath=minetest.get_modpath("pipeworks")
+
+dofile(modpath.."/compat.lua")
+
+minetest.register_craftitem("pipeworks:filter", {
 	description = "Filter",
 	stack_max = 99,
 })
 
-minetest.register_node(":item_transport:filter", {
+minetest.register_node("pipeworks:filter", {
 	description = "filter",
 	tiles = {"filter_top.png", "filter_top.png", "filter_output.png",
 		"filter_input.png", "filter_side.png", "filter_top.png"},
@@ -94,12 +98,12 @@ end,
 function tube_item(pos, item)
 	-- Take item in any format
 	local stack = ItemStack(item)
-	local obj = minetest.env:add_entity(pos, "item_transport:tubed_item")
+	local obj = minetest.env:add_entity(pos, "pipeworks:tubed_item")
 	obj:get_luaentity():set_item(stack:to_string())
 	return obj
 end
 
-minetest.register_entity(":item_transport:tubed_item", {
+minetest.register_entity("pipeworks:tubed_item", {
 	initial_properties = {
 		hp_max = 1,
 		physical = false,
@@ -188,61 +192,69 @@ minetest.register_entity(":item_transport:tubed_item", {
 	local velocity=self.object:getvelocity()
 	
 	if velocity==nil then return end
-
-	if minetest.get_item_group(node.name,"tubedevice_receiver")==1 then
-		leftover = minetest.registered_nodes[node.name].tube.insert_object(pos,node,stack,velocity)
-		drop_pos=minetest.env:find_node_near(pos,1,"air")
-		if drop_pos and not leftover:is_empty() then minetest.item_drop(leftover,"",drop_pos) end
-		self.object:remove()
-		return
-	end
-
+	
+	local velocitycopy={x=velocity.x,y=velocity.y,z=velocity.z}
+	
+	local moved=false
+	
 	if math.abs(velocity.x)==1 then
 		local next_node=math.abs(pos.x-self.start_pos.x)
 		if next_node >= 1 then 
 			self.start_pos.x=self.start_pos.x+velocity.x
-			if go_next (self.start_pos, velocity, stack)==0 then
-				drop_pos=minetest.env:find_node_near({x=self.start_pos.x,y=self.start_pos.y,z=self.start_pos.z+velocity.x}, 1, "air")
-				if drop_pos then minetest.item_drop(stack, "", drop_pos) end
-				self.object:remove()
-				end
-			self.object:setpos(self.start_pos)
-			self.object:setvelocity(velocity)
-			return
-			end
+			moved=true
 		end
-
-	if math.abs(velocity.y)==1 then
+	elseif math.abs(velocity.y)==1 then
 		local next_node=math.abs(pos.y-self.start_pos.y)
 		if next_node >= 1 then 
 			self.start_pos.y=self.start_pos.y+velocity.y
-			if go_next (self.start_pos, velocity, stack)==0 then
-				drop_pos=minetest.env:find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air")
-				if drop_pos then minetest.item_drop(stack, "", drop_pos) end
-				self.object:remove()
-				end
-			self.object:setpos(self.start_pos)
-			self.object:setvelocity(velocity)
-			return 
-			end
-		end
-	
-	if math.abs(velocity.z)==1 then
+			moved=true
+		end	
+	elseif math.abs(velocity.z)==1 then
 		local next_node=math.abs(pos.z-self.start_pos.z)
 		if next_node >= 1 then 
 			self.start_pos.z=self.start_pos.z+velocity.z
-			if go_next (self.start_pos, velocity, stack)==0 then
-				drop_pos=minetest.env:find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air")
-				if drop_pos then minetest.item_drop(stack, "", drop_pos) end
-				self.object:remove()
-				end
-			self.object:setpos(self.start_pos)
-			self.object:setvelocity(velocity)
+			moved=true
+		end
+	end
+	
+	node = minetest.env:get_node(self.start_pos)
+	if moved and minetest.get_item_group(node.name,"tubedevice_receiver")==1 then
+		if minetest.registered_nodes[node.name].tube and minetest.registered_nodes[node.name].tube.insert_object then
+			leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos,node,stack,velocity)
+		else
+			leftover = stack
+		end
+		--drop_pos=minetest.env:find_node_near(self.start_pos,1,"air")
+		--if drop_pos and not leftover:is_empty() then minetest.item_drop(leftover,"",drop_pos) end
+		--self.object:remove()
+		if leftover:is_empty() then
+			self.object:remove()
 			return
+		end
+		velocity.x=-velocity.x
+		velocity.y=-velocity.y
+		velocity.z=-velocity.z
+		self.object:setvelocity(velocity)
+		self:set_item(leftover:to_string())
+		return
+	end
+	
+	if moved then
+		if go_next (self.start_pos, velocity, stack)==0 then
+			drop_pos=minetest.env:find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air")
+			if drop_pos then 
+				minetest.item_drop(stack, "", drop_pos)
+				self.object:remove()
 			end
 		end
 	end
+	
+	if velocity.x~=velocitycopy.x or velocity.y~=velocitycopy.y or velocity.z~=velocitycopy.z then
+		self.object:setpos(self.start_pos)
+		self.object:setvelocity(velocity)
+	end
 
+	end
 end
 })
 
@@ -254,7 +266,7 @@ 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 go_next(pos,velocity,stack)
-	print(dump(pos))
+	--print(dump(pos))
 	local chests={}
 	local tubes={}
 	local cmeta=minetest.env:get_meta(pos)
@@ -273,7 +285,9 @@ function go_next(pos,velocity,stack)
 			meta=minetest.env:get_meta(npos)
 			tubelike=meta:get_int("tubelike")
 			if tube_receiver==1 then
-				if minetest.registered_nodes[node.name].tube.can_insert(npos,node,stack,vect) 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
@@ -305,9 +319,13 @@ function go_next(pos,velocity,stack)
 				i=i+1
 			until false
 			n=meta:get_int("tubedir")+1
-			if n==i then
-				n=1
-			end
+			repeat
+				if n>=i then
+					n=n-i+1
+				else
+					break
+				end
+			until false
 			meta:set_int("tubedir",n)
 			velocity.x=tubes[n].vect.x
 			velocity.y=tubes[n].vect.y
@@ -320,12 +338,16 @@ function go_next(pos,velocity,stack)
 			i=i+1
 		until false
 		n=meta:get_int("tubedir")+1
-		if n==i then
-			n=1
-		end
+		repeat
+			if n>=i then
+				n=n-i+1
+			else
+				break
+			end
+		until false
 		velocity.x=chests[n].vect.x
 		velocity.y=chests[n].vect.y
 		velocity.z=chests[n].vect.z
 	end
 	return 1
-end
+end
\ No newline at end of file
diff --git a/textures/default_chest_side.png b/textures/default_chest_side.png
new file mode 100644
index 0000000..70b8336
Binary files /dev/null and b/textures/default_chest_side.png differ
-- 
cgit v1.2.3