IsClientConnected() public method

This checks if the NetworkManager has a client and that it is connected to a server.

public IsClientConnected ( ) : bool
return bool
コード例 #1
0
        void HostGame()
        {
            if (!_networkManager.IsClientConnected() && !NetworkServer.active)
            {
                if (_noConnection)
                {
                    _networkManager.StartHost();
                }


                // If our client hasn't connected to the server, and the server isn't active...
                // And no connections have been made yet, start a host!
            }
        }
コード例 #2
0
        void Update()
        {
            if (!showGUI)
            {
                return;
            }

            if (!manager.IsClientConnected() && !NetworkServer.active && manager.matchMaker == null)
            {
                if (UnityEngine.Application.platform != RuntimePlatform.WebGLPlayer)
                {
                    if (Input.GetKeyDown(KeyCode.S))
                    {
                        manager.StartServer();
                    }
                    if (Input.GetKeyDown(KeyCode.H))
                    {
                        manager.StartHost();
                    }
                }
                if (Input.GetKeyDown(KeyCode.C))
                {
                    manager.StartClient();
                }
            }
            if (NetworkServer.active && manager.IsClientConnected())
            {
                if (Input.GetKeyDown(KeyCode.X))
                {
                    manager.StopHost();
                }
            }
        }
コード例 #3
0
 private void Update()
 {
     if (!showGUI)
     {
         return;
     }
     if (!manager.IsClientConnected() && !NetworkServer.active && manager.matchMaker == null)
     {
         if (Input.GetKeyDown(KeyCode.S))
         {
             manager.StartServer();
         }
         if (Input.GetKeyDown(KeyCode.H))
         {
             manager.StartHost();
         }
         if (Input.GetKeyDown(KeyCode.C))
         {
             manager.StartClient();
         }
     }
     if (NetworkServer.active && manager.IsClientConnected() && Input.GetKeyDown(KeyCode.X))
     {
         manager.StopHost();
     }
 }
コード例 #4
0
 void Update()
 {
     if (!manager.IsClientConnected() && !NetworkServer.active && manager.matchMaker == null)
     {
         if (UnityEngine.Application.platform != RuntimePlatform.WebGLPlayer)
         {
             manager.StartHost();
         }
     }
 }
コード例 #5
0
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Escape))
            {
                isPaused = !isPaused;
            }


            if (isPaused)
            {
                Time.timeScale = 0f;                 // Le temps s'arrete
            }
            else
            {
                Time.timeScale = 1.0f;                 // Le temps reprend
            }
            if (!showGUI)
            {
                return;
            }

            if (!manager.IsClientConnected() && !NetworkServer.active && manager.matchMaker == null)
            {
                if (UnityEngine.Application.platform != RuntimePlatform.WebGLPlayer)
                {
                    if (Input.GetKeyDown(KeyCode.S))
                    {
                        manager.StartServer();
                    }
                    if (Input.GetKeyDown(KeyCode.H))
                    {
                        manager.StartHost();
                    }
                }
                if (Input.GetKeyDown(KeyCode.C))
                {
                    manager.StartClient();
                }
            }
            if (NetworkServer.active && manager.IsClientConnected())
            {
                if (Input.GetKeyDown(KeyCode.X))
                {
                    manager.StopHost();
                }
            }
        }
コード例 #6
0
 // Update is called once per frame
 void Update()
 {
     if (UnityEngine.Networking.NetworkServer.active)
     {
         if (leaveMatch())
         {
             if (manager.IsClientConnected())
             {
                 manager.StopHost();
             }
             else
             {
                 manager.StopServer();
             }
             ShowMenu(activeGroup);
         }
     }
 }
