Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Doors control
- local sides = require('sides')
- local image = require("image")
- local GUI = require("GUI")
- local redstone = require('component').redstone
- local event = require('event')
- local modem = require('component').modem
- local ser = require('serialization')
- local fs = require('filesystem')
- local pathToConfig = '/doors.cfg'
- local settings = {}
- local isOpen = false
- modem.open(1)
- ------------------------------------------------------------------------------------------
- local mainContainer = GUI.fullScreenContainer()
- mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))
- local layout = mainContainer:addChild(GUI.layout(1, 1, mainContainer.width, mainContainer.height, 5, 3))
- local lblTitleBar = layout:setPosition(3, 1, layout:addChild(GUI.text(1, 1, 0xFFFFFF, "Doors Control Client 1.0")))
- local lblStatusInfo = layout:setPosition(3, 1, layout:addChild(GUI.text(1, 1, 0xFF00FF, "<placeholder text>")))
- layout:setPosition(2, 2, layout:addChild(GUI.text(1, 1, 0x00CCFF, "Door Name")))
- local lblDoorName = layout:setPosition(3, 2, layout:addChild(GUI.text(1, 1, 0x0011FF, "<placeholder text>")))
- layout:setPosition(2, 2, layout:addChild(GUI.text(1, 1, 0x00CCFF, "Door Side")))
- local lblDoorSide = layout:setPosition(3, 2, layout:addChild(GUI.text(1, 1, 0x0011FF, "<placeholder text>")))
- layout:setPosition(2, 2, layout:addChild(GUI.text(1, 1, 0x00CCFF, "Door Locked")))
- local lblDoorLocked = layout:setPosition(3, 2, layout:addChild(GUI.text(1, 1, 0x0011FF, "<placeholder text>")))
- local txtStatus = layout:setPosition(3, 3, layout:addChild(GUI.textBox(2, 2, 32, 1, 0xEEEEEE, 0x2D2D2D, {}, 1, 1, 0)))
- ------------------------------------------------------------------------------------------
- function populateSettings()
- --print(settings.doorname)
- --print(settings.doorside)
- print(settings.doorlocked)
- print(settings.server_address)
- lblDoorName.text = settings.doorname
- lblDoorSide.text = sides[settings.doorside]
- settings.configured = true-- Doors control
- if settings.doorlocked then
- lblDoorLocked.text = "Yes"
- else
- lblDoorLocked.text = "No"
- end
- --table.insert(txtStatus.lines, {text = "Connected to server at "..settings.server_address, color=0x880000})
- handleEvents()
- end
- ------------------------------------------------------------------------------------------
- function sendSettings()
- modem.send(settings.server_address, 1, ser.serialize({command="setdoor", settings=settings}))
- end
- ------------------------------------------------------------------------------------------
- local function showSetup()
- local container = GUI.addBackgroundContainer(mainContainer, true, true, "Initialize Door")
- container.layout:addChild(GUI.text(1, 1, 25, 1, 0xFFFFFF, "Server: "..settings.server_address))
- local txtDoorName = container.layout:addChild(GUI.input(1, 1, 25, 3, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", "Door Name"))
- cmbDoorSide = container.layout:addChild(GUI.comboBox(1, 5, 25, 3, 0xEEEEEE, 0x2D2D2D, 0xCCCCCC, 0x888888))
- local btnAddDoor = container.layout:addChild(GUI.button(1, 8, 25, 3, 0xEEEEEE, 0x2D2D2D, 0xCCCCCC, 0x888888, "+Door"))
- btnAddDoor.onTouch = function()
- settings.doorname = txtDoorName.text
- populateSettings()
- sendSettings()
- container:remove()
- end
- settings.locked = false -- because this can only be set from the server
- settings.doorside = sides.top
- cmbDoorSide:addItem("top").onTouch = function()
- settings.doorside = sides.top
- end
- cmbDoorSide:addItem("bottom").onTouch = function()
- settings.doorside = sides.bottom
- end
- cmbDoorSide:addItem("north").onTouch = function()
- settings.doorside = sides.north
- end
- cmbDoorSide:addItem("south").onTouch = function()
- settings.doorside = sides.south
- end
- cmbDoorSide:addItem("east").onTouch = function()
- settings.doorside = sides.east
- end
- cmbDoorSide:addItem("west").onTouch = function()
- settings.doorside = sides.west
- end
- end
- ------------------------------------------------------------------------------------------
- local function saveConfig()
- local file = io.open(pathToConfig, 'w')
- file:write(ser.serialize(settings))
- file:close()
- end
- ------------------------------------------------------------------------------------------
- local function loadConfig()
- if fs.exists(pathToConfig) then
- local file = io.open(pathToConfig, "r")
- settings = ser.unserialize(file:read("*a"))
- file:close()
- populateSettings()
- else
- settings = {}
- fs.makeDirectory(fs.path(pathToConfig))
- -- Do the modem broadcast, which will tell us if we have already setup this computer
- -- and return the configuration
- modem.broadcast(1, ser.serialize({command="discovery"}))
- -- In this case, we are going to wait for the modem event
- _, _, sender, _, _, msg = event.pull('modem_message')
- -- deserialize the modem message
- local _msg = ser.unserialize(msg)
- print (_msg)
- if _msg.command == "discresponse" then
- settings = _msg.settings
- if settings.configured == false then
- showSetup()
- end
- end
- end
- end
- ------------------------------------------------------------------------------------------
- function handleEvents()
- event.listen('modem_message', function(e, _, sender, _, _, msg)
- local _msg = ser.unserialize(msg)
- if sender == settings.server_address then
- -- deconstruct the message
- if _msg.command == "open" then
- redstone.setOutput(settings.doorside, 15)
- event.timer(1, function()
- redstone.setOutput(settings.doorside, 0)
- end)
- end
- end
- end)
- event.listen('motion', function(e, _, _, _, _, player)
- -- There is an entity near the motion sensor, see if we can open the door
- modem.send(settings.server_address, 1, ser.serialize({command="request", }))
- end)
- end
- ------------------------------------------------------------------------------------------
- loadConfig()
- mainContainer:drawOnScreen(true)
- mainContainer:startEventHandling()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement