void Start()
 {
     m_Portal = GetComponent <GameNetPortal>();
     m_Portal.NetworkStarted  += NetworkStart;
     m_Portal.ConnectFinished += OnConnectFinished;
     m_Portal.NetManager.OnClientDisconnectCallback += OnDisconnectOrTimeout;
 }
        /// <summary>
        /// Wraps the invocation of NetworkManager.StartClient, including our GUID as the payload.
        /// </summary>
        /// <remarks>
        /// This method must be static because, when it is invoked, the client still doesn't know it's a client yet, and in particular, GameNetPortal hasn't
        /// yet initialized its client and server GNP-Logic objects yet (which it does in NetworkStart, based on the role that the current player is performing).
        /// </remarks>
        /// <param name="portal"> </param>
        /// <param name="ipaddress">the IP address of the host to connect to. (currently IPV4 only)</param>
        /// <param name="port">The port of the host to connect to. </param>
        public static void StartClient(GameNetPortal portal, string ipaddress, int port)
        {
            //DMW_NOTE: non-portable. We need to be updated when moving to UTP transport.
            var chosenTransport = NetworkManager.Singleton.gameObject.GetComponent <TransportPicker>().IpHostTransport;

            NetworkManager.Singleton.NetworkConfig.NetworkTransport = chosenTransport;

            switch (chosenTransport)
            {
            case LiteNetLibTransport liteNetLibTransport:
                liteNetLibTransport.Address = ipaddress;
                liteNetLibTransport.Port    = (ushort)port;
                break;

            case UNetTransport unetTransport:
                unetTransport.ConnectAddress = ipaddress;
                unetTransport.ConnectPort    = port;
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(chosenTransport));
            }

            ConnectClient(portal);
        }
        /// <summary>
        /// Wraps the invocation of NetworkingManager.StartClient, including our GUID as the payload.
        /// </summary>
        /// <remarks>
        /// Relay version of <see cref="StartClient"/>, see start client remarks for more information.
        /// </remarks>
        /// <param name="portal"> </param>
        /// <param name="roomKey">The room name of the host to connect to.</param>
        public static bool StartClientRelayMode(GameNetPortal portal, string roomKey, out string failMessage)
        {
            var splits = roomKey.Split('_');

            if (splits.Length != 2)
            {
                failMessage = "Malformatted Room Key!";
                return(false);
            }

            var region   = splits[0];
            var roomName = splits[1];


            var chosenTransport = NetworkManager.Singleton.gameObject.GetComponent <TransportPicker>().RelayTransport;

            NetworkManager.Singleton.NetworkConfig.NetworkTransport = chosenTransport;

            switch (chosenTransport)
            {
            case PhotonRealtimeTransport photonRealtimeTransport:
                photonRealtimeTransport.RoomName = roomName;
                PhotonAppSettings.Instance.AppSettings.FixedRegion = region;
                break;

            default:
                throw new Exception($"unhandled relay transport {chosenTransport.GetType()}");
            }

            ConnectClient(portal);

            failMessage = String.Empty;
            return(true);
        }
Esempio n. 4
0
        public override void NetworkStart()
        {
            base.NetworkStart();

            if (!IsServer)
            {
                enabled = false;
            }
            else
            {
                m_NetPortal       = GameObject.FindGameObjectWithTag("GameNetPortal").GetComponent <GameNetPortal>();
                m_ServerNetPortal = m_NetPortal.GetComponent <ServerGameNetPortal>();

                m_NetPortal.ClientSceneChanged += OnClientSceneChanged;

                // retrieve the lobby state info so that the players we're about to spawn can query it
                var o = GameStateRelay.GetRelayObject();
                if (o != null && o.GetType() != typeof(LobbyResults))
                {
                    throw new System.Exception("No LobbyResults found!");
                }
                m_LobbyResults = (LobbyResults)o;

                DoInitialSpawnIfPossible();
            }
        }
 void Start()
 {
     m_Portal = GetComponent <GameNetPortal>();
     m_Portal.NetworkStarted += NetworkStart;
     // we add ApprovalCheck callback BEFORE NetworkStart to avoid spurious MLAPI warning:
     // "No ConnectionApproval callback defined. Connection approval will timeout"
     m_Portal.NetManager.ConnectionApprovalCallback += ApprovalCheck;
     m_Portal.NetManager.OnServerStarted            += ServerStartedHandler;
     m_ClientData     = new Dictionary <string, PlayerData>();
     m_ClientIDToGuid = new Dictionary <ulong, string>();
 }
        void Start()
        {
            // Find the game Net Portal by tag - it should have been created by Startup
            GameObject GamePortalGO = GameObject.FindGameObjectWithTag("GameNetPortal");

            Assert.IsNotNull("No GameNetPortal found, Did you start the game from the Startup scene?");
            m_GameNetPortal   = GamePortalGO.GetComponent <GameNetPortal>();
            m_ClientNetPortal = GamePortalGO.GetComponent <Client.ClientGameNetPortal>();

            m_ClientNetPortal.NetworkTimedOut += OnNetworkTimeout;
            m_ClientNetPortal.ConnectFinished += OnConnectFinished;
        }
        private static void ConnectClient(GameNetPortal portal)
        {
            var clientGuid = ClientPrefs.GetGuid();
            //var payload = $"client_guid={clientGuid}\n"; //minimal format where key=value pairs are separated by newlines.
            //payload += $"client_scene={UnityEngine.SceneManagement.SceneManager.GetActiveScene().buildIndex}\n";
            //payload += $"player_name={portal.PlayerName}\n";
            var payload = JsonUtility.ToJson(new ConnectionPayload()
            {
                clientGUID = clientGuid, clientScene = SceneManager.GetActiveScene().buildIndex, playerName = portal.PlayerName
            });

            var payloadBytes = System.Text.Encoding.UTF8.GetBytes(payload);

            portal.NetManager.NetworkConfig.ConnectionData = payloadBytes;
            portal.NetManager.NetworkConfig.ClientConnectionBufferTimeout = k_TimeoutDuration;

            //and...we're off! MLAPI will establish a socket connection to the host.
            //  If the socket connection fails, we'll hear back by [???] (FIXME: GOMPS-79, need to handle transport layer failures too).
            //  If the socket connection succeeds, we'll get our RecvConnectFinished invoked. This is where game-layer failures will be reported.
            portal.NetManager.StartClient();
        }