Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Programm: Gatekeeper
- -- Verhindert Terminierung durch Strg+T
- os.pullEvent = os.pullEventRaw
- -- KONFIGURATION
- local allowedIDs = { 5, 12, 18 }
- local playerFile = "players.txt"
- local range = 10
- local openDuration = 10
- -- STATUS-VARIABLEN
- local lastHardwareState = nil
- local lastPlayerString = "" -- Speichert die letzte Liste der Spieler
- -- 1. SPIELERLISTE LADEN
- local function getAllowedPlayers()
- local players = {}
- if fs.exists(playerFile) then
- local file = fs.open(playerFile, "r")
- local line = file.readLine()
- while line do
- players[line] = true
- line = file.readLine()
- end
- file.close()
- end
- return players
- end
- local allowedPlayers = getAllowedPlayers()
- -- 2. FUNKTION: DISPLAY AKTUALISIEREN
- local function updateDisplay(nearbyAllowed)
- -- Erstellt einen String aus der Tabelle (z.B. "Spieler1, Spieler2")
- table.sort(nearbyAllowed) -- Sortieren fuer konsistente Anzeige
- local currentString = table.concat(nearbyAllowed, ", ")
- -- Nur aktualisieren, wenn sich die Liste geaendert hat
- if currentString ~= lastPlayerString then
- -- Zeile 5 im Terminal loeschen und neu schreiben
- term.setCursorPos(1, 5)
- term.clearLine()
- if currentString == "" then
- print("Status: Kein autorisierter Spieler in Reichweite.")
- else
- print("Autorisierte Personen: " .. currentString)
- end
- lastPlayerString = currentString
- end
- end
- -- 3. HAUPTSCHLEIFE
- term.clear()
- term.setCursorPos(1,1)
- print("=== GATEKEEPER SYSTEM ===")
- print("-------------------------")
- while true do
- local modem = peripheral.find("modem")
- local detector = peripheral.find("playerDetector")
- local hardwareOk = (modem ~= nil and detector ~= nil)
- -- Hardware-Status Meldungen
- if hardwareOk ~= lastHardwareState then
- term.setCursorPos(1, 3)
- term.clearLine()
- if not hardwareOk then
- redstone.setOutput("back", false)
- print("Hardware-Fehler! Suche Module...")
- lastPlayerString = "RESET" -- Anzeige-Reset erzwingen
- else
- rednet.open(peripheral.getName(modem))
- print("Hardware OK. System aktiv.")
- end
- lastHardwareState = hardwareOk
- end
- if hardwareOk then
- -- SCANNEN NACH SPIELERN
- local allNearby = detector.getPlayersInRange(range)
- local nearbyAllowed = {}
- for _, name in ipairs(allNearby) do
- if allowedPlayers[name] then
- table.insert(nearbyAllowed, name)
- end
- end
- -- Display-Update aufrufen
- updateDisplay(nearbyAllowed)
- -- Auf Befehle warten (kurzer Timeout)
- local senderID, message = rednet.receive(0.5)
- if senderID and message then
- local idKnown = false
- for _, id in ipairs(allowedIDs) do
- if senderID == id then idKnown = true break end
- end
- if idKnown then
- if message == "open" then
- -- Pruefen ob mindestens einer aus der Liste da ist
- if #nearbyAllowed > 0 then
- term.setCursorPos(1, 7)
- print("[" .. os.date("%H:%M") .. "] Zugriff durch ID " .. senderID)
- redstone.setOutput("back", true)
- sleep(openDuration)
- redstone.setOutput("back", false)
- else
- term.setCursorPos(1, 7)
- term.clearLine()
- print("[" .. os.date("%H:%M") .. "] ID " .. senderID .. ": Kein Spieler nah.")
- end
- elseif message == "edit" then
- term.clear()
- print("Edit-Modus aktiviert.")
- redstone.setOutput("back", true)
- return
- end
- end
- end
- else
- sleep(5)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment