KRIN3X

customExcavate

Jan 14th, 2021 (edited)
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.07 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 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 getModem()
  25.   for a,b in pairs(rs.getSides()) do
  26.     if peripheral.getType(b) == "modem" and peripheral.call(b,"isWireless") then
  27.       return b
  28.     end
  29.   end
  30. end
  31.  
  32. rednet.open(getModem())
  33.  
  34. local function unload( _bKeepOneFuelStack )
  35.     print( "Unloading items..." )
  36.     rednet.broadcast("Unloading items...")
  37.     for n=1,16 do
  38.         local nCount = turtle.getItemCount(n)
  39.         if nCount > 0 then
  40.             turtle.select(n)           
  41.             local bDrop = true
  42.             if _bKeepOneFuelStack and turtle.refuel(0) then
  43.                 bDrop = false
  44.                 _bKeepOneFuelStack = false
  45.             end        
  46.             if bDrop then
  47.                 turtle.drop()
  48.                 unloaded = unloaded + nCount
  49.             end
  50.         end
  51.     end
  52.     collected = 0
  53.     turtle.select(1)
  54. end
  55.  
  56. local function returnSupplies()
  57.     local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
  58.     print( "Returning to surface..." )
  59.     rednet.broadcast("Returning to surface..."  )
  60.     goTo( 0,0,0,0,-1 )
  61.    
  62.     local fuelNeeded = 2*(x+y+z) + 1
  63.     if not refuel( fuelNeeded ) then
  64.         unload( true )
  65.         print( "Waiting for fuel" )
  66.         rednet.broadcast("Waiting for fuel" )
  67.         while not refuel( fuelNeeded ) do
  68.             os.pullEvent( "turtle_inventory" )
  69.         end
  70.     else
  71.         unload( true ) 
  72.     end
  73.    
  74.     print( "Resuming mining..." )
  75.     rednet.broadcast("Resuming 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.             rednet.broadcast("Mined "..(collected + unloaded).." items.")
  95.         end
  96.     end
  97.    
  98.     if bFull then
  99.         print( "No empty slots left." )
  100.         rednet.broadcast("No empty slots left.")
  101.         return false
  102.     end
  103.     return true
  104. end
  105.  
  106. function refuel( ammount )
  107.     local fuelLevel = turtle.getFuelLevel()
  108.     if fuelLevel == "unlimited" then
  109.         return true
  110.     end
  111.    
  112.     local needed = ammount or (xPos + zPos + depth + 2)
  113.     if turtle.getFuelLevel() < needed then
  114.         local fueled = false
  115.         for n=1,16 do
  116.             if turtle.getItemCount(n) > 0 then
  117.                 turtle.select(n)
  118.                 if turtle.refuel(1) then
  119.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  120.                         turtle.refuel(1)
  121.                     end
  122.                     if turtle.getFuelLevel() >= needed then
  123.                         turtle.select(1)
  124.                         return true
  125.                     end
  126.                 end
  127.             end
  128.         end
  129.         turtle.select(1)
  130.         return false
  131.     end
  132.    
  133.     return true
  134. end
  135.  
  136. local function tryForwards()
  137.     if not refuel() then
  138.         print( "Not enough Fuel" )
  139.         rednet.broadcast("Not enough Fuel")
  140.         returnSupplies()
  141.     end
  142.    
  143.     while not turtle.forward() do
  144.         if turtle.detect() then
  145.             if turtle.dig() then
  146.                 if not collect() then
  147.                     returnSupplies()
  148.                 end
  149.             else
  150.                 return false
  151.             end
  152.         elseif turtle.attack() then
  153.             if not collect() then
  154.                 returnSupplies()
  155.             end
  156.         else
  157.             sleep( 0.5 )
  158.         end
  159.     end
  160.    
  161.     xPos = xPos + xDir
  162.     zPos = zPos + zDir
  163.     return true
  164. end
  165.  
  166. local function tryDown()
  167.     if not refuel() then
  168.         print( "Not enough Fuel" )
  169.         rednet.broadcast("Not enough Fuel")
  170.         returnSupplies()
  171.     end
  172.    
  173.     while not turtle.down() do
  174.         if turtle.detectDown() then
  175.             if turtle.digDown() then
  176.                 if not collect() then
  177.                     returnSupplies()
  178.                 end
  179.             else
  180.                 return false
  181.             end
  182.         elseif turtle.attackDown() then
  183.             if not collect() then
  184.                 returnSupplies()
  185.             end
  186.         else
  187.             sleep( 0.5 )
  188.         end
  189.     end
  190.  
  191.     depth = depth + 1
  192.     if math.fmod( depth, 10 ) == 0 then
  193.         print( "Descended "..depth.." metres." )
  194.         rednet.broadcast("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() or turtle.attackUp() 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() or turtle.attack() 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() or turtle.attack() 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() or turtle.attack() 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() or turtle.attack() 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() or turtle.attackDown() 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.     rednet.broadcast("Out of Fuel" )
  295.     return
  296. end
  297.  
  298. print( "Excavating..." )
  299. rednet.broadcast("Excavating..." )
  300.  
  301. local reseal = false
  302. turtle.select(1)
  303. if turtle.digDown() then
  304.     reseal = true
  305. end
  306.  
  307. local alternate = 0
  308. local done = false
  309. while not done do
  310.     for n=1,size do
  311.         for m=1,size-1 do
  312.             if not tryForwards() then
  313.                 done = true
  314.                 break
  315.             end
  316.         end
  317.         if done then
  318.             break
  319.         end
  320.         if n<size then
  321.             if math.fmod(n + alternate,2) == 0 then
  322.                 turnLeft()
  323.                 if not tryForwards() then
  324.                     done = true
  325.                     break
  326.                 end
  327.                 turnLeft()
  328.             else
  329.                 turnRight()
  330.                 if not tryForwards() then
  331.                     done = true
  332.                     break
  333.                 end
  334.                 turnRight()
  335.             end
  336.         end
  337.     end
  338.     if done then
  339.         break
  340.     end
  341.    
  342.     if size > 1 then
  343.         if math.fmod(size,2) == 0 then
  344.             turnRight()
  345.         else
  346.             if alternate == 0 then
  347.                 turnLeft()
  348.             else
  349.                 turnRight()
  350.             end
  351.             alternate = 1 - alternate
  352.         end
  353.     end
  354.    
  355.     if not tryDown() then
  356.         done = true
  357.         break
  358.     end
  359. end
  360.  
  361. print( "Returning to surface..." )
  362. rednet.broadcast("Returning to surface..." )
  363.  
  364. -- Return to where we started
  365. goTo( 0,0,0,0,-1 )
  366. unload( false )
  367. goTo( 0,0,0,0,1 )
  368.  
  369. -- Seal the hole
  370. if reseal then
  371.     turtle.placeDown()
  372. end
  373.  
  374. print( "Mined "..(collected + unloaded).." items total." )
  375. rednet.broadcast("Mined "..(collected + unloaded).." items total.")
Add Comment
Please, Sign In to add comment