private IEnumerator <WaitCommand> RegisterAtMasterServer(string hostName) { while (!_ramnet.NatFacilitatorConnection.ExternalEndpoint.IsResultAvailable) { yield return(WaitCommand.WaitForNextFrame); } var externalEndpoint = _ramnet.NatFacilitatorConnection.ExternalEndpoint.Result; var isRegistrationSuccessful = false; while (true) { while (!isRegistrationSuccessful) { var registrationConfirmation = Coroutine.FromCallback <HttpStatusCode>(callback => { Debug.Log("External endpoint is: " + externalEndpoint); var request = new HostRegistrationRequest(hostName, new PeerInfo(externalEndpoint, _transporter.InternalEndpoint), shouldAdvertise: true, version: VersionInfo.VersionNumber); _masterServerClient.Client.RegisterHost(_authToken, request, callback); }); while (!registrationConfirmation.IsResultAvailable) { yield return(WaitCommand.WaitForNextFrame); } if (registrationConfirmation.Result != HttpStatusCode.OK) { Debug.LogWarning("Failed to register at the master server due to: " + registrationConfirmation.Result); } else { isRegistrationSuccessful = true; Debug.Log("Successfully registered at master server"); } yield return(WaitCommand.WaitSeconds(3f)); } while (isRegistrationSuccessful) { yield return(WaitCommand.WaitSeconds(30f)); var asyncResult = Coroutine.FromCallback <HttpStatusCode>(callback => { _masterServerClient.Client.Ping(_authToken, externalEndpoint, callback); }); while (!asyncResult.IsResultAvailable) { yield return(WaitCommand.WaitForNextFrame); } isRegistrationSuccessful = asyncResult.Result == HttpStatusCode.OK; } } }
// private void CreateWhisp(ConnectionId ownerConnectionId) { // var whisp = _networkSystems.Replicator.Instantiate(ReplicationObjects.Whisp, ownerConnectionId, // _pilotSpawnpoint.position); // _networkSystems.Replicator.Activate(whisp); // } private IEnumerator <WaitCommand> RegisterAtMasterServer(string hostName, int maxPlayers, bool isPrivate = false) { while (!_natFacilitatorConnection.ExternalEndpoint.IsResultAvailable) { yield return(WaitCommand.WaitForNextFrame); } var isRegistrationSuccessful = false; while (true) { var externalEndpoint = _natFacilitatorConnection.ExternalEndpoint.Result; while (!isRegistrationSuccessful) { var registrationConfirmation = new AsyncResult <HttpStatusCode>(); var endpoint = _runOnLocalHost ? new IPEndPoint(IPAddress.Parse("127.0.0.1"), externalEndpoint.Port) : externalEndpoint; Debug.Log("External endpoint is: " + endpoint); string password = null; var request = new HostRegistrationRequest(hostName, new PeerInfo(endpoint, _transporter.InternalEndpoint), password, isPrivate, _versionInfo.VersionNumber, maxPlayers); _masterServerClient.Client.RegisterHost(request, statusCode => registrationConfirmation.SetResult(statusCode)); while (!registrationConfirmation.IsResultAvailable) { yield return(WaitCommand.WaitForNextFrame); } var asyncPlayerInfo = new AsyncResult <Maybe <PlayerInfo> >(); _masterServerClient.Client.Me((statusCode, playerInfo) => { if (statusCode == HttpStatusCode.OK) { asyncPlayerInfo.SetResult(Maybe.Just(playerInfo)); } else { Debug.LogWarning("Unable to retrieve server player info from Padrone"); asyncPlayerInfo.SetResult(Maybe <PlayerInfo> .Nothing); } }); while (!asyncPlayerInfo.IsResultAvailable) { yield return(WaitCommand.WaitForNextFrame); } if (asyncPlayerInfo.Result.IsJust) { _serverPlayerInfo = asyncPlayerInfo.Result.Value; } else { _serverPlayerInfo = new PlayerInfo("Unknown player", "", false, false); } if (registrationConfirmation.Result != HttpStatusCode.OK) { Debug.LogWarning("Failed to register at the master server due to: " + registrationConfirmation.Result); } else { isRegistrationSuccessful = true; Debug.Log("Successfully registered at master server"); } yield return(WaitCommand.WaitSeconds(3f)); } while (isRegistrationSuccessful) { yield return(WaitCommand.WaitSeconds(30f)); var pingResult = new AsyncResult <HttpStatusCode>(); var endpoint = _runOnLocalHost ? new IPEndPoint(IPAddress.Parse("127.0.0.1"), externalEndpoint.Port) : externalEndpoint; var sessions = _clientSessions.Values.ToListOptimized(); _masterServerClient.Client.Ping(endpoint, sessions, statusCode => pingResult.SetResult(statusCode)); while (!pingResult.IsResultAvailable) { yield return(WaitCommand.WaitForNextFrame); } isRegistrationSuccessful = pingResult.Result == HttpStatusCode.OK; } } }