I'm working on a project that will recreate "internet" in minecraft thanks to CC. The idea is that I have MainRouters, SubRouters, and Clients. The Main routers transmit information over large distances. The clients receive the info. The SubRouters act as bridges between them. For the moment, the code I have written should permit the MainRouters to identify each other. The main routers should also identify the SubRouters. The subRouters should be able to identify the Clients. I have implemented a debugPrint function that take the value of debugOpt. If it is true it will print the text in the arguments. For the moment it doesn't semm like they identify themselves. The should be able to identify each other no matter the order in which they are booted. I hope you can help me. Leave any suggestion in the comments. If you wish to help givve a suggestion how it would be possible because I don't own a server. Just leave any way in which I could contact you (Skype, Facebook, Email). We will work out a solution.
Thanks
MainRouter ( there can be a bunch of them, they have the same importance)
Spoiler
--Variables-- adjascentRouters = {} subRouters = {} configuration = {} debugOpt = true --Too many variables-- --Functions-- function clear() term.setCursorPos(1,1) term.clear() end function debugPrint(txt) if debugOpt then print(txt) end end function getModemSide() local sides = {"bottom","right","left","front","back","top"} local side = {} for i,v in pairs(sides) do if peripheral.isPresent(v) == true and peripheral.getType(v) == "modem" then side[#side + 1] = v end end if #side == 0 then return nil end debugPrint("Got modem side") return side[1] end function getIP() local x , y , z = gps.locate() ip = {x,y,z,os.getComputerID()} debugPrint("Got ip") return textutils.serialize(ip) end function setConfig() local configs = {} configs = textutils.unserialize(getIP()) configs[5] = getModemSide() local configFile = fs.open("config","w") configFile.write(textutils.serialize(configs)) configFile.close() debugPrint("Wrote configs") end function setUp() local tempConfigs = {} if fs.exists("config") then configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() debugPrint("File exists") else setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() debugPrint("File does not exist") end if tempConfigs[5] == nil then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() elseif peripheral.isPresent(tempConfigs[5]) == false then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() elseif peripheral.isPresent(tempConfigs[5]) == true and peripheral.getType(tempConfigs[5]) ~= "modem" then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() end if tempConfigs[5] == nil then print("No modem attached") error() end modem = peripheral.wrap(tempConfigs[5]) local idChannel = 65524 local msgChannel = 65525 modem.open(idChannel) modem.open(msgChannel) configuration = {tempConfigs[1],tempConfigs[2],tempConfigs[3],tempConfigs[4]} end function IPsender(a,b,c,d,e,f,g) local serializedMsgBuffer = {a,b,c,d,e,f,g} local serializedMsg = textutils.serialize(serializedMsgBuffer) modem.transmit(65525,1,serializedMsg) end function IPconfirm(a,b,c,d,e) local serializedMsgBuffer = {a,b,c,d,e} local serializedMsg = textutils.serialize(serializedMsgBuffer) modem.transmit(65525,2,serializedMsg) end function identification() serilaizedConfig = textutils.serialize(configuration) modem.transmit(65524,3,serilaizedConfig) local pcIsregistered = false while true do local event, side, ch1, ch2, msg, distance = os.pullEvent("modem_message") if ch2 == 3 and ch1 == 65524 then modem.transmit(65524,4,serilaizedConfig) for i,v in pairs(adjascentRouters) do if v == textutils.unserialize(msg) then pcIsRegistered = true end end if pcIsRegistered == false then adjascentRouters[#adjascentRouters + 1] = textutils.unserialize(msg) end debugPrint("adjacentrouter",textutils.serialize(adjascentRouters)) elseif ch2 == 4 and ch1 == 65524 then for i,v in pairs(adjascentRouters) do if v == textutils.unserialize(msg) then pcIsregistered = true end end if pcIsregistered == false then adjascentRouters[#adjascentRouters + 1] = textutils.unserialize(msg) end debugPrint("adjacentrouter",textutils.serialize(adjascentRouters)) end end end function identificationOfSubRouters() serilaizedConfig = textutils.serialize(configuration) modem.transmit(65524,7,serilaizedConfig) local subRouterIsregistered = false while true do local event, side, ch1, ch2, msg, distance = os.pullEvent("modem_message") if ch2 == 6 and ch1 == 65524 then modem.transmit(65524,5,serilaizedConfig) for i,v in pairs(subRouters) do if v == textutils.unserialize(msg) then subRouterIsregistered = true end end if subRouterIsregistered == false then subRouters[#subRouters + 1] = textutils.unserialize(msg) end elseif ch2 == 8 and ch1 == 65524 then for i,v in pairs(subRouters) do if v == textutils.unserialize(msg) then subRouterIsregistered = true end end if subRouterIsregistered == false then subRouters[#subRouters + 1] = textutils.unserialize(msg) end end debugPrint("subrouters:,",textutils.serialize(subRouters)) end end function checkAndSend() local msgBuffer = {} msgBuffer = textutils.unserialize(serializedMsgBuffer) local destinationPc = {} destinationPc = msgBuffer[1] local sendingPc = {} sendingPc = msgBuffer[2] local toRouter = {} toRouter = msgBuffer[3] local sendingRouter = {} sendingRouter = msgBuffer[4] local msgNum = "" msgNum = msgBuffer[5] local msgToTransmit = "" msgToTransmit = msgBuffer[6] local port = {} port = msgBuffer[7] possibleRouters = adjascentRouters debugPrint(textutils.serialize(possibleRouters)) local vectorLenghtTable = {} for i,v in pairs(possibleRouters) do local xDist = math.abs(destinationPc[1]-v[1]) local yDist = math.abs(destinationPc[2]-v[2]) local zDist = math.abs(destinationPc[3]-v[3]) local vectorBuffer = vector.new(xDist,yDist,zDist) vectorLenghtTable[#vectorLenghtTable+1] = vectorBuffer:lenght() end local winner = {} for i,v in pairs(vectorLenghtTable) do debugPrint(i,v) if i == 1 then winner = {i,v} else if v < winner[2] then winner = {i,v} end end end local closestRouter = possibleRouters[winner[1]] IPsender(destinationPc,sendingPc,closestRouter,configuration,msgNum,msgToTransmit,port) timer = os.startTimer(5) local event, side, ch1, ch2, confirmMessageBuffer, distance = os.pullEvent("modem_message" or "timer") local confirmMessage = {} confirmMessage = textutils.unserialize(confirmMessageBuffer) if event == "modem_message" then if ch2 == 2 and confirmMessage[3] == configuration and confirmMessage[4] == closestRouter and confirmMessage[5] == msgNum then return true end elseif event == "timer" and side == "timer" then for i,v in pairs(adjascentRouters) do if v == closestRouter then adjascentRouters[i] = nil end end local nilHappened = false for i,v in pairs(adjascentRouters) do if nilHappened then adjascentRouters[i-1] = v end if v == nil then nilHappened = true end end nilHappened = false return false else return "invalid" end end function messageSender() local messageNotDelivered = true while true do local event, side, ch1, ch2, message, distance = os.pullEvent("modem_message") if ch2 == 1 and ch1 == 65525 then local msgBuffer = {} msgBuffer = textutils.unserialize(message) local destinationPc = {} destinationPc = msgBuffer[1] local sendingPc = {} sendingPc = msgBuffer[2] local toRouter = {} toRouter = msgBuffer[3] local sendingRouter = {} sendingRouter = msgBuffer[4] local msgNum = "" msgNum = msgBuffer[5] debugPrint(message) local ifSuccessInSending = nil if toRouter == configuration then IPconfirm(destinationPc,sendingPc,sendingRouter,configuration,msgNum) ifSuccessInSending = checkAndSend(message) while ifSuccessInSending == false or ifSuccessInSending == "invalid" do ifSuccessInSending = checkAndSend() if #adjascentRouters == 0 then clear() print("No routers available...") identification() break end end end elseif ch2 == 5 then end end end --Too many functions-- clear() setUp() parallel.waitForAny(identification,messageSender,identificationOfSubRouters)
SubRouter
Spoiler
--Variables-- mainRouter = {} configuration = {} debugOpt = true Clients = {} --Too many variables-- --Functions-- function clear() term.setCursorPos(1,1) term.clear() end function debugPrint(txt) if debugOpt then print(txt) end end function getModemSide() local sides = {"bottom","right","left","front","back","top"} local side = {} for i,v in pairs(sides) do if peripheral.isPresent(v) == true and peripheral.getType(v) == "modem" then side[#side + 1] = v end end if #side == 0 then return nil end debugPrint("Got modem side") return side[1] end function getIP() local x , y , z = gps.locate() ip = {x,y,z,os.getComputerID()} debugPrint("Got ip") return textutils.serialize(ip) end function setConfig() local configs = {} configs = textutils.unserialize(getIP()) configs[5] = getModemSide() local configFile = fs.open("config","w") configFile.write(textutils.serialize(configs)) configFile.close() debugPrint("Wrote configs") end function setUp() local tempConfigs = {} if fs.exists("config") then configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() debugPrint("File exists") else setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() debugPrint("File does not exist") end if tempConfigs[5] == nil then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() elseif peripheral.isPresent(tempConfigs[5]) == false then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() elseif peripheral.isPresent(tempConfigs[5]) == true and peripheral.getType(tempConfigs[5]) ~= "modem" then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() end if tempConfigs[5] == nil then print("No modem attached") error() end modem = peripheral.wrap(tempConfigs[5]) local idChannelMain = 65524 local msgChannelMain = 65525 local idCannelClient = 65522 local msgChannelClient = 65523 modem.open(idChannelMain) modem.open(msgChannelMain) modem.open(idCannelClient) modem.open(msgChannelClient) configuration = {tempConfigs[1],tempConfigs[2],tempConfigs[3],tempConfigs[4]} end function IPsender(a,b,c,d,e,f,g) local serializedMsgBuffer = {a,b,c,d,e,f,g} local serializedMsg = textutils.serialize(serializedMsgBuffer) modem.transmit(65525,1,serializedMsg) end function identificationMainRouter() serilaizedConfig = textutils.serialize(configuration) local mainRouterNotFound = true modem.transmit(65524,6,serilaizedConfig) while mainRouterNotFound do local event, side, ch1, ch2, msg, distance = os.pullEvent("modem_message") if ch2 == 5 and ch1 == 65524 then mainRouter = textutils.unserialize(msg) elseif ch2 == 7 and ch1 == 65524 then modem.transmit(65524,8,serilaizedConfig) mainRouter = textutils.unserialize(msg) end end debugPrint("main router:",textutils.serialize(mainRouter)) end function identificationClients() serilaizedConfig = textutils.serialize(configuration) modem.transmit(65522,11,serilaizedConfig) local subRouterIsregistered = false while true do local event, side, ch1, ch2, msg, distance = os.pullEvent("modem_message") if ch2 == 10 and ch1 == 65522 then modem.transmit(65522,9,serilaizedConfig) for i,v in pairs(Clients) do if v == textutils.unserialize(msg) then subRouterIsregistered = true end end if subRouterIsregistered == false then Clients[#Clients + 1] = textutils.unserialize(msg) end elseif ch2 == 12 and ch1 == 65522 then for i,v in pairs(Clients) do if v == textutils.unserialize(msg) then subRouterIsregistered = true end end if subRouterIsregistered == false then Clients[#Clients + 1] = textutils.unserialize(msg) end debugPrint("clients:",textutils.serialize(Clients)) end end end clear() setUp() parallel.waitForAll(identificationClients,identificationMainRouter)
Client
Spoiler
--Variables-- subRouter = {} configuration = {} debugOpt = true --Too many variables-- --Functions-- function clear() term.setCursorPos(1,1) term.clear() end function debugPrint(txt) if debugOpt then print(txt) end end function getModemSide() local sides = {"bottom","right","left","front","back","top"} local side = {} for i,v in pairs(sides) do if peripheral.isPresent(v) == true and peripheral.getType(v) == "modem" then side[#side + 1] = v end end if #side == 0 then return nil end debugPrint("Got modem side") return side[1] end function getIP() local x , y , z = gps.locate() ip = {x,y,z,os.getComputerID()} debugPrint("Got ip") return textutils.serialize(ip) end function setConfig() local configs = {} configs = textutils.unserialize(getIP()) configs[5] = getModemSide() local configFile = fs.open("config","w") configFile.write(textutils.serialize(configs)) configFile.close() debugPrint("Wrote configs") end function setUp() local tempConfigs = {} if fs.exists("config") then configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() debugPrint("File exists") else setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() debugPrint("File does not exist") end if tempConfigs[5] == nil then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() elseif peripheral.isPresent(tempConfigs[5]) == false then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() elseif peripheral.isPresent(tempConfigs[5]) == true and peripheral.getType(tempConfigs[5]) ~= "modem" then setConfig() configFile = fs.open("config","r") tempConfigs = textutils.unserialize(configFile.readAll()) configFile.close() end if tempConfigs[5] == nil then print("No modem attached") error() end modem = peripheral.wrap(tempConfigs[5]) local idChannel = 65522 local msgChannel = 65523 modem.open(idChannel) modem.open(msgChannel) configuration = {tempConfigs[1],tempConfigs[2],tempConfigs[3],tempConfigs[4]} debugPrint("configuration",textutils.serialize(configuration)) end function identificationSubRouter() serilaizedConfig = textutils.serialize(configuration) local mainRouterNotFound = true modem.transmit(65522,10,serilaizedConfig) while mainRouterNotFound do local event, side, ch1, ch2, msg, distance = os.pullEvent("modem_message") if ch2 == 9 then subRouter = textutils.unserialize(msg) debugPrint(msg) elseif ch2 == 11 then modem.transmit(65522,12,serilaizedConfig) subRouter = textutils.unserialize(msg) debugPrint(msg) end end end function toReturn() clear() setUp() identificationSubRouter() end toReturn()