Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- quarry.lua
- -- Mining Turtle Quarry Programm
- -- Kiste muss direkt hinter der Turtle stehen.
- -- Fuel muss in Slot 16 liegen.
- -- Slots 1-15 werden fuer Mining-Items genutzt.
- -- Slot 16 wird nie entleert.
- local FUEL_SLOT = 16
- local ITEM_SLOTS = 15
- -- Position:
- -- x = nach vorne
- -- y = nach rechts positiv, links negativ
- -- z = nach unten positiv
- local x, y, z = 0, 0, 0
- -- Richtung:
- -- 0 = vorne, 1 = rechts, 2 = hinten, 3 = links
- local dir = 0
- local sideSign = 1
- local length = 0
- local width = 0
- local depth = 0
- local function clear()
- term.clear()
- term.setCursorPos(1, 1)
- end
- local function askYesNo(text)
- while true do
- write(text .. " (j/n): ")
- local a = string.lower(read())
- if a == "j" or a == "ja" or a == "y" or a == "yes" then
- return true
- elseif a == "n" or a == "nein" or a == "no" then
- return false
- end
- print("Bitte j oder n eingeben.")
- end
- end
- local function askNumber(text, min)
- min = min or 1
- while true do
- write(text .. ": ")
- local n = tonumber(read())
- if n and n >= min and math.floor(n) == n then
- return n
- end
- print("Bitte eine ganze Zahl >= " .. min .. " eingeben.")
- end
- end
- local function askSide()
- while true do
- write("Soll die Turtle nach rechts oder links erweitern? (r/l): ")
- local s = string.lower(read())
- if s == "r" or s == "rechts" then
- return 1
- elseif s == "l" or s == "links" then
- return -1
- end
- print("Bitte r oder l eingeben.")
- end
- end
- local function fuelLevel()
- return turtle.getFuelLevel()
- end
- local function needFuel()
- local level = fuelLevel()
- return level ~= "unlimited" and level <= 2
- end
- local function refuelFromSlot16()
- if fuelLevel() == "unlimited" then
- return true
- end
- turtle.select(FUEL_SLOT)
- if turtle.getItemCount(FUEL_SLOT) <= 0 then
- return false
- end
- local ok = turtle.refuel(1)
- return ok
- end
- local function ensureFuel()
- if fuelLevel() == "unlimited" then
- return
- end
- while needFuel() do
- local ok = refuelFromSlot16()
- if not ok then
- print("")
- print("Nicht genug Fuel in Slot 16.")
- print("Lege Fuel in Slot 16 und druecke Enter.")
- read()
- end
- end
- end
- local function turnLeft()
- turtle.turnLeft()
- dir = (dir + 3) % 4
- end
- local function turnRight()
- turtle.turnRight()
- dir = (dir + 1) % 4
- end
- local function turnTo(target)
- while dir ~= target do
- local diff = (target - dir) % 4
- if diff == 1 then
- turnRight()
- elseif diff == 3 then
- turnLeft()
- else
- turnRight()
- turnRight()
- end
- end
- end
- local function updateForwardPos()
- if dir == 0 then
- x = x + 1
- elseif dir == 1 then
- y = y + 1
- elseif dir == 2 then
- x = x - 1
- elseif dir == 3 then
- y = y - 1
- end
- end
- local function safeDig()
- while turtle.detect() do
- turtle.dig()
- sleep(0.2)
- end
- end
- local function safeDigUp()
- while turtle.detectUp() do
- turtle.digUp()
- sleep(0.2)
- end
- end
- local function safeDigDown()
- while turtle.detectDown() do
- turtle.digDown()
- sleep(0.2)
- end
- end
- local function forward()
- ensureFuel()
- while not turtle.forward() do
- safeDig()
- turtle.attack()
- sleep(0.2)
- end
- updateForwardPos()
- end
- local function up()
- ensureFuel()
- while not turtle.up() do
- safeDigUp()
- turtle.attackUp()
- sleep(0.2)
- end
- z = z - 1
- end
- local function down()
- ensureFuel()
- while not turtle.down() do
- safeDigDown()
- turtle.attackDown()
- sleep(0.2)
- end
- z = z + 1
- end
- local function moveX(targetX)
- while x < targetX do
- turnTo(0)
- forward()
- end
- while x > targetX do
- turnTo(2)
- forward()
- end
- end
- local function moveY(targetY)
- while y < targetY do
- turnTo(1)
- forward()
- end
- while y > targetY do
- turnTo(3)
- forward()
- end
- end
- local function moveZ(targetZ)
- while z < targetZ do
- down()
- end
- while z > targetZ do
- up()
- end
- end
- local function goTo(tx, ty, tz)
- -- Erst vertikal, dann horizontal.
- -- Beim Mining von oben nach unten ist der Weg nach oben bereits frei.
- moveZ(tz)
- moveX(tx)
- moveY(ty)
- end
- local function inventoryAlmostFull()
- local emptySlots = 0
- local totalSpace = 0
- for i = 1, ITEM_SLOTS do
- local count = turtle.getItemCount(i)
- local space = turtle.getItemSpace(i)
- if count == 0 then
- emptySlots = emptySlots + 1
- end
- totalSpace = totalSpace + space
- end
- -- "Langsam voll": nur noch 1 leerer Slot oder weniger als 64 Platz.
- return emptySlots <= 1 or totalSpace < 64
- end
- local function dropIntoChest()
- turnTo(2) -- Kiste ist hinter Startposition
- for i = 1, ITEM_SLOTS do
- turtle.select(i)
- while turtle.getItemCount(i) > 0 do
- local ok = turtle.drop()
- if not ok then
- print("")
- print("Kiste scheint voll oder nicht erreichbar zu sein.")
- print("Leere die Kiste und druecke Enter.")
- read()
- end
- end
- end
- turtle.select(1)
- turnTo(0)
- end
- local function returnHomeAndUnload()
- local sx, sy, sz, sd = x, y, z, dir
- print("Inventar fast voll. Fahre zur Kiste...")
- goTo(0, 0, 0)
- dropIntoChest()
- print("Fahre zurueck zur letzten Position...")
- goTo(sx, sy, sz)
- turnTo(sd)
- end
- local function maybeUnload()
- if inventoryAlmostFull() then
- returnHomeAndUnload()
- end
- end
- local function checkChestBehind()
- local oldDir = dir
- turnTo(2)
- local hasBlock = turtle.detect()
- turnTo(oldDir)
- if not hasBlock then
- print("")
- print("Warnung: Hinter der Turtle wurde kein Block erkannt.")
- print("Wenn dort keine Kiste steht, kann die Turtle nicht entleeren.")
- return askYesNo("Trotzdem starten")
- end
- return true
- end
- local function initialRefuel()
- turtle.select(FUEL_SLOT)
- if fuelLevel() ~= "unlimited" then
- print("Fuel-Level vor dem Auftanken: " .. tostring(fuelLevel()))
- if turtle.getItemCount(FUEL_SLOT) <= 0 then
- print("Slot 16 ist leer.")
- return false
- end
- -- Nicht alles verbrennen, sondern erstmal einen Teil.
- -- Danach wird bei Bedarf automatisch weiter refuelt.
- for i = 1, 8 do
- if turtle.getItemCount(FUEL_SLOT) > 1 and fuelLevel() < 500 then
- turtle.refuel(1)
- end
- end
- print("Fuel-Level nach dem Auftanken: " .. tostring(fuelLevel()))
- else
- print("Fuel ist unlimited.")
- end
- turtle.select(1)
- return true
- end
- local function mineCurrentSpot()
- -- Zusatznutzen:
- -- Raeumt oben/unten mit weg, falls Hoehlen, Kies, Gravel usw. stoeren.
- -- Der eigentliche Quader entsteht durch die Bewegung der Turtle.
- safeDigUp()
- safeDigDown()
- end
- local function quarry()
- local sweepForward = true
- for level = 0, depth - 1 do
- print("Ebene " .. (level + 1) .. " von " .. depth)
- if level > 0 then
- -- Eine Ebene tiefer gehen.
- down()
- maybeUnload()
- end
- local yStart, yEnd, yStep
- if level % 2 == 0 then
- yStart = 0
- yEnd = width - 1
- yStep = 1
- else
- yStart = width - 1
- yEnd = 0
- yStep = -1
- end
- local yi = yStart
- while true do
- local targetY = yi * sideSign
- moveY(targetY)
- maybeUnload()
- if sweepForward then
- for tx = 1, length do
- goTo(tx, targetY, level)
- mineCurrentSpot()
- maybeUnload()
- end
- else
- for tx = length, 1, -1 do
- goTo(tx, targetY, level)
- mineCurrentSpot()
- maybeUnload()
- end
- end
- sweepForward = not sweepForward
- if yi == yEnd then
- break
- end
- yi = yi + yStep
- end
- end
- print("Quader fertig. Fahre zur Kiste...")
- goTo(0, 0, 0)
- dropIntoChest()
- print("Fertig! Alle Items aus Slots 1-15 wurden entleert.")
- end
- -- START
- clear()
- print("=== Mining Turtle Quarry ===")
- print("Die Turtle muss nach vorne in den Mining-Bereich schauen.")
- print("Die Kiste muss direkt hinter der Turtle stehen.")
- print("Fuel muss in Slot 16 liegen.")
- print("Slots 1-15 werden fuer Items genutzt.")
- print("")
- if not askYesNo("Steht die Kiste direkt hinter der Turtle") then
- print("Bitte Kiste hinter die Turtle stellen und Programm neu starten.")
- return
- end
- if not askYesNo("Ist Fuel in Slot 16 der Turtle") then
- print("Bitte Fuel in Slot 16 legen und Programm neu starten.")
- return
- end
- if not checkChestBehind() then
- print("Abbruch.")
- return
- end
- if not initialRefuel() then
- print("Kein Fuel in Slot 16 gefunden. Abbruch.")
- return
- end
- print("")
- length = askNumber("Wie viele Bloecke nach vorne soll gearbeitet werden", 1)
- sideSign = askSide()
- width = askNumber("Wie viele Bloecke breit in diese Richtung", 1)
- depth = askNumber("Wie viele Bloecke nach unten", 1)
- print("")
- print("Einstellungen:")
- print("Laenge nach vorne: " .. length)
- print("Breite: " .. width .. " nach " .. (sideSign == 1 and "rechts" or "links"))
- print("Tiefe: " .. depth)
- print("")
- if not askYesNo("Starten") then
- print("Abbruch.")
- return
- end
- quarry()
Add Comment
Please, Sign In to add comment