コード例 #7
0
        void OnGUI()
        {
            if (!showGUI)
            {
                return;
            }

            GUI.skin = myGUI;
            GUI.skin.button.fontSize    = Screen.height / 25;
            GUI.skin.textField.fontSize = Screen.height / 25;
            GUI.skin.label.fontSize     = Screen.height / 25;
            GUI.skin.box.fontSize       = Screen.height / 25;
            int xpos         = 10 + offsetX;
            int ypos         = 40 + offsetY;
            int heightButton = Screen.height / 10;
            int widthButton  = Screen.width / 4;
            int spacing      = heightButton + 10;

            bool noConnection = (manager.client == null || manager.client.connection == null ||
                                 manager.client.connection.connectionId == -1);

            if (!manager.IsClientConnected() && !NetworkServer.active && manager.matchMaker == null)
            {
                if (noConnection)
                {
                }
                else
                {
                    GUI.Label(new Rect(xpos, ypos, 200, 20), "Connecting to " + manager.networkAddress + ":" + manager.networkPort + "..");
                    ypos += spacing;


                    if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Cancel Connection Attempt"))
                    {
                        manager.StopClient();
                    }
                }
            }
            else
            {
            }

            if (manager.IsClientConnected() && !ClientScene.ready)
            {
                if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Client Ready"))
                {
                    ClientScene.Ready(manager.client.connection);

                    if (ClientScene.localPlayers.Count == 0)
                    {
                        ClientScene.AddPlayer(0);
                    }
                }
                ypos += spacing;
            }

            if (NetworkServer.active || manager.IsClientConnected())
            {
                if (GUI.Button(new Rect(xpos, Screen.height - heightButton - 10, widthButton, heightButton), "Stop (X)"))
                {
                    manager.StopHost();
                }
                ypos += spacing;
            }

            if (!NetworkServer.active && !manager.IsClientConnected() && noConnection)
            {
                ypos += 10;

                if (UnityEngine.Application.platform == RuntimePlatform.WebGLPlayer)
                {
                    GUI.Box(new Rect(xpos - 5, ypos, 220, 25), "(WebGL cannot use Match Maker)");
                    return;
                }

                if (manager.matchMaker == null)
                {
                    if (GUI.Button(new Rect(xpos, ypos, widthButton, heightButton), "Multijoueur"))
                    {
                        manager.StartMatchMaker();
                    }
                    ypos += spacing;
                }
                else
                {
                    if (manager.matchInfo == null)
                    {
                        if (manager.matches == null)
                        {
                            if (GUI.Button(new Rect(xpos, ypos, widthButton, heightButton), "Create Internet Match"))
                            {
                                manager.matchMaker.CreateMatch(manager.matchName, manager.matchSize, true, "", "", "", 0, 0, manager.OnMatchCreate);
                            }
                            ypos += spacing;

                            GUI.Label(new Rect(xpos, ypos, widthButton, heightButton), "Room Name:");
                            ypos += spacing / 2;
                            manager.matchName = GUI.TextField(new Rect(xpos, ypos, widthButton, heightButton / 2), manager.matchName);

                            ypos += spacing / 2;

                            if (GUI.Button(new Rect(xpos, ypos, widthButton, heightButton), "Find Internet Match"))
                            {
                                manager.matchMaker.ListMatches(0, 20, "", false, 0, 0, manager.OnMatchList);
                            }
                            ypos += spacing;
                        }
                        else
                        {
                            for (int i = 0; i < manager.matches.Count; i++)
                            {
                                var match = manager.matches[i];
                                if (GUI.Button(new Rect(xpos, ypos, widthButton, heightButton), "Join Match:" + match.name))
                                {
                                    manager.matchName = match.name;
                                    manager.matchMaker.JoinMatch(match.networkId, "", "", "", 0, 0, manager.OnMatchJoined);
                                }
                                ypos += spacing;
                            }

                            if (GUI.Button(new Rect(xpos, ypos, widthButton, heightButton), "Back to Match Menu"))
                            {
                                manager.matches = null;
                            }
                            ypos += spacing;
                        }
                    }
                    if (GUI.Button(new Rect(xpos, ypos, widthButton, heightButton), "Back"))
                    {
                        manager.StopMatchMaker();
                    }
                    ypos += spacing;
                }
            }
        }
