local rs = require('libs/rs') local MAIN_DELAY_ON = 0.25 local MAIN_DELAY_OFF = 0.10 local SECONDARY_DELAY_ON = 1.25 local SECONDARY_DELAY_OFF = 0.5 local MAIN_INPUT_SIDE = 'top' local MAIN_OUTPUT_SIDE = 'left' local SECONDARY_INPUT_SIDE = 'back' local SECONDARY_OUTPUT_SIDE = 'front' local VERSION = '1.1.1' local function getMainColorsOrder() return { colors.white, colors.orange, colors.magenta, colors.lightBlue, colors.yellow, colors.lime, colors.pink, colors.gray, colors.lightGray, colors.cyan, colors.purple, colors.blue, colors.brown, colors.green, colors.red, colors.black } end local function getSecondaryColorsOrder() return { colors.white, colors.orange, colors.magenta } end local function switchOnLight(bundledOutput, colorsOrder, sleepTime) if sleepTime <= 0 then bundledOutput.setColorState(colors.combine(table.unpack(colorsOrder))) return end for _, color in pairs(colorsOrder) do bundledOutput.setOn(color) os.sleep(sleepTime) end end local function switchOffLight(bundledOutput, colorsOrder, sleepTime) if sleepTime <= 0 then bundledOutput.setColorState(0) return end for _, color in pairs(colorsOrder) do bundledOutput.setOff(color) os.sleep(sleepTime) end end local function applyCommand(bundledOutput, loopQueue, colorsOrder, delayOn, delayOff) local nextState = table.remove(loopQueue, 1) if nextState == nil then return end if nextState then switchOnLight(bundledOutput, colorsOrder, delayOn) else switchOffLight(bundledOutput, colorsOrder, delayOff) end return applyCommand(bundledOutput, loopQueue, colorsOrder, delayOn, delayOff) end local function createLoop(side, eventName, loopQueue, colorsOrder, delayOn, delayOff) local bundledOutput = rs.createBundledOutput(side) return function() while true do os.pullEvent(eventName) applyCommand(bundledOutput, loopQueue, colorsOrder, delayOn, delayOff) end end end local function createRedstoneLoop(mainLoopQueue, secondaryLoopQueue) local mainState = nil local secondaryState = nil return function() while true do local newMainState = redstone.getInput(MAIN_INPUT_SIDE) local newSecondaryState = redstone.getInput(SECONDARY_INPUT_SIDE) if mainState ~= newMainState then mainState = newMainState table.insert(mainLoopQueue, newMainState) os.queueEvent('light_command_main', newMainState) end if secondaryState ~= newSecondaryState then secondaryState = newSecondaryState table.insert(secondaryLoopQueue, newSecondaryState) os.queueEvent('light_command_secondary', newSecondaryState) end os.pullEvent('redstone') end end end local mainLoopQueue = {} local secondaryLoopQueue = {} local mainLoop = createLoop(MAIN_OUTPUT_SIDE, 'light_command_main', mainLoopQueue, getMainColorsOrder(), MAIN_DELAY_ON, MAIN_DELAY_OFF) local secondaryLoop = createLoop(SECONDARY_OUTPUT_SIDE, 'light_command_secondary', secondaryLoopQueue, getSecondaryColorsOrder(), SECONDARY_DELAY_ON, SECONDARY_DELAY_OFF) local redstoneLoop = createRedstoneLoop(mainLoopQueue, secondaryLoopQueue) print('> Starting light server v' .. VERSION) parallel.waitForAny(mainLoop, secondaryLoop, redstoneLoop)