topspeed

searcher

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