Advertisement
Guest User

RNPRelay V1A

a guest
Jan 5th, 2014
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.57 KB | None | 0 0
  1. port=8000
  2. modem={}
  3. name=os.getComputerID()
  4.  
  5. --broadcasts go in form: type, src, dest, step (array of hop names), data
  6.  
  7. function openModems()
  8.   n=1
  9.   if peripheral.getType("back")=="modem" then modem[n]=peripheral.wrap("back") n=n+1 print("connected back") end
  10.   if peripheral.getType("top")=="modem" then modem[n]=peripheral.wrap("top") n=n+1 print("connected top") end
  11.   if peripheral.getType("left")=="modem" then modem[n]=peripheral.wrap("left") n=n+1 print("connected left") end
  12.   if peripheral.getType("right")=="modem" then modem[n]=peripheral.wrap("right") n=n+1 print("connected right") end
  13.   for i=1, #modem do
  14.     modem[i].open(port) print("opened "..port.." on modem "..i)
  15.   end
  16. end
  17.  
  18. function broadcast(type, src, dest, dat) --takes type, src, dest, dat
  19.   local packet={}
  20.   packet.type=type
  21.   packet.src=src
  22.   packet.dest=dest
  23.   step={}
  24.   step[1]=name
  25.   packet.step=textutils.serialize(step)
  26.   packet.dat=textutils.serialize(dat)
  27.   local transmit=textutils.serialize(packet)
  28.   for i=1, #modem do
  29.     modem[i].transmit(port, port, transmit) print("transmitted on "..port)
  30.   end
  31.   openModems()
  32. end
  33.  
  34. function receive(type) --returns type, src, dest, step, dat
  35.   local event, mSide, sChannel, rChannel, msg, senderDist = os.pullEvent("modem_message")
  36.   openModems()
  37.   local packet=textutils.unserialize(msg)
  38.   if packet.type==type or type==nil or type==false or type==0 then
  39.     if packet.dest==nil or packet.dest==name then
  40.       return packet.type, packet.src, packet.dest, textutils.unserialize(packet.step), textutils.unserialize(packet.dat)
  41.     end
  42.   end
  43.   print("returning nil")
  44.   return nil
  45. end
  46.  
  47. function setName(n)
  48.   name=n
  49. end
  50.  
  51. function start()
  52.   openModems()
  53.   print("opened modems")
  54.   name=os.getComputerID()
  55. end
  56.  
  57.  
  58. function contains(array, val)
  59.   local found=false
  60.   for i=1, #array do
  61.     if array[i]==val then found=true end
  62.   end
  63.   return found
  64. end
  65.  
  66. openModems()
  67. setName(("host"..os.getComputerID()))
  68. stp={}
  69. stp[1]=name
  70. broadcast("name", name, nil, stp, nil)
  71. while true do
  72.   local type, src, dest, step, dat = receive(nil)
  73.   print("type of broadcast: "..type)
  74.   print("source of broadcast: "..src)
  75.   print("destination of broadcast: "..dest)
  76.   print("Steps of broadcast so far: ")
  77.   for i=1, #step do print(step[i]) end
  78.   print("internal data: "..textutils.serialize(dat))
  79.   if found(step, name) then
  80.     step[(#step+1)]=name
  81.     print("Added self to steps label")
  82.     broadcast("packet", name, nil, step, dat)
  83.     print("resent packets")
  84.   else
  85.     print("Self is in steps, not forwarding (deadloop avoiding)")
  86.   end
  87. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement