lpenap

YAFT v0.1

Jun 14th, 2016
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.50 KB | None | 0 0
  1. -- yaft (yet another felling turtle) v0.1 by lpenap
  2. -- Program for lumberjack turtles in Computercraft
  3. --
  4. -- this is a work in progress, IT IS NOT WORKING ATM
  5.  
  6.  
  7. shell.run('clear')
  8. print ("Put saplings and fuel in any slot.")
  9.  
  10. local tArgs = { ... }
  11. if #tArgs ~= 1 then
  12.     print( "Usage: deforestate <number of trees>" )
  13.     return
  14. end
  15. local numTrees = tonumber( tArgs[1] )
  16. if numTrees < 1 then
  17.     print( "Number of trees must be positive" )
  18.     return
  19. end
  20.  
  21. local saplingBlock = "minecraft:sapling"
  22. local logBlock = "minecraft:log"
  23. local fuelItem = "minecraft:coal"
  24.  
  25. local minFuelNeeded = (numTrees * 5 * 9) + 2
  26. local maxRefuelAttempts = 32
  27. local sleepSecsForFuel = 60
  28. local sleepCycle = 120
  29. local lastTree = 0
  30.  
  31. local xPos, yPos, zPos = 0, 0, 0
  32. local step = 2
  33.  
  34. function refuel( ammount )
  35.   local fuelLevel = turtle.getFuelLevel()
  36.   if fuelLevel == "unlimited" then
  37.     return true
  38.   end
  39.   local needed = ammount
  40.   if turtle.getFuelLevel() < needed then
  41.     local fueled = false
  42.     for n=1,16 do
  43.       if turtle.getItemCount(n) > 0 then
  44.         turtle.select(n)
  45.         local data = turtle.getItemDetail(i)
  46.         if data.name == fuelItem then
  47.           if turtle.refuel(1) then
  48.             while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  49.               turtle.refuel(1)
  50.             end
  51.             if turtle.getFuelLevel() >= needed then
  52.               turtle.select(1)
  53.               return true
  54.             end
  55.           end
  56.         end
  57.       end
  58.     end
  59.     turtle.select(1)
  60.     return false
  61.   end  
  62.   return true
  63. end
  64.  
  65. function tryForward()
  66.   xPos = xPos + 1
  67.   turtle.forward()
  68. end
  69.  
  70. function tryBack()
  71.   xPos = xPos - 1
  72.   turtle.back()
  73. end
  74.  
  75. function circleAndSuck()
  76.   for i = 1, 4 do
  77.     turtle.suck()
  78.     turtle.turnRight()
  79.   end
  80. end
  81.  
  82. function scanInventory()
  83.   for i = 1, 16 do
  84.     local data = turtle.getItemDetail(i)
  85.     if data then
  86.       print("Item name (".. data.count .."): ", data.name)
  87.     end
  88.   end
  89. end
  90.  
  91. function gotSaplingInInventory()
  92.   for i = 1, 16 do
  93.     local data = turtle.getItemDetail(i)
  94.     if data then
  95.       if data.name == saplingBlock then
  96.         turtle.select(i)
  97.         return true
  98.       end
  99.     end
  100.   end
  101.   return false
  102. end
  103.  
  104. function moveToTree(treePos)
  105.   -- we are in front of a tree, move to the next position
  106.   turtle.turnLeft()
  107.   turtle.forward()
  108.   circleAndSuck()
  109.   turtle.forward()
  110.   circleAndSuck()
  111.   turtle.turnRight()
  112.   return true
  113. end
  114.  
  115. function exitTree()
  116.   while not turtle.detectDown() do
  117.     turtle.down()
  118.   end
  119.   -- attempt to suck fallen saplings
  120.   turtle.suckUp()
  121.   circleAndSuck()
  122.   --turtle.forward()
  123.   --circleAndSuck()
  124.   --turtle.back()
  125.   turtle.back()
  126.   circleAndSuck()
  127. end
  128.  
  129. function digUpTree(treePos)
  130.   local success, data = turtle.inspectUp()
  131.   while data.name == logBlock do
  132.     if turtle.digUp() then
  133.       if not collect(treePost) then
  134.         exitTree()
  135.         return false
  136.       else
  137.         turtle.up()
  138.       end
  139.     else
  140.       break
  141.     end
  142.     success, data = turtle.inspectUp()
  143.   end
  144.   exitTree()
  145.   return true
  146. end
  147.  
  148. function continueTree(treePos)
  149.   if not turtle.detect() then
  150.     turtle.forward()
  151.   end
  152.   while turtle.up() do
  153.   end
  154.   return digUpTree(treePos)
  155. end
  156.  
  157. function digTree(treePos)
  158.   if turtle.detect() then
  159.     if turtle.dig() then
  160.       if not collect(treePos) then
  161.         return false
  162.       end
  163.       turtle.forward()
  164.       if not digUpTree(treePos) then
  165.         return false
  166.       end
  167.     end
  168.   end
  169.   if not turtle.detect() then
  170.     if gotSaplingInInventory() then
  171.       turtle.place()
  172.     end
  173.   end
  174.   return true
  175. end
  176.  
  177. function checkBlock(data, treePos)
  178.   if data.name == logBlock then
  179.     return digTree(treePos)
  180.   elseif data.name == saplingBlock then
  181.     print ("Found sapling, skipping for now...")
  182.   else
  183.     print ("Found neither a log(tree) or a sapling, skipping...")
  184.   end
  185.   return true
  186. end
  187.  
  188. function canTakeAction(treePos)
  189.   if turtle.detect() then
  190.     local success, data = turtle.inspect()
  191.     return checkBlock(data, treePos)
  192.   else
  193.     if gotSaplingInInventory() then
  194.       turtle.place()
  195.     else
  196.       return false
  197.     end
  198.   end
  199.   return true
  200. end
  201.  
  202. function collect(treePos)
  203.   local bFull = true
  204.   local nTotalItems = 0
  205.   for n=1,16 do
  206.     local nCount = turtle.getItemCount(n)
  207.     if nCount == 0 then
  208.       bFull = false
  209.     end
  210.     nTotalItems = nTotalItems + nCount
  211.   end  
  212.   if bFull then
  213.     lastTree = treePos
  214.     print( "No empty slots left on tree ", lastTree)
  215.     return false
  216.   end
  217.   return true
  218. end
  219.  
  220. function waitForFuel(ammount)
  221.   while not refuel (ammount) do
  222.     print ("Not enough fuel, please refuel manually to continue...")
  223.     os.sleep(sleepSecsForFuel)
  224.   end
  225. end
  226.  
  227. function compactInventory()
  228.   -- TODO compact inventory to maintain at least 1 stack of coal for fuel
  229.   -- and 1 stack of saplings
  230.   return true
  231. end
  232.  
  233. function returnSupplies()
  234.   print ("returning supplies...")
  235.   turtle.turnRight()
  236.   circleAndSuck()
  237.   while turtle.forward() do
  238.     circleAndSuck()
  239.   end
  240.   turtle.turnLeft()
  241.   turtle.forward()
  242.   turtle.turnRight()
  243.   for i = 1, 16 do
  244.     local data = turtle.getItemDetail(i)
  245.     if data then
  246.       if data.name ~= fuelItem and data.name ~= saplingBlock then
  247.         turtle.select(i)
  248.         turtle.drop()
  249.       end
  250.     end
  251.   end
  252.   compactInventory()
  253.   if not refuel (minFuelNeeded) then
  254.     print ("Not enough fuel, attempting to refuel")
  255.     turtle.turnLeft()
  256.     local suckCount = 1
  257.     turtle.suck()
  258.     while not refuel(minFuelNeeded) do
  259.       turtle.suck()
  260.       suckCount = suckCount + 1
  261.       if suckCount >= maxRefuelAttempts then
  262.         print (suckCount .. " unsuccessful attempts to refuel from inventory ahead, sleeping 60 secs...")
  263.         os.sleep(sleepSecsForFuel)
  264.         suckCount = 0
  265.       end
  266.     end
  267.     print ("Refueled!, going to starting position...")
  268.     turtle.turnLeft()
  269.   else
  270.     turtle.turnRight()
  271.     turtle.turnRight()
  272.   end
  273. end
  274.  
  275. scanInventory()
  276. if not refuel(minFuelNeeded) then
  277.   print ("Out of Fuel")
  278.   return
  279. end
  280.  
  281. while true do
  282.   turtle.forward()
  283.   turtle.turnRight()
  284.   turtle.back()
  285.   if lastTree ~= 0 then
  286.     print ("Going to resume tree ", lastTree)
  287.     for i = 1, lastTree do
  288.       moveToTree(i)
  289.     end
  290.     if continueTree(lastTree) then
  291.       lastTree = 0
  292.     end
  293.   else
  294.     for i = 1, numTrees do
  295.       moveToTree(i)
  296.       if not canTakeAction(i) then
  297.         break
  298.       end
  299.     end
  300.   end
  301.   returnSupplies()
  302.   if lastTree == 0 then
  303.     os.sleep(sleepCycle)
  304.   end
  305. end
Advertisement
Add Comment
Please, Sign In to add comment