SHARE
TWEET

Untitled

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