Exemple #1
0
        void Update()
        {
            if (doneInitializing) // I want this to start executing if we did the manual start function
            {
                networkJobHandle.Complete();

                if (!connection.IsCreated)
                {
                    Debug.Log("Can't create connection.");
                    if (clientGameManager != null && !disconnectedMessage)
                    {
                        StartCoroutine(clientGameManager.ShowConnectionDisconnected());
                        disconnectedMessage = true;
                    }
                    return;
                }

                DataStreamReader  reader;
                NetworkEvent.Type cmd;
                while ((cmd = connection.PopEvent(networkDriver, out reader)) != NetworkEvent.Type.Empty)
                {
                    if (cmd == NetworkEvent.Type.Connect) // Connecting to the server
                    {
                        Debug.Log("Connected to server");
                    }
                    else if (cmd == NetworkEvent.Type.Data) // Getting in Data
                    {
                        var messageType = (MessageHeader.MessageType)reader.ReadUShort();
                        switch (messageType) // client reads all except setname.
                        {
                            #region Lobby Protocol
                        case MessageHeader.MessageType.None:
                            break;

                        case MessageHeader.MessageType.NewPlayer:
                            var newPlayerMessage = new NewPlayerMessage();
                            newPlayerMessage.DeserializeObject(ref reader);
                            MessageConnection mcNewPlayer = new MessageConnection(connection, newPlayerMessage);
                            messagesQueue.Enqueue(mcNewPlayer);
                            break;

                        case MessageHeader.MessageType.Welcome:
                            var welcomeMessage = new WelcomeMessage();
                            welcomeMessage.DeserializeObject(ref reader);
                            MessageConnection mcWelcome = new MessageConnection(connection, welcomeMessage);
                            messagesQueue.Enqueue(mcWelcome);

                            break;

                        case MessageHeader.MessageType.SetName:
                            break;

                        case MessageHeader.MessageType.RequestDenied:
                            var requestDeniedMessage = new RequestDeniedMessage();
                            requestDeniedMessage.DeserializeObject(ref reader);
                            MessageConnection mcDenied = new MessageConnection(connection, requestDeniedMessage);
                            messagesQueue.Enqueue(mcDenied);
                            break;

                        case MessageHeader.MessageType.PlayerLeft:
                            var playerLeftMessage = new PlayerLeftMessage();
                            playerLeftMessage.DeserializeObject(ref reader);
                            MessageConnection mcPlayerLeft = new MessageConnection(connection, playerLeftMessage);
                            messagesQueue.Enqueue(mcPlayerLeft);
                            break;

                        case MessageHeader.MessageType.StartGame:
                            var startGameMessage = new StartGameMessage();
                            startGameMessage.DeserializeObject(ref reader);
                            MessageConnection mcStartGame = new MessageConnection(connection, startGameMessage);
                            messagesQueue.Enqueue(mcStartGame);
                            break;

                            #endregion
                            #region Game Protocol
                        case MessageHeader.MessageType.PlayerTurn:
                            var playerTurnMessage = new PlayerTurnMessage();
                            playerTurnMessage.DeserializeObject(ref reader);
                            MessageConnection mcPlayerTurn = new MessageConnection(connection, playerTurnMessage);
                            messagesQueue.Enqueue(mcPlayerTurn);
                            break;

                        case MessageHeader.MessageType.RoomInfo:
                            var roomInfoMessage = new RoomInfoMessage();
                            roomInfoMessage.DeserializeObject(ref reader);
                            MessageConnection mcRoomInfo = new MessageConnection(connection, roomInfoMessage);
                            messagesQueue.Enqueue(mcRoomInfo);
                            break;

                        case MessageHeader.MessageType.PlayerEnterRoom:
                            var playerEnterRoomMessage = new PlayerEnterRoomMessage();
                            playerEnterRoomMessage.DeserializeObject(ref reader);
                            MessageConnection mcPlayerEnterRoom = new MessageConnection(connection, playerEnterRoomMessage);
                            messagesQueue.Enqueue(mcPlayerEnterRoom);
                            break;

                        case MessageHeader.MessageType.PlayerLeaveRoom:
                            var playerLeaveRoomMessage = new PlayerLeaveRoomMessage();
                            playerLeaveRoomMessage.DeserializeObject(ref reader);
                            MessageConnection mcPlayerLeaveRoom = new MessageConnection(connection, playerLeaveRoomMessage);
                            messagesQueue.Enqueue(mcPlayerLeaveRoom);
                            break;

                        case MessageHeader.MessageType.ObtainTreasure:
                            var obtainTreasureMessage = new ObtainTreasureMessage();
                            obtainTreasureMessage.DeserializeObject(ref reader);
                            MessageConnection mcObtainTreasure = new MessageConnection(connection, obtainTreasureMessage);
                            messagesQueue.Enqueue(mcObtainTreasure);
                            break;

                        case MessageHeader.MessageType.HitMonster:
                            var hitMonsterMessage = new HitMonsterMessage();
                            hitMonsterMessage.DeserializeObject(ref reader);
                            MessageConnection mcHitMonster = new MessageConnection(connection, hitMonsterMessage);
                            messagesQueue.Enqueue(mcHitMonster);
                            break;

                        case MessageHeader.MessageType.HitByMonster:
                            var hitByMonsterMessage = new HitByMonsterMessage();
                            hitByMonsterMessage.DeserializeObject(ref reader);
                            MessageConnection mcHitByMonster = new MessageConnection(connection, hitByMonsterMessage);
                            messagesQueue.Enqueue(mcHitByMonster);
                            break;

                        case MessageHeader.MessageType.PlayerDefends:
                            var playerDefendsMessage = new PlayerDefendsMessage();
                            playerDefendsMessage.DeserializeObject(ref reader);
                            MessageConnection mcPlayerDefends = new MessageConnection(connection, playerDefendsMessage);
                            messagesQueue.Enqueue(mcPlayerDefends);
                            break;

                        case MessageHeader.MessageType.PlayerLeftDungeon:
                            var playerLeftDungeonMessage = new PlayerLeftDungeonMessage();
                            playerLeftDungeonMessage.DeserializeObject(ref reader);
                            MessageConnection mcPlayerLeftDungeon = new MessageConnection(connection, playerLeftDungeonMessage);
                            messagesQueue.Enqueue(mcPlayerLeftDungeon);
                            break;

                        case MessageHeader.MessageType.PlayerDies:
                            var playerDiesMessage = new PlayerDiesMessage();
                            playerDiesMessage.DeserializeObject(ref reader);
                            MessageConnection mcPlayerDies = new MessageConnection(connection, playerDiesMessage);
                            messagesQueue.Enqueue(mcPlayerDies);
                            break;

                        case MessageHeader.MessageType.EndGame:
                            var endGameMessage = new EndGameMessage();
                            endGameMessage.DeserializeObject(ref reader);
                            MessageConnection mcEndGame = new MessageConnection(connection, endGameMessage);
                            messagesQueue.Enqueue(mcEndGame);
                            break;

                        case MessageHeader.MessageType.MoveRequest:
                            break;

                        case MessageHeader.MessageType.AttackRequest:
                            break;

                        case MessageHeader.MessageType.DefendRequest:
                            break;

                        case MessageHeader.MessageType.ClaimTreasureRequest:
                            break;

                        case MessageHeader.MessageType.LeaveDungeonRequest:
                            break;

                            #endregion
                        case MessageHeader.MessageType.Count:
                            break;

                        default:
                            break;
                        }
                    }
                    else if (cmd == NetworkEvent.Type.Disconnect)
                    {
                        Debug.Log("Disconnected from server");
                        connection = default;
                        ClientGameManager.ShowHostTerminatedRoom();
                    }
                }

                networkJobHandle = networkDriver.ScheduleUpdate();
                networkJobHandle.Complete();
                ProcessMessagesQueue();
            }
        }
        void Update()
        {
            if (doneInitializing)
            {
                networkJobHandle.Complete();

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

                // Accept connections
                NetworkConnection connection;
                while ((connection = networkDriver.Accept()) != default)
                {
                    // We can only accept 4 connections
                    if (ClientList.Count >= 4)
                    {
                        // Send Request Denied Message
                        SendRequestDeniedMessage(connection);
                        //networkDriver.Disconnect(connection);
                    }
                    else
                    {
                        connections.Add(connection);
                        Debug.Log("Accepted connection");

                        // Log the client & Send the Welcome Message
                        bool host = false;
                        if (connection.InternalId == 0)
                        {
                            host = true;
                        }
                        Client newClient = new Client(connection.InternalId, "", connection, host);
                        newClient.AssignRandomColor();
                        ClientList.Add(newClient);
                        SendWelcomeMessage(newClient);
                    }
                }

                // Read the stream
                DataStreamReader reader;
                for (int i = 0; i < connections.Length; ++i)
                {
                    if (!connections[i].IsCreated)
                    {
                        continue;
                    }

                    NetworkEvent.Type cmd;
                    while ((cmd = networkDriver.PopEventForConnection(connections[i], out reader)) != NetworkEvent.Type.Empty)
                    {
                        if (cmd == NetworkEvent.Type.Data)
                        {
                            var messageType = (MessageHeader.MessageType)reader.ReadUShort();
                            switch (messageType)
                            {
                                #region Lobby Protocol
                            case MessageHeader.MessageType.None:
                                var noneMessage = new NoneMessage();
                                noneMessage.DeserializeObject(ref reader);
                                MessageConnection mcNone = new MessageConnection(connections[i], noneMessage);
                                messagesQueue.Enqueue(mcNone);
                                break;

                            case MessageHeader.MessageType.NewPlayer:
                                break;

                            case MessageHeader.MessageType.Welcome:
                                break;

                            case MessageHeader.MessageType.SetName:
                                var setNameMessage = new SetNameMessage();
                                setNameMessage.DeserializeObject(ref reader);
                                MessageConnection mcSetName = new MessageConnection(connections[i], setNameMessage);
                                messagesQueue.Enqueue(mcSetName);
                                break;

                            case MessageHeader.MessageType.RequestDenied:
                                break;

                            case MessageHeader.MessageType.PlayerLeft:
                                var playerLeftMessage = new PlayerLeftMessage();
                                playerLeftMessage.DeserializeObject(ref reader);
                                MessageConnection mcPlayerLeft = new MessageConnection(connections[i], playerLeftMessage);
                                messagesQueue.Enqueue(mcPlayerLeft);
                                break;

                            case MessageHeader.MessageType.StartGame:
                                var startGameMessage = new StartGameMessage();
                                startGameMessage.DeserializeObject(ref reader);
                                MessageConnection mcStartGame = new MessageConnection(connections[i], startGameMessage);
                                messagesQueue.Enqueue(mcStartGame);
                                break;

                                #endregion
                                #region Game Protocol
                            case MessageHeader.MessageType.PlayerTurn:
                                break;

                            case MessageHeader.MessageType.RoomInfo:
                                break;

                            case MessageHeader.MessageType.PlayerEnterRoom:
                                break;

                            case MessageHeader.MessageType.PlayerLeaveRoom:
                                break;

                            case MessageHeader.MessageType.ObtainTreasure:
                                break;

                            case MessageHeader.MessageType.HitMonster:
                                break;

                            case MessageHeader.MessageType.HitByMonster:
                                break;

                            case MessageHeader.MessageType.PlayerDefends:
                                break;

                            case MessageHeader.MessageType.PlayerLeftDungeon:
                                break;

                            case MessageHeader.MessageType.PlayerDies:
                                break;

                            case MessageHeader.MessageType.EndGame:
                                break;

                            case MessageHeader.MessageType.MoveRequest:
                                var moveRequestMessage = new MoveRequestMessage();
                                moveRequestMessage.DeserializeObject(ref reader);
                                var mcMoveRequest = new MessageConnection(connections[i], moveRequestMessage);
                                messagesQueue.Enqueue(mcMoveRequest);
                                break;

                            case MessageHeader.MessageType.AttackRequest:
                                var attackRequestMessage = new AttackRequestMessage();
                                attackRequestMessage.DeserializeObject(ref reader);
                                var mcAttackRequest = new MessageConnection(connections[i], attackRequestMessage);
                                messagesQueue.Enqueue(mcAttackRequest);
                                break;

                            case MessageHeader.MessageType.DefendRequest:
                                var defendRequestMessage = new DefendRequestMessage();
                                defendRequestMessage.DeserializeObject(ref reader);
                                var mcDefendRequest = new MessageConnection(connections[i], defendRequestMessage);
                                messagesQueue.Enqueue(mcDefendRequest);
                                break;

                            case MessageHeader.MessageType.ClaimTreasureRequest:
                                var claimTreasureRequestMessage = new ClaimTreasureRequestMessage();
                                claimTreasureRequestMessage.DeserializeObject(ref reader);
                                var mcClaimTreasureRequest = new MessageConnection(connections[i], claimTreasureRequestMessage);
                                messagesQueue.Enqueue(mcClaimTreasureRequest);
                                break;

                            case MessageHeader.MessageType.LeaveDungeonRequest:
                                var leaveDungeonRequestMessage = new LeaveDungeonRequestMessage();
                                leaveDungeonRequestMessage.DeserializeObject(ref reader);
                                var mcLeaveDungeonRequest = new MessageConnection(connections[i], leaveDungeonRequestMessage);
                                messagesQueue.Enqueue(mcLeaveDungeonRequest);
                                break;

                                #endregion
                            case MessageHeader.MessageType.Count:
                                break;

                            default:
                                break;
                            }
                        }
                        else if (cmd == NetworkEvent.Type.Disconnect)
                        {
                            Debug.Log("Client disconnected");
                            // send who is leaving
                            var playerLeftMessage = new PlayerLeftMessage {
                                PlayerLeftID = connections[i].InternalId
                            };
                            Client removeClient = null;
                            foreach (Client c in clientList)
                            {
                                if (c.PlayerID == connections[i].InternalId)
                                {
                                    removeClient = c;
                                }
                            }
                            clientList.Remove(removeClient);

                            foreach (Client c in clientList)
                            {
                                if (c.PlayerID != connections[i].InternalId)
                                {
                                    SendMessage(playerLeftMessage, c.Connection);
                                }
                            }
                            HostGameManager.PlayerLeft(removeClient);
                            connections[i] = default;
                        }
                    }
                }

                networkJobHandle = networkDriver.ScheduleUpdate();
                networkJobHandle.Complete();
                ProcessMessagesQueue();
            }
        }