Advertisement
Guest User

Untitled

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