Advertisement
IronicPickle

enderControlSlave.lua

Feb 27th, 2020
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.10 KB | None | 0 0
  1. -- Args
  2. local args = { ... }
  3. local slaveNum = tonumber(args[1]) or 1
  4. local redstoneOutput = args[2] or "left"
  5. local avgRFT = tonumber(args[3]) or 10000
  6. local channel = tonumber(args[4]) or 40
  7.  
  8. -- Libraries
  9. local setup = require("/lua/lib/setupUtils")
  10. local monUtils = require("/lua/lib/monitorUtils")
  11. local write = monUtils.write
  12. local drawBox = monUtils.drawBox
  13. local render = require("/lua/lib/render")
  14. local state = require("/lua/lib/stateHandler")
  15.  
  16. -- Peripherals
  17. local wrappedPers = setup.getPers({
  18.     "monitor", "modem"
  19. })
  20. local monitor = setup.setupMonitor(
  21.     wrappedPers.monitor[1], 0.5
  22. )
  23. local modem = wrappedPers.modem[1]
  24. local speaker = peripheral.find("speaker")
  25.  
  26. -- Setup
  27. local stateData = state.getState("enderControlSlave")
  28. local defaultData = {
  29.     state = "off", num = slaveNum,
  30.     auto = "off", avgRFT = avgRFT
  31. }
  32. local slaveData = stateData or defaultData
  33. local buttons = {}
  34.  
  35. -- Windows
  36. local winHeader = setup.setupWindow(
  37.     monitor, 1, 1, monitor.x, 6
  38. )
  39. local winMain = setup.setupWindow(
  40.     monitor, 1, 7, monitor.x, (monitor.y - (6 + 4))
  41. )
  42. local winMainControl = setup.setupWindow(
  43.     winMain, (winMain.x - 13), 1,
  44.     14, winMain.y
  45. )
  46. local winFooter = setup.setupWindow(
  47.     monitor, 1, (monitor.y - 3), monitor.x, 4
  48. )
  49.  
  50. -- Actions
  51. local actions = {}
  52. actions.on = function()
  53.     rs.setAnalogOutput(redstoneOutput, 15)
  54.     if(speaker) then
  55.         speaker.playSound(
  56.             "minecraft:block.lever.click",
  57.             1, 1
  58.         )
  59.     end
  60.     slaveData.state = "on"
  61.     drawHeader()
  62.     drawFooter()
  63.     updateRender()
  64. end
  65. actions.off = function()
  66.     rs.setAnalogOutput(redstoneOutput, 0)
  67.     if(speaker) then
  68.         speaker.playSound(
  69.             "minecraft:block.lever.click",
  70.             1, 0.8
  71.         )
  72.     end
  73.     slaveData.state = "off"
  74.     drawHeader()
  75.     drawFooter()
  76.     updateRender()
  77. end
  78. actions.toggle = function()
  79.     if(slaveData.state == "off") then
  80.         actions.on()
  81.     else
  82.         actions.off()
  83.     end
  84. end
  85. actions.toggleAuto = function()
  86.     if(slaveData.auto == "off") then
  87.         slaveData.auto = "on"
  88.     else
  89.         slaveData.auto = "off"
  90.     end
  91.     updateRender()
  92. end
  93.  
  94. -- Main
  95. function start()
  96.     print("# Program Started")
  97.     modem.open(channel)
  98.    
  99.     drawHeader()
  100.     drawFooter()
  101.     drawMain()
  102.     updateRender()
  103.    
  104.     await()
  105. end
  106.  
  107. function await()
  108.     while(true) do
  109.    
  110.         local event, p1, p2, p3, p4, p5 = os.pullEvent()
  111.        
  112.         local isTouch = (event == "monitor_touch")
  113.        
  114.         local isModemMessage = (event == "modem_message")
  115.        
  116.         if(isTouch) then
  117.             local x = p2 - (winMain.x - winMainControl.x) - 1
  118.             local y = p3 - winHeader.y
  119.             if(x > 0) then
  120.                 for i, button in pairs(buttons) do
  121.                     if(y == button.y) then
  122.                         actions[button.action]()
  123.                         modem.transmit(channel, channel,
  124.                             {type = "updatePending"}
  125.                         )
  126.                         updateState()
  127.                     end
  128.                 end
  129.             end
  130.         elseif(isModemMessage) then
  131.             local body = p4
  132.             if(body.type == "modify") then
  133.                 local isSelf = (body.slaveNum == slaveNum)
  134.                 if(isSelf) then
  135.                     local change = body.change
  136.                     actions[change.action](change)
  137.                     modem.transmit(channel, channel,
  138.                         {type = "updatePending"}
  139.                     )
  140.                     updateState()
  141.                 end
  142.             elseif(body.type == "poll") then
  143.                 modem.transmit(channel, channel, {
  144.                     type = "pollRes",
  145.                     slaveData = slaveData
  146.                 })
  147.             end
  148.         end
  149.     end
  150. end
  151.  
  152. function updateRender()
  153.     buttons = render.ender({{
  154.         output = winMain,
  155.         controlOutput = winMainControl,
  156.         data = slaveData
  157.     }})
  158. end
  159.  
  160. function updateState()
  161.     state.updateState("enderControlSlave", slaveData)
  162. end
  163.  
  164. function drawHeader()
  165.     winHeader.bg = colors.blue
  166.     winHeader.setBackgroundColor(winHeader.bg)
  167.    
  168.     drawBox(winHeader,
  169.         1, 1, winHeader.x, winHeader.y,
  170.         true
  171.     )
  172.     drawBox(winHeader,
  173.         1, winHeader.y, winHeader.x, winHeader.y,
  174.         true, colors.white
  175.     )
  176.    
  177.     write(winHeader,
  178.         "Endergenic Resonation Control",
  179.         0, 2, "centre"
  180.     )
  181.     write(winHeader,
  182.         "Generator Unit: " .. slaveNum,
  183.         0, 4, "centre"
  184.     )
  185. end
  186.  
  187. function drawFooter()
  188.     winFooter.bg = colors.blue
  189.     winFooter.setBackgroundColor(winFooter.bg)
  190.    
  191.     drawBox(winFooter,
  192.         1, 1, winFooter.x, winFooter.y,
  193.         true
  194.     )
  195.     drawBox(winFooter,
  196.         1, 1, winFooter.x, 1,
  197.         true, colors.white
  198.     )
  199. end
  200.  
  201. function drawMain()
  202.     winMain.bg = colors.purple
  203.     winMain.setBackgroundColor(winMain.bg)
  204.    
  205.     drawBox(winMain,
  206.         1, 1, winMain.x, winMain.y,
  207.         true
  208.     )
  209. end
  210.  
  211. setup.utilsWrapper(start, modem, channel)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement