Robust Turtle API

From ComputerCraft Wiki
Jump to: navigation, search

This is an unofficial API. This means that you have to install it manually.
This API extends on the original turtle API and makes it more robust. It also strives to make coding a turtle easier.
When traveling, for example, it will not get stopped by mobs, players, sand, or any other block.


Installation

Install globally on all Turtles:

  • Create and install a new resource pack on the client (if playing singleplayer) or the server (if playing multiplayer).
  • Download the API and save it in the 'assets/computercraft/lua/rom/apis/turtle' directory inside the resource pack.
  • The name of the file will determine the name of the API (If you save it as 't' you'd call the 'forward()' function like so: t.forward()).
  • The API will automatically be loaded for every Turtle.

Install only on one specific Turtle:

  • Open the computer you want to download the API into and type: 'pastebin get 0TnEBf2P t' (without the quotes) to download and save the API as 't'.
  • Before using the API you'll have to load it: os.loadAPI("t").

Usage

A lot of the functions do the same as the default turtle API, except with additional checks. There are also some functions that combine default functions for ease of use. E.g. turnAround() turns right twice.
Most of the function names are the same, but instead of writing "turtle." in front, you now write "t.".


Digging
These will dig as long as there is a block in the way. So if sand falls down, it will dig as long as necessary.

  • t.dig()
  • t.digUp()
  • t.digDown()


Traveling
These will not be stopped by blocks or mobs.
[amount] is optional, you can leave it out. It is the amount of blocks to travel. If left out these will travel 1 block.

  • t.forward([amount])
  • t.up([amount])
  • t.down([amount])
  • t.back([amount])


Placing blocks
Here, 'block' is a number between 1 and 16. It combines selecting and placing.
I highly recommend adding e.g. "stoneBrick = 1" at the beginning of the code. This way you can later easily see which block must go in which slot. Example: "t.place(stoneBrick)".
If there is another block in the way, it will break it, unless it is the same type of block.

  • t.place(block)
  • t.placeUp(block)
  • t.placeDown(block)
  • t.placeRight(block)
  • t.placeLeft(block)
  • t.placeBack(block)


The following function places a row of blocks:

  • t.placeRow(placeDir, block, travelDir, length)
    • travelDir is the most logical one. It is the direction the turtle travels to. Possible directions: "forward","up","down","right","left","back".
    • placeDir is a bit more difficult to understand. placeDir is the direction to place the block in. The turtle travels in one direction, but it cannot place a block in that direction (it can, but it will get dug up again). This means that the place direction must be another direction as the travel direction. The possible directions are the same as travelDir.
    • length is the amount of blocks to travel.
    • Example: t.placeRow(up, marble, forward, 15)


If any of these run out of their resource, the API will write a message and waits for any text input to continue.
This way you can refill and write something (anything) to continue the program.


Turning
This function simply turns right twice. If you really want, you can change it to turn left twice ;).

  • t.turnAround()


These are simply a shorter way to write turtle.turnLeft() and turtle.turnRight().

  • t.right()
  • t.left()


These simply turn left or right, and move forward an amount.
[amount] is optional, and is the amount of blocks to travel forward. If left out these will travel 1 block.

  • t.goRight([amount])
  • t.goLeft([amount])


These are the same as the previous functions, except at the end they turn back again.

  • t.strafeRight([amount])
  • t.strafeLeft([amount])

Code

Download: Robust Turtle API
Save it as 't', without ".txt".

--Robust Turtle API by SpeedR

--Digging with gravel/sand detection
function dig()
  local tries = 0
  while turtle.detect() do
    turtle.dig()
    sleep(0.4)
    tries = tries + 1
    if tries>500 then
      print("Error: dug for too long.")
      return false
    end
  end
  return true
end

function digUp()
  local tries = 0
  while turtle.detectUp() do
    turtle.digUp()
    sleep(0.4)
    tries = tries + 1
    if tries>500 then
      print("Error: dug up for too long.")
      return false
    end
  end
  return true
end

function digDown()
  local tries = 0
  while turtle.detectDown() do
    turtle.digDown()
    sleep(0.4)
    tries = tries + 1
    if tries>500 then
      print("Error: dug down for too long.")
      return false
    end
  end
  return true
end


--Traveling: Goes in the direction no matter what (almost)
--Will not be stopped by blocks or mobs
function forward(l)
  l=l or 1
  for i=1,l do
    local tries = 0
    while turtle.forward() ~= true do
      turtle.dig()
      turtle.attack()
      sleep(0.2)
      tries = tries + 1
      if tries>500 then
        print("Error: can't move forward.")
        return false
      end
    end
  end
  return true
end

function up(l)
  l=l or 1
  for i=1,l do
    local tries = 0
    while turtle.up() ~= true do
      turtle.digUp()
      turtle.attackUp()
      sleep(0.2)
      tries = tries + 1
      if tries>500 then
        print("Error: can't move up.")
        return false
      end
    end
  end
  return true
end

function down(l)
  l=l or 1
  for i=1,l do
    local tries = 0
    while turtle.down() ~= true do
      turtle.digDown()
      turtle.attackDown()
      sleep(0.2)
      tries = tries + 1
      if tries>500 then
        print("Error: can't move down.")
        return false
      end
    end
  end
  return true
end

function back(l)
  l=l or 1
  for i=1,l do
    if turtle.back() ~= true then
      turnAround()
      forward()
      turnAround()
    end
  end
end


--Place blocks
--Does not place when there's already the right block.
function place(block)
  turtle.select(block)
  if turtle.compare()==false then
    if turtle.getItemCount(block)==0 then
      outOfResource(block)
    end
    dig()
    turtle.place()
  end
end

function placeUp(block)
  turtle.select(block)
  if turtle.compareUp()==false then
    if turtle.getItemCount(block)==0 then
      outOfResource(block)
    end
    digUp()
    turtle.placeUp()
  end
end

function placeDown(block)
  turtle.select(block)
  if turtle.compareDown()==false then
    if turtle.getItemCount(block)==0 then
      outOfResource(block)
    end
    digDown()
    turtle.placeDown()
  end
end

local function outOfResource()
  print("Ran out of a resource. Block: ",block , ".")
  print("Refill, then say something to proceed.")
  read()
end

function placeRight(block)
  turtle.turnRight()
  place(block)
  turtle.turnLeft()
end

function placeLeft(block)
  turtle.turnLeft()
  place(block)
  turtle.turnRight()
end

function placeBack(block)
  turnAround()
  place(block)
  turnAround()
end

--place row     e.g. placeRow(up, marble, forward, 15)
function placeRow(placeDir, block, travelDir, l) 
  l=l or 1
  for i=1,l do
    if placeDir == "forward" then
      place(block)
    elseif placeDir == "up" then
      placeUp(block)
    elseif placeDir == "down" then
      placeDown(block)
    elseif placeDir == "right" then
      placeRight(block)
    elseif placeDir == "left" then
      placeLeft(block)
    elseif placeDir == "back" then
      placeBack(block)
    else
      print('"', placeDir, '" is not a valid direction!')
      return false
    end
    if travelDir == "forward" then
      forward()
    elseif travelDir == "up" then
      up()
    elseif travelDir == "down" then
      down()
    elseif travelDir == "right" then
      strafeRight()
    elseif travelDir == "left" then
      strafeLeft()
    elseif travelDir == "back" then
      back()
    else
      print('"', travelDir, '" is not a valid direction!')
      return false
    end
  end
  return true
end


--Turning
function turnAround()
  turtle.turnRight()
  turtle.turnRight()
end

function right()
  turtle.turnRight()
end

function left()
  turtle.turnLeft()
end

function goRight(l)
  l=l or 1
  turtle.turnRight()
  forward(l)
end

function goLeft(l)
  l=l or 1
  turtle.turnLeft()
  forward(l)
end

function strafeRight(l)
  l=l or 1
  goRight(l)
  turtle.turnLeft()
end

function strafeLeft(l)
  l=l or 1
  goLeft(l)
  turtle.turnRight()
end