-- orientation: east 1 x+, south 2 z+, west 3 x-, north 4 z- local function turnTo(o1, o2) if o1 == o2 then return nil end if math.abs(o2 - o1) == 2 then turtle.turnLeft() turtle.turnLeft() elseif o2 - o1 == 1 or o2 - o1 == -3 then turtle.turnRight() else turtle.turnLeft() end end local function moveX(x1, x2, o1) if x1 == x2 then return o1 end local amount = x2 - x1 local o2 = amount > 0 and 1 or 3 turnTo(o1, o2) for ii = 1, math.abs(amount) do turtle.forward() end return o2 end local function moveZ(z1, z2, o1) if z1 == z2 then return o1 end local amount = z2 - z1 local o2 = amount > 0 and 2 or 4 turnTo(o1, o2) for ii = 1, math.abs(amount) do turtle.forward() end return o2 end local function moveY(y1, y2) if y1 == y2 then return nil end local amount = y2 - y1 for ii = 1, math.abs(amount) do if y2 > y1 then turtle.up() else turtle.down() end end end local function travel(x1, y1, z1, o1, x2, y2, z2, o2, safe_y, unsafe) unsafe = unsafe or false local dx = x2 - x1 local dz = z2 - z1 local move_safe = (not unsafe) and (dx ~= 0 or dz ~= 0) if move_safe then moveY(y1, safe_y) else moveY(y1, y2) end local newO = moveX(x1, x2, o1) newO = moveZ(z1, z2, newO) if move_safe then moveY(safe_y, y2) end turnTo(newO, o2) end return { turnTo = turnTo, moveX = moveX, moveZ = moveZ, moveY = moveY, travel = travel }