Tomyf4

OC_CubeMiningTurtle

Jan 22nd, 2022 (edited)
1,205
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local component = require("component")
  2. local computer = require("computer")
  3. local robot = require("robot")
  4. local inventory = component.inventory_controller
  5. local generator = component.generator
  6.  
  7.  
  8. -- Notify if no generator is present
  9. if generator == nil then
  10.     print("No generator found, does robot have this component?")
  11. end
  12.  
  13.  
  14. -- local variables
  15. local status = "running"
  16. local issuesDetected = false
  17. local curMinedHeight = 0
  18. local curMinedDepth = 0
  19. local curMinedLength = 0
  20.  
  21.  
  22.  
  23. function refuel()
  24.     -- try inserting anything burnable from the inventory
  25.     for i = 1, 16 do
  26.         robot.select(i)
  27.         generator.insert()
  28.     end
  29.  
  30.     -- Check if we did manage to refuel
  31.     if generator.count() > 0 then
  32.         return true
  33.     else
  34.         return false
  35.     end
  36. end
  37.  
  38.  
  39.  
  40. function checkFuel()
  41.     if generator.count() > 5 then
  42.         return true
  43.     else
  44.         refuel()
  45.         if generator.count() > 5 then
  46.             return true
  47.         else
  48.             return false
  49.         end
  50.     end
  51. end
  52.  
  53.  
  54.  
  55. -- Check held item durability
  56. function checkDurability()
  57.     -- robot.durability() returns durability percentage from 0-1
  58.     if robot.durability() == nil then
  59.         print("Robot has no tool in tool slot")
  60.         return false
  61.     else
  62.         if robot.durability() > 0.05 then
  63.             return true
  64.         else
  65.             return false
  66.         end
  67.     end
  68. end
  69.  
  70.  
  71.  
  72. -- Check Energy in robot
  73. function checkEnergy()
  74.     Energy = computer.energy() / computer.maxEnergy() * 100
  75.     if Energy < 10 and checkFuel() == false then
  76.         return false
  77.     else
  78.         return true
  79.     end
  80. end
  81.  
  82.  
  83.  
  84. -- Check if we have space in the inventory
  85. function checkInventorySpace()
  86.     for i = 1, 16 do
  87.         robot.select(i)
  88.         if robot.space() == 64 then
  89.             return true
  90.         end
  91.     end
  92.     return false
  93. end
  94.  
  95.  
  96.  
  97.  
  98. -- Notify for chest position
  99. print("Please place a chest directly to the right of the robot")
  100. os.sleep(1)
  101.  
  102.  
  103.  
  104. -- Move Forward Function
  105. function moveForward()
  106.     if robot.detect(forward) == true then
  107.         robot.swing()
  108.         robot.forward()
  109.     else
  110.         robot.forward()
  111.     end
  112. end
  113.  
  114.  
  115. -- Move Down Function
  116. function moveDown()
  117.     robot.swingDown()
  118.     robot.down()
  119. end
  120.  
  121.  
  122. -- Split string into a table separated by x
  123. function splitString(input, separator)
  124.     if separator == nil then
  125.         separator = "x"
  126.     end
  127.     local t={}
  128.     for str in string.gmatch(input, "([^"..separator.."]+)") do
  129.         table.insert(t, str)
  130.     end
  131.     return t
  132. end
  133.  
  134.  
  135.  
  136. function depositItemsToChest()
  137.     if robot.detect(front) == true then
  138.    
  139.         local front = 3
  140.        
  141.         -- Loop through internal inventory and drop items to chest
  142.         for i = 1, 16 do
  143.             robot.select(i)
  144.             if robot.space() ~= 64 then
  145.                 for chestSlot = 1, 27 do
  146.                     if inventory.getStackInSlot(front,chestSlot) == nil then
  147.                         inventory.dropIntoSlot(front, chestSlot, 64)
  148.                     end
  149.                 end
  150.             end
  151.         end
  152.        
  153.         --wait for emptying
  154.         for i = 1, 16 do
  155.             robot.select(i)
  156.             if robot.space() ~= 64 then
  157.                 status = "no_inv_chest_full"
  158.                 print("Chest is full..")
  159.             end
  160.         end
  161.        
  162.         -- Reset status if inventory was a problem
  163.         if status == "no_inv" then
  164.             status = "running"
  165.         end
  166.         robot.select(1)
  167.        
  168.     else
  169.         print("ERROR: No Chest Found in front of expected position")
  170.     end
  171. end
  172.  
  173.  
  174.  
  175. function returnToChest()
  176.     print("RETURNING TO CHEST!")
  177.     if curMinedDepth > 0 then
  178.         for i = 1, curMinedDepth do
  179.             robot.back()
  180.         end
  181.         curMinedDepth = 0
  182.     end
  183.     if curMinedLength > 0 then
  184.         robot.turnLeft()
  185.         for i = 1, curMinedLength do
  186.             moveForward()
  187.         end
  188.         curMinedLength = 0
  189.         robot.turnRight()
  190.     end
  191.     if curMinedHeight > 0 then
  192.         for i = 1, curMinedHeight do
  193.             robot.up()
  194.         end
  195.         curMinedHeight = 0
  196.     end
  197.    
  198.     robot.back()
  199.  
  200.     robot.turnRight() -- turn to face chest
  201.     depositItemsToChest()
  202.     robot.turnLeft() -- Turn back to reset position
  203. end
  204.  
  205.  
  206.  
  207. function checkForIssues()
  208.     if status == "running" then
  209.         if checkEnergy() == true then
  210.             if checkDurability() == true then
  211.                 if checkInventorySpace() == true then
  212.                     return "running" -- no issues detected
  213.                 else
  214.                     return "no_inv"
  215.                 end
  216.             else
  217.                 return "no_durability"
  218.             end
  219.         else
  220.             return "no_energy"
  221.         end
  222.     else
  223.         return status
  224.     end
  225. end
  226.  
  227.  
  228. -- Start Cube Mining
  229.  
  230.  
  231. -- First we need some values from the operator=
  232. --#########################################################################################
  233.  
  234. print("Please entery the cube dimensions! ( length x depth ) E.g. ( 3x3 ) ")
  235. local dimensions = io.read()
  236. os.sleep(0.5)
  237.  
  238. local depth = splitString(dimensions)[1]
  239. local length = splitString(dimensions)[2]
  240.  
  241. print(depth.." by "..length.."Confirmed!")
  242. os.sleep(0.5)
  243. print("How far down? eg. ( 10 ) ")
  244.  
  245. local height = io.read()
  246.  
  247. os.sleep(0.5)
  248. print("Cube: "..depth.." x "..length.." x "..height.." Confirmed!")
  249. os.sleep(0.5)
  250. print("Proceeding..")
  251. os.sleep(0.5)
  252.  
  253. --#########################################################################################
  254.  
  255.  
  256. -- First we start the height loop
  257. moveForward()
  258.  
  259. for i = 1, height do
  260.  
  261.     if checkForIssues() == "running" then
  262.  
  263.         moveDown()
  264.         curMinedHeight = curMinedHeight + 1
  265.  
  266.         for i = 1, length do
  267.      
  268.             if checkForIssues() == "running" then
  269.  
  270.                 curMinedLength = curMinedLength + 1
  271.                 -- Move to a new line, but not the first time
  272.                 if i ~= 1 then
  273.                     -- Move to next length-line
  274.                     robot.turnRight()
  275.                     moveForward()
  276.                     robot.turnLeft()
  277.                 end
  278.  
  279.                 -- Dig forward
  280.                 for k = 1, depth-1 do
  281.                     if checkForIssues() == "running" then
  282.                         moveForward()
  283.                         curMinedDepth = curMinedDepth + 1
  284.                     else
  285.                         if issuesDetected == false then
  286.                             status = checkForIssues()
  287.                             returnToChest()
  288.                             issuesDetected = true
  289.                             break
  290.                         end
  291.                     end
  292.                 end
  293.  
  294.                 -- Backtrack
  295.                 for j = 1, depth-1 do
  296.                     robot.back()
  297.                 end
  298.                 curMinedDepth = 0
  299.             else
  300.                 if issuesDetected == false then
  301.                     status = checkForIssues()
  302.                     returnToChest()
  303.                     issuesDetected = true
  304.                     break
  305.                 end
  306.             end
  307.         end
  308.  
  309.         -- return to start
  310.         robot.turnLeft()
  311.         for i = 1, length-1 do
  312.             moveForward()
  313.         end
  314.         curMinedLength = 0
  315.         robot.turnRight()
  316.  
  317.     else
  318.         if issuesDetected == false then
  319.             status = checkForIssues()
  320.             returnToChest()
  321.             issuesDetected = true
  322.             break
  323.         end
  324.     end
  325. end
  326.  
  327. if status == "running" and issuesDetected == false then
  328.     -- Return back up after completion
  329.     for i = 1, height do
  330.     robot.up()
  331.     end
  332.     robot.back()
  333. end
RAW Paste Data Copied