TechManDylan

CustomExcavate2

May 22nd, 2025 (edited)
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.49 KB | None | 0 0
  1. local tArgs = { ... }
  2. if #tArgs ~= 1 then
  3.     print("Usage: excavate <diameter>")
  4.     return
  5. end
  6.  
  7. local size = tonumber(tArgs[1])
  8. if size < 1 then
  9.     print("Excavate diameter must be positive")
  10.     return
  11. end
  12.  
  13. local depth = 0
  14. local unloaded = 0
  15. local collected = 0
  16.  
  17. local xPos, zPos = 0, 0
  18. local xDir, zDir = 0, 1
  19.  
  20. local goTo -- filled in further down
  21.  
  22. -- Updated unload function with Ender Chest logic
  23. local function unload(_bKeepOneFuelStack)
  24.     print("Unloading items to ender chest...")
  25.  
  26.     while turtle.detectUp() do
  27.         if not turtle.digUp() then
  28.             print("Unable to clear space above to place ender chest.")
  29.             return
  30.         end
  31.     end
  32.  
  33.     local chestSlot = nil
  34.     for i = 1, 16 do
  35.         local detail = turtle.getItemDetail(i)
  36.         if detail and detail.name == "enderstorage:ender_chest" then
  37.             chestSlot = i
  38.             break
  39.         end
  40.     end
  41.  
  42.     if not chestSlot then
  43.         print("No ender chest found in inventory!")
  44.         return
  45.     end
  46.  
  47.     turtle.select(chestSlot)
  48.     if not turtle.placeUp() then
  49.         print("Failed to place ender chest above.")
  50.         return
  51.     end
  52.  
  53.     for i = 1, 16 do
  54.         local count = turtle.getItemCount(i)
  55.         if count > 0 then
  56.             turtle.select(i)
  57.             local bDrop = true
  58.             if _bKeepOneFuelStack and turtle.refuel(0) then
  59.                 bDrop = false
  60.                 _bKeepOneFuelStack = false
  61.             end
  62.             if bDrop then
  63.                 if turtle.dropUp() then
  64.                     unloaded = unloaded + count
  65.                 end
  66.             end
  67.         end
  68.     end
  69.  
  70.     turtle.select(chestSlot)
  71.     if not turtle.digUp() then
  72.         print("Warning: Failed to retrieve ender chest.")
  73.     end
  74.  
  75.     turtle.select(1)
  76.     collected = 0
  77. end
  78.  
  79. local function returnSupplies()
  80.     local x, y, z, xd, zd = xPos, depth, zPos, xDir, zDir
  81.     print("Handling inventory and fuel...")
  82.     unload(true)
  83.  
  84.     local fuelNeeded = 2 * (x + y + z) + 1
  85.     if not refuel(fuelNeeded) then
  86.         print("Waiting for fuel...")
  87.         while not refuel(fuelNeeded) do
  88.             os.pullEvent("turtle_inventory")
  89.         end
  90.     end
  91.  
  92.     print("Resuming mining...")
  93.     goTo(x, y, z, xd, zd)
  94. end
  95.  
  96. local function collect()
  97.     local bFull = true
  98.     local nTotalItems = 0
  99.     for n = 1, 16 do
  100.         local nCount = turtle.getItemCount(n)
  101.         if nCount == 0 then
  102.             bFull = false
  103.         end
  104.         nTotalItems = nTotalItems + nCount
  105.     end
  106.  
  107.     if nTotalItems > collected then
  108.         collected = nTotalItems
  109.         if math.fmod(collected + unloaded, 50) == 0 then
  110.             print("Mined " .. (collected + unloaded) .. " items.")
  111.         end
  112.     end
  113.  
  114.     if bFull then
  115.         print("No empty slots left.")
  116.         return false
  117.     end
  118.     return true
  119. end
  120.  
  121. -- Updated refuel function that consumes all fuel items
  122. function refuel(ammount)
  123.     local fuelLevel = turtle.getFuelLevel()
  124.     if fuelLevel == "unlimited" then
  125.         return true
  126.     end
  127.  
  128.     local needed = ammount or (xPos + zPos + depth + 2)
  129.     if turtle.getFuelLevel() >= needed then
  130.         return true
  131.     end
  132.  
  133.     local refueled = false
  134.     for i = 1, 16 do
  135.         if turtle.getItemCount(i) > 0 then
  136.             turtle.select(i)
  137.             if turtle.refuel(0) then
  138.                 while turtle.getItemCount(i) > 0 do
  139.                     if turtle.refuel(1) then
  140.                         refueled = true
  141.                     else
  142.                         break
  143.                     end
  144.                 end
  145.             end
  146.         end
  147.     end
  148.  
  149.     turtle.select(1)
  150.     return turtle.getFuelLevel() >= needed or refueled
  151. end
  152.  
  153. local function tryForwards()
  154.     if not refuel() then
  155.         print("Not enough Fuel")
  156.         returnSupplies()
  157.     end
  158.  
  159.     while not turtle.forward() do
  160.         if turtle.detect() then
  161.             if turtle.dig() then
  162.                 if not collect() then
  163.                     returnSupplies()
  164.                 end
  165.             else
  166.                 return false
  167.             end
  168.         elseif turtle.attack() then
  169.             if not collect() then
  170.                 returnSupplies()
  171.             end
  172.         else
  173.             sleep(0.5)
  174.         end
  175.     end
  176.  
  177.     xPos = xPos + xDir
  178.     zPos = zPos + zDir
  179.     return true
  180. end
  181.  
  182. local function tryDown()
  183.     if not refuel() then
  184.         print("Not enough Fuel")
  185.         returnSupplies()
  186.     end
  187.  
  188.     while not turtle.down() do
  189.         if turtle.detectDown() then
  190.             if turtle.digDown() then
  191.                 if not collect() then
  192.                     returnSupplies()
  193.                 end
  194.             else
  195.                 return false
  196.             end
  197.         elseif turtle.attackDown() then
  198.             if not collect() then
  199.                 returnSupplies()
  200.             end
  201.         else
  202.             sleep(0.5)
  203.         end
  204.     end
  205.  
  206.     depth = depth + 1
  207.     if math.fmod(depth, 10) == 0 then
  208.         print("Descended " .. depth .. " metres.")
  209.     end
  210.  
  211.     return true
  212. end
  213.  
  214. local function turnLeft()
  215.     turtle.turnLeft()
  216.     xDir, zDir = -zDir, xDir
  217. end
  218.  
  219. local function turnRight()
  220.     turtle.turnRight()
  221.     xDir, zDir = zDir, -xDir
  222. end
  223.  
  224. function goTo(x, y, z, xd, zd)
  225.     while depth > y do
  226.         if turtle.up() then
  227.             depth = depth - 1
  228.         elseif turtle.digUp() or turtle.attackUp() then
  229.             collect()
  230.         else
  231.             sleep(0.5)
  232.         end
  233.     end
  234.  
  235.     if xPos > x then
  236.         while xDir ~= -1 do turnLeft() end
  237.         while xPos > x do
  238.             if turtle.forward() then xPos = xPos - 1
  239.             elseif turtle.dig() or turtle.attack() then collect()
  240.             else sleep(0.5) end
  241.         end
  242.     elseif xPos < x then
  243.         while xDir ~= 1 do turnLeft() end
  244.         while xPos < x do
  245.             if turtle.forward() then xPos = xPos + 1
  246.             elseif turtle.dig() or turtle.attack() then collect()
  247.             else sleep(0.5) end
  248.         end
  249.     end
  250.  
  251.     if zPos > z then
  252.         while zDir ~= -1 do turnLeft() end
  253.         while zPos > z do
  254.             if turtle.forward() then zPos = zPos - 1
  255.             elseif turtle.dig() or turtle.attack() then collect()
  256.             else sleep(0.5) end
  257.         end
  258.     elseif zPos < z then
  259.         while zDir ~= 1 do turnLeft() end
  260.         while zPos < z do
  261.             if turtle.forward() then zPos = zPos + 1
  262.             elseif turtle.dig() or turtle.attack() then collect()
  263.             else sleep(0.5) end
  264.         end
  265.     end
  266.  
  267.     while depth < y do
  268.         if turtle.down() then
  269.             depth = depth + 1
  270.         elseif turtle.digDown() or turtle.attackDown() then
  271.             collect()
  272.         else
  273.             sleep(0.5)
  274.         end
  275.     end
  276.  
  277.     while zDir ~= zd or xDir ~= xd do
  278.         turnLeft()
  279.     end
  280. end
  281.  
  282. -- Initial fuel check
  283. if not refuel() then
  284.     print("Out of Fuel")
  285.     return
  286. end
  287.  
  288. print("Excavating...")
  289.  
  290. local alternate = 0
  291. local done = false
  292.  
  293. while not done do
  294.     for n = 1, size do
  295.         for m = 1, size - 1 do
  296.             if not tryForwards() then
  297.                 done = true
  298.                 break
  299.             end
  300.         end
  301.         if done then break end
  302.         if n < size then
  303.             if math.fmod(n + alternate, 2) == 0 then
  304.                 turnLeft()
  305.                 if not tryForwards() then done = true break end
  306.                 turnLeft()
  307.             else
  308.                 turnRight()
  309.                 if not tryForwards() then done = true break end
  310.                 turnRight()
  311.             end
  312.         end
  313.     end
  314.     if done then break end
  315.  
  316.     if size > 1 then
  317.         if math.fmod(size, 2) == 0 then
  318.             turnRight()
  319.         else
  320.             if alternate == 0 then turnLeft() else turnRight() end
  321.             alternate = 1 - alternate
  322.         end
  323.     end
  324.  
  325.     if not tryDown() then
  326.         done = true
  327.         break
  328.     end
  329. end
  330.  
  331. print("Returning to surface...")
  332. goTo(0, 0, 0, 0, -1)
  333. unload(false)
  334. goTo(0, 0, 0, 0, 1)
  335.  
  336. print("Mined " .. (collected + unloaded) .. " items total.")
  337.  
Add Comment
Please, Sign In to add comment