Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- sender.lua — watches redstone + bundled (by color) and broadcasts changes
- local PROTOCOL = "rstrig"
- local SIDES = { "top","bottom","left","right","front","back" }
- local COLOR_ORDER = { "white","orange","magenta","lightBlue","yellow","lime","pink","gray",
- "lightGray","cyan","purple","blue","brown","green","red","black" }
- local COLOR_MASK, MASK_NAME = {}, {}
- for _,name in ipairs(COLOR_ORDER) do
- local m = colors[name]
- COLOR_MASK[name] = m
- MASK_NAME[m] = name
- end
- local function openWireless()
- for _, s in ipairs(SIDES) do
- if peripheral.getType(s) == "modem" and peripheral.call(s, "isWireless") then
- if not rednet.isOpen(s) then rednet.open(s) end
- print("Wireless modem: "..s)
- return
- end
- end
- error("No wireless modem found.")
- end
- local function now() return os.epoch and os.epoch("utc") or os.time() end
- local function readState()
- local t = { rs = {}, b = {} }
- for _, s in ipairs(SIDES) do
- t.rs[s] = redstone.getInput(s)
- if redstone.getBundledInput then
- t.b[s] = redstone.getBundledInput(s) or 0
- else
- t.b[s] = 0
- end
- end
- return t
- end
- local function send(msg)
- msg.ts = now()
- msg.from = os.getComputerLabel() or ("Computer "..os.getComputerID())
- msg.id = os.getComputerID()
- rednet.broadcast(msg, PROTOCOL)
- end
- openWireless()
- local prev = readState()
- print("Watching redstone (plain + bundled)...")
- while true do
- os.pullEvent("redstone")
- local curr = readState()
- -- Plain redstone edges, per side
- for _, s in ipairs(SIDES) do
- if curr.rs[s] ~= prev.rs[s] then
- send({kind="rs", side=s, state=curr.rs[s]})
- print(("RS %s -> %s"):format(s, tostring(curr.rs[s])))
- end
- end
- -- Bundled: detect per-color edges, per side
- for _, s in ipairs(SIDES) do
- local pm, cm = prev.b[s] or 0, curr.b[s] or 0
- local diff = bit32.bxor(pm, cm)
- if diff ~= 0 then
- for _, name in ipairs(COLOR_ORDER) do
- local mask = COLOR_MASK[name]
- if bit32.band(diff, mask) ~= 0 then
- local on = bit32.band(cm, mask) ~= 0
- send({kind="bundled", side=s, color_mask=mask, color_name=name, state=on})
- print(("BUNDLED %s %s -> %s"):format(s, name, on and "on" or "off"))
- end
- end
- end
- end
- prev = curr
- end
Advertisement
Add Comment
Please, Sign In to add comment