コード例 #8
0
        void OnGUI()
        {
            int xpos         = 25;
            int ypos         = 50;
            int buttonWidth  = 400;
            int buttonHeight = 100;
            int spacing      = buttonHeight + 10;

            bool noConnection = (manager.client == null || manager.client.connection == null ||
                                 manager.client.connection.connectionId == -1);

            if (!manager.IsClientConnected() && !NetworkServer.active)
            {
                if (noConnection)
                {
                    if (GUI.Button(new Rect(xpos, ypos, buttonWidth, buttonHeight), "LAN Host(H)"))
                    {
                        manager.StartHost();
                    }
                    ypos += spacing;

                    if (GUI.Button(new Rect(xpos, ypos, buttonWidth / 2, buttonHeight), "LAN Client(C)"))
                    {
                        manager.StartClient();
                    }
                    manager.networkAddress = GUI.TextField(new Rect(xpos + buttonWidth / 2, ypos, buttonWidth / 2, buttonHeight), manager.networkAddress);
                    ypos += spacing;

                    if (GUI.Button(new Rect(xpos, ypos, buttonWidth, buttonHeight), "LAN Server Only(S)"))
                    {
                        manager.StartServer();
                    }
                    ypos += spacing;
                }
                else
                {
                    GUI.Label(new Rect(xpos, ypos, buttonWidth, buttonHeight), "Connecting to " + manager.networkAddress + ":" + manager.networkPort + "..");
                    ypos += spacing;


                    if (GUI.Button(new Rect(xpos, ypos, buttonWidth, buttonHeight), "Cancel Connection Attempt"))
                    {
                        manager.StopClient();
                    }
                }
            }
            else
            {
                if (NetworkServer.active)
                {
                    string serverMsg = "Server: port=" + manager.networkPort;
                    if (manager.useWebSockets)
                    {
                        serverMsg += " (Using WebSockets)";
                    }
                    GUI.Label(new Rect(xpos, ypos, buttonWidth, buttonHeight), serverMsg);
                    ypos += spacing;
                }
                if (manager.IsClientConnected())
                {
                    GUI.Label(new Rect(xpos, ypos, buttonWidth, buttonHeight), "Client: address=" + manager.networkAddress + " port=" + manager.networkPort);
                    ypos += spacing;
                }
            }

            if (manager.IsClientConnected() && !ClientScene.ready)
            {
                if (GUI.Button(new Rect(xpos, ypos, buttonWidth, buttonHeight), "Client Ready"))
                {
                    ClientScene.Ready(manager.client.connection);

                    if (ClientScene.localPlayers.Count == 0)
                    {
                        ClientScene.AddPlayer(0);
                    }
                }
                ypos += spacing;
            }

            if (NetworkServer.active || manager.IsClientConnected())
            {
                if (GUI.Button(new Rect(xpos, ypos, buttonWidth, buttonHeight), "Quit"))
                {
                    manager.StopHost();
                }
                ypos += spacing;
            }
        }
