mast3rillusion

RednetRedstoneSender

Sep 5th, 2025 (edited)
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.30 KB | Gaming | 0 0
  1. -- sender.lua  — watches redstone + bundled (by color) and broadcasts changes
  2. local PROTOCOL = "rstrig"
  3. local SIDES = { "top","bottom","left","right","front","back" }
  4.  
  5. local COLOR_ORDER = { "white","orange","magenta","lightBlue","yellow","lime","pink","gray",
  6.   "lightGray","cyan","purple","blue","brown","green","red","black" }
  7. local COLOR_MASK, MASK_NAME = {}, {}
  8. for _,name in ipairs(COLOR_ORDER) do
  9.   local m = colors[name]
  10.   COLOR_MASK[name] = m
  11.   MASK_NAME[m] = name
  12. end
  13.  
  14. local function openWireless()
  15.   for _, s in ipairs(SIDES) do
  16.     if peripheral.getType(s) == "modem" and peripheral.call(s, "isWireless") then
  17.       if not rednet.isOpen(s) then rednet.open(s) end
  18.       print("Wireless modem: "..s)
  19.       return
  20.     end
  21.   end
  22.   error("No wireless modem found.")
  23. end
  24.  
  25. local function now() return os.epoch and os.epoch("utc") or os.time() end
  26.  
  27. local function readState()
  28.   local t = { rs = {}, b = {} }
  29.   for _, s in ipairs(SIDES) do
  30.     t.rs[s] = redstone.getInput(s)
  31.     if redstone.getBundledInput then
  32.       t.b[s] = redstone.getBundledInput(s) or 0
  33.     else
  34.       t.b[s] = 0
  35.     end
  36.   end
  37.   return t
  38. end
  39.  
  40. local function send(msg)
  41.   msg.ts   = now()
  42.   msg.from = os.getComputerLabel() or ("Computer "..os.getComputerID())
  43.   msg.id   = os.getComputerID()
  44.   rednet.broadcast(msg, PROTOCOL)
  45. end
  46.  
  47. openWireless()
  48. local prev = readState()
  49. print("Watching redstone (plain + bundled)...")
  50.  
  51. while true do
  52.   os.pullEvent("redstone")
  53.   local curr = readState()
  54.  
  55.   -- Plain redstone edges, per side
  56.   for _, s in ipairs(SIDES) do
  57.     if curr.rs[s] ~= prev.rs[s] then
  58.       send({kind="rs", side=s, state=curr.rs[s]})
  59.       print(("RS %s -> %s"):format(s, tostring(curr.rs[s])))
  60.     end
  61.   end
  62.  
  63.   -- Bundled: detect per-color edges, per side
  64.   for _, s in ipairs(SIDES) do
  65.     local pm, cm = prev.b[s] or 0, curr.b[s] or 0
  66.     local diff = bit32.bxor(pm, cm)
  67.     if diff ~= 0 then
  68.       for _, name in ipairs(COLOR_ORDER) do
  69.         local mask = COLOR_MASK[name]
  70.         if bit32.band(diff, mask) ~= 0 then
  71.           local on = bit32.band(cm, mask) ~= 0
  72.           send({kind="bundled", side=s, color_mask=mask, color_name=name, state=on})
  73.           print(("BUNDLED %s %s -> %s"):format(s, name, on and "on" or "off"))
  74.         end
  75.       end
  76.     end
  77.   end
  78.  
  79.   prev = curr
  80. end
Advertisement
Add Comment
Please, Sign In to add comment