kovakovi2000

rnc3

Oct 31st, 2025 (edited)
591
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.89 KB | None | 0 0
  1. -- rnc3.lua  (CC:T API version – no module/table tricks)
  2. local BASE_PORT = 39000
  3. local MODEMS = { peripheral.find("modem") }
  4. if #MODEMS == 0 then
  5.   error("rnc3: no modems found")
  6. end
  7.  
  8. -- open base port
  9. for _, m in ipairs(MODEMS) do
  10.   m.open(BASE_PORT)
  11. end
  12.  
  13. local function shortHash(s)
  14.   local h = 0
  15.   for i = 1, #s do
  16.     h = (h + s:byte(i)) % 1000
  17.   end
  18.   return h
  19. end
  20.  
  21. local function progPort(prog)
  22.   return BASE_PORT + shortHash(prog)
  23. end
  24.  
  25. local function openProg(prog)
  26.   local p = progPort(prog)
  27.   for _, m in ipairs(MODEMS) do
  28.     if not m.isOpen(p) then m.open(p) end
  29.   end
  30.   return p
  31. end
  32.  
  33. function getId(prog)
  34.   return ("%s@%d"):format(prog, os.getComputerID())
  35. end
  36.  
  37. function getPort(prog)
  38.   return progPort(prog)
  39. end
  40.  
  41. function send(prog, target, body)
  42.   local port = openProg(prog)
  43.   local pkt = {
  44.     prog = prog,
  45.     from = getId(prog),
  46.     to   = target or "*",
  47.     t    = os.epoch("utc"),
  48.     body = body
  49.   }
  50.   local data = textutils.serialize(pkt)
  51.   for _, m in ipairs(MODEMS) do
  52.     m.transmit(port, port, data)
  53.   end
  54. end
  55.  
  56. function broadcast(prog, body)
  57.   return send(prog, "*", body)
  58. end
  59.  
  60. function recv(prog, timeout)
  61.   local port = openProg(prog)
  62.   local timerId
  63.   if timeout and timeout > 0 then
  64.     timerId = os.startTimer(timeout)
  65.   end
  66.   while true do
  67.     local ev, p1, p2, p3, p4 = os.pullEvent()
  68.     if ev == "modem_message" and p2 == port then
  69.       local ok, pkt = pcall(textutils.unserialize, p4)
  70.       if ok and type(pkt) == "table" then
  71.         local me = getId(prog)
  72.         if (not pkt.to) or pkt.to == "*" or pkt.to == me then
  73.           return pkt
  74.         end
  75.       end
  76.     elseif ev == "timer" and p1 == timerId then
  77.       return nil
  78.     end
  79.   end
  80. end
  81.  
  82. function autoPong(prog, pkt)
  83.   if pkt.body and pkt.body.type == "ping" then
  84.     send(prog, pkt.from, { type = "pong" })
  85.     return true
  86.   end
  87.   return false
  88. end
Advertisement
Add Comment
Please, Sign In to add comment