jille_Jr icon

CC: Goto

jille_Jr | PRO | 10/18/12 06:44:04 PM UTC | 0 ⭐ | 396 👁️ | Never ⏰ | []
Lua |

4.82 KB

|

None

|

0 👍

/

0 👎

-- Don't use this program yet!
-- It's not ready for use!!
 
local tArgs = {...}
if #tArgs < 3 then
  write("Usage: ")
  write(shell.getRunningProgram())
  print(" <x> <y> <z>")
  return
end
 
if tonumber(tArgs[2]) < 0 then
  print("Too low y value!")
  return
end
 
--[[ Using relative pos ]]--
 
--local posX, posY, posZ = 0
--dir = 0
 
--[[ End ]]--
 
--[[ Using GPS ]]--
 
-- Direction:
-- +------ z ------+
-- |       0       |
-- x  1  turtle  3 |
-- |       2       |
-- +---------------+
 
local dir
 
rednet.open("right")
local posX, posY, posZ = gps.locate(.5)
local curX, curY, curZ = posX, posY, posZ
rednet.close("right")
if not posX then
  print("Could not locate position!")
  return
end
 
function checkGPS()
  rednet.open("right")
  curX, curY, curZ = gps.locate(.5)
  rednet.close("right")
end
 
function checkDir()
  if curX ~= posX then
    if curX < posX then
      dir = 3
    elseif curX > posX then
      dir = 1
    end
  elseif curZ ~= posZ then
    if curZ < posZ then
      dir = 2
    elseif curZ > posZ then
      dir = 0
    end
  end
end
 
function invertDir(dirVariable)
  if type(dirVariable) ~= "number" then
    error("Number expected, got "..type(dirVariable))
  end
  if dirVariable < 2 then
    return dirVariable + 2
  else
    return dirVariable - 2
  end
end
 
if not turtle.forward() then
  if not turtle.back() then
    turtle.turnRight()
    if not turtle.forward() then
      if not turtle.back() then
        turtle.turnLeft()
        print("No empty space found!")
        return
      else
        checkGPS()
        checkDir()
        while not turtle.forward() do
          if not turtle.dig() then
            turtle.attack()
          end
        end
      end
    else
      checkGPS()
      checkDir()
      for q = 1, 2 do
        turtle.turnRight()
      end
      while not turtle.forward() do
        if not turtle.dig() then
          turtle.attack()
        end
      end
      dir = invertDir(dir)
    end
  else
    checkGPS()
    checkDir()
    while not turtle.forward() do
      if not turtle.dig() then
        turtle.attack()
      end
    end
  end
else
  checkGPS()
  checkDir()
  for w = 1, 2 do
    turtle.turnRight()
  end
  while not turtle.forward() do
    if not turtle.dig() then
      turtle.attack()
    end
  end
  dir = invertDir(dir)
end
 
--[[ End ]]--
 
function goUp()
  while not turtle.up() do
    if not turtle.digUp() then
      if not turtle.attackUp() then
        sleep(.1)
      end
    end
  end
  posY = posY + 1
end
function goDown()
  while not turtle.down() do
    if not turtle.digDown() then
      if not turtle.attackDown() then
        sleep(.1)
      end
    end
  end
  posY = posY - 1
end
function left()
  if dir > 3-1 then
    dir = 0
  else
    dir = dir + 1
  end
  turtle.turnLeft()
end
function right()
  if dir < 0+1 then
    dir = 3
  else
    dir = dir - 1
  end
  turtle.turnRight()
end
function goForward()
  while not turtle.forward() do
    goUp()
  end
  if dir == 0 then
    posZ = posZ + 1
  elseif dir == 1 then
    posX = posX + 1
  elseif dir == 2 then
    posZ = posZ - 1
  elseif dir == 3 then
    posX = posX - 1
  else
    error("Undefined direction.")
  end
end
function goBack()
  while not turtle.back() do
    goUp()
  end
  if dir == 0 then
    posZ = posZ - 1
  elseif dir == 1 then
    posX = posX - 1
  elseif dir == 2 then
    posZ = posZ + 1
  elseif dir == 3 then
    posX = posX + 1 
  else
    error("Undefined direction.")
  end
end
function faceZ()
  if dir ~= 0 then
    if dir == 1 then
      right()
    else
      repeat
        left()
      until dir == 0
    end
  end
end
function faceNZ()
  if dir ~= 2 then
    if dir == 3 then
      right()
    else
      repeat
        left()
      until dir == 2
    end
  end
end
function faceX()
  if dir ~= 1 then
    if dir == 2 then
      right()
    else
      repeat
        left()
      until dir == 1
    end
  end
end
function faceNX()
  if dir ~= 3 then
    if dir == 0 then
      right()
    else
      repeat
        left()
      until dir == 3
    end
  end
end
function goto(x,y,z)
  print("Heading to x"..x..", y"..y..", z"..z.."!")
  repeat
    if x < posX then
      faceNX()
    elseif x > posX then
      faceX()
    end
    while x ~= posX do
      goForward()
    end
    if z < posZ then
      faceNZ()
    elseif z > posZ then
      faceZ()
    end
    while z ~= posZ do
      goForward()
    end
    while y < posY do
      goDown()
    end
    while y > posY do
      goUp()
    end
  until x == posX and y == posY and z == posZ
end
 
local param1 = tonumber(tArgs[1])
local param2 = tonumber(tArgs[2])
local param3 = tonumber(tArgs[3])
--goto(param1,param2,param3)
faceZ()

Comments