Advertisement
Guest User

excavate.lua

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