コード例 #9
0
        void Update()
        {
            if ((gameTime % 3600) / 60 > 9)
            {
                gameTimerText.text = gameTime / 3600 + ":" + (gameTime % 3600) / 60;
            }
            else
            {
                gameTimerText.text = gameTime / 3600 + ":0" + (gameTime % 3600) / 60;
            }

            if (gameTime <= 0)
            {
                scores.Clear();
                ending = true;
                if (winner != null)
                {
                    Destroy(winner.gameObject);
                }
                winner         = (Text)Instantiate(whoWon, whoWon.transform.position, whoWon.transform.rotation);
                winner.enabled = true;
                winner.gameObject.SetActive(true);
                winner.transform.SetParent(whoWon.transform.parent);
                try {
                    for (int i = 0; i < playerKills.Count; i++)
                    {
                        ((Text)playerDeaths[i]).text = (ClientScene.FindLocalObject((NetworkInstanceId)playerNetIDs[i]).GetComponent <PlayerSetup>().deaths).ToString();
                        ((Text)playerKills[i]).text  = (ClientScene.FindLocalObject((NetworkInstanceId)playerNetIDs[i]).GetComponent <PlayerSetup>().kills).ToString();
                        scores.Add(int.Parse(((Text)playerKills[i]).text) - int.Parse(((Text)playerDeaths[i]).text));
                    }
                } catch (Exception e)
                {
                    disconnect();
                }
                int indexOfWinner = 0;
                for (int i = 0; i < scores.Count; i++)
                {
                    if ((int)scores[i] > (int)scores[indexOfWinner])
                    {
                        indexOfWinner = i;
                    }
                }
                winner.text = (string)playerNames[indexOfWinner] + " has won with a score of " + ((Text)playerKills[indexOfWinner]).text + " and " + ((Text)playerDeaths[indexOfWinner]).text;
                if (gameTime < -180)
                {
                    disconnect();
                }
            }

            GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
            if (players.Length != playerNames.Count)
            {
                playerNames.Clear();
                playerNetIDs.Clear();
                for (int i = 0; i < playersInGame.Count; i++)
                {
                    Destroy((Text)playersInGame[i]);
                    Destroy((Text)playerDeaths[i]);
                    Destroy((Text)playerKills[i]);
                }
                playerDeaths.Clear();
                playerKills.Clear();
                playersInGame.Clear();
                for (int i = 0; i < players.Length; i++)
                {
                    if (players[i].GetComponent <PlayerSetup>().playerName != "")
                    {
                        playerNames.Add(players[i].GetComponent <PlayerSetup>().playerName);
                        playerNetIDs.Add(players[i].GetComponent <NetworkIdentity>().netId);
                        print(playerNames[i]);
                        playersInGame.Add((Text)Instantiate(playerHeading, new Vector3(playerHeading.transform.position.x, playerHeading.transform.position.y + (i + 1) * -35, 0), playerHeading.transform.rotation));
                        ((Text)playersInGame[i]).transform.SetParent(leaderboardPanel.transform);
                        ((Text)playersInGame[i]).text = (string)playerNames[i];
                        playerKills.Add((Text)Instantiate(killHeading, new Vector3(killHeading.transform.position.x, killHeading.transform.position.y + (i + 1) * -35, 0), killHeading.transform.rotation));
                        ((Text)playerKills[i]).transform.SetParent(leaderboardPanel.transform);
                        ((Text)playerKills[i]).text = (ClientScene.FindLocalObject((NetworkInstanceId)playerNetIDs[i]).GetComponent <PlayerSetup>().kills).ToString();
                        playerDeaths.Add((Text)Instantiate(deathHeading, new Vector3(deathHeading.transform.position.x, deathHeading.transform.position.y + (i + 1) * -35, 0), deathHeading.transform.rotation));
                        ((Text)playerDeaths[i]).transform.SetParent(leaderboardPanel.transform);
                        ((Text)playerDeaths[i]).text = (ClientScene.FindLocalObject((NetworkInstanceId)playerNetIDs[i]).GetComponent <PlayerSetup>().deaths).ToString();
                    }
                }
            }

            if (!showGUI)
            {
                return;
            }

            if (Input.GetButtonDown("Pause") && ((NetworkClient.active && manager.IsClientConnected()) || NetworkServer.active /*manager.matchMaker != null*/) && !ending)
            {
                pausePanel.SetActive(!pausePanel.activeSelf);
            }

            if (Input.GetButton("Leaderboards") && ((NetworkClient.active && manager.IsClientConnected()) || NetworkServer.active /*manager.matchMaker != null*/) && !ending)
            {
                for (int i = 0; i < playerKills.Count; i++)
                {
                    ((Text)playerDeaths[i]).text = (ClientScene.FindLocalObject((NetworkInstanceId)playerNetIDs[i]).GetComponent <PlayerSetup>().deaths).ToString();
                    ((Text)playerKills[i]).text  = (ClientScene.FindLocalObject((NetworkInstanceId)playerNetIDs[i]).GetComponent <PlayerSetup>().kills).ToString();
                }
                leaderboardPanel.SetActive(true);
            }
            else
            {
                leaderboardPanel.SetActive(false);
            }

            if (!NetworkClient.active && !NetworkServer.active /*manager.matchMaker == null*/)
            {
                if (winner != null)
                {
                    Destroy(winner.gameObject);
                }
                ending   = false;
                gameTime = originalGameTime;
                if (playerNames.Count > 0)
                {
                    playerNames.Clear();
                    for (int i = 0; i < playersInGame.Count; i++)
                    {
                        Destroy((Text)playersInGame[i]);
                        Destroy((Text)playerDeaths[i]);
                        Destroy((Text)playerKills[i]);
                    }
                    playerDeaths.Clear();
                    playerKills.Clear();
                    playersInGame.Clear();
                }
                leaderboardPanel.SetActive(false);
                pausePanel.SetActive(false);
                panelToToggleActive.SetActive(true);
                configPanel.SetActive(true);
                connectingPanel.SetActive(false);
            }

            if ((NetworkClient.active && manager.IsClientConnected()) || NetworkServer.active /*manager.matchMaker != null*/)
            {
                panelToToggleActive.SetActive(false);
            }
            else
            {
                panelToToggleActive.SetActive(true);
            }

            if (!manager.IsClientConnected() && NetworkClient.active)
            {
                connectingPanel.SetActive(true);
                configPanel.SetActive(false);
                attemptingConnect.GetComponent <Text>().text = "Attempting to Connect to " + manager.networkAddress;
            }
        }
