Advertisement
Lefra

ComputerCraft optimized mining turtle script

Sep 6th, 2020 (edited)
18,632
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.65 KB | None | 0 0
  1. -- Turtle inventory should be 4 by 4
  2. -- A chest or an inventory should be present at the left of the starting position
  3. -- The block layer at the turtle's level should be clear, fully digged for the defined mining zone
  4. -- Fuel should be on the lower right slot
  5. -- Any well-sealing block should be on slot 15, left of the fuel
  6. -- Blocks not to be mined should be on the first line
  7.  
  8. -- Define the mining zone here
  9. MaxForward = 16
  10. MaxRight = 16
  11. -- Number of holes to skip (beginning)
  12. SkipHoles = 0
  13.  
  14. local pos = {0, 0, 0}
  15. local facing = 0
  16. local curMessage = ''
  17.  
  18. function tWrite(txt)
  19.     term.clear()
  20.     term.setCursorPos(1, 1)
  21.     if txt then term.write(txt)
  22.     else term.write(curMessage)
  23.     end
  24. end
  25.  
  26. function turnRight(n)
  27.     n = n or 1
  28.    
  29.     while n > 0 do
  30.         n = n - 1
  31.         facing = (facing + 1) % 4
  32.         turtle.turnRight()
  33.     end
  34. end
  35.  
  36. function turnLeft(n)
  37.     n = n or 1
  38.    
  39.     while n > 0 do
  40.         n = n - 1
  41.         facing = (facing - 1) % 4
  42.         turtle.turnLeft()
  43.     end
  44. end
  45.  
  46. function right(n)
  47.     n = n or 1
  48.     checkFuel(n)
  49.  
  50.     if facing == 0 then
  51.         turnRight()
  52.         while n > 0 do
  53.             if turtle.forward() then
  54.                 n = n - 1
  55.                 pos[1] = pos[1] + 1
  56.             end
  57.         end
  58.     elseif facing == 1 then
  59.         while n > 0 do
  60.             if turtle.forward() then
  61.                 n = n - 1
  62.                 pos[1] = pos[1] + 1
  63.             end
  64.         end
  65.     elseif facing == 2 then
  66.         turnLeft()
  67.         while n > 0 do
  68.             if turtle.forward() then
  69.                 n = n - 1
  70.                 pos[1] = pos[1] + 1
  71.             end
  72.         end
  73.     else
  74.         while n > 0 do
  75.             if turtle.back() then
  76.                 n = n - 1
  77.                 pos[1] = pos[1] + 1
  78.             end
  79.         end
  80.     end
  81. end
  82.  
  83. function left(n)
  84.     n = n or 1
  85.     checkFuel(n)
  86.    
  87.     if facing == 0 then
  88.         turnLeft()
  89.         while n > 0 do
  90.             if turtle.forward() then
  91.                 n = n - 1
  92.                 pos[1] = pos[1] - 1
  93.             end
  94.         end
  95.     elseif facing == 1 then
  96.         while n > 0 do
  97.             if turtle.back() then
  98.                 n = n - 1
  99.                 pos[1] = pos[1] - 1
  100.             end
  101.         end
  102.     elseif facing == 2 then
  103.         turnRight()
  104.         while n > 0 do
  105.             if turtle.forward() then
  106.                 n = n - 1
  107.                 pos[1] = pos[1] - 1
  108.             end
  109.         end
  110.     else
  111.         while n > 0 do
  112.             if turtle.forward() then
  113.                 n = n - 1
  114.                 pos[1] = pos[1] - 1
  115.             end
  116.         end
  117.     end
  118. end
  119.  
  120. function forward(n)
  121.     n = n or 1
  122.     checkFuel(n)
  123.  
  124.     if facing == 0 then
  125.         while n > 0 do
  126.             if turtle.forward() then
  127.                 n = n - 1
  128.                 pos[2] = pos[2] + 1
  129.             end
  130.         end
  131.     elseif facing == 1 then
  132.         turnLeft()
  133.         while n > 0 do
  134.             if turtle.forward() then
  135.                 n = n - 1
  136.                 pos[2] = pos[2] + 1
  137.             end
  138.         end
  139.     elseif facing == 2 then
  140.         while n > 0 do
  141.             if turtle.back() then
  142.                 n = n - 1
  143.                 pos[2] = pos[2] + 1
  144.             end
  145.         end
  146.     else
  147.         turnRight()
  148.         while n > 0 do
  149.             if turtle.forward() then
  150.                 n = n - 1
  151.                 pos[2] = pos[2] + 1
  152.             end
  153.         end
  154.     end
  155. end
  156.  
  157. function backward(n)
  158.     n = n or 1
  159.     checkFuel(n)
  160.  
  161.     if facing == 0 then
  162.         while n > 0 do
  163.             if turtle.back() then
  164.                 n = n - 1
  165.                 pos[2] = pos[2] - 1
  166.             end
  167.         end
  168.     elseif facing == 1 then
  169.         turnRight()
  170.         while n > 0 do
  171.             if turtle.forward() then
  172.                 n = n - 1
  173.                 pos[2] = pos[2] - 1
  174.             end
  175.         end
  176.     elseif facing == 2 then
  177.         while n > 0 do
  178.             if turtle.forward() then
  179.                 n = n - 1
  180.                 pos[2] = pos[2] - 1
  181.             end
  182.         end
  183.     else
  184.         turnLeft()
  185.         while n > 0 do
  186.             if turtle.forward() then
  187.                 n = n - 1
  188.                 pos[2] = pos[2] - 1
  189.             end
  190.         end
  191.     end
  192. end
  193.  
  194. function up(n)
  195.     n = n or 1
  196.     checkFuel(n)
  197.    
  198.     while n > 0 do
  199.         if turtle.up() then
  200.             n = n - 1
  201.             pos[3] = pos[3] + 1
  202.         end
  203.     end
  204. end
  205.  
  206. function down(n)
  207.     n = n or 1
  208.     checkFuel(n)
  209.    
  210.     while n > 0 do
  211.         if turtle.down() then
  212.             n = n - 1
  213.             pos[3] = pos[3] - 1
  214.         end
  215.     end
  216. end
  217.  
  218. function getTo(nPos)
  219.     if not nPos[1] then nPos[1] = pos[1] end
  220.     if not nPos[2] then nPos[2] = pos[2] end
  221.     if not nPos[3] then nPos[3] = pos[3] end
  222.     diff = {nPos[1] - pos[1], nPos[2] - pos[2], nPos[3] - pos[3]}
  223.  
  224.     -- Right / left
  225.     if diff[1] > 0 then right(diff[1])
  226.     elseif diff[1] < 0 then left(-diff[1])
  227.     end
  228.  
  229.     -- Forward / backward
  230.     if diff[2] > 0 then forward(diff[2])
  231.     elseif diff[2] < 0 then backward(-diff[2])
  232.     end
  233.    
  234.     -- Up / down
  235.     if diff[3] > 0 then up(diff[3])
  236.     elseif diff[3] < 0 then down(-diff[3])
  237.     end
  238. end
  239.  
  240. function checkFuel(n)
  241.     if turtle.getFuelLevel() < n then
  242.         tWrite('Refueling...')
  243.        
  244.         turtle.select(16)
  245.         while turtle.getFuelLevel() < n do
  246.             turtle.refuel(1)
  247.         end
  248.        
  249.         tWrite()
  250.     end
  251. end
  252.  
  253. function startingPoint(row)
  254.     return (2 * (row-1)) % 5 + 1
  255. end
  256.  
  257. function ascend()
  258.     curMessage = 'Ascending...'
  259.     tWrite()
  260.        
  261.     while pos[3] < 0 do
  262.         if turtle.detectUp() then turtle.digUp() end
  263.         up()
  264.     end
  265.    
  266.     turtle.select(15)
  267.     turtle.placeDown()
  268.    
  269.     tWrite()
  270. end
  271.  
  272. function drillSides()
  273.     for i = 0, 3, 1 do
  274.         local canDig = true
  275.        
  276.         for j = 1, 4, 1 do
  277.             turtle.select(j)
  278.             if turtle.compare() then canDig = false end
  279.         end
  280.        
  281.         if canDig then turtle.dig() end
  282.         if i ~=3 then turnLeft() end
  283.     end
  284. end
  285.  
  286. function drill()
  287.     curMessage = 'Drilling...'
  288.     tWrite()
  289.        
  290.     while (not turtle.detectDown()) or (turtle.detectDown() and turtle.digDown()) do
  291.         down()
  292.         drillSides()
  293.     end
  294.    
  295.     ascend()
  296.    
  297.     tWrite()
  298. end
  299.  
  300. function drillRow(row)
  301.     getTo({row, startingPoint(row)})
  302.    
  303.     local willMove = 0
  304.    
  305.     while (pos[2] + willMove) <= (MaxForward - 2) do
  306.         emptyInventory()
  307.        
  308.         if willMove == 0 then willMove = 5
  309.         else forward(willMove)
  310.         end
  311.        
  312.         if SkipHoles == 0 then drill()
  313.         else SkipHoles = SkipHoles - 1
  314.         end
  315.     end
  316. end
  317.  
  318. function emptyInventory()
  319.     curMessage = 'Emptying inventory...'
  320.     tWrite()
  321.    
  322.     local curPos = {pos[1], pos[2]}
  323.     getTo({0,0})
  324.    
  325.     while facing ~= 3 do
  326.         turnRight()
  327.     end
  328.    
  329.     for i = 5, 14, 1 do
  330.         turtle.select(i)
  331.         turtle.drop()
  332.     end
  333.    
  334.     getTo(curPos)
  335.    
  336.     tWrite()
  337. end
  338.  
  339. tWrite('Initializing...')
  340.  
  341. for i = 1, MaxRight - 2, 1 do
  342.     drillRow(i)
  343. end
  344.  
  345. tWrite('Ended')
  346.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement