LUAdev

Redtracker

Nov 30th, 2015
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.13 KB | None | 0 0
  1. local modes = {
  2.     ["regular"] = setmetatable({}, { __call = function( self, side ) return redstone.getInput(side) end, default_value = false }),
  3.     ["bundled"] = setmetatable({}, { __call = function( self, side ) return redstone.getBundledInput(side) end, default_value = 0 })
  4. }
  5.  
  6. local function actualUpdate( _table )
  7.     for side, sideTable in pairs( _table ) do
  8.         local input = _table(side)
  9.         if sideTable.state ~= input then
  10.             sideTable.state = input
  11.             for _, func in pairs( sideTable.callbacks ) do
  12.                 pcall(func, side, sideTable.state)
  13.             end
  14.         end
  15.     end
  16. end
  17.  
  18. function update()
  19.     for _, mode in pairs( modes ) do
  20.         actualUpdate( mode )
  21.     end
  22. end
  23.  
  24. function waitRedstoneUpdate()
  25.     os.pullEvent("redstone")
  26.     update()
  27. end
  28.  
  29. function addCallback(mode, func, side)
  30.     -- Compat check
  31.     if type(mode) == "function" then
  32.         return addCallback("regular", func, side)
  33.     end
  34.  
  35.     if type(func) ~= "function" then
  36.         error("Function expected, got " .. type(func), 3)
  37.     end
  38.     if side then
  39.         if type(side) ~= "string" then
  40.             error("String expected, got " .. type(side), 4 )
  41.         elseif modes[mode][side] == nil then
  42.             error("Expected valid side", 4)
  43.         end
  44.         modes[mode][side].callbacks[#modes[mode][side].callbacks + 1] = func
  45.         return
  46.     end
  47.    
  48.     for _, sideTable in pairs( modes[mode] ) do
  49.         sideTable.callbacks[#sideTable.callbacks + 1] = func
  50.     end
  51. end
  52.  
  53. function addRegularCallback(func, side)
  54.     addCallback("regular", func, side)
  55. end
  56.  
  57. function addBundledCallback(func, side)
  58.     addCallback("bundled", func, side)
  59. end
  60.  
  61. -- This is code to initialize the tables (always ran)
  62. do
  63.     local function initialize( _table )
  64.         local mt = getmetatable( _table )
  65.         for _, side in pairs( redstone.getSides() ) do
  66.             _table[side] = {
  67.                 ["state"] = mt.default_value,
  68.                 ["callbacks"] = {}
  69.             }
  70.         end
  71.     end
  72.     if redstone.getAnalogInput then
  73.         modes["analog"] = setmetatable({}, { __call = function( self, side ) return redstone.getAnalogInput(side) end, default_value = 0 })
  74.         function addAnalogCallback(func, side)
  75.             addCallback("analog", func, side)
  76.         end
  77.     end
  78.     for _, mode in pairs( modes ) do
  79.         initialize( mode )
  80.         actualUpdate( mode )
  81.     end
  82. end
Advertisement
Add Comment
Please, Sign In to add comment