Advertisement
Guest User

Quarry

a guest
Apr 2nd, 2014
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.53 KB | None | 0 0
  1. messageLevel = { DEBUG=0, INFO=1, WARNING=2, ERROR=3, FATAL=4 }
  2. direction = { FORWARD=0, RIGHT=1, BACK=2, LEFT=3, UP=4, DOWN=5 }
  3.  
  4. local messageOutputLevel = messageLevel.INFO
  5. local messageOutputFileName
  6. local fuelLevelToRefuelAt = 5
  7. local refuelItemsToUseWhenRefuelling = 63
  8. local emergencyFuelToRetain = 0
  9. local maximumGravelStackSupported = 25 -- The number of stacked gravel or sand blocks supported
  10. local noiseBlocksCount
  11. local bottomLayer = 5 -- The y co-ords of the layer immediately above bedrock
  12. local returningToStart = false
  13. local lookForChests = false -- Determines if chests should be located as part of the quarrying
  14. local miningOffset -- The offset to the mining layer. This is set depending on whether chests are being looked for or not
  15. local lastEmptySlot -- The last inventory slot that was empty when the program started (is either 15 if not looking for chests or 14 if we are)
  16. local turtleId
  17. local currentlySelectedSlot = 0 -- The slot that the last noise block was found in
  18. local lastMoveNeededDig = true -- Determines whether the last move needed a dig first
  19. local haveBeenAtZeroZeroOnLayer -- Determines whether the turtle has been at (0, 0) in this mining layer
  20. local orientationAtZeroZero -- The turtle's orientation when it was at (0, 0)
  21. local levelToReturnTo -- The level that the turtle should return to in order to head back to the start to unload
  22.  
  23. local currX
  24. local currY
  25. local currZ
  26. local currOrient
  27. local startHeight -- Represents the height (y co-ord) that the turtle started at
  28. local quarryWidth -- Represents the length of the mines that the turtle will dig
  29. function writeMessage(message, msgLevel)
  30. if (msgLevel >= messageOutputLevel) then
  31. print(message)
  32. if (messageOutputFileName ~= nil) then
  33. local outputFile = io.open(messageOutputFileName, "a")
  34. outputFile:write(message)
  35. outputFile:write("\n")
  36. outputFile:close()
  37. end
  38. end
  39. end
  40. function ensureFuel()
  41. local fuelLevel = turtle.getFuelLevel()
  42. if (fuelLevel ~= "unlimited") then
  43. if (fuelLevel < fuelLevelToRefuelAt) then
  44. turtle.select(16)
  45. currentlySelectedSlot = 16
  46. local fuelItems = turtle.getItemCount(16)
  47. if (fuelItems == 0) then
  48. writeMessage("Completely out of fuel!", messageLevel.FATAL)
  49. elseif (fuelItems == 1) then
  50. writeMessage("Out of Fuel!", messageLevel.ERROR)
  51. turtle.refuel()
  52. elseif (fuelItems <= (emergencyFuelToRetain + 1)) then
  53. writeMessage("Consuming emergency fuel supply. "..(fuelItems - 2).." emergency fuel items remain", messageLevel.WARNING)
  54. turtle.refuel(1)
  55. else
  56. if (fuelItems - (emergencyFuelToRetain + 1) < refuelItemsToUseWhenRefuelling) then
  57. turtle.refuel(fuelItems - (emergencyFuelToRetain + 1))
  58. else
  59. turtle.refuel(refuelItemsToUseWhenRefuelling)
  60. end
  61. end
  62. end
  63. end
  64. end
  65. function ensureInventorySpace()
  66. if (returningToStart == false) then
  67. if (turtle.getItemCount(lastEmptySlot) > 0) then
  68. returnToStartAndUnload(true)
  69. end
  70. end
  71. end
  72. function returnToStartAndUnload(returnBackToMiningPoint)
  73. writeMessage("returnToStartAndUnload called", messageLevel.DEBUG)
  74. returningToStart = true
  75. local storedX = currX
  76. local storedY = currY
  77. local storedZ = currZ
  78. local storedOrient = currOrient
  79. writeMessage("Return to start, return level: "..levelToReturnTo, messageLevel.DEBUG)
  80. if (currY > levelToReturnTo) then
  81. while (currY > levelToReturnTo) do
  82. turtleDown()
  83. end
  84. elseif (currY < levelToReturnTo) then
  85. while (currY < levelToReturnTo) do
  86. turtleUp()
  87. end
  88. end
  89. if ((haveBeenAtZeroZeroOnLayer == false) or (orientationAtZeroZero == direction.FORWARD)) then
  90. if (currX > 0) then
  91. turtleSetOrientation(direction.LEFT)
  92. while (currX > 0) do
  93. turtleForward()
  94. end
  95. elseif (currX < 0) then
  96. writeMessage("Current x is less than 0 in returnToStartAndUnload", messageLevel.ERROR)
  97. end
  98. if (currZ > 0) then
  99. turtleSetOrientation(direction.BACK)
  100. while (currZ > 0) do
  101. turtleForward()
  102. end
  103. elseif (currZ < 0) then
  104. writeMessage("Current z is less than 0 in returnToStartAndUnload", messageLevel.ERROR)
  105. end
  106. else
  107. if (currZ > 0) then
  108. turtleSetOrientation(direction.BACK)
  109. while (currZ > 0) do
  110. turtleForward()
  111. end
  112. elseif (currZ < 0) then
  113. writeMessage("Current z is less than 0 in returnToStartAndUnload", messageLevel.ERROR)
  114. end
  115. if (currX > 0) then
  116. turtleSetOrientation(direction.LEFT)
  117. while (currX > 0) do
  118. turtleForward()
  119. end
  120. elseif (currX < 0) then
  121. writeMessage("Current x is less than 0 in returnToStartAndUnload", messageLevel.ERROR)
  122. end
  123. end
  124. if (currY < startHeight) then
  125. while (currY < startHeight) do
  126. turtleUp()
  127. end
  128. elseif (currY > startHeight) then
  129. writeMessage("Current height is greater than start height in returnToStartAndUnload", messageLevel.ERROR)
  130. end
  131. local slotLoop = 1
  132. turtleSetOrientation(direction.BACK)
  133. while (slotLoop < 16) do
  134. turtle.select(slotLoop) -- Don't bother updating selected slot variable as it will set later in this function
  135. if ((slotLoop <= noiseBlocksCount) or ((slotLoop == 15) and (lastEmptySlot == 14))) then
  136. writeMessage("Dropping (n-1) from slot "..slotLoop.." ["..turtle.getItemCount(slotLoop).."]", messageLevel.DEBUG)
  137. turtle.drop(turtle.getItemCount(slotLoop) - 1)
  138. else
  139. writeMessage("Dropping (all) from slot "..slotLoop.." ["..turtle.getItemCount(slotLoop).."]", messageLevel.DEBUG)
  140. turtle.drop()
  141. end
  142. slotLoop = slotLoop + 1
  143. end
  144. if (turtle.getItemCount(16) < 64) then
  145. turtleSetOrientation(direction.LEFT)
  146. turtle.select(16) -- Don't bother updating selected slot variable as it will set later in this function
  147. local currFuelItems = turtle.getItemCount(16)
  148. turtle.suck()
  149. while ((currFuelItems ~= turtle.getItemCount(16)) and (turtle.getItemCount(16) < 64)) do
  150. currFuelItems = turtle.getItemCount(16)
  151. turtle.suck()
  152. end
  153. slotLoop = noiseBlocksCount + 1
  154. while (slotLoop <= lastEmptySlot) do
  155. turtle.select(slotLoop) -- Don't bother updating selected slot variable as it will set later in this function
  156. turtle.drop()
  157. slotLoop = slotLoop + 1
  158. end
  159. end
  160. turtle.select(1)
  161. currentlySelectedSlot = 1
  162. if (returnBackToMiningPoint == true) then
  163. while (currY > levelToReturnTo) do
  164. turtleDown()
  165. end
  166. if ((haveBeenAtZeroZeroOnLayer == false) or (orientationAtZeroZero == direction.FORWARD)) then
  167. writeMessage("Stored Z: "..storedZ..", currZ: "..currZ, messageLevel.DEBUG)
  168. if (storedZ > currZ) then
  169. writeMessage("Orienting forward", messageLevel.DEBUG)
  170. writeMessage("Moving in z direction", messageLevel.DEBUG)
  171. turtleSetOrientation(direction.FORWARD)
  172. while (storedZ > currZ) do
  173. turtleForward()
  174. end
  175. elseif (storedZ < currZ) then
  176. writeMessage("Stored z is less than current z in returnToStartAndUnload", messageLevel.ERROR)
  177. end
  178. if (storedX > currX) then
  179. writeMessage("Stored X: "..storedX..", currX: "..currX, messageLevel.DEBUG)
  180. writeMessage("Orienting right", messageLevel.DEBUG)
  181. writeMessage("Moving in x direction", messageLevel.DEBUG)
  182. turtleSetOrientation(direction.RIGHT)
  183. while (storedX > currX) do
  184. turtleForward()
  185. end
  186. elseif (storedX < currX) then
  187. writeMessage("Stored x is less than current x in returnToStartAndUnload", messageLevel.ERROR)
  188. end
  189. else
  190. if (storedX > currX) then
  191. writeMessage("Stored X: "..storedX..", currX: "..currX, messageLevel.DEBUG)
  192. writeMessage("Orienting right", messageLevel.DEBUG)
  193. writeMessage("Moving in x direction", messageLevel.DEBUG)
  194. turtleSetOrientation(direction.RIGHT)
  195. while (storedX > currX) do
  196. turtleForward()
  197. end
  198. elseif (storedX < currX) then
  199. writeMessage("Stored x is less than current x in returnToStartAndUnload", messageLevel.ERROR)
  200. end
  201. writeMessage("Stored Z: "..storedZ..", currZ: "..currZ, messageLevel.DEBUG)
  202. if (storedZ > currZ) then
  203. writeMessage("Orienting forward", messageLevel.DEBUG)
  204. writeMessage("Moving in z direction", messageLevel.DEBUG)
  205. turtleSetOrientation(direction.FORWARD)
  206. while (storedZ > currZ) do
  207. turtleForward()
  208. end
  209. elseif (storedZ < currZ) then
  210. writeMessage("Stored z is less than current z in returnToStartAndUnload", messageLevel.ERROR)
  211. end
  212. end
  213. if (storedY < currY) then
  214. while (storedY < currY) do
  215. turtleDown()
  216. end
  217. elseif (storedY > currY) then
  218. while (storedY > currY) do
  219. turtleUp()
  220. end
  221. end
  222. turtleSetOrientation(storedOrient)
  223. writeMessage("Have returned to the mining point", messageLevel.DEBUG)
  224. end
  225. returningToStart = false
  226. end
  227. function emptyChest(suckFn)
  228. local prevInventoryCount = {}
  229. local inventoryLoop
  230. local chestEmptied = false
  231. for inventoryLoop = 1, 16 do
  232. prevInventoryCount[inventoryLoop] = turtle.getItemCount(inventoryLoop)
  233. end
  234. while (chestEmptied == false) do
  235. suckFn()
  236. local newInventoryCount = {}
  237. for inventoryLoop = 1, 16 do
  238. newInventoryCount[inventoryLoop] = turtle.getItemCount(inventoryLoop)
  239. end
  240. local foundDifferentItemCount = false
  241. inventoryLoop = 1
  242. while ((foundDifferentItemCount == false) and (inventoryLoop <= 16)) do
  243. if (prevInventoryCount[inventoryLoop] ~= newInventoryCount[inventoryLoop]) then
  244. foundDifferentItemCount = true
  245. else
  246. inventoryLoop = inventoryLoop + 1
  247. end
  248. end
  249. chestEmptied = not foundDifferentItemCount
  250. if (chestEmptied == false) then
  251. prevInventoryCount = newInventoryCount
  252. ensureInventorySpace()
  253. end
  254. end
  255. writeMessage("Finished emptying chest", messageLevel.DEBUG)
  256. end
  257. function moveTurtle(moveFn, detectFn, digFn, attackFn, compareFn, suckFn, maxDigCount)
  258. ensureFuel()
  259. local digCount = 0
  260. local moveSuccess = false
  261. if (lastMoveNeededDig == false) then
  262. moveSuccess = moveFn()
  263. else
  264. if (lookForChests == true) then
  265. if (isNoiseBlock(compareFn) == false) then
  266. if (detectFn() == true) then
  267. if (isChestBlock(compareFn) == true) then
  268. emptyChest (suckFn)
  269. end
  270. end
  271. end
  272. end
  273. local digSuccess = digFn()
  274. if (digSuccess == true) then
  275. digCount = 1
  276. end
  277. moveSuccess = moveFn()
  278. if (moveSuccess == true) then
  279. lastMoveNeededDig = digSuccess
  280. end
  281. end
  282. if (moveSuccess == false) then
  283. while ((moveSuccess == false) and (digCount < maxDigCount)) do
  284. if (detectFn() == true) then
  285. if(digCount == 0) then
  286. if (lookForChests == true) then
  287. if (isNoiseBlock(compareFn) == false) then
  288. if (detectFn() == true) then
  289. if (isChestBlock(compareFn) == true) then
  290. emptyChest (suckFn)
  291. end
  292. end
  293. end
  294. end
  295. else
  296. sleep(0.1)
  297. end
  298. digFn()
  299. digCount = digCount + 1
  300. else
  301. attackFn()
  302. end
  303. moveSuccess = moveFn()
  304. end
  305. if (digCount == 0) then
  306. lastMoveNeededDig = false
  307. else
  308. lastMoveNeededDig = true
  309. end
  310. end
  311. return moveSuccess
  312. end
  313. function turtleForward()
  314. local returnVal = moveTurtle(turtle.forward, turtle.detect, turtle.dig, turtle.attack, turtle.compare, turtle.suck, maximumGravelStackSupported)
  315. if (returnVal == true) then
  316. if (currOrient == direction.FORWARD) then
  317. currZ = currZ + 1
  318. elseif (currOrient == direction.LEFT) then
  319. currX = currX - 1
  320. elseif (currOrient == direction.BACK) then
  321. currZ = currZ - 1
  322. elseif (currOrient == direction.RIGHT) then
  323. currX = currX + 1
  324. else
  325. writeMessage ("Invalid currOrient in turtleForward function", messageLevel.ERROR)
  326. end
  327. ensureInventorySpace()
  328. end
  329. return returnVal
  330. end
  331. function turtleUp()
  332. local returnVal = moveTurtle(turtle.up, turtle.detectUp, turtle.digUp, turtle.attackUp, turtle.compareUp, turtle.suckUp, maximumGravelStackSupported)
  333. if (returnVal == true) then
  334. currY = currY + 1
  335. ensureInventorySpace()
  336. end
  337. return returnVal
  338. end
  339. function turtleDown()
  340. local returnVal
  341. returnVal = moveTurtle(turtle.down, turtle.detectDown, turtle.digDown, turtle.attackDown, turtle.compareDown, turtle.suckDown, 1)
  342. if (returnVal == true) then
  343. currY = currY - 1
  344. ensureInventorySpace()
  345. end
  346. return returnVal
  347. end
  348. function turtleBack()
  349. local returnVal = turtle.back()
  350. if(returnVal == false) then
  351. turtle.turnRight()
  352. turtle.turnRight()
  353. returnVal = turtleForward()
  354. turtle.turnRight()
  355. turtle.turnRight()
  356. end
  357. if (returnVal == true) then
  358. if (currOrient == direction.FORWARD) then
  359. currZ = currZ - 1
  360. elseif (currOrient == direction.LEFT) then
  361. currX = currX + 1
  362. elseif (currOrient == direction.BACK) then
  363. currZ = currZ + 1
  364. elseif (currOrient == direction.RIGHT) then
  365. currX = currX - 1
  366. else
  367. writeMessage ("Invalid currOrient in turtleBack function", messageLevel.ERROR)
  368. end
  369. ensureInventorySpace()
  370. end
  371. return returnVal
  372. end
  373. function turtleTurn(turnDir)
  374. if (turnDir == direction.LEFT) then
  375. if (currOrient == direction.FORWARD) then
  376. currOrient = direction.LEFT
  377. turtle.turnLeft()
  378. elseif (currOrient == direction.LEFT) then
  379. currOrient = direction.BACK
  380. turtle.turnLeft()
  381. elseif (currOrient == direction.BACK) then
  382. currOrient = direction.RIGHT
  383. turtle.turnLeft()
  384. elseif (currOrient == direction.RIGHT) then
  385. currOrient = direction.FORWARD
  386. turtle.turnLeft()
  387. else
  388. writeMessage ("Invalid currOrient in turtleTurn function", messageLevel.ERROR)
  389. end
  390. elseif (turnDir == direction.RIGHT) then
  391. if (currOrient == direction.FORWARD) then
  392. currOrient = direction.RIGHT
  393. turtle.turnRight()
  394. elseif (currOrient == direction.LEFT) then
  395. currOrient = direction.FORWARD
  396. turtle.turnRight()
  397. elseif (currOrient == direction.BACK) then
  398. currOrient = direction.LEFT
  399. turtle.turnRight()
  400. elseif (currOrient == direction.RIGHT) then
  401. currOrient = direction.BACK
  402. turtle.turnRight()
  403. else
  404. writeMessage ("Invalid currOrient in turtleTurn function", messageLevel.ERROR)
  405. end
  406. else
  407. writeMessage ("Invalid turnDir in turtleTurn function", messageLevel.ERROR)
  408. end
  409. end
  410. function turtleSetOrientation(newOrient)
  411.  
  412. if (currOrient ~= newOrient) then
  413. if (currOrient == direction.FORWARD) then
  414. if (newOrient == direction.RIGHT) then
  415. turtle.turnRight()
  416. currOrient = newOrient
  417. elseif (newOrient == direction.BACK) then
  418. turtle.turnRight()
  419. turtle.turnRight()
  420. currOrient = newOrient
  421. elseif (newOrient == direction.LEFT) then
  422. turtle.turnLeft()
  423. currOrient = newOrient
  424. else
  425. writeMessage ("Invalid newOrient in turtleSetOrientation function", messageLevel.ERROR)
  426. end
  427. elseif (currOrient == direction.RIGHT) then
  428. if (newOrient == direction.BACK) then
  429. turtle.turnRight()
  430. currOrient = newOrient
  431. elseif (newOrient == direction.LEFT) then
  432. turtle.turnRight()
  433. turtle.turnRight()
  434. currOrient = newOrient
  435. elseif (newOrient == direction.FORWARD) then
  436. turtle.turnLeft()
  437. currOrient = newOrient
  438. else
  439. writeMessage ("Invalid newOrient in turtleSetOrientation function", messageLevel.ERROR)
  440. end
  441. elseif (currOrient == direction.BACK) then
  442. if (newOrient == direction.LEFT) then
  443. turtle.turnRight()
  444. currOrient = newOrient
  445. elseif (newOrient == direction.FORWARD) then
  446. turtle.turnRight()
  447. turtle.turnRight()
  448. currOrient = newOrient
  449. elseif (newOrient == direction.RIGHT) then
  450. turtle.turnLeft()
  451. currOrient = newOrient
  452. else
  453. writeMessage ("Invalid newOrient in turtleSetOrientation function", messageLevel.ERROR)
  454. end
  455. elseif (currOrient == direction.LEFT) then
  456. if (newOrient == direction.FORWARD) then
  457. turtle.turnRight()
  458. currOrient = newOrient
  459. elseif (newOrient == direction.RIGHT) then
  460. turtle.turnRight()
  461. turtle.turnRight()
  462. currOrient = newOrient
  463. elseif (newOrient == direction.BACK) then
  464. turtle.turnLeft()
  465. currOrient = newOrient
  466. else
  467. writeMessage ("Invalid newOrient in turtleSetOrientation function", messageLevel.ERROR)
  468. end
  469. else
  470. writeMessage ("Invalid currOrient in turtleTurn function", messageLevel.ERROR)
  471. end
  472. end
  473. end
  474. function isNoiseBlock(compareFn)
  475. local returnVal = false
  476. local seamLoop = 1
  477. local prevSelectedSlot
  478. if (currentlySelectedSlot <= noiseBlocksCount) then
  479. returnVal = compareFn()
  480. end
  481. if (returnVal == false) then
  482. prevSelectedSlot = currentlySelectedSlot
  483. while((returnVal == false) and (seamLoop <= noiseBlocksCount)) do
  484. if (seamLoop ~= prevSelectedSlot) then
  485. turtle.select(seamLoop)
  486. currentlySelectedSlot = seamLoop
  487. returnVal = compareFn()
  488. end
  489. seamLoop = seamLoop + 1
  490. end
  491. end
  492. return returnVal
  493. end
  494. function isChestBlock(compareFn)
  495. local returnVal = false
  496. if (lookForChests == true) then
  497. turtle.select(15)
  498. currentlySelectedSlot = 15
  499. returnVal = compareFn()
  500. end
  501. return returnVal
  502. end
  503. function determineNoiseBlocksCountCount()
  504. local foundFirstBlankInventorySlot = false
  505. noiseBlocksCount = 1
  506. while ((noiseBlocksCount < 16) and (foundFirstBlankInventorySlot == false)) do
  507. if (turtle.getItemCount(noiseBlocksCount) > 0) then
  508. noiseBlocksCount = noiseBlocksCount + 1
  509. else
  510. foundFirstBlankInventorySlot = true
  511. end
  512. end
  513. noiseBlocksCount = noiseBlocksCount - 1
  514. if (turtle.getItemCount(15) > 0) then
  515. lookForChests = true
  516. lastEmptySlot = 14
  517. miningOffset = 0
  518. writeMessage("Looking for chests...", messageLevel.DEBUG)
  519. else
  520. lastEmptySlot = 15
  521. miningOffset = 1
  522. writeMessage("Ignoring chests...", messageLevel.DEBUG)
  523. end
  524. end
  525. function createQuarry()
  526. local topMiningLayer = startHeight + ((bottomLayer - startHeight - 2) % 3) - 1 + miningOffset
  527. if (topMiningLayer > currY) then
  528. topMiningLayer = topMiningLayer - 3
  529. end
  530. local startedLayerToRight = true
  531. local miningLevel
  532. for miningLevel = (bottomLayer + miningOffset), topMiningLayer, 3 do
  533. writeMessage("Mining Layer: "..miningLevel, messageLevel.INFO)
  534. haveBeenAtZeroZeroOnLayer = false
  535. if (miningLevel == (bottomLayer + miningOffset)) then
  536. levelToReturnTo = startHeight
  537. end
  538. if (currY > miningLevel) then
  539. while (currY > miningLevel) do
  540. turtleDown()
  541. end
  542. elseif (currY < miningLevel) then
  543. while (currY < miningLevel) do
  544. turtleUp()
  545. end
  546. end
  547. if (miningLevel == (bottomLayer + miningOffset)) then
  548. levelToReturnTo = (bottomLayer + miningOffset)
  549. else
  550. levelToReturnTo = miningLevel - 3
  551. end
  552. writeMessage("Mining Level: "..miningLevel..", Bottom Layer: "..bottomLayer..", Mining Offset: "..miningOffset, messageLevel.DEBUG)
  553. if (miningLevel > (bottomLayer + miningOffset)) then
  554. if (quarryWidth % 2 == 0) then
  555. turtleTurn(direction.RIGHT)
  556. else
  557. if (startedLayerToRight == true) then
  558. turtleTurn(direction.LEFT)
  559. startedLayerToRight = false
  560. else
  561. turtleTurn(direction.RIGHT)
  562. startedLayerToRight = true
  563. end
  564. end
  565. end
  566. local mineRows
  567. local onNearSideOfQuarry = true
  568. local diggingAway = true
  569. for mineRows = 1, quarryWidth do
  570. if ((mineRows == 1) and (lookForChests == false)) then
  571. if (isNoiseBlock(turtle.compareDown) == false) then
  572. turtle.digDown()
  573. ensureInventorySpace()
  574. end
  575. elseif (mineRows > 1) then
  576. if (onNearSideOfQuarry == diggingAway) then
  577. if (startedLayerToRight == true) then
  578. turtleTurn(direction.LEFT)
  579. else
  580. turtleTurn(direction.RIGHT)
  581. end
  582. else
  583. if (startedLayerToRight == true) then
  584. turtleTurn(direction.RIGHT)
  585. else
  586. turtleTurn(direction.LEFT)
  587. end
  588. end
  589. turtleForward()
  590. if (miningLevel ~= bottomLayer) then
  591. if (isNoiseBlock(turtle.compareDown) == false) then
  592. if (lookForChests == false) then
  593. turtle.digDown()
  594. ensureInventorySpace()
  595. elseif (turtle.detectDown() == true) then
  596. if (isChestBlock(turtle.compareDown) == true) then
  597. turtleBack()
  598. turtleDown()
  599. emptyChest(turtle.suck)
  600. turtleUp()
  601. turtleForward()
  602. turtle.digDown()
  603. ensureInventorySpace()
  604. else
  605. turtle.digDown()
  606. ensureInventorySpace()
  607. end
  608. end
  609. end
  610. end
  611. if (onNearSideOfQuarry == diggingAway) then
  612. if (startedLayerToRight == true) then
  613. turtleTurn(direction.LEFT)
  614. else
  615. turtleTurn(direction.RIGHT)
  616. end
  617. else
  618. if (startedLayerToRight == true) then
  619. turtleTurn(direction.RIGHT)
  620. else
  621. turtleTurn(direction.LEFT)
  622. end
  623. end
  624. end
  625. local blocksMined
  626. for blocksMined = 0, (quarryWidth - 1) do
  627. if (blocksMined > 0) then
  628. turtleForward()
  629. end
  630. if ((currX == 0) and (currZ == 0)) then
  631. levelToReturnTo = miningLevel
  632. haveBeenAtZeroZeroOnLayer = true
  633. orientationAtZeroZero = currOrient
  634. end
  635. if (miningLevel == bottomLayer) then
  636. local lookForChestsPrev = lookForChests
  637. lookForChests = false
  638. lastMoveNeededDig = true
  639. local moveDownSuccess = turtleDown()
  640. while (moveDownSuccess == true) do
  641. moveDownSuccess = turtleDown()
  642. end
  643. lastMoveNeededDig = false
  644. while (currY < bottomLayer) do
  645. turtleUp()
  646. end
  647. lastMoveNeededDig = false
  648. lookForChests = lookForChestsPrev
  649. elseif ((blocksMined > 0) and ((currX ~= 0) or (currZ ~= 0))) then
  650. if (isNoiseBlock(turtle.compareDown) == false) then
  651. if (lookForChests == false) then
  652. turtle.digDown()
  653. ensureInventorySpace()
  654. elseif (turtle.detectDown() == true) then
  655. if (isChestBlock(turtle.compareDown) == true) then
  656. turtleBack()
  657. turtleDown()
  658. emptyChest(turtle.suck)
  659. turtleUp()
  660. turtleForward()
  661. turtle.digDown()
  662. ensureInventorySpace()
  663. else
  664. turtle.digDown()
  665. ensureInventorySpace()
  666. end
  667. end
  668. end
  669. end
  670. if ((currX ~= 0) or (currZ ~= 0)) then
  671. if (isNoiseBlock(turtle.compareUp) == false) then
  672. if (lookForChests == false) then
  673. turtle.digUp()
  674. ensureInventorySpace()
  675. elseif (turtle.detectUp() == true) then
  676. if (isChestBlock(turtle.compareUp) == true) then
  677. emptyChest(turtle.suckUp)
  678. turtle.digUp()
  679. ensureInventorySpace()
  680. else
  681. turtle.digUp()
  682. ensureInventorySpace()
  683. end
  684. end
  685. end
  686. end
  687. end
  688. onNearSideOfQuarry = not onNearSideOfQuarry
  689. end
  690. diggingAway = not diggingAway
  691. end
  692. returnToStartAndUnload(false)
  693. turtleSetOrientation(direction.FORWARD)
  694. end
  695. local args = { ... }
  696. local paramsOK = true
  697. turtleId = os.getComputerLabel()
  698. if (#args == 1) then
  699. quarryWidth = tonumber(args[1])
  700. local x, y, z = gps.locate(5)
  701. startHeight = y
  702. if (startHeight == nil) then
  703. writeMessage("Can't locate GPS", messageLevel.FATAL)
  704. paramsOK = false
  705. end
  706. elseif (#args == 2) then
  707. quarryWidth = tonumber(args[1])
  708. startHeight = tonumber(args[2])
  709. else
  710. writeMessage("Usage: OreQuarry <diameter> <turtleY>", messageLevel.FATAL)
  711. paramsOK = false
  712. end
  713. if (paramsOK == true) then
  714. if ((startHeight < 6) or (startHeight > 128)) then
  715. writeMessage("turtleY must be between 6 and 128", messageLevel.FATAL)
  716. paramsOK = false
  717. end
  718. if ((quarryWidth < 2) or (quarryWidth > 64)) then
  719. writeMessage("diameter must be between 2 and 64", messageLevel.FATAL)
  720. paramsOK = false
  721. end
  722. end
  723. if (paramsOK == true) then
  724. writeMessage("** Ore Quarry v0.53 by AustinKK **", messageLevel.INFO)
  725. currX = 0
  726. currY = startHeight
  727. currZ = 0
  728. currOrient = direction.FORWARD
  729. determineNoiseBlocksCountCount()
  730. if ((noiseBlocksCount == 0) or (noiseBlocksCount > 13)) then
  731. writeMessage("No noise blocks have been been added. Please place blocks that the turtle should not mine (e.g. Stone, Dirt, Gravel etc.) in the first few slots of the turtle\'s inventory. The first empty slot signifies the end of the noise blocks.", messageLevel.FATAL)
  732. else
  733. turtle.select(1)
  734. currentlySelectedSlot = 1
  735. createQuarry()
  736. end
  737. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement