1 local oldvel = self.object:getvelocity()
2 local olddir = vector.normalize(oldvel)
3 local x = math.abs(oldvel.x)
4 local z = math.abs(oldvel.z)
5 local pos = self.object:getpos()
7 local pos2 = self.object:getpos()
8 local pos3 = self.object:getpos()
13 local dir = {x=0,y=0,z=0}
18 if olddir.x>0 then xer=1 elseif olddir.x<0 then xer=-1 end
20 if minetest.get_node_group(minetest.get_node(vector.new(pos.x+xer,pos.y+1,pos.z)).name,"rail")>0 then
24 elseif minetest.get_node_group(minetest.get_node(vector.new(pos.x+xer,pos.y-1,pos.z)).name,"rail")>0 then
28 elseif minetest.get_node_group(minetest.get_node(vector.new(pos.x+xer,pos.y,pos.z)).name,"rail")>0 then
33 if olddir.z>0 then zer=1 elseif olddir.z<0 then zer=-1 end
35 if minetest.get_node_group(minetest.get_node(vector.new(pos.x,pos.y+1,pos.z+zer)).name,"rail")>0 then
39 elseif minetest.get_node_group(minetest.get_node(vector.new(pos.x,pos.y-1,pos.z+zer)).name,"rail")>0 then
43 elseif minetest.get_node_group(minetest.get_node(vector.new(pos.x,pos.y,pos.z+zer)).name,"rail")>0 then
49 if vector.equals(dir,vector.new(0,0,0)) then
51 if minetest.get_node_group(minetest.get_node(vector.new(pos.x,pos.y,pos.z+1)).name,"rail")>0 then
53 --recenter on the rail
54 self.object:moveto(vector.new(math.floor(pos2.x+0.5),pos2.y,pos2.z))
55 elseif minetest.get_node_group(minetest.get_node(vector.new(pos.x,pos.y,pos.z-1)).name,"rail")>0 then
57 --recenter on the rail
58 self.object:moveto(vector.new(math.floor(pos2.x+0.5),pos2.y,pos2.z))
62 if minetest.get_node_group(minetest.get_node(vector.new(pos.x+1,pos.y,pos.z)).name,"rail")>0 then
64 --recenter on the rail
65 self.object:moveto(vector.new(pos2.x,pos2.y,math.floor(pos2.z+0.5)))
66 elseif minetest.get_node_group(minetest.get_node(vector.new(pos.x-1,pos.y,pos.z)).name,"rail")>0 then
68 --recenter on the rail
69 self.object:moveto(vector.new(pos2.x,pos2.y,math.floor(pos2.z+0.5)))
74 --if not vector.equals(dir,vector.new(0,0,0)) then
75 self.object:setvelocity(dir)