sasaa86

CC-advancedperipherals talking excavate turtle

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