minecraft-cc-tools/light-server.lua
2024-05-28 01:11:48 +02:00

120 lines
2.8 KiB
Lua

local rs = require('libs/rs.lua')
local MAIN_DELAY_ON = 0.25
local MAIN_DELAY_OFF = 0
local SECONDARY_DELAY_ON = 0.75
local SECONDARY_DELAY_OFF = 0.25
local MAIN_INPUT_SIDE = 'top'
local MAIN_OUTPUT_SIDE = 'left'
local SECONDARY_INPUT_SIDE = 'back'
local SECONDARY_OUTPUT_SIDE = 'front'
local VERSION = '1.0.0'
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 mainLoop()
local mainOutput = rs.createBundledOutput(MAIN_OUTPUT_SIDE)
local secondaryOutput = rs.createBundledOutput(SECONDARY_OUTPUT_SIDE)
local mainColorsOrder = getMainColorsOrder()
local secondaryColorsOrder = getSecondaryColorsOrder()
while true do
local _, typeOfRoom, lightIsOn = os.pullEvent('light_command')
if typeOfRoom == 'main' then
if lightIsOn then
switchOnLight(mainOutput, mainColorsOrder, MAIN_DELAY_ON)
else
switchOffLight(mainOutput, mainColorsOrder, MAIN_DELAY_OFF)
end
elseif typeOfRoom == 'secondary' then
if lightIsOn then
switchOnLight(secondaryOutput, secondaryColorsOrder, SECONDARY_DELAY_ON)
else
switchOffLight(secondaryOutput, secondaryColorsOrder, SECONDARY_DELAY_OFF)
end
else
error('unknown type of room "' .. tostring(typeOfRoom) .. '"', 0)
end
end
end
local function redstoneLoop()
local mainState = nil
local secondaryState = nil
while true do
local newMainState = redstone.getInput(MAIN_INPUT_SIDE)
local newSecondaryState = redstone.getInput(SECONDARY_INPUT_SIDE)
if mainState ~= newMainState then
mainState = newMainState
os.queueEvent('light_command', 'main', newMainState)
end
if secondaryState ~= newSecondaryState then
secondaryState = newSecondaryState
os.queueEvent('light_command', 'secondary', newSecondaryState)
end
os.pullEvent('redstone')
end
end
print('> Starting light server v' .. VERSION)
parallel.waitForAny(mainLoop, redstoneLoop)