MigasRocha

Excavate Program (Drop Cobblestone)

Apr 15th, 2024 (edited)
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.73 KB | Gaming | 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. -- List of unwanted item names
  25. local unwantedItems = {
  26.     "minecraft:cobblestone",
  27.     "minecraft:dirt",
  28.     "minecraft:gravel",
  29.     "quark:jasper",
  30.     "minecraft:granite",
  31.     "minecraft:andesite",
  32.     "minecraft:diorite",
  33.     "minecraft:deepslate",
  34.     "minecraft:tuff",
  35.     "minecraft:calcite",
  36.     "powah:dry_ice",
  37.     "minecraft:oak_planks",
  38.     "minecraft:oak_fence",
  39.     "minecraft:torch",
  40.     "minecraft:rail",
  41.     "minecraft:sand",
  42.     "quark:shale",
  43.     "quark:myalite",
  44.     "minecraft:stick",
  45.     "quark:limestone",
  46.     "create:scoria",
  47.     "forbidden_arcanus:darkstone",
  48.     "minecraft:cobbled_deepslate",
  49.     "mminecraft:coarse_dirt"
  50.    
  51.     -- Add more item names as needed
  52. }
  53.  
  54. -- Function to check if an item is unwanted
  55. local function isUnwanted(itemName)
  56.     for _, unwanted in ipairs(unwantedItems) do
  57.         if itemName == unwanted then
  58.             return true
  59.         end
  60.     end
  61.     return false
  62. end
  63.  
  64. -- Function to drop unwanted items from turtle's inventory
  65. local function dropUnwantedItems()
  66.     for slot = 1, 16 do  -- Iterate over turtle's inventory slots (1 to 16)
  67.         local itemDetails = turtle.getItemDetail(slot)
  68.         if itemDetails then
  69.             local itemName = itemDetails.name
  70.             if isUnwanted(itemName) then
  71.                 turtle.select(slot)  -- Select the slot with unwanted item
  72.                 turtle.dropUp()        -- Drop the unwanted item
  73.             end
  74.         end
  75.     end
  76. end
  77.  
  78. local function unload( _bKeepOneFuelStack )
  79.     print( "Unloading items..." )
  80.     for n=1,16 do
  81.         local nCount = turtle.getItemCount(n)
  82.         if nCount > 0 then
  83.             turtle.select(n)           
  84.             local bDrop = true
  85.             if _bKeepOneFuelStack and turtle.refuel(0) then
  86.                 bDrop = false
  87.                 _bKeepOneFuelStack = false
  88.             end        
  89.             if bDrop then
  90.                 turtle.drop()
  91.                 unloaded = unloaded + nCount
  92.             end
  93.         end
  94.     end
  95.     collected = 0
  96.     turtle.select(1)
  97. end
  98.  
  99. local function returnSupplies()
  100.     local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
  101.     print( "Returning to surface..." )
  102.     goTo( 0,0,0,0,-1 )
  103.    
  104.     local fuelNeeded = 2*(x+y+z) + 1
  105.     if not refuel( fuelNeeded ) then
  106.         unload( true )
  107.         print( "Waiting for fuel" )
  108.         while not refuel( fuelNeeded ) do
  109.             os.pullEvent( "turtle_inventory" )
  110.         end
  111.     else
  112.         unload( true ) 
  113.     end
  114.    
  115.     print( "Resuming mining..." )
  116.     goTo( x,y,z,xd,zd )
  117. end
  118.  
  119. local function collect()   
  120.     local bFull = true
  121.     local nTotalItems = 0
  122.     for n=1,16 do
  123.         local nCount = turtle.getItemCount(n)
  124.         if nCount == 0 then
  125.             bFull = false
  126.         end
  127.         nTotalItems = nTotalItems + nCount
  128.     end
  129.    
  130.     if nTotalItems > collected then
  131.         collected = nTotalItems
  132.         if math.fmod(collected + unloaded, 50) == 0 then
  133.             print( "Mined "..(collected + unloaded).." items." )
  134.         end
  135.     end
  136.    
  137.     if bFull then
  138.         print( "No empty slots left." )
  139.         return false
  140.     end
  141.     return true
  142. end
  143.  
  144. function refuel( ammount )
  145.     local fuelLevel = turtle.getFuelLevel()
  146.     if fuelLevel == "unlimited" then
  147.         return true
  148.     end
  149.    
  150.     local needed = ammount or (xPos + zPos + depth + 2)
  151.     if turtle.getFuelLevel() < needed then
  152.         local fueled = false
  153.         for n=1,16 do
  154.             if turtle.getItemCount(n) > 0 then
  155.                 turtle.select(n)
  156.                 if turtle.refuel(1) then
  157.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  158.                         turtle.refuel(1)
  159.                     end
  160.                     if turtle.getFuelLevel() >= needed then
  161.                         turtle.select(1)
  162.                         return true
  163.                     end
  164.                 end
  165.             end
  166.         end
  167.         turtle.select(1)
  168.         return false
  169.     end
  170.    
  171.     return true
  172. end
  173.  
  174. local function tryForwards()
  175.     if not refuel() then
  176.         print( "Not enough Fuel" )
  177.         returnSupplies()
  178.     end
  179.    
  180.     while not turtle.forward() do
  181.         if turtle.detect() then
  182.             if turtle.dig() then
  183.                 dropUnwantedItems()
  184.                 if not collect() then
  185.                     returnSupplies()
  186.                 end
  187.             else
  188.                 return false
  189.             end
  190.         elseif turtle.attack() then
  191.             if not collect() then
  192.                 returnSupplies()
  193.             end
  194.         else
  195.             sleep( 0.5 )
  196.         end
  197.     end
  198.    
  199.     xPos = xPos + xDir
  200.     zPos = zPos + zDir
  201.     return true
  202. end
  203.  
  204. local function tryDown()
  205.     if not refuel() then
  206.         print( "Not enough Fuel" )
  207.         returnSupplies()
  208.     end
  209.    
  210.     while not turtle.down() do
  211.         if turtle.detectDown() then
  212.             if turtle.digDown() then
  213.                 if not collect() then
  214.                     returnSupplies()
  215.                 end
  216.             else
  217.                 return false
  218.             end
  219.         elseif turtle.attackDown() then
  220.             if not collect() then
  221.                 returnSupplies()
  222.             end
  223.         else
  224.             sleep( 0.5 )
  225.         end
  226.     end
  227.  
  228.     depth = depth + 1
  229.     if math.fmod( depth, 10 ) == 0 then
  230.         print( "Descended "..depth.." metres." )
  231.     end
  232.  
  233.     return true
  234. end
  235.  
  236. local function turnLeft()
  237.     turtle.turnLeft()
  238.     xDir, zDir = -zDir, xDir
  239. end
  240.  
  241. local function turnRight()
  242.     turtle.turnRight()
  243.     xDir, zDir = zDir, -xDir
  244. end
  245.  
  246. function goTo( x, y, z, xd, zd )
  247.     while depth > y do
  248.         if turtle.up() then
  249.             depth = depth - 1
  250.         elseif turtle.digUp() or turtle.attackUp() then
  251.             collect()
  252.         else
  253.             sleep( 0.5 )
  254.         end
  255.     end
  256.  
  257.     if xPos > x then
  258.         while xDir ~= -1 do
  259.             turnLeft()
  260.         end
  261.         while xPos > x do
  262.             if turtle.forward() then
  263.                 xPos = xPos - 1
  264.             elseif turtle.dig() or turtle.attack() then
  265.                 collect()
  266.             else
  267.                 sleep( 0.5 )
  268.             end
  269.         end
  270.     elseif xPos < x then
  271.         while xDir ~= 1 do
  272.             turnLeft()
  273.         end
  274.         while xPos < x do
  275.             if turtle.forward() then
  276.                 xPos = xPos + 1
  277.             elseif turtle.dig() or turtle.attack() then
  278.                 collect()
  279.             else
  280.                 sleep( 0.5 )
  281.             end
  282.         end
  283.     end
  284.    
  285.     if zPos > z then
  286.         while zDir ~= -1 do
  287.             turnLeft()
  288.         end
  289.         while zPos > z do
  290.             if turtle.forward() then
  291.                 zPos = zPos - 1
  292.             elseif turtle.dig() or turtle.attack() then
  293.                 collect()
  294.             else
  295.                 sleep( 0.5 )
  296.             end
  297.         end
  298.     elseif zPos < z then
  299.         while zDir ~= 1 do
  300.             turnLeft()
  301.         end
  302.         while zPos < z do
  303.             if turtle.forward() then
  304.                 zPos = zPos + 1
  305.             elseif turtle.dig() or turtle.attack() then
  306.                 collect()
  307.             else
  308.                 sleep( 0.5 )
  309.             end
  310.         end
  311.     end
  312.    
  313.     while depth < y do
  314.         if turtle.down() then
  315.             depth = depth + 1
  316.         elseif turtle.digDown() or turtle.attackDown() then
  317.             collect()
  318.         else
  319.             sleep( 0.5 )
  320.         end
  321.     end
  322.    
  323.     while zDir ~= zd or xDir ~= xd do
  324.         turnLeft()
  325.     end
  326. end
  327.  
  328. if not refuel() then
  329.     print( "Out of Fuel" )
  330.     return
  331. end
  332.  
  333. print( "Excavating..." )
  334.  
  335. local reseal = false
  336. turtle.select(1)
  337. if turtle.digDown() then
  338.     reseal = true
  339. end
  340.  
  341. local alternate = 0
  342. local done = false
  343. while not done do
  344.     for n=1,size do
  345.         for m=1,size-1 do
  346.             if not tryForwards() then
  347.                 done = true
  348.                 break
  349.             end
  350.         end
  351.         if done then
  352.             break
  353.         end
  354.         if n<size then
  355.             if math.fmod(n + alternate,2) == 0 then
  356.                 turnLeft()
  357.                 if not tryForwards() then
  358.                     done = true
  359.                     break
  360.                 end
  361.                 turnLeft()
  362.             else
  363.                 turnRight()
  364.                 if not tryForwards() then
  365.                     done = true
  366.                     break
  367.                 end
  368.                 turnRight()
  369.             end
  370.         end
  371.     end
  372.     if done then
  373.         break
  374.     end
  375.    
  376.     if size > 1 then
  377.         if math.fmod(size,2) == 0 then
  378.             turnRight()
  379.         else
  380.             if alternate == 0 then
  381.                 turnLeft()
  382.             else
  383.                 turnRight()
  384.             end
  385.             alternate = 1 - alternate
  386.         end
  387.     end
  388.    
  389.     if not tryDown() then
  390.         done = true
  391.         break
  392.     end
  393. end
  394.  
  395. print( "Returning to surface..." )
  396.  
  397. -- Return to where we started
  398. goTo( 0,0,0,0,-1 )
  399. unload( false )
  400. goTo( 0,0,0,0,1 )
  401.  
  402. -- Seal the hole
  403. if reseal then
  404.     turtle.placeDown()
  405. end
  406.  
  407. print( "Mined "..(collected + unloaded).." items total." )
Add Comment
Please, Sign In to add comment