MigasRocha

Excavate Program (Drop Cobblestone)

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