kovakovi2000

CC: Turtle - EX, RF_fuel, auto_reboot

Apr 5th, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.56 KB | None | 0 0
  1. os.loadAPI("ldb")
  2.  
  3. local depth = 0
  4. local unloaded = 0
  5. local collected = 0
  6.  
  7. local xPos,zPos = 0,0
  8. local xDir,zDir = 0,1
  9.  
  10. local tArgs = { ... }
  11. if #tArgs ~= 1 then
  12. print( "Usage: excavate <diameter>" )
  13. shell.run("goto","ex_home")
  14. xDir = -1
  15. zDir = 0
  16. end
  17. if ldb.is("ex_depth") == false then
  18. ldb.set("ex_depth", 0)
  19. end
  20. local size = 0
  21. if ldb.is("ex_size") == false then
  22. size = tonumber( tArgs[1] )
  23. ldb.set("ex_size", size)
  24. else
  25. size = ldb.get("ex_size")
  26. end
  27. local depthFrom = ldb.get("ex_depth")
  28. if size < 0 then
  29. print( "Excavate diameter must be positive" )
  30. return
  31. end
  32.  
  33.  
  34.  
  35. local goTo -- Filled in further down
  36. local refuel -- Filled in further down
  37.  
  38. local function unload( _bKeepOneFuelStack )
  39. print( "Unloading items..." )
  40. goTo( 0,0,0,0,-1 )
  41. for n=1,16 do
  42. local nCount = turtle.getItemCount(n)
  43. if nCount > 0 then
  44. turtle.select(n)
  45. local bDrop = true
  46. if _bKeepOneFuelStack and turtle.refuel(0) then
  47. bDrop = false
  48. _bKeepOneFuelStack = false
  49. end
  50. if bDrop then
  51. turtle.drop()
  52. unloaded = unloaded + nCount
  53. end
  54. end
  55. end
  56. collected = 0
  57. turtle.select(1)
  58. end
  59.  
  60. local function RefuelFromRF()
  61. goTo(0,0,0,-1,0)
  62. print("Refueling...")
  63. local fuelLevel = turtle.getFuelLevel()
  64. while fuelLevel ~= "unlimited" do
  65. fuelLevel = turtle.getFuelLevel()
  66. oldxc, oldyc = term.getCursorPos()
  67. term.setCursorPos(1,oldyc-1)
  68. print("Refueled: " .. fuelLevel)
  69. sleep(1)
  70. end
  71. print("Refueled: " .. fuelLevel)
  72. goTo( 0,0,0,0,1 )
  73. end
  74.  
  75. local function returnSupplies()
  76. local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
  77. print( "Returning to surface..." )
  78. goTo( 0,0,0,0,-1 )
  79. unload( false )
  80. RefuelFromRF()
  81. print( "Resuming mining..." )
  82. goTo( x,y,z,xd,zd )
  83. end
  84.  
  85. local function collect()
  86. local bFull = true
  87. local nTotalItems = 0
  88. for n=1,16 do
  89. local nCount = turtle.getItemCount(n)
  90. if nCount == 0 then
  91. bFull = false
  92. end
  93. nTotalItems = nTotalItems + nCount
  94. end
  95.  
  96. if nTotalItems > collected then
  97. collected = nTotalItems
  98. if math.fmod(collected + unloaded, 50) == 0 then
  99. print( "Mined "..(collected + unloaded).." items." )
  100. end
  101. end
  102.  
  103. if bFull then
  104. print( "No empty slots left." )
  105. return false
  106. end
  107. return true
  108. end
  109.  
  110. function refuel( ammount )
  111. local fuelLevel = turtle.getFuelLevel()
  112. if fuelLevel == "unlimited" then
  113. return true
  114. end
  115.  
  116. local needed = ammount or (xPos + zPos + depth + 2)
  117. if turtle.getFuelLevel() < needed then
  118. local fueled = false
  119. for n=1,16 do
  120. if turtle.getItemCount(n) > 0 then
  121. turtle.select(n)
  122. if turtle.refuel(1) then
  123. while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  124. turtle.refuel(1)
  125. end
  126. if turtle.getFuelLevel() >= needed then
  127. turtle.select(1)
  128. return true
  129. end
  130. end
  131. end
  132. end
  133. turtle.select(1)
  134. return false
  135. end
  136.  
  137. return true
  138. end
  139.  
  140. local function tryForwards()
  141. if not refuel() then
  142. print( "Not enough Fuel" )
  143. returnSupplies()
  144. end
  145.  
  146. while not turtle.forward() do
  147. if turtle.detect() then
  148. if turtle.dig() then
  149. if not collect() then
  150. returnSupplies()
  151. end
  152. else
  153. return false
  154. end
  155. elseif turtle.attack() then
  156. if not collect() then
  157. returnSupplies()
  158. end
  159. else
  160. sleep( 0.5 )
  161. end
  162. end
  163.  
  164. xPos = xPos + xDir
  165. zPos = zPos + zDir
  166. return true
  167. end
  168.  
  169. local function tryDown()
  170. if not refuel() then
  171. print( "Not enough Fuel" )
  172. returnSupplies()
  173. end
  174.  
  175. while not turtle.down() do
  176. if turtle.detectDown() then
  177. if turtle.digDown() then
  178. if not collect() then
  179. returnSupplies()
  180. end
  181. else
  182. return false
  183. end
  184. elseif turtle.attackDown() then
  185. if not collect() then
  186. returnSupplies()
  187. end
  188. else
  189. sleep( 0.5 )
  190. end
  191. end
  192.  
  193. depth = depth + 1
  194. ldb.set("ex_depth", depth)
  195. if math.fmod( depth, 10 ) == 0 then
  196. print( "Descended "..depth.." metres." )
  197. end
  198.  
  199. return true
  200. end
  201.  
  202. local function turnLeft()
  203. turtle.turnLeft()
  204. xDir, zDir = -zDir, xDir
  205. end
  206.  
  207. local function turnRight()
  208. turtle.turnRight()
  209. xDir, zDir = zDir, -xDir
  210. end
  211.  
  212. function goTo( x, y, z, xd, zd )
  213. while depth > y do
  214. if turtle.up() then
  215. depth = depth - 1
  216. elseif turtle.digUp() or turtle.attackUp() then
  217. collect()
  218. else
  219. sleep( 0.5 )
  220. end
  221. end
  222.  
  223. if xPos > x then
  224. while xDir ~= -1 do
  225. turnLeft()
  226. end
  227. while xPos > x do
  228. if turtle.forward() then
  229. xPos = xPos - 1
  230. elseif turtle.dig() or turtle.attack() then
  231. collect()
  232. else
  233. sleep( 0.5 )
  234. end
  235. end
  236. elseif xPos < x then
  237. while xDir ~= 1 do
  238. turnLeft()
  239. end
  240. while xPos < x do
  241. if turtle.forward() then
  242. xPos = xPos + 1
  243. elseif turtle.dig() or turtle.attack() then
  244. collect()
  245. else
  246. sleep( 0.5 )
  247. end
  248. end
  249. end
  250.  
  251. if zPos > z then
  252. while zDir ~= -1 do
  253. turnLeft()
  254. end
  255. while zPos > z do
  256. if turtle.forward() then
  257. zPos = zPos - 1
  258. elseif turtle.dig() or turtle.attack() then
  259. collect()
  260. else
  261. sleep( 0.5 )
  262. end
  263. end
  264. elseif zPos < z then
  265. while zDir ~= 1 do
  266. turnLeft()
  267. end
  268. while zPos < z do
  269. if turtle.forward() then
  270. zPos = zPos + 1
  271. elseif turtle.dig() or turtle.attack() then
  272. collect()
  273. else
  274. sleep( 0.5 )
  275. end
  276. end
  277. end
  278.  
  279. while depth < y do
  280. if turtle.down() then
  281. depth = depth + 1
  282. elseif turtle.digDown() or turtle.attackDown() then
  283. collect()
  284. else
  285. sleep( 0.5 )
  286. end
  287. end
  288.  
  289. while zDir ~= zd or xDir ~= xd do
  290. turnLeft()
  291. end
  292. end
  293.  
  294. RefuelFromRF()
  295. print( "Excavating..." )
  296.  
  297. for n=1, depthFrom do
  298. tryDown()
  299. end
  300.  
  301. local reseal = false
  302. turtle.select(1)
  303. if turtle.digDown() then
  304. reseal = true
  305. end
  306.  
  307. local alternate = 0
  308. local done = false
  309. while not done do
  310. for n=1,size do
  311. for m=1,size-1 do
  312. if not tryForwards() then
  313. done = true
  314. break
  315. end
  316. end
  317. if done then
  318. break
  319. end
  320. if n<size then
  321. if math.fmod(n + alternate,2) == 0 then
  322. turnLeft()
  323. if not tryForwards() then
  324. done = true
  325. break
  326. end
  327. turnLeft()
  328. else
  329. turnRight()
  330. if not tryForwards() then
  331. done = true
  332. break
  333. end
  334. turnRight()
  335. end
  336. end
  337. end
  338. if done then
  339. break
  340. end
  341.  
  342. if size > 1 then
  343. if math.fmod(size,2) == 0 then
  344. turnRight()
  345. else
  346. if alternate == 0 then
  347. turnLeft()
  348. else
  349. turnRight()
  350. end
  351. alternate = 1 - alternate
  352. end
  353. end
  354.  
  355. if not tryDown() then
  356. done = true
  357. break
  358. end
  359. end
  360.  
  361. print( "Returning to surface..." )
  362.  
  363. -- Return to where we started
  364. goTo( 0,0,0,0,-1 )
  365. unload( false )
  366. RefuelFromRF()
  367. goTo( 0,0,0,0,1 )
  368.  
  369.  
  370. -- Seal the hole
  371. if reseal then
  372. turtle.placeDown()
  373. end
  374.  
  375. print( "Mined "..(collected + unloaded).." items total." )
Add Comment
Please, Sign In to add comment