mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 11:09:21 +01:00
263 lines
7.6 KiB
Lua
263 lines
7.6 KiB
Lua
local c = require("component")
|
||
local computer = require("computer")
|
||
local event = require("event")
|
||
local ecs = require("ECSAPI")
|
||
local colors = require("colors")
|
||
local sides = require("sides")
|
||
local config = require("config")
|
||
local fs = require("filesystem")
|
||
local rs = c.redstone
|
||
local gpu = c.gpu
|
||
local modem = c.modem
|
||
|
||
modem.open(512)
|
||
|
||
---------------------------------------------------------------------
|
||
|
||
local pathToWhitelist = "System/Home/whitelist.txt"
|
||
local pathToDoors = "System/Home/doors.txt"
|
||
|
||
local whitelist
|
||
local doors
|
||
|
||
if not fs.exists(pathToWhitelist) then
|
||
fs.makeDirectory(fs.path(pathToWhitelist))
|
||
config.write(pathToWhitelist, "Igor_Timofeev", "owner")
|
||
end
|
||
|
||
if not fs.exists(pathToDoors) then
|
||
config.write(pathToDoors, "3b1ea", colors.lightblue)
|
||
config.write(pathToDoors, "9d482", colors.yellow)
|
||
doors = config.readAll(pathToDoors)
|
||
end
|
||
|
||
whitelist = config.readAll(pathToWhitelist)
|
||
doors = config.readAll(pathToDoors)
|
||
|
||
------------------------------------------------------------------------
|
||
|
||
local redstoneSide = sides.bottom
|
||
|
||
local xScale, yScale = 40, 20
|
||
local xSize, ySize = gpu.getResolution()
|
||
|
||
local doorTimer = 3
|
||
|
||
local buttons = {{false, 0x444444, colors.lightblue}, {false, 0x444444, colors.black}, {false, 0x444444, colors.brown}, {true, ecs.colors.green, colors.pink}, {true, ecs.colors.green, colors.red}, {true, ecs.colors.green, colors.orange}}
|
||
|
||
local killWireColor = colors.blue
|
||
|
||
---------------------------------------
|
||
|
||
local obj = {}
|
||
local function newObj(class, name, ...)
|
||
obj[class] = obj[class] or {}
|
||
obj[class][name] = {...}
|
||
end
|
||
|
||
local function getScreens()
|
||
local list = c.list()
|
||
local screens = {}
|
||
for key, val in pairs(list) do
|
||
if val == "screen" then
|
||
screens[key] = {val, c.isPrimary(key)}
|
||
end
|
||
end
|
||
return screens
|
||
end
|
||
|
||
local function clearMonitor(backColor, frontColor, text)
|
||
gpu.setBackground(backColor)
|
||
local xSize, ySize = gpu.getResolution()
|
||
gpu.fill(1, 1, xSize, ySize, " ")
|
||
gpu.setForeground(frontColor)
|
||
ecs.centerText("xy", 1, text)
|
||
end
|
||
|
||
local screens = getScreens()
|
||
local primaryScreen = c.getPrimary("screen").address
|
||
|
||
local function bind(address)
|
||
if address then
|
||
gpu.bind(address)
|
||
gpu.setResolution(xScale, yScale)
|
||
else
|
||
gpu.bind(primaryScreen)
|
||
gpu.setResolution(xSize, ySize)
|
||
end
|
||
end
|
||
|
||
local function checkNick(nick)
|
||
for key, val in pairs(whitelist) do
|
||
if key == nick then return true end
|
||
end
|
||
return false
|
||
end
|
||
|
||
--DOORS
|
||
|
||
local function door(which, open)
|
||
|
||
local color = 0
|
||
local address
|
||
for key, val in pairs(doors) do
|
||
address = c.get(key, "screen")
|
||
if address == which then
|
||
color = tonumber(val)
|
||
break
|
||
end
|
||
end
|
||
|
||
|
||
if open then
|
||
rs.setBundledOutput(redstoneSide, color, 100)
|
||
else
|
||
rs.setBundledOutput(redstoneSide, color, 0)
|
||
end
|
||
end
|
||
|
||
local function openAllDoors(open)
|
||
local color
|
||
for key, val in pairs(doors) do
|
||
color = tonumber(val)
|
||
if open then
|
||
rs.setBundledOutput(redstoneSide, color, 100)
|
||
else
|
||
rs.setBundledOutput(redstoneSide, color, 0)
|
||
end
|
||
end
|
||
end
|
||
|
||
local function mini()
|
||
clearMonitor(0xffffff, 0x444444, "Приложите палец для идентификации")
|
||
end
|
||
|
||
local function infa()
|
||
gpu.setBackground(0xffffff)
|
||
gpu.setForeground(0x444444)
|
||
|
||
local yPos = ySize - 3
|
||
if c.isAvailable("mfsu") then ecs.centerText("x", yPos, "Заряд МФСУ: "..c.mfsu.getStored()); yPos = yPos + 1 end
|
||
if c.isAvailable("reactor") then ecs.centerText("x", yPos, "Нагрев реактора: "..math.ceil(c.reactor.getHeat() / c.reactor.getMaxHeat() * 100).."%"); yPos = yPos + 1 end
|
||
if c.isAvailable("reactor_chamber") then ecs.centerText("x", yPos, "Нагрев реактора: "..math.ceil(c.reactor_chamber.getHeat() / c.reactor_chamber.getMaxHeat() * 100).."%"); yPos = yPos + 1 end
|
||
end
|
||
|
||
local function main()
|
||
gpu.setBackground(0xffffff)
|
||
gpu.fill(1, 1, xSize, ySize, " ")
|
||
|
||
local yCenter = math.floor(ySize / 2)
|
||
local yPos = yCenter - 12
|
||
newObj("buttons", 1, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Открыть двери", buttons[1][2] or 0x444444, 0xffffff)); yPos = yPos + 4
|
||
newObj("buttons", 2, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Фабрика материи", buttons[2][2] or 0x444444, 0xffffff)); yPos = yPos + 4
|
||
newObj("buttons", 3, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Управление реактором", buttons[3][2] or 0x444444, 0xffffff)); yPos = yPos + 4
|
||
newObj("buttons", 4, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Свет на втором этаже", buttons[4][2] or 0x444444, 0xffffff)); yPos = yPos + 4
|
||
newObj("buttons", 5, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Свет на первом этаже", buttons[5][2] or 0x444444, 0xffffff)); yPos = yPos + 4
|
||
newObj("buttons", 6, ecs.drawAdaptiveButton("auto", yPos, 3, 1, "Свет в шахте", buttons[6][2] or 0x444444, 0xffffff)); yPos = yPos + 4
|
||
|
||
infa()
|
||
end
|
||
|
||
local function redstoneRecontrol()
|
||
for i = 1, #buttons do
|
||
if buttons[i][1] then
|
||
rs.setBundledOutput(redstoneSide, buttons[i][3], 100)
|
||
else
|
||
rs.setBundledOutput(redstoneSide, buttons[i][3], 0)
|
||
end
|
||
end
|
||
end
|
||
|
||
local function killThemAll()
|
||
ecs.square(1, 1, xSize, ySize, 0xff0000)
|
||
gpu.setForeground(0xffffff)
|
||
ecs.centerText("xy", 1, "KILL THEM ALL!")
|
||
rs.setBundledOutput(redstoneSide, killWireColor, 100)
|
||
os.sleep(2)
|
||
rs.setBundledOutput(redstoneSide, killWireColor, 0)
|
||
main("Помещение очищено от всего живого.")
|
||
end
|
||
|
||
local function switchButton(key, buttonColor)
|
||
if buttons[key][1] then
|
||
buttons[key][1] = false
|
||
buttons[key][2] = 0x444444
|
||
else
|
||
buttons[key][1] = true
|
||
buttons[key][2] = buttonColor or ecs.colors.green
|
||
end
|
||
end
|
||
|
||
-----------------------------------------
|
||
|
||
main("Ничего интересного.")
|
||
|
||
for key, val in pairs(screens) do
|
||
if not val[2] then
|
||
bind(key)
|
||
mini()
|
||
bind()
|
||
end
|
||
end
|
||
|
||
while true do
|
||
local e = {event.pull()}
|
||
if e[1] == "touch" then
|
||
|
||
--ЕСЛИ КЛИКНУТО НА ГЛАВНОМ МОНИКЕ
|
||
if e[2] == primaryScreen then
|
||
for key, val in pairs(obj["buttons"]) do
|
||
if ecs.clickedAtArea(e[3], e[4], obj["buttons"][key][1], obj["buttons"][key][2], obj["buttons"][key][3], obj["buttons"][key][4]) then
|
||
local color
|
||
if key == 3 then color = ecs.colors.red end
|
||
switchButton(key, color)
|
||
main("Изменен параметр кнопки "..tostring(key).." на "..tostring(buttons[key][1]))
|
||
if key == 1 then
|
||
openAllDoors(buttons[key][1])
|
||
else
|
||
redstoneRecontrol()
|
||
end
|
||
break
|
||
end
|
||
end
|
||
|
||
--ЕСЛИ КЛИКНУТО НА КАКОМ-ТО ЛЕВОМ МОНИКЕ
|
||
else
|
||
bind(e[2])
|
||
|
||
if checkNick(e[6]) then
|
||
clearMonitor(0x44ff44, 0xffffff, "С возвращением, "..e[6].."!")
|
||
door(e[2], true)
|
||
os.sleep(doorTimer)
|
||
door(e[2], false)
|
||
mini()
|
||
bind()
|
||
main(e[6].." вернулся в нашу скромную обитель!")
|
||
else
|
||
clearMonitor(0xff0000, 0xffffff, "Недостойным дороги нет.")
|
||
bind()
|
||
killThemAll()
|
||
bind(e[2])
|
||
os.sleep(doorTimer)
|
||
mini()
|
||
bind()
|
||
main(e[6].." попытался зайти в дом. Убей его. Убей чужака!")
|
||
end
|
||
end
|
||
|
||
infa()
|
||
elseif e[1] == "modem_message" then
|
||
if e[6] == "killThemAll!" then
|
||
killThemAll()
|
||
elseif e[6] == "openAllDoors" then
|
||
switchButton(1)
|
||
openAllDoors(buttons[1][1])
|
||
main("Двери открыты!")
|
||
end
|
||
elseif e[1] == "key_down" then
|
||
if e[4] == 28 then
|
||
killThemAll()
|
||
end
|
||
end
|
||
end
|