sasaa86

chatty-excavate (Advanced peripherals)

Feb 6th, 2022
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.76 KB | None | 0 0
  1. if not turtle then
  2.     printError("Requires a Turtle")
  3.     return
  4. end
  5.  
  6. -- enter Playername here
  7. ditchItem = false
  8. useChat = true
  9. playerName = "sasaa_86"
  10. ditchList = {"minecraft:cobblestone", "minecrat:dirt", "minecraft:deepslate"}
  11. fuelList = {"minecraft:coal"}
  12.  
  13. box = peripheral.find("chatBox")
  14. if box == nil then
  15.     error("chatBox not found")
  16.     useChat = false
  17. end
  18. if playerName == nil then
  19.     box.sendMessage("no name stated in config")
  20.     useChat = false
  21. end
  22.  
  23. local tArgs = { ... }
  24. if #tArgs ~= 1 then
  25.     local programName = arg[0] or fs.getName(shell.getRunningProgram())
  26.     print("Usage: " .. programName .. " <diameter>")
  27.     return
  28. end
  29.  
  30. -- Mine in a quarry pattern until we hit something we can't dig
  31. local size = tonumber(tArgs[1])
  32. if size < 1 then
  33.     print("Excavate diameter must be positive")
  34.     return
  35. end
  36. if useChat then
  37.     box.sendMessageToPlayer("Mining a ".. size .." by ".. size, playerName)
  38. end
  39.  
  40. local function isInTable(table, value)
  41. for _, v in pairs(table) do -- Use _ if you don't need that return value.
  42.   if v == value then
  43.    return true, k
  44.   end
  45. end
  46. return false
  47. end
  48.  
  49. local depth = 0
  50. local unloaded = 0
  51. local collected = 0
  52.  
  53. local xPos, zPos = 0, 0
  54. local xDir, zDir = 0, 1
  55.  
  56. local goTo -- Filled in further down
  57. local refuel -- Filled in further down
  58.  
  59. local function unload(_bKeepOneFuelStack)
  60.     print("Unloading items...")
  61.     if useChat then
  62.         box.sendMessageToPlayer("Unloading items...", playerName)
  63.     end
  64.     for n = 1, 16 do
  65.         turtle.select(n)
  66.         item = turtle.getItemDetail(n)
  67.         if item ~= nil then
  68.             turtle.refuel(item.count)
  69.             turtle.drop(item.count)
  70.             unloaded = unloaded + item.count
  71.         end
  72.     end
  73.     collected = 0
  74.     turtle.select(1)
  75. end
  76.  
  77. local function returnSupplies()
  78.     local x, y, z, xd, zd = xPos, depth, zPos, xDir, zDir
  79.     print("Returning to surface...")
  80.     if useChat then
  81.         box.sendMessageToPlayer("Returning to surface", playerName)
  82.     end
  83.     goTo(0, 0, 0, 0, -1)
  84.  
  85.     local fuelNeeded = 2 * (x + y + z) + 1
  86.     if not refuel(fuelNeeded) then
  87.         unload(true)
  88.         print("Waiting for fuel")
  89.         if useChat then
  90.             box.sendMessageToPlayer("Waiting for fuel", playerName)
  91.         end
  92.         while not refuel(fuelNeeded) do
  93.             os.pullEvent("turtle_inventory")
  94.         end
  95.     else
  96.         unload(true)
  97.     end
  98.  
  99.     print("Resuming mining...")
  100.     if useChat then
  101.         box.sendMessageToPlayer("Resuming mining...", playerName)
  102.     end
  103.     goTo(x, y, z, xd, zd)
  104. end
  105.  
  106. local function collect()
  107.     local bFull = true
  108.     local nTotalItems = 0
  109.     for n = 1, 16 do
  110.         local nCount = turtle.getItemCount(n)
  111.         if nCount == 0 then
  112.             bFull = false
  113.         end
  114.         nTotalItems = nTotalItems + nCount
  115.     end
  116.  
  117.     if nTotalItems > collected then
  118.         collected = nTotalItems
  119.         if math.fmod(collected + unloaded, 50) == 0 then
  120.             print("Mined " .. collected + unloaded .. " items.")
  121.             if useChat then
  122.                 box.sendMessageToPlayer("Mined " .. collected + unloaded .. " items.", playerName)
  123.             end
  124.         end
  125.     end
  126.  
  127.     if bFull then
  128.         print("No empty slots left.")
  129.         if useChat then
  130.             box.sendMessageToPlayer("No empty slots left.", playerName)
  131.         end
  132.         return false
  133.     end
  134.     return true
  135. end
  136.  
  137. function refuel(ammount)
  138.     local fuelLevel = turtle.getFuelLevel()
  139.     if fuelLevel == "unlimited" then
  140.         return true
  141.     end
  142.  
  143.     local needed = ammount or xPos + zPos + depth + 2
  144.     if turtle.getFuelLevel() < needed then
  145.         for n = 1, 16 do
  146.             if turtle.getItemCount(n) > 0 then
  147.                 turtle.select(n)
  148.                 if turtle.refuel(1) then
  149.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  150.                         turtle.refuel(1)
  151.                     end
  152.                     if turtle.getFuelLevel() >= needed then
  153.                         turtle.select(1)
  154.                         return true
  155.                     end
  156.                 end
  157.             end
  158.         end
  159.         turtle.select(1)
  160.         return false
  161.     end
  162.  
  163.     return true
  164. end
  165.  
  166. local function tryForwards()
  167.     if not refuel() then
  168.         print("Not enough Fuel")
  169.         if useChat then
  170.             box.sendMessageToPlayer("Not enough Fuel", playerName)
  171.         end
  172.         returnSupplies()
  173.     end
  174.  
  175.     while not turtle.forward() do
  176.         if turtle.detect() then
  177.             if turtle.dig() then
  178.                 if not collect() then
  179.                     returnSupplies()
  180.                 end
  181.             else
  182.                 return false
  183.             end
  184.         elseif turtle.attack() then
  185.             if not collect() then
  186.                 returnSupplies()
  187.             end
  188.         else
  189.             sleep(0.5)
  190.         end
  191.     end
  192.  
  193.     xPos = xPos + xDir
  194.     zPos = zPos + zDir
  195.     return true
  196. end
  197.  
  198. local function tryDown()
  199.     if not refuel() then
  200.         print("Not enough Fuel")
  201.         if useChat then
  202.             box.sendMessageToPlayer("Not enough Fuel", playerName)
  203.         end
  204.         returnSupplies()
  205.     end
  206.  
  207.     while not turtle.down() do
  208.         if turtle.detectDown() then
  209.             if turtle.digDown() then
  210.                 if not collect() then
  211.                     returnSupplies()
  212.                 end
  213.             else
  214.                 return false
  215.             end
  216.         elseif turtle.attackDown() then
  217.             if not collect() then
  218.                 returnSupplies()
  219.             end
  220.         else
  221.             sleep(0.5)
  222.         end
  223.     end
  224.  
  225.     depth = depth + 1
  226.     if math.fmod(depth, 10) == 0 then
  227.         print("Descended " .. depth .. " metres.")
  228.         if useChat then
  229.             box.sendMessageToPlayer("Descended " .. depth .. " metres.", playerName)
  230.         end
  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.         if useChat then
  331.             box.sendMessageToPlayer("Out of Fuel", playerName)
  332.         end
  333.     return
  334. end
  335.  
  336. print("Excavating...")
  337.         if useChat then
  338.             box.sendMessageToPlayer("Excavating...", playerName)
  339.         end
  340.  
  341. local reseal = false
  342. turtle.select(1)
  343. if turtle.digDown() then
  344.     reseal = true
  345. end
  346.  
  347. local alternate = 0
  348. local done = false
  349. while not done do
  350.     for n = 1, size do
  351.         for _ = 1, size - 1 do
  352.             if not tryForwards() then
  353.                 done = true
  354.                 break
  355.             end
  356.         end
  357.         if done then
  358.             break
  359.         end
  360.         if n < size then
  361.             if math.fmod(n + alternate, 2) == 0 then
  362.                 turnLeft()
  363.                 if not tryForwards() then
  364.                     done = true
  365.                     break
  366.                 end
  367.                 turnLeft()
  368.             else
  369.                 turnRight()
  370.                 if not tryForwards() then
  371.                     done = true
  372.                     break
  373.                 end
  374.                 turnRight()
  375.             end
  376.         end
  377.     end
  378.     if done then
  379.         break
  380.     end
  381.  
  382.     if size > 1 then
  383.         if math.fmod(size, 2) == 0 then
  384.             turnRight()
  385.         else
  386.             if alternate == 0 then
  387.                 turnLeft()
  388.             else
  389.                 turnRight()
  390.             end
  391.             alternate = 1 - alternate
  392.         end
  393.     end
  394.  
  395.     if not tryDown() then
  396.         done = true
  397.         break
  398.     end
  399. end
  400.  
  401. print("Returning to surface...")
  402.         if useChat then
  403.             box.sendMessageToPlayer("Returning to surface...", playerName)
  404.         end
  405.  
  406. -- Return to where we started
  407. goTo(0, 0, 0, 0, -1)
  408. unload(false)
  409. goTo(0, 0, 0, 0, 1)
  410.  
  411. -- Seal the hole
  412. if reseal then
  413.     turtle.placeDown()
  414. end
  415.  
  416. print("Mined " .. collected + unloaded .. " items total.")
  417.         if useChat then
  418.             box.sendMessageToPlayer("Mined " .. collected + unloaded .. " items total.", playerName)
  419.         end
Add Comment
Please, Sign In to add comment