Guest User

Untitled

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