thaile4ever

excavate2

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