babulm

Untitled

May 2nd, 2026
8
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.16 KB | None | 0 0
  1. -- quarry.lua
  2. -- Mining Turtle Quarry Programm
  3. -- Kiste muss direkt hinter der Turtle stehen.
  4. -- Fuel muss in Slot 16 liegen.
  5. -- Slots 1-15 werden fuer Mining-Items genutzt.
  6. -- Slot 16 wird nie entleert.
  7.  
  8. local FUEL_SLOT = 16
  9. local ITEM_SLOTS = 15
  10.  
  11. -- Position:
  12. -- x = nach vorne
  13. -- y = nach rechts positiv, links negativ
  14. -- z = nach unten positiv
  15. local x, y, z = 0, 0, 0
  16.  
  17. -- Richtung:
  18. -- 0 = vorne, 1 = rechts, 2 = hinten, 3 = links
  19. local dir = 0
  20.  
  21. local sideSign = 1
  22. local length = 0
  23. local width = 0
  24. local depth = 0
  25.  
  26. local function clear()
  27. term.clear()
  28. term.setCursorPos(1, 1)
  29. end
  30.  
  31. local function askYesNo(text)
  32. while true do
  33. write(text .. " (j/n): ")
  34. local a = string.lower(read())
  35. if a == "j" or a == "ja" or a == "y" or a == "yes" then
  36. return true
  37. elseif a == "n" or a == "nein" or a == "no" then
  38. return false
  39. end
  40. print("Bitte j oder n eingeben.")
  41. end
  42. end
  43.  
  44. local function askNumber(text, min)
  45. min = min or 1
  46. while true do
  47. write(text .. ": ")
  48. local n = tonumber(read())
  49. if n and n >= min and math.floor(n) == n then
  50. return n
  51. end
  52. print("Bitte eine ganze Zahl >= " .. min .. " eingeben.")
  53. end
  54. end
  55.  
  56. local function askSide()
  57. while true do
  58. write("Soll die Turtle nach rechts oder links erweitern? (r/l): ")
  59. local s = string.lower(read())
  60. if s == "r" or s == "rechts" then
  61. return 1
  62. elseif s == "l" or s == "links" then
  63. return -1
  64. end
  65. print("Bitte r oder l eingeben.")
  66. end
  67. end
  68.  
  69. local function fuelLevel()
  70. return turtle.getFuelLevel()
  71. end
  72.  
  73. local function needFuel()
  74. local level = fuelLevel()
  75. return level ~= "unlimited" and level <= 2
  76. end
  77.  
  78. local function refuelFromSlot16()
  79. if fuelLevel() == "unlimited" then
  80. return true
  81. end
  82.  
  83. turtle.select(FUEL_SLOT)
  84.  
  85. if turtle.getItemCount(FUEL_SLOT) <= 0 then
  86. return false
  87. end
  88.  
  89. local ok = turtle.refuel(1)
  90. return ok
  91. end
  92.  
  93. local function ensureFuel()
  94. if fuelLevel() == "unlimited" then
  95. return
  96. end
  97.  
  98. while needFuel() do
  99. local ok = refuelFromSlot16()
  100. if not ok then
  101. print("")
  102. print("Nicht genug Fuel in Slot 16.")
  103. print("Lege Fuel in Slot 16 und druecke Enter.")
  104. read()
  105. end
  106. end
  107. end
  108.  
  109. local function turnLeft()
  110. turtle.turnLeft()
  111. dir = (dir + 3) % 4
  112. end
  113.  
  114. local function turnRight()
  115. turtle.turnRight()
  116. dir = (dir + 1) % 4
  117. end
  118.  
  119. local function turnTo(target)
  120. while dir ~= target do
  121. local diff = (target - dir) % 4
  122. if diff == 1 then
  123. turnRight()
  124. elseif diff == 3 then
  125. turnLeft()
  126. else
  127. turnRight()
  128. turnRight()
  129. end
  130. end
  131. end
  132.  
  133. local function updateForwardPos()
  134. if dir == 0 then
  135. x = x + 1
  136. elseif dir == 1 then
  137. y = y + 1
  138. elseif dir == 2 then
  139. x = x - 1
  140. elseif dir == 3 then
  141. y = y - 1
  142. end
  143. end
  144.  
  145. local function safeDig()
  146. while turtle.detect() do
  147. turtle.dig()
  148. sleep(0.2)
  149. end
  150. end
  151.  
  152. local function safeDigUp()
  153. while turtle.detectUp() do
  154. turtle.digUp()
  155. sleep(0.2)
  156. end
  157. end
  158.  
  159. local function safeDigDown()
  160. while turtle.detectDown() do
  161. turtle.digDown()
  162. sleep(0.2)
  163. end
  164. end
  165.  
  166. local function forward()
  167. ensureFuel()
  168. while not turtle.forward() do
  169. safeDig()
  170. turtle.attack()
  171. sleep(0.2)
  172. end
  173. updateForwardPos()
  174. end
  175.  
  176. local function up()
  177. ensureFuel()
  178. while not turtle.up() do
  179. safeDigUp()
  180. turtle.attackUp()
  181. sleep(0.2)
  182. end
  183. z = z - 1
  184. end
  185.  
  186. local function down()
  187. ensureFuel()
  188. while not turtle.down() do
  189. safeDigDown()
  190. turtle.attackDown()
  191. sleep(0.2)
  192. end
  193. z = z + 1
  194. end
  195.  
  196. local function moveX(targetX)
  197. while x < targetX do
  198. turnTo(0)
  199. forward()
  200. end
  201. while x > targetX do
  202. turnTo(2)
  203. forward()
  204. end
  205. end
  206.  
  207. local function moveY(targetY)
  208. while y < targetY do
  209. turnTo(1)
  210. forward()
  211. end
  212. while y > targetY do
  213. turnTo(3)
  214. forward()
  215. end
  216. end
  217.  
  218. local function moveZ(targetZ)
  219. while z < targetZ do
  220. down()
  221. end
  222. while z > targetZ do
  223. up()
  224. end
  225. end
  226.  
  227. local function goTo(tx, ty, tz)
  228. -- Erst vertikal, dann horizontal.
  229. -- Beim Mining von oben nach unten ist der Weg nach oben bereits frei.
  230. moveZ(tz)
  231. moveX(tx)
  232. moveY(ty)
  233. end
  234.  
  235. local function inventoryAlmostFull()
  236. local emptySlots = 0
  237. local totalSpace = 0
  238.  
  239. for i = 1, ITEM_SLOTS do
  240. local count = turtle.getItemCount(i)
  241. local space = turtle.getItemSpace(i)
  242.  
  243. if count == 0 then
  244. emptySlots = emptySlots + 1
  245. end
  246.  
  247. totalSpace = totalSpace + space
  248. end
  249.  
  250. -- "Langsam voll": nur noch 1 leerer Slot oder weniger als 64 Platz.
  251. return emptySlots <= 1 or totalSpace < 64
  252. end
  253.  
  254. local function dropIntoChest()
  255. turnTo(2) -- Kiste ist hinter Startposition
  256.  
  257. for i = 1, ITEM_SLOTS do
  258. turtle.select(i)
  259.  
  260. while turtle.getItemCount(i) > 0 do
  261. local ok = turtle.drop()
  262. if not ok then
  263. print("")
  264. print("Kiste scheint voll oder nicht erreichbar zu sein.")
  265. print("Leere die Kiste und druecke Enter.")
  266. read()
  267. end
  268. end
  269. end
  270.  
  271. turtle.select(1)
  272. turnTo(0)
  273. end
  274.  
  275. local function returnHomeAndUnload()
  276. local sx, sy, sz, sd = x, y, z, dir
  277.  
  278. print("Inventar fast voll. Fahre zur Kiste...")
  279. goTo(0, 0, 0)
  280. dropIntoChest()
  281.  
  282. print("Fahre zurueck zur letzten Position...")
  283. goTo(sx, sy, sz)
  284. turnTo(sd)
  285. end
  286.  
  287. local function maybeUnload()
  288. if inventoryAlmostFull() then
  289. returnHomeAndUnload()
  290. end
  291. end
  292.  
  293. local function checkChestBehind()
  294. local oldDir = dir
  295. turnTo(2)
  296. local hasBlock = turtle.detect()
  297. turnTo(oldDir)
  298.  
  299. if not hasBlock then
  300. print("")
  301. print("Warnung: Hinter der Turtle wurde kein Block erkannt.")
  302. print("Wenn dort keine Kiste steht, kann die Turtle nicht entleeren.")
  303. return askYesNo("Trotzdem starten")
  304. end
  305.  
  306. return true
  307. end
  308.  
  309. local function initialRefuel()
  310. turtle.select(FUEL_SLOT)
  311.  
  312. if fuelLevel() ~= "unlimited" then
  313. print("Fuel-Level vor dem Auftanken: " .. tostring(fuelLevel()))
  314.  
  315. if turtle.getItemCount(FUEL_SLOT) <= 0 then
  316. print("Slot 16 ist leer.")
  317. return false
  318. end
  319.  
  320. -- Nicht alles verbrennen, sondern erstmal einen Teil.
  321. -- Danach wird bei Bedarf automatisch weiter refuelt.
  322. for i = 1, 8 do
  323. if turtle.getItemCount(FUEL_SLOT) > 1 and fuelLevel() < 500 then
  324. turtle.refuel(1)
  325. end
  326. end
  327.  
  328. print("Fuel-Level nach dem Auftanken: " .. tostring(fuelLevel()))
  329. else
  330. print("Fuel ist unlimited.")
  331. end
  332.  
  333. turtle.select(1)
  334. return true
  335. end
  336.  
  337. local function mineCurrentSpot()
  338. -- Zusatznutzen:
  339. -- Raeumt oben/unten mit weg, falls Hoehlen, Kies, Gravel usw. stoeren.
  340. -- Der eigentliche Quader entsteht durch die Bewegung der Turtle.
  341. safeDigUp()
  342. safeDigDown()
  343. end
  344.  
  345. local function quarry()
  346. local sweepForward = true
  347.  
  348. for level = 0, depth - 1 do
  349. print("Ebene " .. (level + 1) .. " von " .. depth)
  350.  
  351. if level > 0 then
  352. -- Eine Ebene tiefer gehen.
  353. down()
  354. maybeUnload()
  355. end
  356.  
  357. local yStart, yEnd, yStep
  358.  
  359. if level % 2 == 0 then
  360. yStart = 0
  361. yEnd = width - 1
  362. yStep = 1
  363. else
  364. yStart = width - 1
  365. yEnd = 0
  366. yStep = -1
  367. end
  368.  
  369. local yi = yStart
  370. while true do
  371. local targetY = yi * sideSign
  372.  
  373. moveY(targetY)
  374. maybeUnload()
  375.  
  376. if sweepForward then
  377. for tx = 1, length do
  378. goTo(tx, targetY, level)
  379. mineCurrentSpot()
  380. maybeUnload()
  381. end
  382. else
  383. for tx = length, 1, -1 do
  384. goTo(tx, targetY, level)
  385. mineCurrentSpot()
  386. maybeUnload()
  387. end
  388. end
  389.  
  390. sweepForward = not sweepForward
  391.  
  392. if yi == yEnd then
  393. break
  394. end
  395.  
  396. yi = yi + yStep
  397. end
  398. end
  399.  
  400. print("Quader fertig. Fahre zur Kiste...")
  401. goTo(0, 0, 0)
  402. dropIntoChest()
  403. print("Fertig! Alle Items aus Slots 1-15 wurden entleert.")
  404. end
  405.  
  406. -- START
  407. clear()
  408. print("=== Mining Turtle Quarry ===")
  409. print("Die Turtle muss nach vorne in den Mining-Bereich schauen.")
  410. print("Die Kiste muss direkt hinter der Turtle stehen.")
  411. print("Fuel muss in Slot 16 liegen.")
  412. print("Slots 1-15 werden fuer Items genutzt.")
  413. print("")
  414.  
  415. if not askYesNo("Steht die Kiste direkt hinter der Turtle") then
  416. print("Bitte Kiste hinter die Turtle stellen und Programm neu starten.")
  417. return
  418. end
  419.  
  420. if not askYesNo("Ist Fuel in Slot 16 der Turtle") then
  421. print("Bitte Fuel in Slot 16 legen und Programm neu starten.")
  422. return
  423. end
  424.  
  425. if not checkChestBehind() then
  426. print("Abbruch.")
  427. return
  428. end
  429.  
  430. if not initialRefuel() then
  431. print("Kein Fuel in Slot 16 gefunden. Abbruch.")
  432. return
  433. end
  434.  
  435. print("")
  436. length = askNumber("Wie viele Bloecke nach vorne soll gearbeitet werden", 1)
  437. sideSign = askSide()
  438. width = askNumber("Wie viele Bloecke breit in diese Richtung", 1)
  439. depth = askNumber("Wie viele Bloecke nach unten", 1)
  440.  
  441. print("")
  442. print("Einstellungen:")
  443. print("Laenge nach vorne: " .. length)
  444. print("Breite: " .. width .. " nach " .. (sideSign == 1 and "rechts" or "links"))
  445. print("Tiefe: " .. depth)
  446. print("")
  447.  
  448. if not askYesNo("Starten") then
  449. print("Abbruch.")
  450. return
  451. end
  452.  
  453. quarry()
Add Comment
Please, Sign In to add comment