Advertisement
PhilHibbs

cc_turtle_fell

Jan 24th, 2013
467
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.23 KB | None | 0 0
  1.  
  2. local tArgs = { ... }
  3. if #tArgs ~= 1 then
  4.     print( "Usage: fell <diameter>" )
  5.     return
  6. end
  7.  
  8. -- Fell a tree in a "quarry" pattern until we hit a layer with nothing found
  9. local size = tonumber( tArgs[1] )
  10. if size < 1 then
  11.     print( "Fell diameter must be positive" )
  12.     return
  13. end
  14.    
  15. local depth = 0
  16. local unloaded = 0
  17. local collected = 0
  18. local emptylayer = 1
  19.  
  20. local xPos,zPos = 0,0
  21. local xDir,zDir = 0,1
  22.  
  23. local goTo -- Filled in further down
  24. local refuel -- Filled in further down
  25.  
  26. local function unload()
  27.     print( "Unloading items..." )
  28.     for n=1,16 do
  29.         unloaded = unloaded + turtle.getItemCount(n)
  30.         turtle.select(n)
  31.         turtle.drop()
  32.     end
  33.     collected = 0
  34.     turtle.select(1)
  35. end
  36.  
  37. local function returnSupplies()
  38.     local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
  39.     print( "Returning to surface..." )
  40.     goTo( 0,0,0,0,-1 )
  41.    
  42.     local fuelNeeded = x+y+z + x+y+z + 1
  43.     if not refuel( fuelNeeded ) then
  44.         unload()
  45.         print( "Waiting for fuel" )
  46.         while not refuel( fuelNeeded ) do
  47.             sleep(1)
  48.         end
  49.     else
  50.         unload()   
  51.     end
  52.    
  53.     print( "Resuming felling..." )
  54.     goTo( x,y,z,xd,zd )
  55. end
  56.  
  57. local function collect()   
  58.     local bFull = true
  59.     local nTotalItems = 0
  60.     for n=1,16 do
  61.         local nCount = turtle.getItemCount(n)
  62.         if nCount == 0 then
  63.             bFull = false
  64.         end
  65.         nTotalItems = nTotalItems + nCount
  66.     end
  67.    
  68.     if nTotalItems > collected then
  69.         collected = nTotalItems
  70.         if math.fmod(collected + unloaded, 50) == 0 then
  71.             print( "Felled "..(collected + unloaded).." items." )
  72.         end
  73.     end
  74.    
  75.     if bFull then
  76.         print( "No empty slots left." )
  77.         return false
  78.     end
  79.     return true
  80. end
  81.  
  82. function refuel( ammount )
  83.     local fuelLevel = turtle.getFuelLevel()
  84.     if fuelLevel == "unlimited" then
  85.         return true
  86.     end
  87.    
  88.     local needed = ammount or (xPos + zPos + depth + 1)
  89.     if turtle.getFuelLevel() < needed then
  90.         local fueled = false
  91.         for n=1,16 do
  92.             if turtle.getItemCount(n) > 0 then
  93.                 turtle.select(n)
  94.                 if turtle.refuel(1) then
  95.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  96.                         turtle.refuel(1)
  97.                     end
  98.                     if turtle.getFuelLevel() >= needed then
  99.                         turtle.select(1)
  100.                         return true
  101.                     end
  102.                 end
  103.             end
  104.         end
  105.         turtle.select(1)
  106.         return false
  107.     end
  108.    
  109.     return true
  110. end
  111.  
  112. local function tryForwards()
  113.     if not refuel() then
  114.         print( "Not enough Fuel" )
  115.         returnSupplies()
  116.     end
  117.    
  118.     while not turtle.forward() do
  119.         if turtle.detect() then
  120.                         if emptylayer == 1 then
  121.                                 print( "Found a block on layer" )
  122.                                 emptylayer = 0
  123.                         end
  124.             if turtle.dig() then
  125.                 if not collect() then
  126.                     returnSupplies()
  127.                 end
  128.             else
  129.                 return false
  130.             end
  131.         elseif turtle.attack() then
  132.             if not collect() then
  133.                 returnSupplies()
  134.             end
  135.         else
  136.             sleep( 0.5 )
  137.         end
  138.     end
  139.    
  140.     xPos = xPos + xDir
  141.     zPos = zPos + zDir
  142.     return true
  143. end
  144.  
  145. local function tryUp()
  146.     if not refuel() then
  147.         print( "Not enough Fuel" )
  148.         returnSupplies()
  149.     end
  150.    
  151.     while not turtle.up() do
  152.         if turtle.detectUp() then
  153.             if turtle.digUp() then
  154.                 if not collect() then
  155.                     returnSupplies()
  156.                 end
  157.             else
  158.                 return false
  159.             end
  160.         elseif turtle.attackUp() then
  161.             if not collect() then
  162.                 returnSupplies()
  163.             end
  164.         else
  165.             sleep( 0.5 )
  166.         end
  167.     end
  168.  
  169.     depth = depth + 1
  170.     if math.fmod( depth, 10 ) == 0 then
  171.         print( "Ascended "..depth.." metres." )
  172.     end
  173.  
  174.     return true
  175. end
  176.  
  177. local function turnLeft()
  178.     turtle.turnLeft()
  179.     xDir, zDir = -zDir, xDir
  180. end
  181.  
  182. local function turnRight()
  183.     turtle.turnRight()
  184.     xDir, zDir = zDir, -xDir
  185. end
  186.  
  187. function goTo( x, y, z, xd, zd )
  188.     while depth < y do
  189.         if turtle.up() then
  190.             depth = depth + 1
  191.         elseif turtle.digUp() or turtle.attackUp() then
  192.             collect()
  193.         else
  194.             sleep( 0.5 )
  195.         end
  196.     end
  197.  
  198.     if xPos > x then
  199.         while xDir ~= -1 do
  200.             turnLeft()
  201.         end
  202.         while xPos > x do
  203.             if turtle.forward() then
  204.                 xPos = xPos - 1
  205.             elseif turtle.dig() or turtle.attack() then
  206.                 collect()
  207.             else
  208.                 sleep( 0.5 )
  209.             end
  210.         end
  211.     elseif xPos < x then
  212.         while xDir ~= 1 do
  213.             turnLeft()
  214.         end
  215.         while xPos < x do
  216.             if turtle.forward() then
  217.                 xPos = xPos + 1
  218.             elseif turtle.dig() or turtle.attack() then
  219.                 collect()
  220.             else
  221.                 sleep( 0.5 )
  222.             end
  223.         end
  224.     end
  225.    
  226.     if zPos > z then
  227.         while zDir ~= -1 do
  228.             turnLeft()
  229.         end
  230.         while zPos > z do
  231.             if turtle.forward() then
  232.                 zPos = zPos - 1
  233.             elseif turtle.dig() or turtle.attack() then
  234.                 collect()
  235.             else
  236.                 sleep( 0.5 )
  237.             end
  238.         end
  239.     elseif zPos < z then
  240.         while zDir ~= 1 do
  241.             turnLeft()
  242.         end
  243.         while zPos < z do
  244.             if turtle.forward() then
  245.                 zPos = zPos + 1
  246.             elseif turtle.dig() or turtle.attack() then
  247.                 collect()
  248.             else
  249.                 sleep( 0.5 )
  250.             end
  251.         end
  252.     end
  253.    
  254.     while depth > y do
  255.         if turtle.down() then
  256.             depth = depth - 1
  257.         elseif turtle.digDown() or turtle.attackDown() then
  258.             collect()
  259.         else
  260.             sleep( 0.5 )
  261.         end
  262.     end
  263.    
  264.     while zDir ~= zd or xDir ~= xd do
  265.         turnLeft()
  266.     end
  267. end
  268.  
  269. if not refuel() then
  270.     print( "Out of Fuel" )
  271.     return
  272. end
  273.  
  274. print( "Felling..." )
  275.  
  276. local alternate = 0
  277. local done = false
  278. if tryForwards() then
  279.     while not done do
  280.         for n=1,size do
  281.             for m=1,size-1 do
  282.                 if not tryForwards() then
  283.                     done = true
  284.                     break
  285.                 end
  286.             end
  287.             if done then
  288.                 break
  289.             end
  290.             if n<size then
  291.                 if math.fmod(n + alternate,2) == 0 then
  292.                     turnLeft()
  293.                     if not tryForwards() then
  294.                         done = true
  295.                         break
  296.                     end
  297.                     turnLeft()
  298.                 else
  299.                     turnRight()
  300.                     if not tryForwards() then
  301.                         done = true
  302.                         break
  303.                     end
  304.                     turnRight()
  305.                 end
  306.             end
  307.         end
  308.         if done then
  309.             break
  310.         end
  311.    
  312.         if size > 1 then
  313.             if math.fmod(size,2) == 0 then
  314.                 turnRight()
  315.             else
  316.                 if alternate == 0 then
  317.                     turnLeft()
  318.                 else
  319.                     turnRight()
  320.                 end
  321.                 alternate = 1 - alternate
  322.             end
  323.         end
  324.  
  325.         print( "emptylayer "..emptylayer )
  326.         if emptylayer == 1 then
  327.                 print( "empty layer " )
  328.             done = true
  329.             break
  330.         end
  331.         if not tryUp() then
  332.             done = true
  333.             break
  334.         end
  335.             emptylayer = 1
  336.     end
  337. end
  338.  
  339. print( "Returning to surface..." )
  340.  
  341. -- Return to where we started
  342. goTo( 0,0,0,0,-1 )
  343. unload()
  344. goTo( 0,0,0,0,1 )
  345.  
  346. print( "Felled "..(collected + unloaded).." items total." )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement