Exemplo n.º 1
0
    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;
            }
        }
    }
Exemplo n.º 2
0
//        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;
                }
            }
        }