コード例 #10
0
        void OnGUI()
        {
            if (!showGUI)
            {
                return;
            }

            bool noConnection = (manager.client == null || manager.client.connection == null ||
                                 manager.client.connection.connectionId == -1);

            GUILayout.BeginArea(new Rect(10 + offsetX, 40 + offsetY, 215, 9999));
            if (!manager.IsClientConnected() && !NetworkServer.active)
            {
                if (noConnection)
                {
                    // LAN Host
                    if (Application.platform != RuntimePlatform.WebGLPlayer)
                    {
                        if (GUILayout.Button("LAN Host"))
                        {
                            manager.StartHost();
                        }
                    }

                    // LAN Client + IP
                    GUILayout.BeginHorizontal();
                    if (GUILayout.Button("LAN Client"))
                    {
                        manager.StartClient();
                    }
                    manager.networkAddress = GUILayout.TextField(manager.networkAddress);
                    GUILayout.EndHorizontal();

                    // LAN Server Only
                    if (Application.platform == RuntimePlatform.WebGLPlayer)
                    {
                        // cant be a server in webgl build
                        GUILayout.Box("(  WebGL cannot be server  )");
                    }
                    else
                    {
                        if (GUILayout.Button("LAN Server Only"))
                        {
                            manager.StartServer();
                        }
                    }
                }
                else
                {
                    // Connecting
                    GUILayout.Label("Connecting to " + manager.networkAddress + ":" + manager.networkPort + "..");
                    if (GUILayout.Button("Cancel Connection Attempt"))
                    {
                        manager.StopClient();
                    }
                }
            }
            else
            {
                // server / client status message
                if (NetworkServer.active)
                {
                    string serverMsg = "Server: port=" + manager.networkPort;
                    if (manager.useWebSockets)
                    {
                        serverMsg += " (Using WebSockets)";
                    }

                    GUILayout.Label(serverMsg);
                }
                if (manager.IsClientConnected())
                {
                    GUILayout.Label("Client: address=" + manager.networkAddress + " port=" + manager.networkPort);
                }
            }

            // client ready
            if (manager.IsClientConnected() && !ClientScene.ready)
            {
                if (GUILayout.Button("Client Ready"))
                {
                    ClientScene.Ready(manager.client.connection);

                    if (ClientScene.localPlayers.Count == 0)
                    {
                        ClientScene.AddPlayer(0);
                    }
                }
            }

            // stop
            if (NetworkServer.active || manager.IsClientConnected())
            {
                if (GUILayout.Button("Stop"))
                {
                    manager.StopHost();
                }
            }

            GUILayout.EndArea();
        }
