CCCPaste

Porta treni con lista


local allowedFile = "allowed_users"

-- Colori RS Latch
local COLOR_APERTO = colors.green
local COLOR_CHIUSO = colors.red

-- Funzione XOR di criptazione
local function xorCrypt(str, key)
    local res = {}
    for i = 1, #str do
        local k = string.byte(key, ((i - 1) % #key) + 1)
        local c = string.byte(str, i)
        table.insert(res, string.char(bit.bxor(c, k)))
    end
    return table.concat(res)
end

-- Carica utenti autorizzati
local function loadAllowed()
    if not fs.exists(allowedFile) then return {} end
    local f = fs.open(allowedFile, "r")
    local enc = f.readAll()
    f.close()
    local dec = xorCrypt(enc, "passwordchiave")
    local t = textutils.unserialize(dec)
    return t or {}
end

-- Legge stato dal latch
local function leggiStato()
    local bund = redstone.getBundledInput("bottom") 
    if bit.band(bund, COLOR_APERTO) ~= 0 then
        return true
    elseif bit.band(bund, COLOR_CHIUSO) ~= 0 then
        return false
    else
        return true
    end
end

-- Imposta latch
local function impostaStato(nuovoStato)
    if nuovoStato then
        redstone.setBundledOutput("bottom", COLOR_APERTO)
    else
        redstone.setBundledOutput("bottom", COLOR_CHIUSO)
    end
    sleep(0.2)
    redstone.setBundledOutput("bottom", 0) -- reset segnali
end

-- Animazione apertura/chiusura
local function movimento(stato)
    if stato then
        -- CHIUDO
        redstone.setBundledOutput("bottom", colors.magenta)
        sleep(0.2)
        for i = 0, 2 do
            redstone.setBundledOutput("top", colors.white)
            sleep(1)
            redstone.setBundledOutput("top", 0)
            print("abbasso")
            sleep(0.1)
        end
        redstone.setBundledOutput("bottom", 0)
    else
        -- APRO
        for i = 0, 2 do
                redstone.setBundledOutput("top", colors.lightBlue)
                sleep(1)
                redstone.setBundledOutput("top", 0)
                print("alzo")
                sleep(0.2)
            end
            redstone.setBundledOutput("bottom", colors.blue)
            sleep(0.2)
            redstone.setBundledOutput("bottom", 0)
    end
end

-- MAIN LOOP
local allowed = loadAllowed()
local stato = leggiStato()

print("Sistema avviato. Stato iniziale: ", stato and "APERTO" or "CHIUSO")

while true do
    local event, user = os.pullEvent("player")
    for _, name in ipairs(allowed) do
        if user == name then
            stato = not stato
            movimento(stato)
            impostaStato(stato)
            print("Nuovo stato: ", stato and "APERTO" or "CHIUSO")
        end
    end
end