chico0991

Loch

Sep 2nd, 2025 (edited)
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.32 KB | Gaming | 0 0
  1. -- Benutzereingaben für Parameter
  2.  
  3. print("Groesse der Mine (Laenge): ")
  4. local l = tonumber(io.read())
  5. print("Groesse der Mine (Breite): ")
  6. local w = tonumber(io.read())
  7. print("Turtle Y: ")
  8. local z0 = tonumber(io.read())
  9. local listtype = 12
  10. while(listtype ~= 1 and listtype ~= 0) do
  11. print("Whitelist ja/nein?")
  12. listtype = io.read()
  13. if(listtype == "ja" or listtype == "Ja" or listtype == "j" or listtype == "J") then
  14. listtype = 1
  15. elseif(listtype == "nein" or listtype == "Nein" or listtype == "n" or listtype == "N") then
  16. listtype = 0
  17. else
  18. print("Ungueltige Antwort, bitte gib entweder ja oder nein ein")
  19. end
  20. end
  21. print("Moechtest du das gesamte Chunk abbauen, ja/nein?")
  22. local dummy = io.read()
  23. if dummy == "n" or dummy == "N" or dummy == "nein" or dummy == "Nein" then
  24. print("Wie viele Schichten moechtest du abbauen?")
  25. fin = tonumber(io.read())
  26. else fin = z0 end
  27.  
  28. -- Variablen festlegen
  29.  
  30. local x = 0
  31. local y = 0
  32. local z = 0
  33. local rev = 1
  34. local face = 0
  35. local counter = 0
  36. arr = {0} -- fuer Muellbeseitigung
  37. local cobble = false
  38. local stone = false
  39. local slot = 16
  40. trashtable = {}
  41. fuel = turtle.getItemDetail(16).name
  42.  
  43. -- Funktionalitaeten definieren
  44.  
  45. function refuel() -- prueft, ob die Turtle Treibstoff benoetigt und nutzt interne Items, um nachzutanken
  46. local f = false
  47. if turtle.getFuelLevel() < 500 then
  48. for i = 1,16 do
  49. fuelvar = false
  50. if not(turtle.getItemDetail(i) == nil) then
  51. if turtle.getItemDetail(i).name == fuel then
  52. fuelvar = true
  53. end
  54. end
  55. if fuelvar then
  56. turtle.select(i)
  57. while turtle.getItemCount() > 0 do
  58. turtle.refuel(1)
  59. if turtle.getFuelLevel() >= 500 then
  60. f = true
  61. turtle.select(1)
  62. break
  63. end
  64. end
  65. end
  66. if f then break end
  67. end
  68. end
  69. end
  70.  
  71. function moveForward() -- bewegt die Turtle vorwaerts um einen Block und aktualisiert die Position
  72. refuel()
  73. while not turtle.forward() do
  74. turtle.dig()
  75. end
  76. if face == 0 then y=y+1 end
  77. if face == 1 then x=x+1 end
  78. if face == 2 then y=y-1 end
  79. if face == 3 then x=x-1 end
  80. end
  81.  
  82. function turn(num) -- dreht die Turtle entweder nach links (-1) oder nach rechts (+1) und aktualisiert die Blickrichtung
  83. if num == 1 then
  84. turtle.turnRight()
  85. face = (face+1)%4
  86. elseif num == -1 then
  87. turtle.turnLeft()
  88. face = (face-1)%4
  89. end
  90. end
  91.  
  92. function trashlist() -- erstellt je nach Benutzereingabe eine Whitelist oder Blacklist und speichert Block-IDs in einer Tabelle zur Referenz | unterstuetzt auch einige Forge-Tags fuer Cobblestone und Stein
  93. for i=1,15 do
  94. if turtle.getItemCount(i) > 0 then
  95. trashtable[i] = turtle.getItemDetail(i).name
  96. if trashtable[i] == "minecraft:cobblestone" then
  97. cobble = true
  98. end
  99. if trashtable[i] == "minecraft:stone" then
  100. stone = true
  101. end
  102. else
  103. slot = i
  104. break
  105. end
  106. end
  107. print("Item-Daten gespeichert")
  108.  
  109. while face ~= 2 do turn(1) end
  110. for i=1,slot-1 do
  111. turtle.select(i)
  112. turtle.drop()
  113. end
  114. turn(-1)
  115. turn(-1)
  116. turtle.select(1)
  117. end
  118.  
  119. function dispense() -- gibt abgebauten Muell in eine Truhe hinter der Turtle ab und prueft, ob Treibstoff benoetigt wird, bevor sie Treibstoff in die Truhe abgibt
  120. for i=1,15 do
  121. turtle.select(i)
  122. if not turtle.refuel(0) then
  123. turtle.drop()
  124. else turtle.transferTo(16) turtle.drop()
  125. end
  126. end
  127. turtle.select(1)
  128. end
  129.  
  130. function goHome(state) -- bringt die Turtle zurueck zum Ausgangspunkt und behandelt verschiedene Gruende fuer die Rueckkehr. Wenn state == "mine", geht sie zum letzten Punkt, an dem sie abgebaut hat.
  131. -- Wenn die Turtle aufgrund eines vollen Inventars zurueckkehrt (state == "full"), gibt sie die Items ab und kehrt zum Abbauort zurueck
  132. -- Wenn sie aufgrund von Treibstoffmangel zurueckkehrt (state == "fuel"), fragt sie den Benutzter nach Treibstoff und kehrt nach Auffuellung zurueck
  133. -- Wenn sie abgeschlossen hat (state == "comp"), gibt sie die Items ab und beendet das Programm
  134. print(state)
  135. xp = x
  136. yp = y
  137. zp = z
  138. facep = face
  139. while y > 0 do
  140. if face == 0 then turn(1) end
  141. if face == 1 then turn(1) end
  142. if face == 2 then moveForward() end
  143. if face == 3 then turn(-1) end
  144. end
  145. while x > 0 do
  146. if face == 0 then turn(-1) end
  147. if face == 1 then turn(-1) end
  148. if face == 2 then turn(1) end
  149. if face == 3 then moveForward() end
  150. end
  151.  
  152. if(state == "full" or state == "fuel") then trashRemoval() end
  153.  
  154. while z > 0 do
  155. turtle.up()
  156. z=z-1
  157. end
  158. while(face ~= 2) do turn(-1) end
  159. suc2,dat2 = turtle.inspect()
  160. if not suc2 then
  161. turn(-1)
  162. turn(-1)
  163. error()
  164. end
  165. while state == "fuel" do
  166. sleep(10)
  167. refuel()
  168. if turtle.getFuelLevel() >= 500 then state = "full" end -- setze den Zustand auf "full", statt auf "mine", um vor der Rueckkehr abzugeben
  169. end
  170. if state == "full" then
  171. dispense()
  172. arr = {0}
  173. state = "mine"
  174. end
  175. if state == "comp" then
  176. dispense()
  177. while face ~= 0 do turn(1) end
  178. error()
  179. end
  180. if state == "mine" then
  181. while z < zp do
  182. turtle.down() z = z+1
  183. end
  184. while x < xp do
  185. if face == 0 then turn(1) end
  186. if face == 1 then moveForward() end
  187. if face == 2 then turn(-1) end
  188. if face == 3 then turn(-1) end
  189. end
  190. while y < yp do
  191. if face == 0 then moveForward() end
  192. if face == 1 then turn(-1) end
  193. if face == 2 then turn(1) end
  194. if face == 3 then turn(1) end
  195. end
  196. while face ~= facep do
  197. turn(1)
  198. end
  199. end
  200. end
  201.  
  202. function compare(dir) -- prueft den Block in der angegebenen Richtung ("up", "front", "down") gegen die Liste der Blacklist oder Whitelist und gibt zurueck, ob er uebereinstimmt
  203. local suc = true
  204. local dat = nil
  205. local tf = true
  206. if(listtype == 1) then
  207. tf = false
  208. end
  209. if dir == "up" then
  210. suc,dat = turtle.inspectUp()
  211. elseif dir == "front" then
  212. suc,dat = turtle.inspect()
  213. elseif dir == "down" then
  214. suc,dat = turtle.inspectDown()
  215. elseif dir == "in" then
  216. dat = turtle.getItemDetail()
  217. end
  218. if suc then
  219. for i=1,slot-1 do
  220. if trashtable[i] == dat.name or listtype == 1 and "minecraft:coal_ore" == dat.name then
  221. return tf
  222. end
  223. if cobble and dat.tags["forge:cobblestone"] or stone and dat.tags["forge:stone"] then
  224. return tf
  225. end
  226. end
  227. end
  228. return not(tf)
  229. end
  230.  
  231.  
  232. function digUp() -- graebt den Block ueber der Turtle, wenn er in der Whitelist oder nicht in der Blacklist ist
  233. if not compare("up") then
  234. while turtle.digUp() do
  235. -- turtle.digUp()
  236. end
  237. end
  238. end
  239.  
  240. function digDown() -- graebt den Block unter der Turtle, wenn er in der Whitelist oder nicht in der Blacklist ist
  241. if not compare("down") then
  242. while turtle.digDown() do
  243. -- turtle.digDown()
  244. end
  245. end
  246. end
  247.  
  248. function trashRemoval() -- entfernt interne Items, die entweder mit der Blacklist uebereinstimmen oder nicht mit der Whitelist uebereinstimmen
  249. for i=1,15 do
  250. if(arr[i+1] == nil) then
  251. local dispose = true
  252. for j=1,slot-1 do
  253. if turtle.getItemCount(i) > 0 then
  254. if listtype == 0 then
  255. if turtle.getItemDetail(i).name == trashtable[j] then
  256. turtle.select(i)
  257. turtle.drop()
  258. elseif cobble or stone then
  259. dat = turtle.getItemDetail(i,true)
  260. if cobble and dat.tags["forge:cobblestone"] or stone and dat.tags["forge:stone"] then
  261. turtle.select(i)
  262. turtle.drop()
  263. end
  264. end
  265. else
  266. if turtle.getItemDetail(i).name == trashtable[j] then
  267. dispose = false
  268. elseif(turtle.getItemDetail(i).name == turtle.getItemDetail(16).name) then
  269. turtle.select(i)
  270. turtle.transferTo(16)
  271. dispose = false
  272. end
  273. end
  274. end
  275. end
  276. if(listtype == 1 and dispose) then
  277. turtle.select(i)
  278. turtle.drop()
  279. end
  280. if(turtle.getItemCount(i) > 0) then
  281. arr[i+1] = 1
  282. arr[1] = arr[1]+1
  283. end
  284. end
  285. end
  286. turtle.select(1)
  287. end
  288.  
  289. function isFull() -- prueft, ob der Inventar voll ist
  290. local ret = true
  291. for i=0,14 do
  292. if turtle.getItemCount(15-i) == 0 then ret = false break end
  293. end
  294. return ret
  295. end
  296.  
  297. function checkfuel() -- tankt die Turtle nach und prueft dann, ob genug Treibstoff vorhanden ist, um zum Ausgangspunkt zurueckzukehren und die naechste Schicht abzubauen
  298. -- Falls nicht genug Treibstoff vorhanden ist, geht die Turtle zum Startpunkt zurueck, um nachzutanken
  299. refuel()
  300. if turtle.getFuelLevel() < (x+y+z)+l*w then
  301. goHome("fuel")
  302. end
  303. end
  304.  
  305. function mine() -- prueft alle 16 Operationen nach Treibstoff und graebt dann den Block vor der Turtle ab, bewegt sich vorwaerts und graebt den Block oben und unten ab, falls noetig
  306. -- ueberprueft auch, ob das Inventar voll ist und gibt Items ab, wenn noetig
  307. if counter%16 == 0 then checkfuel() counter = 1
  308. else counter = counter+1 end
  309. moveForward()
  310. digDown()
  311. digUp()
  312. if isFull() then
  313. trashRemoval()
  314. if arr[1] >= 14 then goHome("full") end
  315. end
  316. end
  317.  
  318. function Bore() -- bewegt die Turtle nach z = z0-3 (falls unregelmaessiger Bedrock)
  319. while z < z0-3 do
  320. while not turtle.down() do turtle.digDown() end
  321. z = z+1
  322. end
  323. end
  324.  
  325. function moveY() -- baut eine Linie ab und verfolgt dabei den Standort und die Blickrichtung
  326. if y == 0 then
  327. while y < l-1 do
  328. if face == 0 then
  329. mine()
  330. elseif face == 1 or face == 2 then
  331. turn(-1)
  332. else turn(1)
  333. end
  334. end
  335. else
  336. while y > 0 do
  337. if face == 2 then
  338. mine()
  339. elseif face == 1 or face == 0 then
  340. turn(1)
  341. else turn(-1)
  342. end
  343. end
  344. end
  345. end
  346.  
  347. function quarry() -- nutzt moveY, um ein Quadrat abzubauen
  348. refuel()
  349. for i=0,w-1 do
  350. moveY()
  351. if(i < w-1) then
  352. if(i%2 == 0) then
  353. turn(rev)
  354. else
  355. turn(-rev)
  356. end
  357. mine()
  358. end
  359. end
  360. end
  361.  
  362. function Mastermind() -- fuehrt die anderen Funktionen in der richtigen Reihenfolge aus, um das benutzerdefinierte Gebiet abzubauen und gibt zurueck, wenn es fertig ist
  363. trashlist()
  364. refuel()
  365. if turtle.getFuelLevel() < 500 then
  366. print("Nicht genug Treibstoff, bitte fuege mehr Treibstoff hinzu")
  367. while turtle.getFuelLevel() < 500 do
  368. sleep(5)
  369. refuel()
  370. end
  371. end
  372. print(z)
  373. Bore()
  374. print(fin)
  375. for i=0,fin-3 do
  376. print(i)
  377. if i%3 == 0 then
  378. turtle.digUp()
  379. quarry()
  380. if(w%2 == 0) then
  381. rev=0-rev
  382. end
  383. trashRemoval()
  384. end
  385. if i < fin-3 then
  386. while not turtle.up() do turtle.digUp() end
  387. z=z-1
  388. end
  389. end
  390. trashRemoval()
  391. print("Arbeit erledigt")
  392. goHome("comp")
  393.  
  394. end
  395.  
  396. Mastermind() -- boese Lache
  397.  
Advertisement
Add Comment
Please, Sign In to add comment