Advertisement
Jdoolzey

Lumberjack 3.0

Apr 10th, 2020
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 82.30 KB | None | 0 0
  1. -- Section: Variable ----------------------------------------------------------------------------
  2. -- these are defaults run when the turtle runs for the first time
  3. local whatsMyName = "Professor Oak"
  4. local logSlot = 2
  5. local fuelSlot1 = 13
  6. local fuelSlot2 = 14
  7. local saplingSlot1 = 9
  8. local saplingSlot2 = 10
  9. local minFuel = 100 -- the turtle will refuel if fuel level drops below this
  10. local firstRun = true
  11. local saplingGap = 2 -- blocks between saplings
  12. local wallGap = 2 -- blocks between turtle's starting position and the first tree
  13. local sleepTime = 600 -- automatically adjusted by program
  14. local baseTime = 600 -- used for making the sleepTime calculation and is not saved in logger.cfg
  15. local useFurnace = true -- do you want the turtle to make its own charcoal? Put a furnace above it to use.
  16. local poweredFurnace = false -- set to true if your furnace is powered by something else
  17. local charcoalNumber = 2 -- number of charcoal to make each logging run, in multiples of 8
  18. local dumpStuff = true -- if true the turtle will drop off extra stuff in a chest on its right
  19. local getSaplings = true -- if true the turtle will get saplings from a chest on its left, put only saplings in there
  20. local treeTotal = 0 -- keeps track of how many trees it has cut down
  21. local charcoalMade = 0 -- keeps track of how many charcoal it has made
  22. local saplingsPlanted = 0 -- keeps track of how many saplings it has planted
  23. local fuelOn = true -- setting for if the server has fuel disabled for turtles
  24. local rowOffset = 0 -- scoot the first row left (+) or right (-) with a positive or negative number
  25. local needsBroken = false -- if the turtle can't find its way back home you will need to break it before it runs again
  26. local omgDirt = 0
  27. -- variables for saving the turtle's cordinates, saved in loggercords.dat
  28. local cordsx = 0
  29. local cordsy = 0
  30. local cordsz = 0
  31. local facing = 1
  32.  
  33.  
  34. -- SECTION: Settings Saving and Loading -----------------------------------------------------------
  35. function saveSettings() -- write the settings to logger.cfg
  36. term.setCursorPos (3, 2)
  37. write ("Commiting to memory")
  38. local file = fs.writeFile ("logger.cfg", "w")
  39. file.writeLine (whatsMyName)
  40. file.writeLine (logSlot)
  41. file.writeLine (fuelSlot1)
  42. file.writeLine (fuelSlot2)
  43. file.writeLine (saplingSlot1)
  44. file.writeLine (saplingSlot2)
  45. file.writeLine (minFuel)
  46. file.writeLine (firstRun)
  47. file.writeLine (saplingGap)
  48. file.writeLine (wallGap)
  49. file.writeLine (sleepTime)
  50. file.writeLine (long)
  51. file.writeLine (wide)
  52. file.writeLine (useFurnace)
  53. file.writeLine (poweredFurnace)
  54. file.writeLine (charcoalNumber)
  55. file.writeLine (dumpStuff)
  56. file.writeLine (getSaplings)
  57. file.writeLine (treeTotal)
  58. file.writeLine (charcoalMade)
  59. file.writeLine (saplingsPlanted)
  60. file.writeLine (fuelOn)
  61. file.writeLine (rowOffset)
  62. file.writeLine (needsBroken)
  63. file.close ( )
  64. sleep (0.3)
  65. term.setCursorPos (3, 2)
  66. write (" ")
  67. end
  68.  
  69. function loadSettings() -- load values from logger.cfg
  70. term.setCursorPos (3, 2)
  71. write (" Trying to Remember...")
  72. local file = fs.readFile ("logger.cfg", "w")
  73. whatsMyName = file.readLine ( )
  74. logSlot = tonumber (file.readLine ( ))
  75. fuelSlot1 = tonumber (file.readLine ( ))
  76. fuelSlot2 = tonumber (file.readLine ( ))
  77. saplingSlot1 = tonumber (file.readLine ( ))
  78. saplingSlot2 = tonumber (file.readLine ( ))
  79. minFuel = tonumber (file.readLine ( ))
  80. firstRun = file.readLine ( ) == "true"
  81. saplingGap = tonumber (file.readLine ( ))
  82. wallGap = tonumber (file.readLine ( ))
  83. sleepTime = tonumber (file.readLine ( ))
  84. long = tonumber (file.readLine ( ))
  85. wide = tonumber (file.readLine ( ))
  86. useFurnace = file.readLine ( ) == "true"
  87. poweredFurnace = file.readLine ( ) == "true"
  88. charcoalNumber = tonumber (file.readLine ( ))
  89. dumpStuff = file.readLine ( ) == "true"
  90. getSaplings = file.readLine ( ) == "true"
  91. treeTotal = tonumber (file.readLine ( ))
  92. charcoalMade = tonumber (file.readLine ( ))
  93. saplingsPlanted = tonumber (file.readLine ( ))
  94. fuelOn = file.readLine ( ) == "true"
  95. liltest = (file.readLine ( ))
  96. if type( tonumber (liltest) ) == "number" then
  97. -- rowOffset = tonumber (file.readLine ( ))
  98. rowOffset = tonumber (liltest)
  99. else
  100. rowOffset = 0
  101. rowOffset = tonumber (rowOffset)
  102. end
  103. needsBroken = file.readLine ( ) == "true"
  104. file.close ( )
  105. end
  106.  
  107. -- SECTION: Cordinate Handling
  108. -- cords notes: x is forward and backward, z is left and right
  109. -- faceing is as follows: 1 is x+, 2 is z+, 3 is x-, 4 is z- or
  110. -- Forward, Right, Backward, Left from inital placement
  111. -- all cords and facings are relative to turtles initial placement, not minecraft cords
  112.  
  113. function saveCords() -- write cordinates to loggercords.dat
  114. local file = fs.open ("loggercords.dat", "w")
  115. file.writeLine (cordsx)
  116. file.writeLine (cordsy)
  117. file.writeLine (cordsz)
  118. file.writeLine (facing)
  119. file.close ( )
  120. end
  121.  
  122. function loadCords() -- read cordinates from loggercords.dat
  123. local file = fs.open ("loggercords.dat", "r")
  124. cordsx = tonumber (file.readLine ( ))
  125. cordsy = tonumber (file.readLine ( ))
  126. cordsz = tonumber (file.readLine ( ))
  127. facing = tonumber (file.readLine ( ))
  128. file.close ( )
  129. end
  130.  
  131. function homeCheck() -- see if turtle is at home after booting up
  132. -- checks to see if turtle was broken, most likely the player will not refill logslot
  133. if turtle.getItemCount(logSlot) == 0 then
  134. cordsx = 0
  135. cordsy = 0
  136. cordsz = 0
  137. facing = 1
  138. saveCords()
  139. loadCords()
  140. return true
  141. end
  142. -- check cords and returns true if at home position and facing
  143. if cordsx == 0 then
  144. if cordsy == 0 then
  145. if cordsz == 0 then
  146. if facing == 1 then
  147. return true
  148. else
  149. return false
  150. end
  151. else
  152. return false
  153. end
  154. else
  155. return false
  156. end
  157. else
  158. return false
  159. end
  160. end
  161.  
  162. function goHome() -- turtle was out in the field when restarted, lets get it home
  163. -- finish cutting down tree first
  164. if cordsx == 0 then -- Dodge the furnace!
  165. if cordsz == 0 then
  166. if cordsy == 2 then
  167. while facing ~= 1 do
  168. turn ("left")
  169. end
  170. forward(1)
  171. down(2)
  172. turn("back")
  173. forward(1)
  174. turn("back")
  175. return
  176. end
  177. end
  178. end
  179. turtle.select(logSlot)
  180. if cordsy ~= 0 then
  181. height = 0
  182. up(1)
  183. height = height + 1
  184. while turtle.compareUp() do
  185. turtle.digUp ()
  186. up (1)
  187. height = height + 1
  188. end
  189. down(height)
  190. end
  191. -- get to the right height
  192. term.setCursorPos (1, 2)
  193. clearLine()
  194. write ("| Im heading home! :D")
  195. while cordsy > 0 do
  196. down (1)
  197. sleep (0.2)
  198. end
  199. if cordsy < 0 then
  200. up (1)
  201. end
  202. -- face the correct z direction to go home
  203. if cordsz < 0 then
  204. while facing ~= 2 do
  205. turn ("right")
  206. end
  207. elseif cordsz > 0 then
  208. while facing ~= 4 do
  209. turn ("left")
  210. end
  211. end
  212. -- get to z = 0
  213. while cordsz ~= 0 do
  214. forward (1)
  215. sleep (0.3)
  216. end
  217. -- face towards home
  218. while facing ~= 3 do
  219. turn ("left")
  220. end
  221. -- go home
  222. while cordsx ~= 0 do
  223. forward (1)
  224. sleep (0.2)
  225. end
  226. turn ("back") -- should now be home facing the right direction
  227. if useFurnace == true then -- lets make sure the turtle made it home, assuming a chest or furnace is nearby
  228. if furnaceCheck() == false then
  229. needsBroken = true
  230. saveSettings()
  231. term.clear()
  232. term.setCursorPos (1, 1)
  233. print ("Logger may not have made it home so the program was closed. Break the turtle and replace it to continue.")
  234. running = false
  235. return
  236. end
  237. elseif dumpStuff == true then -- if useFurnace is off, check for a dump chest
  238. turn ("right")
  239. if turtle.detect() == false then
  240. needsBroken = true
  241. saveSettings()
  242. turn ("left")
  243. term.clear()
  244. term.setCursorPos (1, 1)
  245. print ("Logger may not have made it home so the program was closed. Break the turtle and replace it to continue.")
  246. running = false
  247. return
  248. end
  249. elseif getSaplings == true then -- if dumpchest is off, check for a sapling chest
  250. turn ("left")
  251. if turtle.detect() == false then
  252. needsBroken = true
  253. saveSettings()
  254. turn ("right")
  255. term.clear()
  256. term.setCursorPos (1, 1)
  257. print ("Logger may not have made it home so the program was closed. Break the turtle and replace it to continue.")
  258. running = false
  259. return
  260. end
  261. end -- if somehow the tests pass, or all chests and furnace are turned off, and the turtle isn't in the right spot, then too bad.
  262. end
  263.  
  264. -- SECTION: Settings Menus, used for changing variables -------------------------------------------
  265.  
  266. function settings() -- main settings menu
  267. -- display settings menu
  268. -- allow for selection of different setting categories
  269. -- some settings categories goes to their own page, some toggles
  270. -- menus:
  271. -- Turtle Name, change slots, Farm layout, Sleep Time,
  272. -- Furnace (toggle), Sapling chest (toggle), Output chest (toggle)
  273. -- Powered Furnace (toggle), Quit Program
  274. if running == false then return end
  275. term.clear()
  276. box()
  277. term.setCursorPos (15, 1)
  278. write ("Settings Menu")
  279. term.setCursorPos (1, 13)
  280. write ("O---a=back, d=select, w=up, s=down ---O")
  281. keypress = 0
  282. selection = 1
  283. while gotosettings == true do -- menus start here
  284. if selection == 1 then -- Turtle Name
  285. term.setCursorPos (14, 3)
  286. write ("*Turtle Name ")
  287. if keypress == 68 then
  288. changeName()
  289. return
  290. end
  291. else
  292. term.setCursorPos (14, 3)
  293. write (" Turtle Name ")
  294. end
  295. if selection == 2 then
  296. term.setCursorPos (14, 4)
  297. write ("*Change Slots")
  298. if keypress == 68 then
  299. changeSlots()
  300. return
  301. end
  302. else
  303. term.setCursorPos (14, 4)
  304. write (" Change Slots ")
  305. end
  306. if selection == 3 then -- Farm Layout
  307. term.setCursorPos (14, 5)
  308. write ("*Farm Layout")
  309. if keypress == 68 then
  310. farmLayout()
  311. return
  312. end
  313. else
  314. term.setCursorPos (14, 5)
  315. write (" Farm Layout ")
  316. end
  317. if selection == 4 then -- Sleep Time
  318. term.setCursorPos (14, 6)
  319. write ("*Sleep Time")
  320. if keypress == 68 then
  321. changeSleepTime()
  322. return
  323. end
  324. else
  325. term.setCursorPos (14, 6)
  326. write (" Sleep Time ")
  327. end
  328. if selection == 5 then -- Furnace (toggle)
  329. term.setCursorPos (14, 7)
  330. write ("*Furnace ("..tostring(useFurnace)..") ")
  331. if keypress == 68 then
  332. if useFurnace == false then
  333. useFurnace = true
  334. else
  335. useFurnace = false
  336. end
  337. term.setCursorPos (14, 7)
  338. write ("*Furnace ("..tostring(useFurnace)..") ")
  339. end
  340. else
  341. term.setCursorPos (14, 7)
  342. write (" Furnace ("..tostring(useFurnace)..") ")
  343. end
  344. if selection == 6 then -- Powered Furnace (toggle)
  345. term.setCursorPos (14, 8)
  346. write ("*Powered Furnace ("..tostring(poweredFurnace)..") ")
  347. if keypress == 68 then
  348. if poweredFurnace == false then
  349. poweredFurnace = true
  350. else
  351. poweredFurnace = false
  352. end
  353. term.setCursorPos (14, 8)
  354. write ("*Powered Furnace ("..tostring(poweredFurnace)..") ")
  355. end
  356. else
  357. term.setCursorPos (14, 8)
  358. write (" Powered Furnace ("..tostring(poweredFurnace)..") ")
  359. end
  360. if selection == 7 then -- Sapling Chest (toggle)
  361. term.setCursorPos (14, 9)
  362. write ("*Sapling Chest ("..tostring(getSaplings)..") ")
  363. if keypress == 68 then
  364. if getSaplings == false then
  365. getSaplings = true
  366. else
  367. getSaplings = false
  368. end
  369. term.setCursorPos (14, 9)
  370. write ("*Sapling Chest ("..tostring(getSaplings)..") ")
  371. end
  372. else
  373. term.setCursorPos (14, 9)
  374. write (" Sapling Chest ("..tostring(getSaplings)..") ")
  375. end
  376. if selection == 8 then -- Output Chest (toggle)
  377. term.setCursorPos (14, 10)
  378. write ("*Output Chest ("..tostring(dumpStuff)..") ")
  379. if keypress == 68 then
  380. if dumpStuff == false then
  381. dumpStuff = true
  382. else
  383. dumpStuff = false
  384. end
  385. term.setCursorPos (14, 10)
  386. write ("*Output Chest ("..tostring(dumpStuff)..") ")
  387. end
  388. else
  389. term.setCursorPos (14, 10)
  390. write (" Output Chest ("..tostring(dumpStuff)..") ")
  391. end
  392. if selection == 9 then -- Quit Program
  393. term.setCursorPos (14, 11)
  394. write ("*Quit Program ")
  395. if keypress == 68 then
  396. gotosettings = false
  397. term.clear()
  398. saveSettings()
  399. term.clear()
  400. running = false
  401. term.clear()
  402. term.setCursorPos (1, 1)
  403. return
  404. end
  405. else
  406. term.setCursorPos (14, 11)
  407. write (" Quit Program ")
  408. end
  409.  
  410. --------------------controls-----------------------
  411. keypress = 0
  412. sleep (0.2)
  413. event, keypress = os.pullEvent("key")
  414. if keypress == 87 then -- w key or UP on the menu
  415. selection = selection - 1
  416. if selection < 1 then
  417. selection = 9
  418. end
  419. elseif keypress == 83 then -- s key or DOWN on the menu
  420. selection = selection + 1
  421. if selection > 9 then
  422. selection = 1
  423. end
  424. elseif keypress == 65 then -- a key or Back on the menu
  425. gotosettings = false
  426. term.clear()
  427. graphics()
  428. saveSettings()
  429. loadSettings()
  430. sleep(1)
  431. return
  432. end
  433. end
  434. end
  435.  
  436. function changeName() -- Change the turtles name (whatsMyName)
  437. term.clear()
  438. box()
  439. term.setCursorPos (15, 1)
  440. write ("Turtle Name")
  441. term.setCursorPos (5, 3)
  442. write ("My name is "..os.getComputerLabel())
  443. term.setCursorPos (5, 5)
  444. write ("Would you like to change it? y/n")
  445. sleep(0.3)
  446. while true do
  447. keypress = 0
  448. event, keypress = os.pullEvent("key")
  449. if keypress == 78 then
  450. settings()
  451. break
  452. elseif keypress == 89 then
  453. term.setCursorPos (5, 5)
  454. write ("What is my new name? ")
  455. term.setCursorPos (5, 6)
  456. sleep(0.3)
  457. whatsMyName = read ()
  458. os.setComputerLabel(whatsMyName)
  459. sleep(1.5)
  460. settings()
  461. break
  462. elseif keypress == 78 then
  463. settings()
  464. break
  465. end
  466. end
  467. end
  468.  
  469. function changeSlots() -- Slots for log, sapling 1 and 2, fuel 1 and 2
  470. term.clear()
  471. box()
  472. term.setCursorPos (15, 1)
  473. write ("View Slots")
  474. term.setCursorPos (1, 13)
  475. write ("O---a=back, d=select, w=up, s=down ---O")
  476. selection = 1
  477. keypress = 0
  478. while true do
  479. term.setCursorPos (15, 3)
  480. if selection == 2 then -- logSlot
  481. write ("*Log: "..logSlot)
  482. turtle.select(logSlot)
  483. if keypress == 32 then
  484. term.setCursorPos (10, 9)
  485. write ("Type new Log Slot: ")
  486. sleep(0.1)
  487. newwide = read ()
  488. liltest = tonumber ( newwide )
  489. if type( liltest ) ~= "number" then
  490. term.setCursorPos (10, 10)
  491. write ("I was expecting a number")
  492. sleep(1.5)
  493. term.setCursorPos (10, 10)
  494. write (" ")
  495. else
  496. logSlot = tonumber(newwide)
  497. changeSlots()
  498. return
  499. end
  500. term.setCursorPos (10, 9)
  501. write (" ")
  502. end
  503. else
  504. write (" Log: "..logSlot)
  505. end
  506. term.setCursorPos (15, 5)
  507.  
  508. if selection == 3 then -- saplingSlot1
  509. write ("*Sapling 1: "..saplingSlot1)
  510. turtle.select(saplingSlot1)
  511. if keypress == 32 then
  512. term.setCursorPos (10, 9)
  513. write ("Type new Sapling 1 slot: ")
  514. sleep(0.1)
  515. newgap = read ()
  516. liltest = tonumber ( newgap )
  517. if type( liltest ) ~= "number" then
  518. term.setCursorPos (10, 10)
  519. write ("I was expecting a number")
  520. sleep(1.5)
  521. term.setCursorPos (10, 10)
  522. write (" ")
  523. else
  524. saplingSlot1 = tonumber(newgap)
  525. changeSlots()
  526. return
  527. end
  528. term.setCursorPos (10, 9)
  529. write (" ")
  530. end
  531. else
  532. write (" Sapling 1: "..saplingSlot1)
  533. end
  534. term.setCursorPos (15, 6)
  535.  
  536. if selection == 4 then -- saplingSlot2
  537. write ("*Sapling 2: "..saplingSlot2)
  538. turtle.select(saplingSlot2)
  539. if keypress == 32 then
  540. term.setCursorPos (10, 9)
  541. write ("Type new Sapling 2 slot: ")
  542. sleep(0.1)
  543. newgap = read ()
  544. liltest = tonumber ( newgap )
  545. if type( liltest ) ~= "number" then
  546. term.setCursorPos (10, 10)
  547. write ("I was expecting a number")
  548. sleep(1.5)
  549. term.setCursorPos (10, 10)
  550. write (" ")
  551. else
  552. saplingSlot2 = tonumber(newgap)
  553. changeSlots()
  554. return
  555. end
  556. term.setCursorPos (10, 9)
  557. write (" ")
  558. end
  559. else
  560. write (" Sapling 2: "..saplingSlot2)
  561. end
  562. term.setCursorPos (15, 7)
  563.  
  564. if selection == 5 then -- fuelSlot1
  565. write ("*Fuel 1: "..fuelSlot1)
  566. turtle.select(fuelSlot1)
  567. if keypress == 32 then
  568. term.setCursorPos (10, 9)
  569. write ("Type new Fuel 1 slot: ")
  570. sleep(0.1)
  571. newgap = read ()
  572. liltest = tonumber ( newgap )
  573. if type( liltest ) ~= "number" then
  574. term.setCursorPos (10, 10)
  575. write ("I was expecting a number")
  576. sleep(1.5)
  577. term.setCursorPos (10, 10)
  578. write (" ")
  579. else
  580. fuelSlot1 = tonumber(newgap)
  581. changeSlots()
  582. return
  583. end
  584. term.setCursorPos (10, 9)
  585. write (" ")
  586. end
  587. else
  588. write (" Fuel 1: "..fuelSlot1)
  589. end
  590. term.setCursorPos (15, 8)
  591.  
  592. if selection == 6 then ---- fuelSlot2
  593. write ("*Fuel 2: "..fuelSlot2)
  594. turtle.select(fuelSlot2)
  595. if keypress == 32 then
  596. term.setCursorPos (10, 9)
  597. write ("Type new Sapling 2 slot: ")
  598. sleep(0.1)
  599. newgap = read ()
  600. liltest = tonumber ( newgap )
  601. if type( liltest ) ~= "number" then
  602. term.setCursorPos (10, 10)
  603. write ("I was expecting a number")
  604. sleep(1.5)
  605. term.setCursorPos (10, 10)
  606. write (" ")
  607. else
  608. fuelSlot2 = tonumber(newgap)
  609. changeSlots()
  610. return
  611. end
  612. term.setCursorPos (10, 9)
  613. write (" ")
  614. end
  615. else
  616. write (" Fuel 2: "..fuelSlot2)
  617. end
  618.  
  619. -- listen for keyboard input
  620. sleep(0.3)
  621. keypress = 0
  622. event, keypress = os.pullEvent("key")
  623. if keypress == 17 then
  624. selection = selection - 1
  625. if selection < 1 then
  626. selection = 6
  627. end
  628. elseif keypress == 31 then
  629. selection = selection + 1
  630. if selection > 6 then
  631. selection = 1
  632. end
  633. elseif keypress == 30 then
  634. settings()
  635. return
  636. end
  637. term.setCursorPos (15, 8)
  638. write (" ")
  639. end
  640. end
  641.  
  642. function changeSleepTime() -- Change how long the turtle waits (sleepTime)
  643. term.clear()
  644. box()
  645. term.setCursorPos (15, 1)
  646. write ("Sleep Time")
  647. term.setCursorPos (3, 3)
  648. write ("I will currently sleep "..sleepTime.." seconds.")
  649. term.setCursorPos (3, 5)
  650. write ("Would you like to change that? y/n")
  651. sleep(0.3)
  652. while true do
  653. keypress = 0
  654. event, keypress = os.pullEvent("key")
  655. if keypress == 49 then
  656. settings()
  657. break
  658. elseif keypress == 21 then
  659. term.setCursorPos (3, 5)
  660. write ("How long should I sleep? ")
  661. term.setCursorPos (3, 6)
  662. sleep(0.3)
  663. newTime = read ()
  664. liltest = tonumber ( newTime )
  665. if type( liltest ) ~= "number" then
  666. term.setCursorPos (15, 10)
  667. write ("I was expecting a number")
  668. sleep(1.5)
  669. term.setCursorPos (15, 10)
  670. write (" ")
  671. changeSleepTime()
  672. return
  673. else
  674. sleepTime = tonumber(newTime)
  675. end
  676. sleep(1.5)
  677. settings()
  678. break
  679. elseif keypress == 30 then
  680. settings()
  681. break
  682. end
  683. end
  684. end
  685.  
  686. function farmLayout() -- Change the layout for the farm
  687. -- graphical setup
  688. term.clear()
  689. box()
  690. line(13)
  691. selection = 1
  692. keypress = 0
  693. -- show demonstration
  694. term.setCursorPos (15, 1)
  695. write ("Farm Layout")
  696. term.setCursorPos (1, 13)
  697. write ("O---a=back, d=select, w=up, s=down ---O")
  698. term.setCursorPos (4, 3)
  699. write ("Width")
  700. term.setCursorPos (3, 4)
  701. write ("T T T")
  702. term.setCursorPos (3, 5)
  703. write ("T T T") -- last char is on 10, 4
  704. term.setCursorPos (3, 6)
  705. write ("T T T")
  706. term.setCursorPos (3, 7)
  707. write ("T T T")
  708. term.setCursorPos (3, 8)
  709. write ("T T T")
  710. term.setCursorPos (3, 9)
  711. write ("@")
  712. term.setCursorPos (3, 10)
  713. write ("^ Turtle")
  714. term.setCursorPos (3, 11)
  715. write ("| facing")
  716. term.setCursorPos (3, 12)
  717. write ("| Up")
  718. -- write the word length vertically
  719. term.setCursorPos (11, 3)
  720. write ("L")
  721. term.setCursorPos (11, 4)
  722. write ("e")
  723. term.setCursorPos (11, 5)
  724. write ("n")
  725. term.setCursorPos (11, 6)
  726. write ("g")
  727. term.setCursorPos (11, 7)
  728. write ("t")
  729. term.setCursorPos (11, 8)
  730. write ("h")
  731.  
  732. while true do
  733. term.setCursorPos (15, 3)
  734.  
  735. if selection == 1 then -- long
  736. write ("*Length: "..long)
  737. term.setCursorPos (15, 8)
  738. write ("Number of trees long")
  739. if keypress == 32 then
  740. term.setCursorPos (15, 9)
  741. write ("Type new Length: ")
  742. sleep(0.4)
  743. newlong = read ()
  744. liltest = tonumber ( newlong )
  745. if type( liltest ) ~= "number" then
  746. term.setCursorPos (15, 10)
  747. write ("I was expecting a number")
  748. sleep(1.5)
  749. term.setCursorPos (15, 10)
  750. write (" ")
  751. elseif liltest > 0 then
  752. long = tonumber(newlong)
  753. firstRun = true
  754. farmLayout()
  755. return
  756. elseif liltest == 0 then
  757. term.setCursorPos (15, 10)
  758. write ("Must be more than Zero")
  759. sleep(1.5)
  760. farmLayout()
  761. return
  762. end
  763. term.setCursorPos (15, 10)
  764. write (" ")
  765. end
  766. else
  767. write (" Length: "..long)
  768. end
  769.  
  770. term.setCursorPos (15, 4)
  771.  
  772. if selection == 2 then -- wide
  773. write ("*Width: "..wide)
  774. term.setCursorPos (15, 8)
  775. write ("Number of trees wide")
  776. if keypress == 32 then
  777. term.setCursorPos (15, 9)
  778. write ("Type new Width: ")
  779. sleep(0.4)
  780. newwide = read ()
  781. liltest = tonumber ( newwide )
  782. if type( liltest ) ~= "number" then
  783. term.setCursorPos (15, 10)
  784. write ("I was expecting a number")
  785. sleep(1.5)
  786. term.setCursorPos (15, 10)
  787. write (" ")
  788. elseif liltest > 0 then
  789. wide = tonumber(newwide)
  790. firstRun = true
  791. farmLayout()
  792. return
  793. elseif liltest == 0 then
  794. term.setCursorPos (15, 10)
  795. write ("Must be more than Zero")
  796. sleep(1.5)
  797. farmLayout()
  798. return
  799. end
  800. term.setCursorPos (15, 9)
  801. write (" ")
  802. end
  803. else
  804. write (" Width: "..wide)
  805. end
  806.  
  807. term.setCursorPos (15, 5)
  808.  
  809. if selection == 3 then -- saplingGap/Tree Gap
  810. write ("*Tree Gap: "..saplingGap)
  811. term.setCursorPos (15, 8)
  812. write ("Blocks between Trees")
  813. if keypress == 32 then
  814. term.setCursorPos (15, 9)
  815. write ("Type new Gap size: ")
  816. sleep(0.4)
  817. newgap = read ()
  818. liltest = tonumber ( newgap )
  819. if type( liltest ) ~= "number" then
  820. term.setCursorPos (15, 10)
  821. write ("I was expecting a number")
  822. sleep(1.5)
  823. term.setCursorPos (15, 10)
  824. write (" ")
  825. else
  826. saplingGap = tonumber(newgap)
  827. farmLayout()
  828. return
  829. end
  830. term.setCursorPos (15, 9)
  831. write (" ")
  832. end
  833. else
  834. write (" Tree Gap: "..saplingGap)
  835. end
  836. term.setCursorPos (15, 6)
  837.  
  838. if selection == 4 then -- wallGap/ Turtle Gap
  839. write ("*Turtle Gap: "..wallGap)
  840. term.setCursorPos (15, 8)
  841. write ("Distance to First tree")
  842. if keypress == 32 then
  843. term.setCursorPos (15, 9)
  844. write ("Type new Gap size: ")
  845. sleep(0.1)
  846. newgap = read ()
  847. liltest = tonumber ( newgap )
  848. if type( liltest ) ~= "number" then
  849. term.setCursorPos (15, 10)
  850. write ("I was expecting a number")
  851. sleep(1.5)
  852. term.setCursorPos (15, 10)
  853. write (" ")
  854. elseif liltest > 0 then
  855. wallGap = tonumber(newgap)
  856. farmLayout()
  857. return
  858. elseif liltest == 0 then
  859. term.setCursorPos (15, 10)
  860. write ("Must be more than Zero")
  861. sleep(1.5)
  862. farmLayout()
  863. return
  864. end
  865. term.setCursorPos (15, 9)
  866. write (" ")
  867. end
  868. else
  869. write (" Turtle Gap: "..wallGap)
  870. end
  871. -- rowOffset
  872. term.setCursorPos (15, 7)
  873.  
  874. if selection == 5 then -- rowOffset
  875. write ("*Row Offset: "..rowOffset)
  876. term.setCursorPos (15, 8)
  877. write ("Move first row")
  878. term.setCursorPos (15, 9)
  879. write ("left with positive num")
  880. term.setCursorPos (15, 10)
  881. write ("right with negative num")
  882. if keypress == 32 then
  883. term.setCursorPos (15, 11)
  884. write ("Type new Row Offset: ")
  885. sleep(0.1)
  886. newgap = read ()
  887. liltest = tonumber ( newgap )
  888. if type( liltest ) ~= "number" then
  889. term.setCursorPos (15, 10)
  890. write ("I was expecting a number")
  891. sleep(1.5)
  892. term.setCursorPos (15, 10)
  893. write (" ")
  894. else
  895. rowOffset = tonumber(newgap)
  896. farmLayout()
  897. return
  898. end
  899. term.setCursorPos (15, 11)
  900. write (" ")
  901. end
  902. else
  903. write (" Row Offset: "..rowOffset)
  904. end
  905.  
  906. -- listen for keyboard input
  907. sleep(0.4)
  908. keypress = 0
  909. event, keypress = os.pullEvent("key")
  910. if keypress == 17 then
  911. selection = selection - 1
  912. if selection < 1 then
  913. selection = 5
  914. end
  915. elseif keypress == 31 then
  916. selection = selection + 1
  917. if selection > 5 then
  918. selection = 1
  919. end
  920. elseif keypress == 30 then
  921. sleepTime = baseTime - ((long * wide) * 5)
  922. if sleepTime < 60 then
  923. sleepTime = 60
  924. end
  925. settings()
  926. return
  927. end
  928. term.setCursorPos (15, 8)
  929. write (" ")
  930. term.setCursorPos (15, 9)
  931. write (" ")
  932. term.setCursorPos (15, 10)
  933. write (" ")
  934. end
  935. end
  936.  
  937. function startup() -- Get inital lengh and width on first startup
  938. term.clear()
  939. term.setCursorPos (1, 1)
  940. print ("")
  941. print ("W I D E")
  942. print ("T T T L")
  943. print ("T T T O")
  944. print ("T T T N")
  945. print ("T T T G")
  946. print ("@ <-- Turtle facing Up")
  947. print ("")
  948. print ("How many trees Long?")
  949. long = read ()
  950. liltesta = tonumber ( long )
  951. if type( liltesta ) ~= "number" then
  952. print ("I was expecting a number...")
  953. print ("Lets try that again.")
  954. sleep(2)
  955. startup()
  956. return
  957. end
  958. print ("How many trees Wide?")
  959. wide = read ()
  960. liltestb = tonumber ( wide )
  961. if type( liltestb ) ~= "number" then
  962. print ("I was expecting a number...")
  963. print ("Lets try that again.")
  964. sleep(2)
  965. startup()
  966. return
  967. end
  968. sleep (1)
  969. if liltesta == 0 then long = 1 end
  970. if liltestb == 0 then wide = 1 end
  971. while ((wide + long) * saplingGap) > minFuel do
  972. minFuel = minFuel + 50
  973. end
  974. sleepTime = baseTime - ((long * wide) * 5)
  975. if sleepTime < 60 then
  976. sleepTime = 60
  977. end
  978. end
  979.  
  980. -- SECTION: Graphics ------------------------------------------------------------------------------
  981.  
  982. function box() -- 39x12 box used in some menus
  983. term.setCursorPos (1, 1)
  984. write ("O-------------------------------------O")
  985. for i = 2, 12 do
  986. term.setCursorPos (1, i)
  987. clearLine()
  988. end
  989. term.setCursorPos (1, 13)
  990. write ("O-------------------------------------O")
  991. end
  992.  
  993. function line(char) -- 12 long vertical line used in some menus
  994. for i = 2, 12 do
  995. term.setCursorPos (char, i)
  996. write ("|")
  997. end
  998. end
  999.  
  1000. function totals() -- updates the totals on main GUI
  1001. term.setCursorPos (3, 6)
  1002. write ("Tree Total: "..treeTotal)
  1003. term.setCursorPos (24, 6)
  1004. write ("Fuel "..turtle.getFuelLevel().."/" ..minFuel.." ")
  1005. term.setCursorPos (5, 7)
  1006. write ("Charcoal: "..charcoalMade)
  1007. term.setCursorPos (5, 8)
  1008. write ("Saplings: "..saplingsPlanted)
  1009. term.setCursorPos (24, 8)
  1010. write ("Farm: "..long.."x"..wide)
  1011. end
  1012.  
  1013. function graphics() -- displays graphics for main GUI, not run often
  1014. term.setCursorPos (1, 1)
  1015. write ("O----(^u^)----------------------------O")
  1016. mylable = os.getComputerLabel()
  1017. term.setCursorPos (15, 1)
  1018. write (mylable)
  1019. term.setCursorPos (1, 2)
  1020. write ("|")
  1021. term.setCursorPos (39, 2)
  1022. write ("|")
  1023. term.setCursorPos (1, 3)
  1024. write ("|")
  1025. term.setCursorPos (39, 3)
  1026. write ("|")
  1027. term.setCursorPos (1, 4)
  1028. write ("|")
  1029. term.setCursorPos (39, 4)
  1030. write ("|")
  1031. term.setCursorPos (1, 5)
  1032. write ("O--------------------O----------------O")
  1033. term.setCursorPos (1, 6)
  1034. write ("|")
  1035. term.setCursorPos (22, 6)
  1036. write ("|")
  1037. term.setCursorPos (39, 6)
  1038. write ("|")
  1039. term.setCursorPos (1, 7)
  1040. write ("|")
  1041. term.setCursorPos (22, 7)
  1042. write ("O----------------O")
  1043. term.setCursorPos (1, 8)
  1044. write ("|")
  1045. term.setCursorPos (22, 8)
  1046. write ("|")
  1047. term.setCursorPos (39, 8)
  1048. write ("|")
  1049. term.setCursorPos (1, 9)
  1050. write ("O--------------------O----------------O")
  1051. if useFurnace == true then
  1052. term.setCursorPos (12, 11)
  1053. write ("Furnace Above Me")
  1054. end
  1055. if getSaplings == true then
  1056. term.setCursorPos (3, 12)
  1057. write ("<--Sapling Chest")
  1058. end
  1059. if dumpStuff == true then
  1060. term.setCursorPos (22, 12)
  1061. write ("Dropoff Chest-->")
  1062. end
  1063. if useFurnace == true or getSaplings == true or dumpStuff == true then
  1064. term.setCursorPos (14, 10)
  1065. write ("Configuration")
  1066. term.setCursorPos (17, 13)
  1067. write ("My Back")
  1068. end
  1069. totals()
  1070. end
  1071.  
  1072. function clearLine() -- used to clear a line at the previously set cursor postion
  1073. local x, y = term.getCursorPos()
  1074. write ("| |")
  1075. term.setCursorPos (1, y)
  1076. end
  1077.  
  1078. -- SECTION: Movement ------------------------------------------------------------------------------
  1079.  
  1080. function forward(value) -- moves a quantity of blocks forward even with obstructions
  1081. for i = 1, value do
  1082. if turtle.detect() == true then
  1083. turtle.dig()
  1084. end
  1085. if facing == 1 then -- Cordinates code for movement x, z
  1086. cordsx = cordsx + 1
  1087. elseif facing == 2 then
  1088. cordsz = cordsz + 1
  1089. elseif facing == 3 then
  1090. cordsx = cordsx - 1
  1091. elseif facing == 4 then
  1092. cordsz = cordsz - 1
  1093. end
  1094. saveCords()
  1095. local movement = false
  1096. while not movement do
  1097. movement = turtle.forward ()
  1098. if not movement and turtle.detect () then
  1099. turtle.dig ()
  1100. end
  1101. end
  1102. end
  1103. end
  1104.  
  1105. function up(value) -- moves up
  1106. for i = 1, value do
  1107. cordsy = cordsy + 1 -- cords code for y up
  1108. saveCords()
  1109. local movement = false
  1110. while not movement do
  1111. movement = turtle.up ()
  1112. if not movement and turtle.detectUp () then
  1113. turtle.digUp ()
  1114. end
  1115. end
  1116. end
  1117. end
  1118.  
  1119. function down (value) -- moves down
  1120. for i = 1, value do
  1121. cordsy = cordsy - 1
  1122. saveCords()
  1123. movement = false
  1124. while not movement do
  1125. movement = turtle.down ()
  1126. if not movement and turtle.detectDown () then
  1127. turtle.digDown ()
  1128. end
  1129. end
  1130. end
  1131. end
  1132.  
  1133. function turn(way) -- easier turning
  1134. if way == "left" then -- faces left
  1135. facing = facing - 1
  1136. if facing < 1 then
  1137. facing = 4
  1138. end
  1139. saveCords()
  1140. turtle.turnLeft()
  1141. elseif way == "right" then -- faces right
  1142. facing = facing + 1
  1143. if facing > 4 then
  1144. facing = 1
  1145. end
  1146. saveCords()
  1147. turtle.turnRight()
  1148. elseif way == "back" then -- turnes around
  1149. facing = facing + 1
  1150. if facing > 4 then
  1151. facing = 1
  1152. end
  1153. saveCords()
  1154. turtle.turnRight()
  1155. facing = facing + 1
  1156. if facing > 4 then
  1157. facing = 1
  1158. end
  1159. saveCords()
  1160. turtle.turnRight()
  1161. end
  1162. end
  1163.  
  1164. -- SECTION: Resource Checking ---------------------------------------------------------------------
  1165.  
  1166. local function saplingTotal() -- returns curent total of saplings
  1167. if running == false then return end
  1168. if saplingSlot1 ~= saplingSlot2 then
  1169. sTotal1 = turtle.getItemCount(saplingSlot1)
  1170. sTotal2 = turtle.getItemCount(saplingSlot2)
  1171. return sTotal1 + sTotal2
  1172. else
  1173. return turtle.getItemCount(saplingSlot1) + 1
  1174. end
  1175. end
  1176.  
  1177. function saplings() -- ensures the turtle has enough saplings for a logging run + 1
  1178. if running == false then return end
  1179. imdone = false
  1180. term.setCursorPos (1, 4)
  1181. clearLine()
  1182. term.setCursorPos (1, 3)
  1183. clearLine()
  1184. term.setCursorPos (1, 2)
  1185. clearLine()
  1186. sapNeed = saplingTotal()
  1187. while sapNeed-1 < (long * wide) do
  1188. turtle.select(saplingSlot1)
  1189. term.setCursorPos(1, 2)
  1190. write ("| Put saplings in slot "..saplingSlot1..". Extras ")
  1191. term.setCursorPos (1, 3)
  1192. write ("| go into the Left chest and slot "..saplingSlot2..".")
  1193. term.setCursorPos (1, 4)
  1194. write ("| "..(1+(long*wide)-sapNeed).." more saplings needed...")
  1195. sleep (0.5)
  1196. sapNeed = saplingTotal()
  1197. end
  1198. imdone = true
  1199. end
  1200.  
  1201. function someFuel() -- ensure the turtle has fuel before leaving home
  1202. if running == false then return end
  1203. imdone = false
  1204. if fuelOn == true then
  1205. treeNumbers = ((wide * long) / 5) + 1
  1206. fuelCheck = turtle.getItemCount(fuelSlot1) + turtle.getItemCount(fuelSlot2)
  1207. while fuelCheck < (treeNumbers + charcoalNumber) do
  1208. term.setCursorPos (1, 4)
  1209. clearLine()
  1210. term.setCursorPos (1, 3)
  1211. clearLine()
  1212. term.setCursorPos (1, 2)
  1213. clearLine()
  1214. write ("| Please put more fuel in slot "..fuelSlot1.." or "..fuelSlot2)
  1215. term.setCursorPos (1, 3)
  1216. write ("| I need at least "..(treeNumbers + charcoalNumber).." fuel before")
  1217. term.setCursorPos (1, 4)
  1218. write ("| I can go logging!")
  1219. turtle.select(fuelSlot1)
  1220. sleep(1)
  1221. fuelCheck = turtle.getItemCount(fuelSlot1) + turtle.getItemCount(fuelSlot2)
  1222. end
  1223. end
  1224. imdone = true
  1225. end
  1226.  
  1227. function refillSaplings() -- get saplings from sapling chest
  1228. if running == false then return end
  1229. if getSaplings == true then
  1230. term.setCursorPos (1, 4)
  1231. clearLine()
  1232. term.setCursorPos (1, 3)
  1233. clearLine()
  1234. term.setCursorPos (1, 2)
  1235. clearLine()
  1236. write ("| Refilling Saplings")
  1237. turn("left")
  1238. checkfuelSlot2 = turtle.getItemCount(fuelSlot2)
  1239. turtle.select(saplingSlot1)
  1240. turtle.suck()
  1241. turtle.select(saplingSlot2)
  1242. turtle.suck()
  1243. if not turtle.compareTo(saplingSlot1) then
  1244. for cnt = 1, 16 do
  1245. if cnt ~= logSlot then
  1246. if cnt ~= fuelSlot1 then
  1247. if cnt ~= fuelSlot2 then
  1248. if cnt ~= saplingSlot1 then
  1249. if cnt ~= saplingSlot2 then
  1250.  
  1251. end
  1252. end
  1253. end
  1254. end
  1255. end
  1256. end
  1257. end
  1258. for cnt=1, 16 do -- picked up too many? put them back!
  1259. if cnt ~= saplingSlot1 then
  1260. if cnt ~= saplingSlot2 then
  1261. if turtle.getItemCount(cnt) > 0 then
  1262. turtle.select(cnt)
  1263. if turtle.compareTo(saplingSlot1) then
  1264. turtle.drop()
  1265. end
  1266. end
  1267. end
  1268. end
  1269. end
  1270. if checkfuelSlot2 < turtle.getItemCount(fuelSlot2) then
  1271. turtle.select(fuelSlot2)
  1272. for cnt = 1, 16 do
  1273. if cnt ~= logSlot then
  1274. if cnt ~= fuelSlot1 then
  1275. if cnt ~= fuelSlot2 then
  1276. if cnt ~= saplingSlot1 then
  1277. if cnt ~= saplingSlot2 then
  1278. if cnt ~= dirtSlot then
  1279. turtle.transferTo(cnt, 64)
  1280. end
  1281. end
  1282. end
  1283. end
  1284. end
  1285. end
  1286. end
  1287. end
  1288. turn("right")
  1289. end
  1290. end
  1291.  
  1292. -- SECTION: Fueling and Charcoal Making -----------------------------------------------------------
  1293.  
  1294. function fuel() -- refuels the turtle and ensures it has fuel
  1295. if running == false then return end
  1296. imdone = false
  1297. if fuelOn == true then
  1298. term.setCursorPos (1, 4)
  1299. clearLine()
  1300. term.setCursorPos (1, 3)
  1301. clearLine()
  1302. term.setCursorPos (1, 2)
  1303. clearLine()
  1304. write ("| I'm checking my fuel")
  1305. while turtle.getFuelLevel() < minFuel do -- compare current fuel level to the minimum
  1306. if turtle.getItemCount(fuelSlot1) > 1 then -- refuels from slot 1 if there is more than 1 fuel
  1307. turtle.select(fuelSlot1)
  1308. turtle.refuel(1)
  1309. elseif turtle.getItemCount(fuelSlot2) ~= 0 then -- if slot 1 is empty, tries to fuel from slot 2
  1310. turtle.select(fuelSlot2)
  1311. turtle.refuel(1)
  1312. else -- if there is not enough fuel, ask the player for some
  1313. term.setCursorPos (1, 2)
  1314. turtle.select(fuelSlot1)
  1315. if useFurnace == false then
  1316. write ("| Please put more fuel in slot "..fuelSlot1.." or "..fuelSlot2)
  1317. term.setCursorPos (1, 4)
  1318. write ("| Press any key to change settings.")
  1319. sleep (1)
  1320. else
  1321. write ("| Please put more fuel in slot "..fuelSlot1)
  1322. term.setCursorPos (1, 3)
  1323. write ("| Reserve slot "..fuelSlot2.." for charcoal")
  1324. term.setCursorPos (1, 4)
  1325. write ("| Press any key to change settings.")
  1326. sleep (1)
  1327. end
  1328. end
  1329. end
  1330. term.setCursorPos (24, 6)
  1331. write ("Fuel "..turtle.getFuelLevel().."/" ..minFuel.." ")
  1332. end
  1333. imdone = true
  1334. end
  1335.  
  1336. function furnaceCheck() -- checks to see if it has a furnace, but only if fuelOn is enabled and poweredFurnace is disabled
  1337. if running == false then return end
  1338. if fuelOn == true then
  1339. if poweredFurnace == false then
  1340. term.setCursorPos (1, 4)
  1341. clearLine()
  1342. term.setCursorPos (1, 3)
  1343. clearLine()
  1344. term.setCursorPos (1, 2)
  1345. clearLine()
  1346. write ("| Do I have a furnace?")
  1347. if turtle.detectUp() then -- check for a furnace
  1348. if turtle.getItemCount(fuelSlot1) > 2 then
  1349. turtle.select(fuelSlot1)
  1350. rememberNumber = turtle.getItemCount(fuelSlot1)
  1351. turtle.dropUp(2)
  1352. sleep(0.5)
  1353. turtle.suckUp()
  1354. if rememberNumber == turtle.getItemCount(fuelSlot1) then
  1355. return true
  1356. elseif rememberNumber == turtle.getItemCount(fuelSlot1)+1 then
  1357. turtle.suckDown()
  1358. return true
  1359. elseif rememberNumber < turtle.getItemCount(fuelSlot1) then
  1360. return true
  1361. end
  1362. elseif turtle.getItemCount(fuelSlot2) > 2 then
  1363. turtle.select(fuelSlot2)
  1364. rememberNumber = turtle.getItemCount(fuelSlot2)
  1365. turtle.dropUp(2)
  1366. sleep(0.5)
  1367. turtle.suckUp()
  1368. if rememberNumber == turtle.getItemCount(fuelSlot2) then
  1369. return true
  1370. elseif rememberNumber == turtle.getItemCount(fuelSlot2)+1 then
  1371. turtle.suckDown()
  1372. return true
  1373. elseif rememberNumber < turtle.getItemCount(fuelSlot2) then
  1374. return true
  1375. end
  1376. else
  1377. turtle.suckDown()
  1378. return false
  1379. end
  1380. end
  1381. else return true
  1382. end
  1383. end
  1384. end
  1385.  
  1386. function makeCharcoal(anumber) -- makes specified number of charcoal in multiples of 8
  1387. if fuelOn == true then
  1388. if useFurnace == true then
  1389. if furnaceCheck() == true then
  1390. quickcheck = turtle.getItemSpace(fuelSlot1) + turtle.getItemSpace(fuelSlot2) -- adds empty space in both slots
  1391. if quickcheck > 8 * charcoalNumber then -- if there is enough room for more fuel then make some charcoal
  1392. term.setCursorPos (1, 4)
  1393. clearLine()
  1394. term.setCursorPos (1, 3)
  1395. clearLine()
  1396. term.setCursorPos (1, 2)
  1397. clearLine()
  1398. write ("| I'm making Charcoal")
  1399. hadfuel = "false"
  1400. if poweredFurnace == false then
  1401. if turtle.getItemCount(fuelSlot1) > 1 + anumber then -- checks for fuel and logs, puts fuel in furnace
  1402. if turtle.getItemCount(logSlot) > 8 * anumber then
  1403. turtle.select(fuelSlot1)
  1404. turtle.suckUp()
  1405. turtle.dropUp(1 * anumber)
  1406. turtle.suckDown() -- incase of overflow
  1407. hadfuel = "true"
  1408. end
  1409. elseif turtle.getItemCount(fuelSlot2) > 1 + anumber then -- not enough in fuelSlot1, then try fuelSlot2
  1410. if turtle.getItemCount(logSlot) > 8 * anumber then
  1411. turtle.select(fuelSlot2)
  1412. turtle.suckUp()
  1413. turtle.dropUp(1 * anumber)
  1414. turtle.suckDown() -- incase of overflow
  1415. hadfuel = "true"
  1416. end
  1417. end
  1418. end
  1419. if poweredFurnace == true then -- assume the furnace has fuel and don't put any in
  1420. hadfuel = "true"
  1421. end
  1422. forward(1)
  1423. up(2)
  1424. turn("back")
  1425. forward(1)
  1426. if turtle.getItemCount(logSlot) > 8 * anumber and hadfuel == "true" then -- if there are enough logs and the furnace has been fueled, put in some logs
  1427. turtle.select(logSlot)
  1428. turtle.dropDown(8 * anumber)
  1429. charcoalMade = charcoalMade + (8 * anumber)
  1430. term.setCursorPos (5, 7)
  1431. write ("Charcoal: "..charcoalMade)
  1432. end
  1433. turn("back") -- go back home, grabbing fuel along the way
  1434. forward(1)
  1435. down(1)
  1436. turn("back")
  1437. turtle.select(fuelSlot1)
  1438. turtle.suck()
  1439. turtle.select(fuelSlot2)
  1440. turtle.suck()
  1441. down(1)
  1442. forward(1)
  1443. turn("back")
  1444. else
  1445. return
  1446. end
  1447. end
  1448. end
  1449. end
  1450. end
  1451.  
  1452. -- SECTION: Docking and Undocking -----------------------------------------------------------------
  1453.  
  1454. function undock() -- moves from docking station to first tree
  1455. if imdone == false then -- if settings wasn't done and somehow got back here, return to the beginning of undocking
  1456. undock()
  1457. return
  1458. end
  1459. refillSaplings() -- don't leave without saplings
  1460. parallel.waitForAny(saplings, wakeUp)
  1461. if gotosettings == true then
  1462. settings()
  1463. end
  1464. if imdone == false then
  1465. undock()
  1466. return
  1467. end
  1468. parallel.waitForAny(fuel, wakeUp) -- don't leave without fuel
  1469. if gotosettings == true then
  1470. settings()
  1471. end
  1472. if imdone == false then
  1473. undock()
  1474. return
  1475. end
  1476. parallel.waitForAny(someFuel, wakeUp) -- make sure you have enough too!
  1477. if gotosettings == true then
  1478. settings()
  1479. end
  1480. if imdone == false then
  1481. undock()
  1482. return
  1483. end
  1484. dropOff() -- drop off all extra inventory items
  1485. if dumpStuff == false then -- check that there is inventry room for another run
  1486. emptySpace = 0
  1487. for cnt=1, 16 do
  1488. if cnt ~= logSlot then
  1489. if cnt ~= fuelSlot1 then
  1490. if cnt ~= fuelSlot2 then
  1491. if cnt ~= saplingSlot1 then
  1492. if cnt ~= saplingSlot2 then
  1493. if cnt ~= dirtSlot then
  1494. turtle.select(cnt)
  1495. emptySpace = emptySpace + turtle.getItemSpace(cnt)
  1496. end
  1497. end
  1498. end
  1499. end
  1500. end
  1501. end
  1502. end
  1503. end
  1504. dropFail() -- if there was not enough inventory the program will quit, happens if the output chest is full
  1505. if running == false then return end -- something quit the program, cancel everything!
  1506. term.setCursorPos (1, 4)
  1507. clearLine()
  1508. term.setCursorPos (1, 3)
  1509. clearLine()
  1510. term.setCursorPos (1, 2)
  1511. clearLine()
  1512. sleep(1)
  1513. write ("| Let's get going!") -- start getting into position
  1514. turtle.select(saplingSlot2)
  1515. forward(wallGap)
  1516. up(1)
  1517. if rowOffset > 0 then -- move first row to the left
  1518. turn ("left")
  1519. forward (rowOffset)
  1520. turn ("right")
  1521. end
  1522. if rowOffset < 0 then -- or move first row to the right
  1523. adjOffset = rowOffset - (rowOffset + rowOffset)
  1524. turn ("right")
  1525. forward (adjOffset)
  1526. turn ("left")
  1527. end
  1528. turtle.select(logSlot)
  1529. end
  1530.  
  1531. function redock() -- logging is done so lets get back home
  1532. fuel()
  1533. term.setCursorPos (1, 4)
  1534. clearLine()
  1535. term.setCursorPos (1, 3)
  1536. clearLine()
  1537. term.setCursorPos (1, 2)
  1538. clearLine()
  1539. write ("| Going Home")
  1540. if wide % 2 == 1 then -- check to see if we are far from home or close by
  1541. turn ("right")
  1542. forward (1)
  1543. turn ("right")
  1544. forward ((long - 1) * (saplingGap + 1) + 1)
  1545. turn ("right")
  1546. forward (1 )
  1547. else
  1548. forward (1)
  1549. turn ("right")
  1550. end
  1551. if ((wide - 1) * (saplingGap + 1)) >= rowOffset then -- if we are far away, move closer
  1552. forward ((wide - 1) * (saplingGap + 1) - rowOffset)
  1553. down(1)
  1554. turn("left")
  1555. else -- move to being in front of home
  1556. turn("back")
  1557. forward(rowOffset)
  1558. down(1)
  1559. turn("right")
  1560. end -- move the wallGap distance to home
  1561. forward(wallGap)
  1562. turn("back")
  1563. fuel()
  1564. end
  1565.  
  1566. -- SECTION: Drop off stuff ------------------------------------------------------------------------
  1567.  
  1568. function dropOff() -- put stuff in the output chest
  1569. if dumpStuff == true then
  1570. term.setCursorPos (1, 4)
  1571. clearLine()
  1572. term.setCursorPos (1, 3)
  1573. clearLine()
  1574. term.setCursorPos (1, 2)
  1575. clearLine()
  1576. write ("| Dropping Off Inventory")
  1577. turn("right")
  1578. emptySpace = 0
  1579. for cnt=1, 16 do -- check all slots except the designated resource slots for stuff we want to keep
  1580. if cnt ~= logSlot then
  1581. if cnt ~= fuelSlot1 then
  1582. if cnt ~= fuelSlot2 then
  1583. if cnt ~= saplingSlot1 then
  1584. if cnt ~= saplingSlot2 then
  1585. if cnt ~= dirtSlot then
  1586. emptySpace = emptySpace + turtle.getItemSpace(cnt)
  1587. if turtle.getItemCount(cnt) > 0 then
  1588. turtle.select(cnt)
  1589. turtle.drop()
  1590. end
  1591. end
  1592. end
  1593. end
  1594. end
  1595. end
  1596. end
  1597. end
  1598. turn("left")
  1599. end
  1600. end
  1601.  
  1602. function dropFail() -- if inventory is full quit program
  1603. if emptySpace < 64 then
  1604. term.setCursorPos (1, 4)
  1605. clearLine()
  1606. term.setCursorPos (1, 3)
  1607. clearLine()
  1608. term.setCursorPos (1, 2)
  1609. clearLine()
  1610. write ("| Oh Noes! The dropoff chest is full!")
  1611. sleep(2)
  1612. running = false
  1613. term.clear()
  1614. term.setCursorPos (1, 2)
  1615. write (whatsMyName.." Stopped logging")
  1616. write ("\nbecause the output chest is Full.")
  1617. write ("\nPlease make room in the chest")
  1618. write ("\nand restart the program")
  1619. term.setCursorPos (1, 6)
  1620. return
  1621. end
  1622. end
  1623.  
  1624. -- SECTION: Farming Functions ---------------------------------------------------------------------
  1625.  
  1626. function checkPlant() -- ensure there is a sapling and dirt where a tree is to be grown
  1627. term.setCursorPos (1, 4)
  1628. clearLine()
  1629. term.setCursorPos (1, 3)
  1630. clearLine()
  1631. term.setCursorPos (1, 2)
  1632. clearLine()
  1633. write ("| Checking for Sapling and Dirt")
  1634. forward(1)
  1635. if treeCheckDown() == true then
  1636. turtle.digDown()
  1637. end
  1638. turtle.select(dirtSlot)
  1639. if turtle.compareDown() == true then
  1640. turtle.digDown()
  1641. end
  1642. if turtle.detectDown() == false then
  1643. down(1)
  1644. if turtle.compareDown() == false then
  1645. turtle.digDown()
  1646. turtle.placeDown()
  1647. end
  1648. up(1)
  1649. turtle.select(saplingSlot1)
  1650. if turtle.getItemCount(saplingSlot1) > 1 then
  1651. turtle.placeDown()
  1652. saplingsPlanted = saplingsPlanted + 1
  1653. term.setCursorPos (5, 8)
  1654. write ("Saplings: "..saplingsPlanted)
  1655. elseif turtle.getItemCount(saplingSlot2) > 1 then
  1656. if turtle.compareTo(saplingSlot1) then
  1657. turtle.select(saplingSlot2)
  1658. turtle.placeDown()
  1659. saplingsPlanted = saplingsPlanted + 1
  1660. term.setCursorPos (5, 8)
  1661. write ("Saplings: "..saplingsPlanted)
  1662. end
  1663. end
  1664. end
  1665. turtle.select(logSlot)
  1666. checkup = treeCheckUp()
  1667. if checkup == true then
  1668. term.setCursorPos (1, 2)
  1669. clearLine()
  1670. write ("| Chopping Tree")
  1671. height = 0
  1672. while turtle.compareUp() do
  1673. turtle.digUp ()
  1674. up (1)
  1675. height = height + 1
  1676. end
  1677. down(height)
  1678. treeTotal = treeTotal +1
  1679. term.setCursorPos (3, 6)
  1680. write ("Tree Total: "..treeTotal)
  1681. end
  1682. end
  1683.  
  1684. function treeCheckUp() -- return true if turtle faces a tree
  1685. logCount = turtle.getItemCount(logSlot)
  1686. if logCount > 0 then
  1687. turtle.select(logSlot)
  1688. ret = turtle.compareUp()
  1689. return ret
  1690. else
  1691. return false
  1692. end
  1693. end
  1694.  
  1695. -- function treeCheck() -- return true if turtle faces a tree (NOT IN USE)
  1696. -- logCount = turtle.getItemCount(logSlot)
  1697. -- if logCount > 0 then
  1698. -- turtle.select(logSlot)
  1699. -- ret = turtle.compare()
  1700. -- return ret
  1701. -- else
  1702. -- return true
  1703. -- end
  1704. -- end
  1705.  
  1706. function treeCheckDown() -- return true if turtle faces a tree
  1707. logCount = turtle.getItemCount(logSlot)
  1708. if logCount > 0 then
  1709. turtle.select(logSlot)
  1710. ret = turtle.compareDown()
  1711. return ret
  1712. else
  1713. return false
  1714. end
  1715. end
  1716.  
  1717. -- function fellTree() -- cut down a tree
  1718. -- term.setCursorPos (1, 4)
  1719. -- clearLine()
  1720. -- term.setCursorPos (1, 3)
  1721. -- clearLine()
  1722. -- term.setCursorPos (1, 2)
  1723. -- clearLine()
  1724. -- write ("| Chopping Tree")
  1725. -- turtle.select(logSlot)
  1726. -- turtle.dig()
  1727. -- forward(1)
  1728. -- turtle.digDown ()
  1729. -- down(1)
  1730. -- turtle.select(dirtSlot)
  1731. -- if not turtle.compareDown() then
  1732. -- turtle.digDown()
  1733. -- turtle.placeDown()
  1734. -- end
  1735. -- up (1)
  1736. -- turtle.select(saplingSlot1)
  1737. -- if turtle.getItemCount(saplingSlot1) > 1 then
  1738. -- turtle.placeDown()
  1739. -- saplingsPlanted = saplingsPlanted + 1
  1740. -- term.setCursorPos (5, 8)
  1741. -- write ("Saplings: "..saplingsPlanted)
  1742. -- elseif turtle.getItemCount(saplingSlot2) > 1 then
  1743. -- if turtle.compareTo(saplingSlot1) then
  1744. -- turtle.select(saplingSlot2)
  1745. -- turtle.placeDown()
  1746. -- saplingsPlanted = saplingsPlanted + 1
  1747. -- term.setCursorPos (5, 8)
  1748. -- write ("Saplings: "..saplingsPlanted)
  1749. -- end
  1750. -- end
  1751. -- turtle.select(logSlot)
  1752. -- height = 0
  1753. -- while turtle.compareUp() do
  1754. -- turtle.digUp ()
  1755. -- up (1)
  1756. -- height = height + 1
  1757. -- end
  1758. -- down(height)
  1759. -- treeTotal = treeTotal +1
  1760. -- term.setCursorPos (3, 6)
  1761. -- write ("Tree Total: "..treeTotal)
  1762. -- end
  1763.  
  1764. function logging() -- MAIN FARMING FUNCTION, calls checkPlant(), treeCheck(), fellTree(), and moves tree to tree
  1765. undock()
  1766. if running == false then return end
  1767. turnleftnow = 0
  1768. for countWide=1, wide do
  1769. for countLong=1, long do -- loop for each tree
  1770. fuel()
  1771. turtle.select(logSlot)
  1772. -- treeTest = treeCheck()
  1773. -- if treeTest == true then
  1774. -- fellTree()
  1775. -- else
  1776. checkPlant()
  1777. -- end
  1778. if countLong ~= long then
  1779. turtle.select(saplingSlot1)
  1780. forward(saplingGap)
  1781. term.setCursorPos (1, 4)
  1782. clearLine()
  1783. term.setCursorPos (1, 3)
  1784. clearLine()
  1785. term.setCursorPos (1, 2)
  1786. clearLine()
  1787. write ("| Moving to next tree")
  1788. end
  1789. end
  1790. term.setCursorPos (1, 4)
  1791. clearLine()
  1792. term.setCursorPos (1, 3)
  1793. clearLine()
  1794. term.setCursorPos (1, 2)
  1795. clearLine()
  1796. write ("| Moving to next row")
  1797. if countWide < wide then -- loop for moving to next row of trees
  1798. forward(1)
  1799. if turnleftnow == 1 then
  1800. turn("left")
  1801. forward(saplingGap + 1)
  1802. turn("left")
  1803. turnleftnow = 0
  1804. else
  1805. turn("right")
  1806. forward(saplingGap + 1)
  1807. turn("right")
  1808. turnleftnow = 1
  1809. end
  1810. end
  1811. end
  1812. redock()
  1813. end
  1814.  
  1815. -- SECTION: Sleeping between logging runs ---------------------------------------------------------
  1816.  
  1817. goodNight = function() -- Waiting between runs
  1818. imdone = false
  1819. term.setCursorPos (1, 4)
  1820. clearLine()
  1821. term.setCursorPos (1, 2)
  1822. clearLine()
  1823. term.setCursorPos (1, 3)
  1824. clearLine()
  1825. write ("| Press any key to change settings.")
  1826. if sleepTime > 0 then
  1827. while resetsleep < sleepTime do
  1828. if running == false then break end
  1829. term.setCursorPos (1, 2)
  1830. write ("| Sleeping for "..sleepTime-resetsleep.." seconds...")
  1831. sleep(1)
  1832. resetsleep = resetsleep + 1
  1833. end
  1834. end
  1835. term.setCursorPos (1, 3)
  1836. clearLine()
  1837. term.setCursorPos (1, 2)
  1838. clearLine()
  1839. resetsleep = 1
  1840. imdone = true
  1841. end
  1842.  
  1843. wakeUp = function() -- inturrption by keyboard input, goes to settings menu
  1844. sleep(1)
  1845. os.pullEvent("char")
  1846. gotosettings = true
  1847. end
  1848.  
  1849. function nowISleep() -- sets up for sleeping and inturrupting the sleep for the settings menu
  1850. parallel.waitForAny(goodNight, wakeUp)
  1851. if running == false then term.clear() return end
  1852. if gotosettings == true then
  1853. sleep(0.4)
  1854. settings()
  1855. end
  1856. if imdone == false then
  1857. nowISleep()
  1858. end
  1859. end
  1860.  
  1861. -- SECTION: Misc. ---------------------------------------------------------------------------------
  1862.  
  1863. function fuelSettingCheck() -- checks to see if the server has fuel use disabled
  1864. if turtle.getFuelLevel() ~= "unlimited" then
  1865. fuelOn = true
  1866. else
  1867. fuelOn = false
  1868. end
  1869. end
  1870.  
  1871. function breakTest() -- if the turtle coulden't find its way home it will need broken before restarting itself
  1872. if turtle.getItemCount(logSlot) == 0 then
  1873. needsBroken = false
  1874. saveSettings()
  1875. end
  1876. if needsBroken == true then
  1877. term.clear()
  1878. term.setCursorPos (1, 1)
  1879. print ("Logger may not have made it home so the program was closed. Break the turtle and replace it to continue.")
  1880. running = false
  1881. end
  1882. end
  1883.  
  1884. -------------------- PROGRAM START ----------------------------------------------------------------
  1885.  
  1886. -- Make sure files exist
  1887. while not fs.exists ("logger.cfg") do
  1888. os.setComputerLabel(whatsMyName)
  1889. startup()
  1890. saveSettings()
  1891. saveCords()
  1892. end
  1893.  
  1894. while not fs.exists ("loggercords.dat") do
  1895. saveCords()
  1896. end
  1897.  
  1898. -- Load settings and start initial graphical setup
  1899. term.clear()
  1900. gotosettings = false
  1901. imdone = true
  1902. loadSettings()
  1903. graphics() -- renders the GUI
  1904. fuelSettingCheck() -- checks for unlimeted fuel setting
  1905. running = true
  1906.  
  1907. -- Checks cordinates and goes back to starting position if out in the field
  1908. loadCords()
  1909. if homeCheck() == false then
  1910. goHome()
  1911. end
  1912. breakTest()
  1913.  
  1914. -- Start main loop
  1915. while running == true do
  1916. logging()
  1917. if running == false then break end
  1918. firstRun = false
  1919. makeCharcoal(charcoalNumber)
  1920. saveSettings()
  1921. resetsleep = 1
  1922. nowISleep()
  1923. if running == false then break end
  1924. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement