mortarsynth

excavateSM

Jul 18th, 2019
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.34 KB | None | 0 0
  1. function excavate(size, max_depth)
  2.  
  3. local depth = 0
  4.  
  5. local xPos, zPos = 0, 0
  6. local xDir, zDir = 0, 1
  7.  
  8. local goTo -- Filled in further down
  9. local refuel -- Filled in further down
  10.  
  11. local function unload()
  12. print("Unloading items...")
  13. for n = 3, 16 do
  14. local nCount = turtle.getItemCount(n)
  15. if nCount > 0 then
  16. turtle.select(n)
  17. turtle.dropDown()
  18. end
  19. end
  20. turtle.select(3)
  21. end
  22.  
  23. local function returnSupplies()
  24. local x, y, z, xd, zd = xPos, depth, zPos, xDir, zDir
  25. print("Returning to surface...")
  26. goTo(0, 0, -1, 0, -1)
  27. local fuelNeeded = 2 * (x + y + z) + 1
  28. if not refuel(fuelNeeded) then
  29. unload()
  30. print("Waiting for fuel")
  31. while not refuel(fuelNeeded) do
  32. os.pullEvent("turtle_inventory")
  33. end
  34. else
  35. unload()
  36. end
  37. print("Resuming mining...")
  38. goTo(0, 0, 0, 0, -1)
  39. goTo(x, y, z, xd, zd)
  40. end
  41.  
  42. local function collect()
  43. local bFull = true
  44. for n = 3, 16 do
  45. local nCount = turtle.getItemCount(n)
  46. if nCount == 0 then
  47. bFull = false
  48. end
  49. end
  50. if bFull then
  51. print("No empty slots left")
  52. return false
  53. end
  54. return true
  55. end
  56.  
  57. function refuel(amount)
  58. local fuelLevel = turtle.getFuelLevel()
  59. if fuelLevel == "unlimited" then
  60. return true
  61. end
  62. local needed = amount or (xPos + zPos + depth + 2)
  63. if turtle.getFuelLevel() < needed then
  64. turtle.select(1)
  65. while turtle.getItemCount(1) > 0 and turtle.getFuelLevel() < needed do
  66. turtle.refuel(1)
  67. end
  68. if turtle.getFuelLevel() >= needed then
  69. turtle.select(1)
  70. return true
  71. end
  72. return false
  73. end
  74. return true
  75. end
  76.  
  77. local function tryForwards()
  78. if not refuel() then
  79. print("Not enough Fuel")
  80. returnSupplies()
  81. end
  82. while not turtle.forward() do
  83. if turtle.detect() then
  84. if turtle.dig() then
  85. if not collect() then
  86. returnSupplies()
  87. end
  88. else
  89. return false
  90. end
  91. elseif turtle.attack() then
  92. if not collect() then
  93. returnSupplies()
  94. end
  95. else
  96. sleep(0.5)
  97. end
  98. end
  99. xPos = xPos + xDir
  100. zPos = zPos + zDir
  101. return true
  102. end
  103.  
  104. local function tryDown()
  105. if not refuel() then
  106. print("Not enough Fuel")
  107. returnSupplies()
  108. end
  109. while not turtle.down() do
  110. if turtle.detectDown() then
  111. if turtle.digDown() then
  112. if not collect() then
  113. returnSupplies()
  114. end
  115. else
  116. return false
  117. end
  118. elseif turtle.attackDown() then
  119. if not collect() then
  120. returnSupplies()
  121. end
  122. else
  123. sleep(0.5)
  124. end
  125. end
  126. depth = depth + 1
  127. if math.fmod(depth, 10) == 0 then
  128. print("Descended "..depth.." metres.")
  129. end
  130. return true
  131. end
  132.  
  133. local function turnLeft()
  134. turtle.turnLeft()
  135. xDir, zDir = -zDir, xDir
  136. end
  137.  
  138. local function turnRight()
  139. turtle.turnRight()
  140. xDir, zDir = zDir, -xDir
  141. end
  142.  
  143. function goTo(x, y, z, xd, zd)
  144. while depth > y do
  145. if turtle.up() then
  146. depth = depth - 1
  147. elseif turtle.digUp() or turtle.attackUp() then
  148. collect()
  149. else
  150. sleep(0.5)
  151. end
  152. end
  153. if xPos > x then
  154. while xDir ~= -1 do
  155. turnLeft()
  156. end
  157. while xPos > x do
  158. if turtle.forward() then
  159. xPos = xPos - 1
  160. elseif turtle.dig() or turtle.attack() then
  161. collect()
  162. else
  163. sleep(0.5)
  164. end
  165. end
  166. elseif xPos < x then
  167. while xDir ~= 1 do
  168. turnLeft()
  169. end
  170. while xPos < x do
  171. if turtle.forward() then
  172. xPos = xPos + 1
  173. elseif turtle.dig() or turtle.attack() then
  174. collect()
  175. else
  176. sleep(0.5)
  177. end
  178. end
  179. end
  180. if zPos > z then
  181. while zDir ~= -1 do
  182. turnLeft()
  183. end
  184. while zPos > z do
  185. if turtle.forward() then
  186. zPos = zPos - 1
  187. elseif turtle.dig() or turtle.attack() then
  188. collect()
  189. else
  190. sleep(0.5)
  191. end
  192. end
  193. elseif zPos < z then
  194. while zDir ~= 1 do
  195. turnLeft()
  196. end
  197. while zPos < z do
  198. if turtle.forward() then
  199. zPos = zPos + 1
  200. elseif turtle.dig() or turtle.attack() then
  201. collect()
  202. else
  203. sleep(0.5)
  204. end
  205. end
  206. end
  207. while depth < y do
  208. if turtle.down() then
  209. depth = depth + 1
  210. elseif turtle.digDown() or turtle.attackDown() then
  211. collect()
  212. else
  213. sleep(0.5)
  214. end
  215. end
  216. while zDir ~= zd or xDir ~= xd do
  217. turnLeft()
  218. end
  219. end
  220.  
  221. if not refuel() then
  222. print("Out of Fuel")
  223. return
  224. end
  225.  
  226. print("Excavating...")
  227.  
  228. local alternate = 0
  229. local done = false
  230. while not done do
  231. for n = 1, size do
  232. for m = 1, size-1 do
  233. if not tryForwards() then
  234. done = true
  235. break
  236. end
  237. end
  238. if done then
  239. break
  240. end
  241. if n<size then
  242. if math.fmod(n + alternate, 2) == 0 then
  243. turnLeft()
  244. if not tryForwards() then
  245. done = true
  246. break
  247. end
  248. turnLeft()
  249. else
  250. turnRight()
  251. if not tryForwards() then
  252. done = true
  253. break
  254. end
  255. turnRight()
  256. end
  257. end
  258. end
  259. if done then
  260. break
  261. end
  262. if size > 1 then
  263. if math.fmod(size, 2) == 0 then
  264. turnRight()
  265. else
  266. if alternate == 0 then
  267. turnLeft()
  268. else
  269. turnRight()
  270. end
  271. alternate = 1 - alternate
  272. end
  273. end
  274.  
  275. if (not tryDown() or depth >= max_depth) then
  276. done = true
  277. break
  278. end
  279. end
  280.  
  281. print("Returning to surface...")
  282.  
  283. -- Return to where we started
  284. goTo(0, 0, 0, 0, -1)
  285. goTo(0, 0, 0, 0, 1)
  286.  
  287. end
Add Comment
Please, Sign In to add comment