mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-07-06 03:52:53 +00:00

Unfortunately we can't apply the config changes due to backwards compatibility. This'll be something we may need to PR into Forge. CraftTweaker support still needs to be added.
92 lines
3.1 KiB
Lua
92 lines
3.1 KiB
Lua
|
|
-- Find modems
|
|
local tModems = {}
|
|
for _, sModem in ipairs( peripheral.getNames() ) do
|
|
if peripheral.getType( sModem ) == "modem" then
|
|
table.insert( tModems, sModem )
|
|
end
|
|
end
|
|
if #tModems == 0 then
|
|
print( "No modems found." )
|
|
return
|
|
elseif #tModems == 1 then
|
|
print( "1 modem found." )
|
|
else
|
|
print( #tModems .. " modems found." )
|
|
end
|
|
|
|
local function open( nChannel )
|
|
for n = 1, #tModems do
|
|
local sModem = tModems[n]
|
|
peripheral.call( sModem, "open", nChannel )
|
|
end
|
|
end
|
|
|
|
local function close( nChannel )
|
|
for n = 1, #tModems do
|
|
local sModem = tModems[n]
|
|
peripheral.call( sModem, "close", nChannel )
|
|
end
|
|
end
|
|
|
|
-- Open channels
|
|
print( "0 messages repeated." )
|
|
open( rednet.CHANNEL_REPEAT )
|
|
|
|
-- Main loop (terminate to break)
|
|
local ok, error = pcall( function()
|
|
local tReceivedMessages = {}
|
|
local tReceivedMessageTimeouts = {}
|
|
local nTransmittedMessages = 0
|
|
|
|
while true do
|
|
local sEvent, sModem, nChannel, nReplyChannel, tMessage = os.pullEvent()
|
|
if sEvent == "modem_message" then
|
|
-- Got a modem message, rebroadcast it if it's a rednet thing
|
|
if nChannel == rednet.CHANNEL_REPEAT then
|
|
if type( tMessage ) == "table" and tMessage.nMessageID and tMessage.nRecipient and type(tMessage.nRecipient) == "number" then
|
|
if not tReceivedMessages[ tMessage.nMessageID ] then
|
|
-- Ensure we only repeat a message once
|
|
tReceivedMessages[ tMessage.nMessageID ] = true
|
|
tReceivedMessageTimeouts[ os.startTimer( 30 ) ] = tMessage.nMessageID
|
|
|
|
-- Send on all other open modems, to the target and to other repeaters
|
|
for n = 1, #tModems do
|
|
local sOtherModem = tModems[n]
|
|
peripheral.call( sOtherModem, "transmit", rednet.CHANNEL_REPEAT, nReplyChannel, tMessage )
|
|
peripheral.call( sOtherModem, "transmit", tMessage.nRecipient, nReplyChannel, tMessage )
|
|
end
|
|
|
|
-- Log the event
|
|
nTransmittedMessages = nTransmittedMessages + 1
|
|
local _, y = term.getCursorPos()
|
|
term.setCursorPos( 1, y - 1 )
|
|
term.clearLine()
|
|
if nTransmittedMessages == 1 then
|
|
print( nTransmittedMessages .. " message repeated." )
|
|
else
|
|
print( nTransmittedMessages .. " messages repeated." )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
elseif sEvent == "timer" then
|
|
-- Got a timer event, use it to clear the message history
|
|
local nTimer = sModem
|
|
local nMessageID = tReceivedMessageTimeouts[ nTimer ]
|
|
if nMessageID then
|
|
tReceivedMessageTimeouts[ nTimer ] = nil
|
|
tReceivedMessages[ nMessageID ] = nil
|
|
end
|
|
|
|
end
|
|
end
|
|
end )
|
|
if not ok then
|
|
printError( error )
|
|
end
|
|
|
|
-- Close channels
|
|
close( rednet.CHANNEL_REPEAT )
|