Advertisement
aelbrecht

CC Turtle Excavator

Apr 23rd, 2025 (edited)
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.58 KB | Gaming | 0 0
  1. local modem = peripheral.find("modem")
  2. local channel = 42
  3.  
  4. function printMessage(msg)
  5.   print(msg)
  6.   if modem then
  7.     modem.transmit(channel, 0, msg)
  8.   end
  9. end
  10.  
  11. function printFuelInfo()
  12.   local level = turtle.getFuelLevel()
  13.   local limit = turtle.getFuelLimit()
  14.   local percent = (type(level) == "number" and type(limit) == "number" and limit > 0)
  15.     and math.floor(level / limit * 100)
  16.     or "?"
  17.  
  18.   local msg = string.format("Fuel: %s / %s (%s%%)", level, limit, percent)
  19.   printMessage(msg)
  20. end
  21.  
  22. local position = { x = 0, y = 0, z = 0 }
  23. local facing = 0
  24. local moveHistory = {}
  25.  
  26. function forwardTrack()
  27.   if turtle.forward() then
  28.     if facing == 0 then position.z = position.z - 1
  29.     elseif facing == 1 then position.x = position.x + 1
  30.     elseif facing == 2 then position.z = position.z + 1
  31.     elseif facing == 3 then position.x = position.x - 1 end
  32.     table.insert(moveHistory, "forward")
  33.     return true
  34.   end
  35.   return false
  36. end
  37.  
  38. function backTrack()
  39.   if turtle.back() then
  40.     if facing == 0 then position.z = position.z + 1
  41.     elseif facing == 1 then position.x = position.x - 1
  42.     elseif facing == 2 then position.z = position.z - 1
  43.     elseif facing == 3 then position.x = position.x + 1 end
  44.     table.insert(moveHistory, "back")
  45.     return true
  46.   end
  47.   return false
  48. end
  49.  
  50. function upTrack()
  51.   if turtle.up() then
  52.     position.y = position.y + 1
  53.     table.insert(moveHistory, "up")
  54.     return true
  55.   end
  56.   return false
  57. end
  58.  
  59. function downTrack()
  60.   if turtle.down() then
  61.     position.y = position.y - 1
  62.     table.insert(moveHistory, "down")
  63.     return true
  64.   end
  65.   return false
  66. end
  67.  
  68. function turnLeftTrack()
  69.   turtle.turnLeft()
  70.   facing = (facing - 1) % 4
  71.   table.insert(moveHistory, "left")
  72. end
  73.  
  74. function turnRightTrack()
  75.   turtle.turnRight()
  76.   facing = (facing + 1) % 4
  77.   table.insert(moveHistory, "right")
  78. end
  79.  
  80. function returnHome()
  81.   for i = #moveHistory, 1, -1 do
  82.     local move = moveHistory[i]
  83.  
  84.     if move == "forward" then
  85.       turtle.back()
  86.       -- update position ...
  87.     elseif move == "back" then
  88.       turtle.forward()
  89.       -- update position ...
  90.     elseif move == "up" then
  91.       turtle.down()
  92.       position.y = position.y - 1
  93.     elseif move == "down" then
  94.       turtle.up()
  95.       position.y = position.y + 1
  96.     elseif move == "left" then
  97.       turtle.turnRight()
  98.       facing = (facing + 1) % 4
  99.     elseif move == "right" then
  100.       turtle.turnLeft()
  101.       facing = (facing - 1) % 4
  102.     end
  103.   end
  104.  
  105.   moveHistory = {}
  106.   print("Returned to home at:", position.x, position.y, position.z)
  107.   return true
  108. end
  109.  
  110. function refuelToTarget()
  111.   local targetRatio = 0.97
  112.   local fuelLimit = turtle.getFuelLimit()
  113.   local targetFuel = math.floor(fuelLimit * targetRatio)
  114.  
  115.   if turtle.getFuelLevel() == "unlimited" or turtle.getFuelLevel() >= targetFuel then
  116.     return true
  117.   end
  118.  
  119.   turtle.turnRight()
  120.   turtle.select(1)
  121.  
  122.   while turtle.getFuelLevel() < targetFuel do
  123.     if not turtle.suck() then
  124.       turtle.turnLeft()
  125.       return false
  126.     end
  127.     turtle.refuel()
  128.   end
  129.  
  130.   if turtle.getItemCount(1) > 0 then
  131.     turtle.drop()
  132.   end
  133.  
  134.   turtle.turnLeft()
  135.   return true
  136. end
  137.  
  138. function unloadAfterMining()
  139.   turtle.turnLeft()
  140.   for i = 1, 16 do
  141.     turtle.select(i)
  142.     turtle.drop()
  143.   end
  144.   turtle.select(1)
  145.   turtle.turnRight()
  146. end
  147.  
  148. function hasFreeSlot()
  149.   for slot = 1, 16 do
  150.     if turtle.getItemCount(slot) == 0 then return true end
  151.   end
  152.   return false
  153. end
  154.  
  155. function shouldReturn()
  156.   local level = turtle.getFuelLevel()
  157.   local limit = turtle.getFuelLimit()
  158.   return (type(level) == "number" and level < (limit * 0.4)) or not hasFreeSlot()
  159. end
  160.  
  161. function mineLayer(width, depth)
  162.   local evenRow = true
  163.   for row = 1, depth do
  164.     for col = 1, width - 1 do
  165.       if turtle.detect() then turtle.dig() end
  166.       forwardTrack()
  167.       turtle.digUp()
  168.       turtle.digDown()
  169.  
  170.       if shouldReturn() then
  171.         printMessage("Fuel low or inventory full, returning to base.")
  172.         return false -- interrupt layer, let main handle return
  173.       end
  174.  
  175.         printFuelInfo()
  176.     end
  177.  
  178.     if row < depth then
  179.       if evenRow then
  180.         turnRightTrack()
  181.         if turtle.detect() then turtle.dig() end
  182.         forwardTrack()
  183.         turnRightTrack()
  184.       else
  185.         turnLeftTrack()
  186.         if turtle.detect() then turtle.dig() end
  187.         forwardTrack()
  188.         turnLeftTrack()
  189.       end
  190.       evenRow = not evenRow
  191.     end
  192.   end
  193.   return true
  194. end
  195.  
  196. function descendToStart(depth)
  197.   forwardTrack()
  198.   for i = 1, depth do
  199.     if turtle.detectDown() then turtle.digDown() end
  200.     if not downTrack() then break end
  201.   end
  202.   turnRightTrack()
  203. end
  204.  
  205. function mineChunkArea(width, depth, layers)
  206.   for layer = 1, layers do
  207.     local ok = mineLayer(width, depth)
  208.     if not ok then
  209.       -- Aborted mid-layer: stop mining and signal interruption
  210.       return false, layer
  211.     end
  212.  
  213.     -- Finished layer: descend 3 blocks
  214.     if layer < layers then
  215.       for i = 1, 3 do
  216.         if turtle.detectDown() then turtle.digDown() end
  217.         downTrack()
  218.       end
  219.     end
  220.   end
  221.  
  222.   return true
  223. end
  224.  
  225. while true do
  226.   if not refuelToTarget() then
  227.     printMessage("Refuel failed — aborting.")
  228.     break
  229.   end
  230.  
  231.   printMessage("Turtle starting mining task...")
  232.  
  233.   descendToStart(30)
  234.  
  235.   local success, stoppedAtLayer = mineChunkArea(50, 50, 60)
  236.  
  237.   if not success then
  238.     printMessage("Mining stopped early at layer: " .. stoppedAtLayer)
  239.   else
  240.     printMessage("Finished mining all layers.")
  241.   end
  242.  
  243.   returnHome()
  244.   unloadAfterMining()
  245. end
  246.  
  247. printMessage("Turtle script ended.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement