local shared = assert( require 'shared' ) local packet = shared.packet local socket = assert( require 'socket' ) local ms = shared.metaserver local udp local io = assert( io ) local svInfo = packet.serverInfo{ version = 13, players = 0, capacity = 255, ip = shared.ip.fromString( socket.dns.toip(socket.dns.gethostname()) ), port = 51312, svname = "New Server", map = "Test Map" } local server = { tick = 0, advertised = function() print( "Advertised." ) end, } local clients = {} --Developer convenience function: start the local client program. function server.StartLocalClient() os.execute( "start vision.bat" ) end function server.Advertise() print( "Advertise." ) packet.get() packet.metaServer() packet.serverInfo( svInfo ) udp:sendto( packet.get() , ms.ip, ms.port ) end function server.serverInfo( serverInfo ) print( packet.getString( serverInfo.svname ) ) end function server.metaServer( ms ) server.advertising = true end --Incoming packet. function server.Parse( msg, ip, port ) if not msg then return end if not clients[ip] then print( "New IP:", ip, port ) clients[ip] = { ip = ip, port = port } end local msgs, types = packet.deserialise( msg ) if msgs then for i = 1, #msgs do print( "Received: ", types[i], ip, port ); ( server[ types[i] ] or print )( msgs[i], ip, port ) end end return server.Parse( udp:receivefrom() ) -- Process other packets. end function server.SetIP( ipString, port ) svInfo.ip = shared.ip.fromString( ipString ) svInfo.port = port if udp:setsockname( ipString, port ) then print( ipString, port ) --Find another port. elseif port < 65536 then return server.SetIP( ipString, port + 1 ) else print( "Could not use IP: "..ipString ) return error( "Connection failed." ) end end function server.Start() udp = assert( socket.udp() ) udp:settimeout(0) server.SetIP( shared.myip, 51312 ) print( "Server started:", udp:getsockname() ) repeat server.Parse( udp:receivefrom() ) server.Advance() if server.tick % 50 == 0 then server.Advertise() end until socket.sleep( 0.1 ) end function server.Advance() server.tick = server.tick + 1 for id, client in pairs( clients ) do -- end end function server.NewGame() server.tick = 0 end function server.Quit() end return server.Start()