minecraft-cc-tools/light-server.lua

130 lines
3.3 KiB
Lua

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)