mirror of
				https://github.com/LDDestroier/CC/
				synced 2025-10-30 15:03:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			91 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- brednet - better rednet
 | |
| -- if you're going to be using rednet, at least use this
 | |
| 
 | |
| local brednet = {}
 | |
| 
 | |
| if ccemux and not peripheral.find("modem") then
 | |
| 	ccemux.attach("top", "wireless_modem")
 | |
| end
 | |
| 
 | |
| -- stores the last 1000 received messages
 | |
| local USED = {}
 | |
| 
 | |
| local cycleIntoUsed = function(id)
 | |
| 	USED[id] = 1000
 | |
| 	for k,v in pairs(USED) do
 | |
| 		if v == 0 then
 | |
| 			USED[k] = nil
 | |
| 		else
 | |
| 			USED[k] = -1 + v
 | |
| 		end
 | |
| 	end
 | |
| end
 | |
| 
 | |
| brednet.open = function(CHANNEL, MODEMS)
 | |
| 	local session = {
 | |
| 		channel = CHANNEL or 65530,
 | |
| 		modems = MODEMS or {},
 | |
| 	}
 | |
| 
 | |
| 	-- make virtual modem that is, in fact, every modem in the list
 | |
| 	session.modem = {}
 | |
| 	local modem = session.modem
 | |
| 	for k,v in next, {"open", "close", "transmit"} do
 | |
| 		local list = (#session.modems ~= 0) and sessions.modems or {peripheral.find("modem")}
 | |
| 		modem[v] = function(...)
 | |
| 			for i = 1, #list do
 | |
| 				list[i][v](...)
 | |
| 			end
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	session.send = function(message, channel)
 | |
| 		local msgID = math.random(1, 2^31-1)
 | |
| 		cycleIntoUsed(msgID)
 | |
| 		modem.transmit(
 | |
| 			channel or session.channel,
 | |
| 			channel or session.channel,
 | |
| 			{
 | |
| 				msg = message,
 | |
| 				id = msgID,
 | |
| 				time = os.time()
 | |
| 			}
 | |
| 		)
 | |
| 	end
 | |
| 
 | |
| 	session.parse = function(input)
 | |
| 		-- check types
 | |
| 		if type(input) == "table" then
 | |
| 			if type(input.id) == "number" and input.msg then
 | |
| 				if not USED[input.id] then
 | |
| 					return input.id, input.msg
 | |
| 				end
 | |
| 			end
 | |
| 		end
 | |
| 	end
 | |
| 
 | |
| 	session.receive = function()
 | |
| 		local evt, output = {}
 | |
| 		while not session.parse(evt[5]) do
 | |
| 			evt = {os.pullEvent("modem_message")}
 | |
| 		end
 | |
| 		cycleIntoUsed(evt[5].id)
 | |
| 		modem.transmit(
 | |
| 			channel or session.channel,
 | |
| 			channel or session.channel,
 | |
| 			{
 | |
| 				msg = evt[5].msg,
 | |
| 				id = evt[5].id,
 | |
| 				time = evt[5].time,
 | |
| 			}
 | |
| 		)
 | |
| 		return evt[5].id, evt[5].msg
 | |
| 	end
 | |
| 
 | |
| 	modem.open(session.channel)
 | |
| 
 | |
| 	return session
 | |
| end
 | |
| 
 | |
| return brednet
 | 
