Advertisement
kingpulse

Untitled

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