Advertisement
klindley

Untitled

Aug 7th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.37 KB | None | 0 0
  1. -- Doors control
  2.  
  3. local sides = require('sides')
  4. local image = require("image")
  5. local GUI = require("GUI")
  6. local redstone = require('component').redstone
  7. local event = require('event')
  8. local modem = require('component').modem
  9. local ser = require('serialization')
  10. local fs = require('filesystem')
  11. local pathToConfig = '/doors.cfg'
  12. local settings = {}
  13.  
  14. local isOpen = false
  15. modem.open(1)
  16. ------------------------------------------------------------------------------------------
  17. local mainContainer = GUI.fullScreenContainer()
  18. mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))
  19.  
  20. local layout = mainContainer:addChild(GUI.layout(1, 1, mainContainer.width, mainContainer.height, 5, 3))
  21. local lblTitleBar = layout:setPosition(3, 1, layout:addChild(GUI.text(1, 1, 0xFFFFFF, "Doors Control Client 1.0")))
  22. local lblStatusInfo = layout:setPosition(3, 1, layout:addChild(GUI.text(1, 1, 0xFF00FF, "<placeholder text>")))
  23.  
  24. layout:setPosition(2, 2, layout:addChild(GUI.text(1, 1, 0x00CCFF, "Door Name")))
  25. local lblDoorName = layout:setPosition(3, 2, layout:addChild(GUI.text(1, 1, 0x0011FF, "<placeholder text>")))
  26.  
  27. layout:setPosition(2, 2, layout:addChild(GUI.text(1, 1, 0x00CCFF, "Door Side")))
  28. local lblDoorSide = layout:setPosition(3, 2, layout:addChild(GUI.text(1, 1, 0x0011FF, "<placeholder text>")))
  29.  
  30. layout:setPosition(2, 2, layout:addChild(GUI.text(1, 1, 0x00CCFF, "Door Locked")))
  31. local lblDoorLocked = layout:setPosition(3, 2, layout:addChild(GUI.text(1, 1, 0x0011FF, "<placeholder text>")))
  32.  
  33. local txtStatus = layout:setPosition(3, 3, layout:addChild(GUI.textBox(2, 2, 32, 1, 0xEEEEEE, 0x2D2D2D, {}, 1, 1, 0)))
  34.  
  35. ------------------------------------------------------------------------------------------
  36.  
  37. function populateSettings()
  38.     --print(settings.doorname)
  39.     --print(settings.doorside)
  40.     print(settings.doorlocked)
  41.     print(settings.server_address)
  42.     lblDoorName.text = settings.doorname
  43.     lblDoorSide.text = sides[settings.doorside]
  44.    
  45.     settings.configured = true-- Doors control
  46.  
  47.     if settings.doorlocked then
  48.         lblDoorLocked.text = "Yes"
  49.     else
  50.         lblDoorLocked.text = "No"
  51.     end
  52.  
  53.     --table.insert(txtStatus.lines, {text = "Connected to server at "..settings.server_address, color=0x880000})
  54.     handleEvents()
  55.  
  56. end
  57.  
  58. ------------------------------------------------------------------------------------------
  59.  
  60. function sendSettings()
  61.     modem.send(settings.server_address, 1, ser.serialize({command="setdoor", settings=settings}))
  62. end
  63.  
  64. ------------------------------------------------------------------------------------------
  65.  
  66. local function showSetup()
  67.     local container = GUI.addBackgroundContainer(mainContainer, true, true, "Initialize Door")
  68.     container.layout:addChild(GUI.text(1, 1, 25, 1, 0xFFFFFF, "Server: "..settings.server_address))
  69.    
  70.     local txtDoorName = container.layout:addChild(GUI.input(1, 1, 25, 3, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", "Door Name"))
  71.     cmbDoorSide = container.layout:addChild(GUI.comboBox(1, 5, 25, 3, 0xEEEEEE, 0x2D2D2D, 0xCCCCCC, 0x888888))
  72.     local btnAddDoor = container.layout:addChild(GUI.button(1, 8, 25, 3, 0xEEEEEE, 0x2D2D2D, 0xCCCCCC, 0x888888, "+Door"))
  73.     btnAddDoor.onTouch = function()
  74.         settings.doorname = txtDoorName.text
  75.         populateSettings()
  76.         sendSettings()
  77.         container:remove()
  78.     end
  79.  
  80.     settings.locked = false -- because this can only be set from the server
  81.     settings.doorside = sides.top
  82.  
  83.     cmbDoorSide:addItem("top").onTouch = function()
  84.         settings.doorside = sides.top
  85.     end
  86.     cmbDoorSide:addItem("bottom").onTouch = function()
  87.         settings.doorside = sides.bottom
  88.     end
  89.     cmbDoorSide:addItem("north").onTouch = function()
  90.         settings.doorside = sides.north
  91.     end
  92.     cmbDoorSide:addItem("south").onTouch = function()
  93.         settings.doorside = sides.south
  94.     end
  95.     cmbDoorSide:addItem("east").onTouch = function()
  96.         settings.doorside = sides.east
  97.     end
  98.     cmbDoorSide:addItem("west").onTouch = function()
  99.         settings.doorside = sides.west
  100.     end
  101.  
  102. end
  103.  
  104. ------------------------------------------------------------------------------------------
  105.  
  106. local function saveConfig()
  107.     local file = io.open(pathToConfig, 'w')
  108.  
  109.     file:write(ser.serialize(settings))
  110.     file:close()
  111.  
  112. end
  113.  
  114. ------------------------------------------------------------------------------------------
  115.  
  116. local function loadConfig()
  117.     if fs.exists(pathToConfig) then
  118.         local file = io.open(pathToConfig, "r")
  119.         settings = ser.unserialize(file:read("*a"))
  120.         file:close()
  121.         populateSettings()
  122.     else
  123.         settings = {}
  124.         fs.makeDirectory(fs.path(pathToConfig))
  125.         -- Do the modem broadcast, which will tell us if we have already setup this computer
  126.         -- and return the configuration
  127.         modem.broadcast(1, ser.serialize({command="discovery"}))
  128.         -- In this case, we are going to wait for the modem event
  129.         _, _, sender, _, _, msg = event.pull('modem_message')
  130.         -- deserialize the modem message
  131.         local _msg = ser.unserialize(msg)
  132.         print (_msg)
  133.         if _msg.command == "discresponse" then
  134.            
  135.             settings = _msg.settings
  136.             if settings.configured == false then
  137.                 showSetup()
  138.             end
  139.         end
  140.     end
  141.  
  142. end
  143.  
  144. ------------------------------------------------------------------------------------------
  145. function handleEvents()
  146.     event.listen('modem_message', function(e, _, sender, _, _, msg)
  147.  
  148.         local _msg = ser.unserialize(msg)
  149.         if sender == settings.server_address then
  150.             -- deconstruct the message
  151.  
  152.             if _msg.command == "open" then
  153.                 redstone.setOutput(settings.doorside, 15)
  154.                 event.timer(1, function()
  155.                     redstone.setOutput(settings.doorside, 0)
  156.                 end)
  157.              end
  158.         end
  159.     end)
  160.  
  161.     event.listen('motion', function(e, _, _, _, _, player)
  162.         -- There is an entity near the motion sensor, see if we can open the door
  163.         modem.send(settings.server_address, 1, ser.serialize({command="request", }))
  164.     end)
  165. end
  166.  
  167. ------------------------------------------------------------------------------------------
  168.  
  169. loadConfig()
  170. mainContainer:drawOnScreen(true)
  171. mainContainer:startEventHandling()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement