Advertisement
Ulthean

api_turtleExt

Jan 12th, 2013
11,313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.68 KB | None | 0 0
  1. -- VALUES FOR THE DIRECTIONS
  2. local up = "up"
  3. local down = "down"
  4. local forward = "forward"
  5. local back  = "back"
  6. local right = "right"
  7. local left = "left"
  8.  
  9. -- --------------------------------------------------------------- --
  10. -- START OF FUNCTIONS EXTENDING THE FUNCTIONALITY OF THE BASIC API --
  11. -- --------------------------------------------------------------- --
  12.  
  13. -- ALIGNS THE TURTLE TO MOVE, DIG, ... IN A CERTAIN DIRECTION
  14. function turnTo(dir)
  15.   if dir==back then
  16.     turtle.turnLeft()
  17.     turtle.turnLeft()
  18.   elseif dir==right then
  19.     turtle.turnRight()
  20.   elseif dir==left then
  21.     turtle.turnLeft()
  22.   end
  23. end
  24.  
  25. -- REALIGNS THE TURTLE TO THE ORIGINAL DIRECTION
  26. function turnFrom(dir)
  27.   if dir==back then
  28.     turtle.turnLeft()
  29.     turtle.turnLeft()
  30.   elseif dir==right then
  31.     turtle.turnLeft()
  32.   elseif dir==left then
  33.     turtle.turnRight()
  34.   end
  35. end
  36.  
  37. -- RETURNS THE DIRECTION THE TURTLE SHOULD MOVE, DIG, ... AFTER THE PREVIOUS ALIGNMENT
  38. function turnedDir(dir)
  39.   if dir==right or dir==left or dir==back then
  40.     return forward
  41.   else
  42.     return dir
  43.   end
  44. end
  45.  
  46. -- RETURNS THE REVERSE DIRECTION SO UP BECOMES DOWN ETC
  47. function reverseDir(dir)
  48.   if dir==forward then
  49.     return back
  50.   elseif dir==back then
  51.     return forward
  52.   elseif dir==up then
  53.     return down
  54.   elseif dir==down then
  55.     return up
  56.   elseif dir==right then
  57.     return left
  58.   elseif dir==left then
  59.     return right
  60.   end
  61. end
  62.  
  63. -- RETURNS THE DIRECTION USED BY THE PERIPHERAL FUNCTIONS
  64. function peripheralDir(dir)
  65.   if dir==forward then
  66.     return "front"
  67.   elseif dir==up then
  68.     return "top"
  69.   elseif dir==down then
  70.     return "bottom"
  71.   end
  72. end
  73.  
  74. -- CONVERTS AN INTEGER TO A DIRECTION
  75. function intToDir(dir)
  76.   if dir == 1 then
  77.     return up
  78.   elseif dir == 2 then
  79.     return down
  80.   elseif dir == 3 then
  81.     return forward
  82.   elseif dir == 4 then
  83.     return left
  84.   elseif dir == 5 then
  85.     return back
  86.   elseif dir == 6 then
  87.     return right
  88.   end
  89. end
  90.  
  91. -- RETURNS THE REVERSE DIRECTION SO UP BECOMES DOWN ETC
  92. function reverseIntDir(dir)
  93.   if dir==1 then
  94.     return 2
  95.   elseif dir==2 then
  96.     return 1
  97.   elseif dir==3 then
  98.     return 5
  99.   elseif dir==4 then
  100.     return 6
  101.   elseif dir==5 then
  102.     return 3
  103.   elseif dir==6 then
  104.     return 4
  105.   end
  106. end
  107.  
  108. -- MOVES THE TURTLE A CERTAIN DISTANCE IN A CERTAIN DIRECTION
  109. -- IF NO DISTANCE IS SPECIFIED IT WILL JUST MOVE 1 STEP
  110. function move(dir, steps, attempts)
  111.   steps = steps or 1
  112.   attempts = attempts or 10
  113.   local stepsTaken = 0
  114.   turnTo(dir)
  115.   local tDir=turnedDir(dir)
  116.   for i=1,steps do
  117.     local tries=1
  118.     local success=false
  119.     while (((attempts==0) or (tries<=attempts))) do
  120.       if tDir==forward then
  121.         success=turtle.forward()
  122.       elseif tDir==up then
  123.         success=turtle.up()
  124.       elseif tDir==down then
  125.         success=turtle.down()
  126.       end
  127.       if success then
  128.         break
  129.       end
  130.       attack(tDir)
  131.       -- THIS CONSTRUCTION IS USED SO TRIES WON'T OVERFLOW WHEN ATTEMPTS==0
  132.       tries = math.min(tries+1, attempts+1)
  133.       sleep(0.5)
  134.     end
  135.     if success then
  136.       stepsTaken=stepsTaken+1
  137.     else
  138.       break
  139.     end
  140.   end
  141.   turnFrom(dir)
  142.   return stepsTaken
  143. end
  144.  
  145. -- DIGS IN A CERTAIN DIRECTION
  146. function dig(dir, attempts)
  147.   attempts = attempts or 10
  148.   turtle.select(1)
  149.   turnTo(dir)
  150.   local tDir=turnedDir(dir)
  151.   local tries=1
  152.   local success=false
  153.   while ((detect(tDir)) and ((attempts==0) or (tries<=attempts))) do
  154.     if not (peripheral.getType(peripheralDir(tDir))=="turtle") then
  155.       if tDir==forward then
  156.         success=turtle.dig()
  157.       elseif tDir==up then
  158.         success=turtle.digUp()
  159.       elseif tDir==down then
  160.         success=turtle.digDown()
  161.       end
  162.     end
  163.     -- THIS CONSTRUCTION IS USED SO TRIES WON'T OVERFLOW WHEN ATTEMPTS==0
  164.     tries = math.min(tries+1, attempts+1)
  165.     -- THE RANDOM FUNCTION IS USED SO THE TURTLE WON'T GET STUCK ON COBBLESTONE GENERATORS
  166.     sleep(0.4+(math.random()/10))
  167.   end
  168.   turnFrom(dir)
  169.   return success
  170. end
  171.  
  172. -- DIGS AND MOVES A CERTAIN DISTANCE IN A CERTAIN DIRECTION
  173. -- IF NO DISTANCE IS SPECIFIED IT WILL JUST MOVE 1 STEP
  174. function digAndMove(dir, steps, attempts)
  175.   steps = steps or 1
  176.   attempts = attempts or 10
  177.   local stepsTaken = 0
  178.   turnTo(dir)
  179.   local tDir=turnedDir(dir)
  180.   for i=1,steps do
  181.     local tries=1
  182.     local success=false
  183.     while (((attempts==0) or (tries<=attempts))) do
  184.       dig(tDir, 1)
  185.       success = (move(tDir, 1, 1)==1)
  186.       if success then
  187.         break
  188.       end
  189.       -- THIS CONSTRUCTION IS USED SO TRIES WON'T OVERFLOW WHEN ATTEMPTS==0
  190.       tries = math.min(tries+1, attempts+1)
  191.       sleep(0)
  192.     end
  193.     if success then
  194.       stepsTaken=stepsTaken+1
  195.     else
  196.       break
  197.     end
  198.   end
  199.   turnFrom(dir)
  200.   return stepsTaken
  201. end
  202.  
  203. -- ATTACKS IN A CERTAIN DIRECTION
  204. function attack(dir)
  205.   turnTo(dir)
  206.   local tDir=turnedDir(dir)
  207.   local success
  208.   while turtle.attack(tDir) do
  209.     success=true
  210.     sleep(0.3)
  211.   end
  212.   turnFrom(dir)
  213.   return success
  214. end
  215.  
  216. -- PLACES A BLOCK FROM A CERTAIN SLOT IN A CERTAIN DIRECTION
  217. function place(dir, slot)
  218.   turtle.select(slot)
  219.   turnTo(dir)
  220.   local tDir=turnedDir(dir)
  221.   local success
  222.   if tDir==forward then
  223.     success=turtle.place()
  224.   elseif tDir==up then
  225.     success=turtle.placeUp()
  226.   elseif tDir==down then
  227.     success=turtle.placeDown()
  228.   end
  229.   turnFrom(dir)
  230.   return success
  231. end
  232.  
  233. -- DETECTS IF THERE IS A BLOCK IN A CERTAIN DIRECTION
  234. function detect(dir)
  235.   local block = false
  236.   turnTo(dir)
  237.   local tDir=turnedDir(dir)
  238.   if tDir==forward then
  239.     block = turtle.detect()
  240.   elseif tDir==up then
  241.     block = turtle.detectUp()
  242.   elseif tDir==down then
  243.     block = turtle.detectDown()
  244.   end
  245.   turnFrom(dir)
  246.   return block
  247. end
  248.  
  249. -- COMPARES A BLOCK IN A CERTAIN DIRECTION TO THE BLOCK IN A CERTAIN INVENTORY SLOT
  250. function compare(dir, slot)
  251.   local same = false
  252.   turtle.select(slot)
  253.   turnTo(dir)
  254.   local tDir=turnedDir(dir)
  255.   if tDir==forward then
  256.     same = turtle.compare()
  257.   elseif tDir==up then
  258.     same = turtle.compareUp()
  259.   elseif tDir==down then
  260.     same = turtle.compareDown()
  261.   end
  262.   turnFrom(dir)
  263.   return same
  264. end
  265.  
  266. -- COMPARES A BLOCK IN A CERTAIN DIRECTION TO A CERTAIN INVENTORY SLOT
  267. -- IF IT MATCHES THE BLOCK WILL BE REPLACED BY A BLOCK IN THE SPECIFIED SLOT
  268. function compareAndReplace(dir, compareSlot, replaceSlot)
  269.   local replaced = false
  270.   turnTo(dir)
  271.   local tDir=turnedDir(dir)
  272.   if not compare(tDir, compareSlot) then
  273.     replaced = true
  274.     dig(tDir)
  275.     place(tDir, replaceSlot)  
  276.   end
  277.   turnFrom(dir)
  278.   return replaced
  279. end
  280.  
  281. -- DROPS A CERTAIN NUMBER OF ITEMS IN A CERTAIN DIRECTION
  282. -- IF NO NUMBER IS SPECIFIED IT WILL DROP ALL THE ITEMS
  283. function drop(dir, num)
  284.   turnTo(dir)
  285.   local tDir=turnedDir(dir)
  286.   local success
  287.   if num == null then
  288.     if tDir==forward then
  289.       success=turtle.drop()
  290.     elseif tDir==up then
  291.       success=turtle.dropUp()
  292.     elseif tDir==down then
  293.       success=turtle.dropDown()
  294.     end
  295.   else
  296.     if tDir==forward then
  297.       success=turtle.drop(num)
  298.     elseif tDir==up then
  299.       success=turtle.dropUp(num)
  300.     elseif tDir==down then
  301.       success=turtle.dropDown(num)
  302.     end
  303.   end
  304.   turnFrom(dir)
  305.   return success
  306. end
  307.  
  308. -- SUCKS UP ITEMS FROM A CERTAIN DIRECTION
  309. function suck(dir)
  310.   turnTo(dir)
  311.   local tDir=turnedDir(dir)
  312.   local success
  313.   if tDir==forward then
  314.     success=turtle.suck()
  315.   elseif tDir==up then
  316.     success=turtle.suckUp()
  317.   elseif tDir==down then
  318.     success=turtle.suckDown()
  319.   end
  320.   turnFrom(dir)
  321.   return success
  322. end
  323.  
  324. -- REFUELS THE TURTLE, PARAMETERS DENOTE IN WHICH DIRECTION THE FUEL ITEMS WILL BE, WHERE TO DROP ANY
  325. -- LEFTOVERS (BUCKETS) IN WHICH INVENTORY SPOT THE FUEL WILL BE AND HOW MUCH FUEL NEEDS TO BE STORED
  326. function refuel(suckDir, dropDir, fuelSlot, requiredFuel)
  327.   turtle.select(fuelSlot)
  328.   local dispMsg=true
  329.   while turtle.getFuelLevel() < requiredFuel do
  330.     suck(suckDir)
  331.     local success = turtle.refuel()
  332.     if not success then
  333.       if dispMsg then
  334.         term.clear()
  335.         term.setCursorPos(1,1)
  336.         print("---------------------------------")
  337.         print("Please place some fuel in a chest")
  338.         print("Chest Direction: "..suckDir)
  339.         print("Fuel required:   "..(requiredFuel-turtle.getFuelLevel()))
  340.         print("---------------------------------")
  341.         dispMsg=false
  342.       end
  343.       sleep(1)
  344.     else
  345.       dispMsg=true
  346.     end
  347.     drop(dropDir)
  348.     sleep(0)
  349.   end
  350.   turtle.select(1)
  351.   term.clear()
  352. end
  353.  
  354. -- ------------------------------------------------------------- --
  355. -- END OF FUNCTIONS EXTENDING THE FUNCTIONALITY OF THE BASIC API --
  356. -- ------------------------------------------------------------- --
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement