Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Benutzereingaben für Parameter
- print("Groesse der Mine (Laenge): ")
- local l = tonumber(io.read())
- print("Groesse der Mine (Breite): ")
- local w = tonumber(io.read())
- print("Turtle Y: ")
- local z0 = tonumber(io.read())
- local listtype = 12
- while(listtype ~= 1 and listtype ~= 0) do
- print("Whitelist ja/nein?")
- listtype = io.read()
- if(listtype == "ja" or listtype == "Ja" or listtype == "j" or listtype == "J") then
- listtype = 1
- elseif(listtype == "nein" or listtype == "Nein" or listtype == "n" or listtype == "N") then
- listtype = 0
- else
- print("Ungueltige Antwort, bitte gib entweder ja oder nein ein")
- end
- end
- print("Moechtest du das gesamte Chunk abbauen, ja/nein?")
- local dummy = io.read()
- if dummy == "n" or dummy == "N" or dummy == "nein" or dummy == "Nein" then
- print("Wie viele Schichten moechtest du abbauen?")
- fin = tonumber(io.read())
- else fin = z0 end
- -- Variablen festlegen
- local x = 0
- local y = 0
- local z = 0
- local rev = 1
- local face = 0
- local counter = 0
- arr = {0} -- fuer Muellbeseitigung
- local cobble = false
- local stone = false
- local slot = 16
- trashtable = {}
- fuel = turtle.getItemDetail(16).name
- -- Funktionalitaeten definieren
- function refuel() -- prueft, ob die Turtle Treibstoff benoetigt und nutzt interne Items, um nachzutanken
- local f = false
- if turtle.getFuelLevel() < 500 then
- for i = 1,16 do
- fuelvar = false
- if not(turtle.getItemDetail(i) == nil) then
- if turtle.getItemDetail(i).name == fuel then
- fuelvar = true
- end
- end
- if fuelvar then
- turtle.select(i)
- while turtle.getItemCount() > 0 do
- turtle.refuel(1)
- if turtle.getFuelLevel() >= 500 then
- f = true
- turtle.select(1)
- break
- end
- end
- end
- if f then break end
- end
- end
- end
- function moveForward() -- bewegt die Turtle vorwaerts um einen Block und aktualisiert die Position
- refuel()
- while not turtle.forward() do
- turtle.dig()
- end
- if face == 0 then y=y+1 end
- if face == 1 then x=x+1 end
- if face == 2 then y=y-1 end
- if face == 3 then x=x-1 end
- end
- function turn(num) -- dreht die Turtle entweder nach links (-1) oder nach rechts (+1) und aktualisiert die Blickrichtung
- if num == 1 then
- turtle.turnRight()
- face = (face+1)%4
- elseif num == -1 then
- turtle.turnLeft()
- face = (face-1)%4
- end
- end
- 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
- for i=1,15 do
- if turtle.getItemCount(i) > 0 then
- trashtable[i] = turtle.getItemDetail(i).name
- if trashtable[i] == "minecraft:cobblestone" then
- cobble = true
- end
- if trashtable[i] == "minecraft:stone" then
- stone = true
- end
- else
- slot = i
- break
- end
- end
- print("Item-Daten gespeichert")
- while face ~= 2 do turn(1) end
- for i=1,slot-1 do
- turtle.select(i)
- turtle.drop()
- end
- turn(-1)
- turn(-1)
- turtle.select(1)
- end
- 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
- for i=1,15 do
- turtle.select(i)
- if not turtle.refuel(0) then
- turtle.drop()
- else turtle.transferTo(16) turtle.drop()
- end
- end
- turtle.select(1)
- end
- 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.
- -- Wenn die Turtle aufgrund eines vollen Inventars zurueckkehrt (state == "full"), gibt sie die Items ab und kehrt zum Abbauort zurueck
- -- Wenn sie aufgrund von Treibstoffmangel zurueckkehrt (state == "fuel"), fragt sie den Benutzter nach Treibstoff und kehrt nach Auffuellung zurueck
- -- Wenn sie abgeschlossen hat (state == "comp"), gibt sie die Items ab und beendet das Programm
- print(state)
- xp = x
- yp = y
- zp = z
- facep = face
- while y > 0 do
- if face == 0 then turn(1) end
- if face == 1 then turn(1) end
- if face == 2 then moveForward() end
- if face == 3 then turn(-1) end
- end
- while x > 0 do
- if face == 0 then turn(-1) end
- if face == 1 then turn(-1) end
- if face == 2 then turn(1) end
- if face == 3 then moveForward() end
- end
- if(state == "full" or state == "fuel") then trashRemoval() end
- while z > 0 do
- turtle.up()
- z=z-1
- end
- while(face ~= 2) do turn(-1) end
- suc2,dat2 = turtle.inspect()
- if not suc2 then
- turn(-1)
- turn(-1)
- error()
- end
- while state == "fuel" do
- sleep(10)
- refuel()
- if turtle.getFuelLevel() >= 500 then state = "full" end -- setze den Zustand auf "full", statt auf "mine", um vor der Rueckkehr abzugeben
- end
- if state == "full" then
- dispense()
- arr = {0}
- state = "mine"
- end
- if state == "comp" then
- dispense()
- while face ~= 0 do turn(1) end
- error()
- end
- if state == "mine" then
- while z < zp do
- turtle.down() z = z+1
- end
- while x < xp do
- if face == 0 then turn(1) end
- if face == 1 then moveForward() end
- if face == 2 then turn(-1) end
- if face == 3 then turn(-1) end
- end
- while y < yp do
- if face == 0 then moveForward() end
- if face == 1 then turn(-1) end
- if face == 2 then turn(1) end
- if face == 3 then turn(1) end
- end
- while face ~= facep do
- turn(1)
- end
- end
- end
- 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
- local suc = true
- local dat = nil
- local tf = true
- if(listtype == 1) then
- tf = false
- end
- if dir == "up" then
- suc,dat = turtle.inspectUp()
- elseif dir == "front" then
- suc,dat = turtle.inspect()
- elseif dir == "down" then
- suc,dat = turtle.inspectDown()
- elseif dir == "in" then
- dat = turtle.getItemDetail()
- end
- if suc then
- for i=1,slot-1 do
- if trashtable[i] == dat.name or listtype == 1 and "minecraft:coal_ore" == dat.name then
- return tf
- end
- if cobble and dat.tags["forge:cobblestone"] or stone and dat.tags["forge:stone"] then
- return tf
- end
- end
- end
- return not(tf)
- end
- function digUp() -- graebt den Block ueber der Turtle, wenn er in der Whitelist oder nicht in der Blacklist ist
- if not compare("up") then
- while turtle.digUp() do
- -- turtle.digUp()
- end
- end
- end
- function digDown() -- graebt den Block unter der Turtle, wenn er in der Whitelist oder nicht in der Blacklist ist
- if not compare("down") then
- while turtle.digDown() do
- -- turtle.digDown()
- end
- end
- end
- function trashRemoval() -- entfernt interne Items, die entweder mit der Blacklist uebereinstimmen oder nicht mit der Whitelist uebereinstimmen
- for i=1,15 do
- if(arr[i+1] == nil) then
- local dispose = true
- for j=1,slot-1 do
- if turtle.getItemCount(i) > 0 then
- if listtype == 0 then
- if turtle.getItemDetail(i).name == trashtable[j] then
- turtle.select(i)
- turtle.drop()
- elseif cobble or stone then
- dat = turtle.getItemDetail(i,true)
- if cobble and dat.tags["forge:cobblestone"] or stone and dat.tags["forge:stone"] then
- turtle.select(i)
- turtle.drop()
- end
- end
- else
- if turtle.getItemDetail(i).name == trashtable[j] then
- dispose = false
- elseif(turtle.getItemDetail(i).name == turtle.getItemDetail(16).name) then
- turtle.select(i)
- turtle.transferTo(16)
- dispose = false
- end
- end
- end
- end
- if(listtype == 1 and dispose) then
- turtle.select(i)
- turtle.drop()
- end
- if(turtle.getItemCount(i) > 0) then
- arr[i+1] = 1
- arr[1] = arr[1]+1
- end
- end
- end
- turtle.select(1)
- end
- function isFull() -- prueft, ob der Inventar voll ist
- local ret = true
- for i=0,14 do
- if turtle.getItemCount(15-i) == 0 then ret = false break end
- end
- return ret
- end
- function checkfuel() -- tankt die Turtle nach und prueft dann, ob genug Treibstoff vorhanden ist, um zum Ausgangspunkt zurueckzukehren und die naechste Schicht abzubauen
- -- Falls nicht genug Treibstoff vorhanden ist, geht die Turtle zum Startpunkt zurueck, um nachzutanken
- refuel()
- if turtle.getFuelLevel() < (x+y+z)+l*w then
- goHome("fuel")
- end
- end
- 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
- -- ueberprueft auch, ob das Inventar voll ist und gibt Items ab, wenn noetig
- if counter%16 == 0 then checkfuel() counter = 1
- else counter = counter+1 end
- moveForward()
- digDown()
- digUp()
- if isFull() then
- trashRemoval()
- if arr[1] >= 14 then goHome("full") end
- end
- end
- function Bore() -- bewegt die Turtle nach z = z0-3 (falls unregelmaessiger Bedrock)
- while z < z0-3 do
- while not turtle.down() do turtle.digDown() end
- z = z+1
- end
- end
- function moveY() -- baut eine Linie ab und verfolgt dabei den Standort und die Blickrichtung
- if y == 0 then
- while y < l-1 do
- if face == 0 then
- mine()
- elseif face == 1 or face == 2 then
- turn(-1)
- else turn(1)
- end
- end
- else
- while y > 0 do
- if face == 2 then
- mine()
- elseif face == 1 or face == 0 then
- turn(1)
- else turn(-1)
- end
- end
- end
- end
- function quarry() -- nutzt moveY, um ein Quadrat abzubauen
- refuel()
- for i=0,w-1 do
- moveY()
- if(i < w-1) then
- if(i%2 == 0) then
- turn(rev)
- else
- turn(-rev)
- end
- mine()
- end
- end
- end
- function Mastermind() -- fuehrt die anderen Funktionen in der richtigen Reihenfolge aus, um das benutzerdefinierte Gebiet abzubauen und gibt zurueck, wenn es fertig ist
- trashlist()
- refuel()
- if turtle.getFuelLevel() < 500 then
- print("Nicht genug Treibstoff, bitte fuege mehr Treibstoff hinzu")
- while turtle.getFuelLevel() < 500 do
- sleep(5)
- refuel()
- end
- end
- print(z)
- Bore()
- print(fin)
- for i=0,fin-3 do
- print(i)
- if i%3 == 0 then
- turtle.digUp()
- quarry()
- if(w%2 == 0) then
- rev=0-rev
- end
- trashRemoval()
- end
- if i < fin-3 then
- while not turtle.up() do turtle.digUp() end
- z=z-1
- end
- end
- trashRemoval()
- print("Arbeit erledigt")
- goHome("comp")
- end
- Mastermind() -- boese Lache
Advertisement
Add Comment
Please, Sign In to add comment