Esempio n. 1
0
        void Update()
        {
            m_Driver.ScheduleUpdate().Complete();

            // Clean up connections
            for (int i = 0; i < m_Connections.Length; i++)
            {
                if (!m_Connections[i].IsCreated)
                {
                    m_Connections.RemoveAtSwapBack(i);
                    --i;
                }
            }

            // Accept new connections
            NetworkConnection c;

            while ((c = m_Driver.Accept()) != default(NetworkConnection) && Clients.Count < 4)
            {
                m_Connections.Add(c);
                //Debug.Log("Accepted a connection");

                //Send Welcome Message to Client
                var  color        = Lobby.ColorList[Clients.Count];
                uint encodedColor = (uint)DataUtilities.EncodeColor(color);
                //uint colourInt = ((uint)colour.r << 24 | (uint)colour.g << 16 | (uint)colour.b << 8 | (uint)colour.a);

                ServerClient newClient = new ServerClient(c.InternalId, "", color);
                newClient.StartHealth = Lobby.PlayerStartHealth;

                Clients.Add(newClient);

                var message = new WelcomeMessage
                {
                    PlayerID = c.InternalId,
                    Colour   = encodedColor,
                };

                var writer = m_Driver.BeginSend(c);
                message.SerializeObject(ref writer);
                m_Driver.EndSend(writer);
            }

            DataStreamReader reader;

            for (int i = 0; i < m_Connections.Length; i++)
            {
                if (!m_Connections[i].IsCreated)
                {
                    continue;
                }


                NetworkEvent.Type cmd;
                while ((cmd = m_Driver.PopEventForConnection(m_Connections[i], out reader)) != NetworkEvent.Type.Empty)
                {
                    if (cmd == NetworkEvent.Type.Data)
                    {
                        var messageType = (Message.MessageType)reader.ReadUShort();

                        switch (CurrentGameState)
                        {
                        case GameState.Lobby:
                            LobbyData.HandleMessages(messageType, reader, i);
                            break;

                        case GameState.InGame:
                            GameData.HandleMessages(messageType, reader, i);
                            break;

                        default:
                            break;
                        }
                    }
                    else if (cmd == NetworkEvent.Type.Disconnect)
                    {
                        for (int j = 0; j < m_Connections.Length; j++)
                        {
                            var leftMessage = new PlayerLeft
                            {
                                PlayerDisconnectID = Clients[i].ClientID,
                            };

                            var write = m_Driver.BeginSend(m_Connections[j]);
                            leftMessage.SerializeObject(ref write);
                            m_Driver.EndSend(write);
                        }

                        Clients.RemoveAt(i);
                        Lobby.LobbyUI.GetComponent <PlayerLobbyList>().RemoveFromList(i);

                        m_Connections[i] = default(NetworkConnection);
                    }
                }
            }
        }