SHARE
TWEET

Untitled

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