Hydrotronics

ComputerCraft Excavate+return

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