コード例 #11
0
        void Update()
        {
            if (!showGUI)
            {
                return;
            }

            if (!chosen)
            {
                startPanel.SetActive(false);
                connectPanel.SetActive(false);
                mmPanel.SetActive(false);
                connectedPanel.SetActive(false);
                readyPanel.SetActive(false);
                pickMatchPanel.SetActive(false);
                changeServerPanel.SetActive(false);
                connectedServerPanel.SetActive(false);
                return;
            }

            int       xpos    = 10 + offsetX;
            int       ypos    = 40 + offsetY;
            const int spacing = 24;

            bool noConnection = (manager.client == null || manager.client.connection == null ||
                                 manager.client.connection.connectionId == -1);

            if (!manager.IsClientConnected() && !NetworkServer.active && manager.matchMaker == null)
            {
                if (noConnection)
                {
                    startPanel.SetActive(true);
                    connectPanel.SetActive(false);
                    mmPanel.SetActive(false);
                    connectedPanel.SetActive(false);
                    readyPanel.SetActive(false);
                    pickMatchPanel.SetActive(false);
                    changeServerPanel.SetActive(false);
                    connectedServerPanel.SetActive(false);
                    manager.networkAddress = ipAddr.text;
                }
                else
                {
                    startPanel.SetActive(false);
                    connectPanel.SetActive(true);
                    mmPanel.SetActive(false);
                    connectedPanel.SetActive(false);
                    readyPanel.SetActive(false);
                    pickMatchPanel.SetActive(false);
                    changeServerPanel.SetActive(false);
                    connectedServerPanel.SetActive(false);
                    connectingClient.text = "Connecting to " + manager.networkAddress + ":" + manager.networkPort + "..";
                }
            }
            else
            {
                if (NetworkServer.active)
                {
                    startPanel.SetActive(false);
                    connectPanel.SetActive(false);
                    mmPanel.SetActive(false);
                    connectedPanel.SetActive(true);
                    connectedServerPanel.SetActive(false);
                    readyPanel.SetActive(false);
                    pickMatchPanel.SetActive(false);
                    changeServerPanel.SetActive(false);
                    string serverMsg = "Server: port=" + manager.networkPort;
                    if (manager.useWebSockets)
                    {
                        serverMsg += " (Using WebSockets)";
                    }
                    //GUI.Label(new Rect(xpos, ypos, 300, 20), serverMsg);
                }
                if (manager.IsClientConnected())
                {
                    connectedClient.text = "Client: address=" + manager.networkAddress + " port=" + manager.networkPort;
                }
            }

            if (manager.IsClientConnected() && !ClientScene.ready)
            {
                startPanel.SetActive(false);
                connectPanel.SetActive(false);
                mmPanel.SetActive(false);
                connectedPanel.SetActive(false);
                connectedServerPanel.SetActive(false);
                readyPanel.SetActive(true);
                pickMatchPanel.SetActive(false);
                changeServerPanel.SetActive(false);
            }

            if (NetworkServer.active || manager.IsClientConnected())
            {
                startPanel.SetActive(false);
                connectPanel.SetActive(false);
                mmPanel.SetActive(false);
                connectedServerPanel.SetActive(true);
                connectedPanel.SetActive(false);
                readyPanel.SetActive(false);
                pickMatchPanel.SetActive(false);
                changeServerPanel.SetActive(false);
            }

            if (!NetworkServer.active && !manager.IsClientConnected() && noConnection)
            {
                if (manager.matchMaker != null)
                {
                    if (manager.matchInfo == null)
                    {
                        if (manager.matches == null)
                        {
                            startPanel.SetActive(false);
                            connectPanel.SetActive(false);
                            mmPanel.SetActive(true);
                            connectedPanel.SetActive(false);
                            readyPanel.SetActive(false);
                            pickMatchPanel.SetActive(false);
                            changeServerPanel.SetActive(false);
                            connectedServerPanel.SetActive(false);

                            manager.matchName = matchNameField.text;
                        }
                        else
                        {
                            startPanel.SetActive(false);
                            connectPanel.SetActive(false);
                            mmPanel.SetActive(true);
                            connectedPanel.SetActive(false);
                            readyPanel.SetActive(false);
                            pickMatchPanel.SetActive(true);
                            changeServerPanel.SetActive(false);
                            connectedServerPanel.SetActive(false);

                            /* for (int i = 0; i < manager.matches.Count; i++)
                             * {
                             *   var match = manager.matches[i];
                             *   if (GUI.Button(new Rect(xpos, ypos, 200, 20), "Join Match:" + match.name))
                             *   {
                             *       manager.matchName = match.name;
                             *       manager.matchMaker.JoinMatch(match.networkId, "", "", "", 0, 0, manager.OnMatchJoined);
                             *   }
                             *   ypos += spacing;
                             * }*/
                        }
                    }

                    if (m_ShowServer)
                    {
                        startPanel.SetActive(false);
                        connectPanel.SetActive(false);
                        mmPanel.SetActive(true);
                        connectedPanel.SetActive(false);
                        readyPanel.SetActive(false);
                        pickMatchPanel.SetActive(false);
                        changeServerPanel.SetActive(true);
                        connectedServerPanel.SetActive(false);
                        ypos += spacing;
                    }

                    //GUI.Label(new Rect(xpos, ypos, 300, 20), "MM Uri: " + manager.matchMaker.baseUri);
                }
            }
        }