9FastCutMan

Quarry for CC:Restitched

Aug 11th, 2025 (edited)
1,008
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.26 KB | None | 0 0
  1. local TRASH = {
  2. ["minecraft:cobblestone"] = true,
  3. ["minecraft:dirt"] = true,
  4. ["minecraft:gravel"] = true,
  5. ["minecraft:stone"] = true,
  6. ["minecraft:netherrack"] = true,
  7. }
  8.  
  9. local width = tonumber(arg[1])
  10. local length = tonumber(arg[2])
  11. local depth = tonumber(arg[3])
  12.  
  13. if not (width and length and depth) then
  14. print("Usage: quarry <width> <length> <depth>")
  15. return
  16. end
  17.  
  18. local posX, posY, posZ = 0, 0, 0
  19. local dir = 0 -- 0=north,1=east,2=south,3=west
  20. local startX, startY = 0, 0
  21. local surfaceZ = 0 -- constant chest height
  22.  
  23. local function compactInventory()
  24. for i = 1, 15 do
  25. local detail_i = turtle.getItemDetail(i)
  26. if detail_i then
  27. for j = i + 1, 16 do
  28. local detail_j = turtle.getItemDetail(j)
  29. if detail_j and detail_j.name == detail_i.name then
  30. turtle.select(j)
  31. turtle.transferTo(i)
  32. end
  33. end
  34. end
  35. end
  36. turtle.select(1)
  37. end
  38.  
  39. local function dropTrash()
  40. compactInventory()
  41. for slot = 1, 16 do
  42. local detail = turtle.getItemDetail(slot)
  43. if detail and TRASH[detail.name] then
  44. turtle.select(slot)
  45. turtle.drop()
  46. end
  47. end
  48. turtle.select(1)
  49. end
  50.  
  51. local function depositItems()
  52. compactInventory()
  53. for slot = 1, 16 do
  54. local detail = turtle.getItemDetail(slot)
  55. if detail and not TRASH[detail.name] then
  56. turtle.select(slot)
  57. turtle.drop()
  58. end
  59. end
  60. turtle.select(1)
  61. end
  62.  
  63. local function tryDigForward()
  64. while turtle.detect() do
  65. if not turtle.dig() then return false end
  66. sleep(0.2)
  67. end
  68. return true
  69. end
  70.  
  71. local function tryDigUp()
  72. while turtle.detectUp() do
  73. if not turtle.digUp() then return false end
  74. sleep(0.2)
  75. end
  76. return true
  77. end
  78.  
  79. local function tryDigDown()
  80. while turtle.detectDown() do
  81. if not turtle.digDown() then return false end
  82. sleep(0.2)
  83. end
  84. return true
  85. end
  86.  
  87. local function forward()
  88. while not turtle.forward() do
  89. if not tryDigForward() then return false end
  90. sleep(0.2)
  91. end
  92. if dir == 0 then posY = posY + 1
  93. elseif dir == 1 then posX = posX + 1
  94. elseif dir == 2 then posY = posY - 1
  95. elseif dir == 3 then posX = posX - 1
  96. end
  97. return true
  98. end
  99.  
  100. local function back()
  101. while not turtle.back() do sleep(0.2) end
  102. if dir == 0 then posY = posY - 1
  103. elseif dir == 1 then posX = posX - 1
  104. elseif dir == 2 then posY = posY + 1
  105. elseif dir == 3 then posX = posX + 1
  106. end
  107. return true
  108. end
  109.  
  110. local function up()
  111. while not turtle.up() do
  112. if not tryDigUp() then return false end
  113. sleep(0.2)
  114. end
  115. posZ = posZ - 1
  116. return true
  117. end
  118.  
  119. local function down()
  120. while not turtle.down() do
  121. if not tryDigDown() then return false end
  122. sleep(0.2)
  123. end
  124. posZ = posZ + 1
  125. return true
  126. end
  127.  
  128. local function right()
  129. turtle.turnRight()
  130. dir = (dir + 1) % 4
  131. return true
  132. end
  133.  
  134. local function left()
  135. turtle.turnLeft()
  136. dir = (dir - 1) % 4
  137. if dir < 0 then dir = dir + 4 end
  138. return true
  139. end
  140.  
  141. local function turnTo(targetDir)
  142. local diff = (targetDir - dir) % 4
  143. if diff == 3 then
  144. left()
  145. else
  146. for i = 1, diff do
  147. right()
  148. end
  149. end
  150. end
  151.  
  152. local function moveForwardN(n)
  153. for _ = 1, n do
  154. if not forward() then
  155. error("Failed moving forward")
  156. end
  157. end
  158. end
  159.  
  160. local function returnToStartHorizontal()
  161. if posX > startX then
  162. turnTo(3)
  163. moveForwardN(posX - startX)
  164. elseif posX < startX then
  165. turnTo(1)
  166. moveForwardN(startX - posX)
  167. end
  168.  
  169. if posY > startY then
  170. turnTo(2)
  171. moveForwardN(posY - startY)
  172. elseif posY < startY then
  173. turnTo(0)
  174. moveForwardN(startY - posY)
  175. end
  176.  
  177. turnTo(0)
  178. end
  179.  
  180. local function returnToChestSurface()
  181. -- Move horizontally to startX, startY
  182. returnToStartHorizontal()
  183. -- Move vertically to surfaceZ
  184. while posZ > surfaceZ do
  185. if not up() then return false end
  186. end
  187. while posZ < surfaceZ do
  188. if not down() then return false end
  189. end
  190. -- Face south (direction 2) so front faces chest
  191. turnTo(2)
  192. return true
  193. end
  194.  
  195. -- When depositing items after return:
  196. depositItems()
  197.  
  198. -- Then turn 180° to face quarry again
  199. right()
  200. right()
  201.  
  202. local function mine3LayerColumn(digForward)
  203. if not tryDigUp() then return false end
  204. if digForward and not tryDigForward() then return false end
  205. if not tryDigDown() then return false end
  206. return true
  207. end
  208.  
  209. local function getLayerZ(layer)
  210. return surfaceZ + (layer - 1) * 3
  211. end
  212.  
  213. local function moveToZ(targetZ)
  214. while posZ < targetZ do
  215. if not down() then
  216. print("Cannot move down to next layer.")
  217. return false
  218. end
  219. end
  220. while posZ > targetZ do
  221. if not up() then
  222. print("Cannot move up to next layer.")
  223. return false
  224. end
  225. end
  226. return true
  227. end
  228.  
  229. -- Initialize start position & surface chest height
  230. startX, startY, surfaceZ = posX, posY, posZ
  231. posZ = surfaceZ
  232.  
  233. for layer = 1, depth do
  234. print("Starting layer "..layer..", posZ="..posZ)
  235. local goingForward = true
  236.  
  237. for row = 1, length do
  238. if goingForward then
  239. turnTo(0)
  240. else
  241. turnTo(2)
  242. end
  243.  
  244. for col = 1, width do
  245. local digForward = (col < width)
  246.  
  247. if not mine3LayerColumn(digForward) then
  248. print("Unmineable block or bedrock reached. Stopping.")
  249. if not returnToChestSurface() then
  250. print("Failed returning to surface chest.")
  251. else
  252. depositItems()
  253. end
  254. return
  255. end
  256.  
  257. if col == width then
  258. dropTrash()
  259. end
  260.  
  261. if col < width then
  262. if not forward() then
  263. print("Failed to move forward. Stopping.")
  264. if not returnToChestSurface() then
  265. print("Failed returning to surface chest.")
  266. else
  267. depositItems()
  268. end
  269. return
  270. end
  271. end
  272. end
  273.  
  274. if row < length then
  275. if goingForward then
  276. right()
  277. if not forward() then
  278. print("Failed to move right. Stopping.")
  279. if not returnToChestSurface() then
  280. print("Failed returning to surface chest.")
  281. else
  282. depositItems()
  283. end
  284. return
  285. end
  286. right()
  287. else
  288. left()
  289. if not forward() then
  290. print("Failed to move left. Stopping.")
  291. if not returnToChestSurface() then
  292. print("Failed returning to surface chest.")
  293. else
  294. depositItems()
  295. end
  296. return
  297. end
  298. left()
  299. end
  300. goingForward = not goingForward
  301. end
  302. end
  303.  
  304. print("Completed layer "..layer)
  305.  
  306. print("Returning to surface chest to deposit items...")
  307. if not returnToChestSurface() then
  308. print("Failed returning to surface chest.")
  309. return
  310. end
  311. depositItems()
  312.  
  313. if layer < depth then
  314. local nextLayerZ = getLayerZ(layer + 1)
  315. if not moveToZ(nextLayerZ) then
  316. print("Failed to move down to next layer.")
  317. if not returnToChestSurface() then
  318. print("Failed returning to surface chest.")
  319. else
  320. depositItems()
  321. end
  322. return
  323. end
  324. print("Moved vertically to next layer "..(layer + 1).." at posZ "..posZ)
  325. end
  326. end
  327.  
  328. print("Quarry complete, returning to surface chest.")
  329. if returnToChestSurface() then
  330. depositItems()
  331. end
  332. print("Done!")
  333.  
Advertisement
Add Comment
Please, Sign In to add comment