Advertisement
HarvDad

ores

Mar 24th, 2014
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.64 KB | None | 0 0
  1. -- ores
  2. -- Mines specifically for ores, every third level within specified range
  3. -- Turtle returns to its starting point when mission is completed or fuel runs low
  4. -- Written by HarvDad, March 2014
  5.  
  6. args = {...}
  7. nArgs = #args
  8.  
  9. version = "ores: Rev 3.0"
  10. mission = "Mine specifically for ores, every third level"
  11. instructions = "The first 3 slots must contain blocks to be ignored.."
  12.  
  13. usage = "ores <length> <width> [level]"
  14.  
  15. x = 0
  16. y = 0
  17. z = 0
  18. face = 0
  19. minimumFuel = 100
  20. missionMessage = "Mission complete."
  21. abort = false
  22. maxLevel = 0
  23. local currentFuelLevel = turtle.getFuelLevel()
  24.  
  25. -- The following 'face' directions are relative to the starting position of the turtle in this program
  26. north = 0
  27. west = 1
  28. south = 2
  29. east = 3
  30.  
  31. if nArgs == 0 or (nArgs == 1 and args[1]== "help") then
  32. print(version)
  33. print(mission)
  34. print(instructions)
  35. print(usage)
  36. return
  37. end
  38.  
  39. if nArgs < 2 or nArgs > 3 then
  40. print(usage)
  41. return
  42. end
  43.  
  44. length = tonumber(args[1])
  45. if length == nil then
  46. print("\"", args[1], "\" is not a valid length")
  47. return
  48. end
  49. if length < 1 then
  50. print("length must be a positive number greater than zero")
  51. end
  52.  
  53. width = tonumber(args[2])
  54. if width == nil then
  55. print("\"", args[2], "\" is not a valid width")
  56. return
  57. end
  58. if width < 1 then
  59. print("width must be a positive number greater than zero")
  60. end
  61.  
  62. if nArgs == 3 then
  63. maxLevel = ((math.floor(tonumber(args[3]) / 3)) * 3) + 1
  64. if maxLevel == nil then
  65. print("\"", args[3], "\" is not a valid start level")
  66. return
  67. end
  68. end
  69.  
  70. targetArea = length * width
  71. areaCovered = 1
  72. currentSlot = 2
  73. chestSlot = 16
  74. garbageSlot = 3
  75. maxSlot = 16
  76.  
  77. nextTurn = "left"
  78.  
  79. local clock = os.clock
  80. function sleep(n) -- seconds
  81. local t0 = clock()
  82. while clock() - t0 <= n do end
  83. end
  84.  
  85. function left()
  86. if face == 0 then face = 1 turtle.turnLeft() return end
  87. if face == 1 then face = 2 turtle.turnLeft() return end
  88. if face == 2 then face = 3 turtle.turnLeft() return end
  89. if face == 3 then face = 0 turtle.turnLeft() return end
  90. print("function left\(\): Bad face value: ", face)
  91. end
  92.  
  93. function right()
  94. if face == 0 then face = 3 turtle.turnRight() return end
  95. if face == 1 then face = 0 turtle.turnRight() return end
  96. if face == 2 then face = 1 turtle.turnRight() return end
  97. if face == 3 then face = 2 turtle.turnRight() return end
  98. print("function right\(\): Bad face value: ", face)
  99. end
  100.  
  101. function up()
  102. for i=1,10 do
  103. if not turtle.up() then
  104. if turtle.detectUp() then
  105. digUp()
  106. else
  107. turtle.attackUp()
  108. sleep(2)
  109. end
  110. else
  111. break
  112. end
  113. end
  114. y = y+1
  115. end
  116.  
  117. function rise(nBlocks)
  118. local i
  119. for i=1,nBlocks do
  120. up()
  121. end
  122. end
  123.  
  124. function down()
  125. for i=1,10 do
  126. if not turtle.down() then
  127. if turtle.detectDown() then
  128. digDown()
  129. else
  130. turtle.attackDown()
  131. sleep(2)
  132. end
  133. else
  134. break
  135. end
  136. end
  137. y = y-1
  138. end
  139.  
  140. function turn()
  141. if nextTurn == "left" then
  142. left()
  143. else
  144. right()
  145. end
  146. chomp()
  147. forward()
  148. if nextTurn == "left" then
  149. left()
  150. nextTurn = "right"
  151. else
  152. right()
  153. nextTurn = "left"
  154. end
  155. areaCovered = areaCovered + 1
  156. end
  157.  
  158. function forward(keepTrackOfArea)
  159. if keepTrackOfArea == nil then
  160. keepTrackOfArea = true
  161. end
  162. while turtle.detect() do -- This loop added in case of falling sand or whatever
  163. dig()
  164. end
  165. for i=1,10 do -- This loop trys to handle pests (mob) that might be in the way
  166. if not turtle.forward() then
  167. if turtle.detect() then
  168. dig()
  169. else
  170. turtle.attack()
  171. sleep(2)
  172. end
  173. else
  174. break
  175. end
  176. end
  177. if keepTrackOfArea then
  178. areaCovered = areaCovered + 1
  179. end
  180.  
  181. if face == 0 then z = z+1 return end
  182. if face == 1 then x = x-1 return end
  183. if face == 2 then z = z-1 return end
  184. if face == 3 then x = x+1 return end
  185. end
  186.  
  187. function dig()
  188. if noMoreEmptySlots() then
  189. jettisonGarbage()
  190. goEmptyInventoryToChestAndReturn()
  191. end
  192. turtle.dig()
  193. end
  194.  
  195. function digUp()
  196. if noMoreEmptySlots() then
  197. jettisonGarbage()
  198. goEmptyInventoryToChestAndReturn()
  199. end
  200. turtle.digUp()
  201. end
  202.  
  203. function digDown()
  204. if noMoreEmptySlots() then
  205. jettisonGarbage()
  206. goEmptyInventoryToChestAndReturn()
  207. end
  208. turtle.digDown()
  209. end
  210.  
  211. function setFace(f)
  212. if f == 0 then
  213. if face == 0 then return end
  214. if face == 1 then right() return end
  215. if face == 2 then right() right() return end
  216. if face == 3 then left() return end
  217. end
  218.  
  219. if f == 1 then
  220. if face == 0 then left() return end
  221. if face == 1 then return end
  222. if face == 2 then right() return end
  223. if face == 3 then right() right() return end
  224. end
  225.  
  226. if f == 2 then
  227. if face == 0 then left() left() return end
  228. if face == 1 then left() return end
  229. if face == 2 then return end
  230. if face == 3 then right() return end
  231. end
  232.  
  233. if f == 3 then
  234. if face == 0 then right() return end
  235. if face == 1 then left() left() return end
  236. if face == 2 then left() return end
  237. if face == 3 then return end
  238. end
  239. end
  240.  
  241. function home(homeFace)
  242. if x < 0 then
  243. setFace(east)
  244. while x < 0 do
  245. forward()
  246. end
  247. else
  248. if x > 0 then
  249. setFace(west)
  250. while x > 0 do
  251. forward()
  252. end
  253. end
  254. end
  255.  
  256. if z < 0 then
  257. setFace(north)
  258. while z < 0 do
  259. forward()
  260. end
  261. else
  262. if z > 0 then
  263. setFace(south)
  264. while z > 0 do
  265. forward()
  266. end
  267. end
  268. end
  269.  
  270. if y > 0 then
  271. while y > 0 do
  272. down()
  273. end
  274. end
  275.  
  276. if homeFace ~= nil then
  277. setFace(homeFace)
  278. end
  279. end
  280.  
  281. function returnToMark()
  282. if markZ < 0 then
  283. setFace(south)
  284. while z > markZ do
  285. forward(false)
  286. end
  287. else
  288. if markZ > 0 then
  289. setFace(north)
  290. while z < markZ do
  291. forward(false)
  292. end
  293. end
  294. end
  295.  
  296. if markX < 0 then
  297. setFace(west)
  298. while x > markX do
  299. forward(false)
  300. end
  301. else
  302. if markX > 0 then
  303. setFace(east)
  304. while x < markX do
  305. forward(false)
  306. end
  307. end
  308. end
  309.  
  310. setFace(markFace)
  311. end
  312.  
  313. function ensureMaterial()
  314. if turtle.getItemCount(materialSlot) < 3 then
  315. organizeMaterial()
  316. end
  317. if turtle.getItemCount(materialSlot) < 3 then
  318. print("No more material")
  319. return false
  320. end
  321. return true
  322. end
  323.  
  324. function organizeMaterial()
  325. local i
  326. materialCount = turtle.getItemCount(materialSlot)
  327.  
  328. if materialCount < 3 then
  329. print("Attempting to refill slot ", materialSlot)
  330. for i=2,16 do
  331. turtle.select(i)
  332. if turtle.compareTo(materialSlot) then
  333. turtle.transferTo(materialSlot)
  334. end
  335. end
  336. end
  337. turtle.select(materialSlot)
  338. end
  339.  
  340. function ignoreUp()
  341. for slot=1,3 do
  342. turtle.select(slot)
  343. if turtle.compareUp() then
  344. return true
  345. end
  346. end
  347. return false
  348. end
  349.  
  350. function ignoreDown()
  351. for slot=1,3 do
  352. turtle.select(slot)
  353. if turtle.compareDown() then
  354. return true
  355. end
  356. end
  357. return false
  358. end
  359.  
  360. function mineUp()
  361. while turtle.detectUp() do
  362. digUp()
  363. end
  364. end
  365.  
  366. function mineDown()
  367. if turtle.detectDown() then
  368. digDown()
  369. end
  370. end
  371.  
  372. function mineAtLevel()
  373. end
  374.  
  375. function layBlock()
  376. turtle.select(materialSlot)
  377.  
  378. if maxLevel > 2 then
  379. if turtle.detectUp() then
  380. if turtle.compareUp() then
  381. return
  382. else
  383. digUp()
  384. end
  385. end
  386. if ensureMaterial() then
  387. turtle.placeUp()
  388. end
  389. else
  390. if turtle.detectDown() then
  391. if turtle.compareDown() then
  392. return
  393. else
  394. digDown()
  395. end
  396. end
  397. if ensureMaterial() then
  398. turtle.placeDown()
  399. end
  400. end
  401. end
  402.  
  403. function checkFuel()
  404. if currentFuelLevel == "unlimited" then
  405. return true
  406. end
  407.  
  408. if currentFuelLevel < minimumFuel then
  409. if not turtle.refuel() then
  410. areaCovered = targetArea
  411. missionMessage = "Mission aborted due to low fuel."
  412. abort = true
  413. return false
  414. end
  415. end
  416. return true
  417. end
  418.  
  419. -- MAIN PROGRAM
  420.  
  421. turtle.select(1)
  422.  
  423. if currentFuelLevel ~= "unlimited" then
  424. if currentFuelLevel < minimumFuel then
  425. if not turtle.refuel() then
  426. print("No fuel")
  427. return
  428. end
  429. end
  430. end
  431.  
  432. function mineLoop()
  433. while areaCovered < targetArea do
  434. if abort then
  435. break
  436. end
  437. for w=1,width do
  438. if abort then
  439. break
  440. end
  441. for z=1,length do
  442. if abort then
  443. break
  444. end
  445. if not ignoreUp() then
  446. mineUp()
  447. end
  448. if not ignoreDown() then
  449. mineDown()
  450. end
  451. if z < length then
  452. forward()
  453. end
  454. end
  455. if nextTurn == "left" then
  456. if areaCovered < targetArea then
  457. left()
  458. forward()
  459. left()
  460. nextTurn = "right"
  461. end
  462. else
  463. if areaCovered < targetArea then
  464. right()
  465. forward()
  466. right()
  467. nextTurn = "left"
  468. end
  469. end
  470. end
  471. end
  472. end
  473.  
  474. function inventoryGettingFull()
  475. return ((turtle.getItemCount(14) > 0) or (turtle.getItemCount(15) > 0))
  476. end
  477.  
  478. function noMoreEmptySlots()
  479. return (turtle.getItemCount(15) > 0)
  480. end
  481.  
  482. markX = 0
  483. markY = 0
  484. markZ = 0
  485. markFace = nil
  486.  
  487. function goEmptyInventoryToChestAndReturn()
  488. saveAreaCovered = areaCovered
  489. markX = x
  490. markY = y
  491. markZ = z
  492. markFace = face
  493.  
  494. home()
  495. setFace(east)
  496. while y > 0 do
  497. down()
  498. end
  499. dump()
  500. while y < markY do
  501. up()
  502. end
  503. returnToMark()
  504. areaCovered = saveAreaCovered
  505. end
  506.  
  507. jettisonCount = 0
  508. function jettisonGarbage()
  509. jettisonCount = jettisonCount + 1
  510. -- print("Jettison count ", jettisonCount)
  511. turtle.select(garbageSlot)
  512. for i=5,15 do
  513. turtle.select(i)
  514. if turtle.compareTo(garbageSlot) then
  515. turtle.dropDown()
  516. end
  517. end
  518. if turtle.getItemCount(15) > 0 then
  519. turtle.select(15)
  520. for i=5,13 do
  521. if turtle.getItemCount(i) == 0 then
  522. turtle.transferTo(i)
  523. end
  524. end
  525. end
  526. turtle.select(1)
  527. end
  528.  
  529. purgeCount = 0
  530. function purgeGarbage()
  531. purgeCount = purgeCount + 1
  532. -- print("Purge garbage ", purgeCount)
  533. if turtle.detectDown() then
  534. turtle.digDown()
  535. end
  536. turtle.select(garbageSlot)
  537. for i=5,15 do
  538. turtle.select(i)
  539. if turtle.compareTo(garbageSlot) then
  540. turtle.dropDown()
  541. end
  542. end
  543.  
  544. if turtle.getItemCount(14) > 0 then
  545. turtle.select(14)
  546. for i=5,13 do
  547. if turtle.getItemCount(i) == 0 then
  548. turtle.transferTo(i)
  549. end
  550. end
  551. end
  552. if turtle.getItemCount(15) > 0 then
  553. turtle.select(15)
  554. for i=5,13 do
  555. if turtle.getItemCount(i) == 0 then
  556. turtle.transferTo(i)
  557. end
  558. end
  559. end
  560. turtle.select(1)
  561. end
  562.  
  563. function collapseInventory()
  564. turtle.select(15)
  565. for i=5,15 do
  566. if turtle.getItemCount(i) == 0 then
  567. turtle.transferTo(i)
  568. end
  569. end
  570. end
  571.  
  572. function dump()
  573. -- setFace(east)
  574. --[[ turtle.select(chestSlot)
  575. if not turtle.compare() then
  576. plantChest()
  577. end
  578. --]]
  579. for i=1,3 do
  580. turtle.select(i)
  581. itemCount = turtle.getItemCount(i)
  582. if itemCount > 0 then
  583. turtle.drop(itemCount-1)
  584. end
  585. end
  586.  
  587. for i=5,15 do
  588. turtle.select(i)
  589. if turtle.getItemCount(i) > 0 then
  590. if not turtle.drop() then
  591. print("Dump failed. Chest is full.")
  592. return
  593. end
  594. end
  595. end
  596. turtle.select(1)
  597. setFace(north)
  598. end
  599.  
  600. function plantChest()
  601. turtle.select(chestSlot)
  602. setFace(east)
  603. forward()
  604. mineUp()
  605. left()
  606. forward()
  607. mineUp()
  608. left()
  609. forward()
  610. left()
  611. left()
  612. turtle.place()
  613. right()
  614. forward()
  615. left()
  616. turtle.place()
  617. setFace(east)
  618. turtle.select(1)
  619. end
  620.  
  621. function sealItOff()
  622. turtle.select(3)
  623. turtle.up()
  624. turtle.placeUp()
  625. turtle.down()
  626. turtle.placeUp()
  627. turtle.place()
  628. turtle.turnLeft()
  629. turtle.place()
  630. turtle.turnRight()
  631. end
  632.  
  633. y = 0
  634. --up()
  635.  
  636. mineLevel = 1
  637. saveY = y
  638.  
  639. plantChest()
  640. setFace(north)
  641.  
  642. while mineLevel <= maxLevel do
  643. areaCovered = 1
  644. nextTurn = "left"
  645. mineLoop()
  646. home()
  647. while y > 0 do
  648. down()
  649. end
  650. setFace(east)
  651. dump()
  652. if mineLevel < maxLevel then
  653. mineLevel = mineLevel + 3
  654. while y < mineLevel-1 do
  655. up()
  656. end
  657. else
  658. break
  659. end
  660. end
  661.  
  662. print(missionMessage)
  663. print(" Current fuel level is ", turtle.getFuelLevel())
  664. home(north)
  665. sealItOff()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement