Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- pastebin get rncwTbUx SettingsManager
- local SETTINGS_LABEL = "Settings"
- local COORD_FILE = "initial_coords.txt"
- local TASK_FILE = "task_list.txt" -- zentrale Taskliste auf der Settings-Disk
- -- Funktion: Hole Disk-Laufwerk mit Label "Settings"
- function getSettingsDisk()
- for _, side in ipairs(peripheral.getNames()) do
- if peripheral.getType(side) == "drive" then
- local disk = peripheral.wrap(side)
- if disk.getDiskLabel() == SETTINGS_LABEL then
- return disk, disk.getMountPath()
- end
- end
- end
- return nil, nil
- end
- -- Funktion: Überprüft, ob initial_coords.txt bereits existiert
- function coordsFileExists()
- local _, path = getSettingsDisk()
- if not path then return false end
- return fs.exists(fs.combine(path, COORD_FILE))
- end
- -- Funktion: Fragt den Nutzer nach einer Koordinate (in Form "x y z")
- function askForCoords(promptText)
- while true do
- print(promptText)
- local input = read()
- local x, y, z = input:match("(-?%d+)%s+(-?%d+)%s+(-?%d+)")
- if x and y and z then
- return tonumber(x), tonumber(y), tonumber(z)
- else
- print("Ungültiges Format. Bitte erneut eingeben als: x y z")
- end
- end
- end
- -- Funktion: Speichert die beiden Koordinaten in initial_coords.txt
- function saveInitialCoords(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4, x5, y5, z5)
- local _, path = getSettingsDisk()
- if not path then error("Settings-Disk nicht gefunden!") end
- local fullPath = fs.combine(path, COORD_FILE)
- local file = fs.open(fullPath, "w")
- file.writeLine(string.format("%d,%d,%d", x1, y1, z1))
- file.writeLine(string.format("%d,%d,%d", x2, y2, z2))
- file.writeLine(string.format("%d,%d,%d", x3, y3, z3))
- file.writeLine(string.format("%d,%d,%d", x4, y4, z4))
- file.writeLine(string.format("%d,%d,%d", x5, y5, z5))
- file.close()
- print("Koordinaten erfolgreich gespeichert.")
- end
- -- Funktion: Lädt Taskliste von Disk
- function loadTaskList(filePath)
- if not fs.exists(filePath) then return {} end
- local file = fs.open(filePath, "r")
- local content = file.readAll()
- file.close()
- local data = textutils.unserialize(content)
- return data or {}
- end
- -- Funktion: Fügt Task zur Liste hinzu und speichert sie wieder
- function appendTaskToList(filePath, taskData)
- local tasks = loadTaskList(filePath)
- table.insert(tasks, taskData)
- local file = fs.open(filePath, "w")
- file.write(textutils.serialize(tasks))
- file.close()
- print("Neuer Task wurde erfolgreich gespeichert.")
- end
- -- Neue Funktion: Liest die Koordinaten der Kistenreihe aus der Settings-Disk
- local function loadInitialCoords()
- local _, path = getSettingsDisk()
- if not path then error("Settings-Disk nicht gefunden!") end
- local fullPath = fs.combine(path, COORD_FILE)
- if not fs.exists(fullPath) then error("initial_coords.txt nicht gefunden!") end
- local file = fs.open(fullPath, "r")
- local coords = {}
- for i = 1, 2 do -- Nur die ersten zwei Zeilen (Kistenreihe)
- local line = file.readLine()
- local x, y, z = line:match("(-?%d+),(-?%d+),(-?%d+)")
- table.insert(coords, {x = tonumber(x), y = tonumber(y), z = tonumber(z)})
- end
- file.close()
- return coords[1], coords[2] -- Start, End
- end
- -- Neue Funktion: Validiert Kistenposition
- local function validateChestCoord(inputCoord, startCoord, endCoord)
- local dirX = endCoord.x - startCoord.x
- local dirZ = endCoord.z - startCoord.z
- local axis
- if dirX ~= 0 then
- axis = "x"
- elseif dirZ ~= 0 then
- axis = "z"
- else
- return false, "Ungültige Start-/Endkoordinaten: keine Richtung erkennbar."
- end
- local yModulo = startCoord.y % 7
- if inputCoord.y % 7 ~= yModulo then
- return false, string.format("Y-Koordinate muss y %% 7 == %d erfüllen.", yModulo)
- end
- if axis == "x" then
- if inputCoord.z % 4 ~= startCoord.z % 4 then
- return false, string.format("Z-Koordinate muss z %% 4 == %d erfüllen.", startCoord.z % 4)
- end
- if dirX > 0 and inputCoord.x < startCoord.x then
- return false, "X-Koordinate liegt hinter der Startposition."
- elseif dirX < 0 and inputCoord.x > startCoord.x then
- return false, "X-Koordinate liegt hinter der Startposition."
- end
- if inputCoord.x % 12 ~= startCoord.x % 12 then
- return false, string.format("X-Koordinate muss x %% 12 == %d erfüllen.", startCoord.x % 12)
- end
- else -- z-Achse
- if inputCoord.x % 4 ~= startCoord.x % 4 then
- return false, string.format("X-Koordinate muss x %% 4 == %d erfüllen.", startCoord.x % 4)
- end
- if dirZ > 0 and inputCoord.z < startCoord.z then
- return false, "Z-Koordinate liegt hinter der Startposition."
- elseif dirZ < 0 and inputCoord.z > startCoord.z then
- return false, "Z-Koordinate liegt hinter der Startposition."
- end
- if inputCoord.z % 12 ~= startCoord.z % 12 then
- return false, string.format("Z-Koordinate muss z %% 12 == %d erfüllen.", startCoord.z % 12)
- end
- end
- return true
- end
- -- Neue Funktion: Fragt solange nach Position, bis valide
- local function askForValidChestPosition()
- local startCoord, endCoord = loadInitialCoords()
- while true do
- local x, y, z = askForCoords("Position der ersten Kiste eingeben (x y z):")
- local coord = {x = x, y = y, z = z}
- local isValid, msg = validateChestCoord(coord, startCoord, endCoord)
- if isValid then
- return x, y, z
- else
- print("Ungültige Eingabe: " .. msg)
- end
- end
- end
- -- Funktion: Wiederholt Menü für Task-Erstellung
- function showTaskMenu(filePath)
- while true do
- print()
- print("Was möchtest du tun?")
- print("[1] Kisten per Task erstellen lassen")
- print("[2] Bereits vorhandene Kisten initialisieren")
- print("[3] Bestandsaufnahme durchführen")
- print("[4] Beenden")
- write("Auswahl: ")
- local choice = read()
- if choice == "1" or choice == "2" then
- local x, y, z = askForValidChestPosition()
- local taskType = (choice == "1") and "create_chests" or "initialize_chests"
- local task = {
- taskType = taskType,
- x = x,
- y = y,
- z = z
- }
- appendTaskToList(filePath, task)
- elseif choice == "3" then
- local task = {
- taskType = "check_inventory"
- }
- appendTaskToList(filePath, task)
- elseif choice == "4" then
- print("Beende das Programm.")
- break
- else
- print("Ungültige Eingabe. Bitte wähle 1-4.")
- end
- end
- end
- -- === Hauptprogramm ===
- print("Starte Settings-Setup...")
- local _, path = getSettingsDisk()
- while not path do
- print("Warte auf eingelegte Settings-Disk...")
- sleep(1)
- _, path = getSettingsDisk()
- end
- local taskFilePath = fs.combine(path, TASK_FILE)
- if coordsFileExists() then
- print("initial_coords.txt existiert bereits.")
- else
- print("Keine initial_coords.txt gefunden. Bitte Kisten Koordinaten eingeben.")
- local x1, y1, z1 = askForCoords("Start-Koordinate eingeben (x y z):")
- local x2, y2, z2 = askForCoords("End-Koordinate eingeben (x y z):")
- print("\nBitte Finish Block festlegen.")
- local x3, y3, z3 = askForCoords("Finish-Koordinate eingeben (x y z):")
- print("\nBitte rechte Koordinate der Output Kiste eingeben.")
- local x4, y4, z4 = askForCoords("Output-Koordinaten eingeben (x y z):")
- print("\nBitte Koordinate der Kiste mit Abbauturtle für refuels eingeben.")
- local x5, y5, z5 = askForCoords("Refuel-Koordinaten eingeben (x y z):")
- print()
- print("Sollen die Kisten jetzt manuell erstellt werden oder per Task?")
- print("[1] Kisten existieren bereits")
- print("[2] Kisten sollen per Task erstellt werden")
- write("Auswahl (1 oder 2): ")
- local choice = read()
- if choice == "2" then
- local task = {
- taskType = "create_chests",
- x = x1,
- y = y1,
- z = z1
- }
- appendTaskToList(taskFilePath, task)
- else
- print("Kein Task erstellt. Es wird davon ausgegangen, dass die Kisten vorhanden sind.")
- end
- saveInitialCoords(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4, x5, y5, z5)
- end
- -- Starte interaktives Menü zur Erstellung weiterer Tasks
- showTaskMenu(taskFilePath)
Advertisement
Add Comment
Please, Sign In to add comment