Ejemplo n.º 1
0
    /// <summary>
    /// Send to all clients when a player leaves the dungeon.
    /// </summary>
    private void SendPlayerLeftDungeon(Client leavingClient)
    {
        var message = new PlayerLeftDungeonMessage()
        {
            PlayerID = leavingClient.PlayerID
        };

        foreach (Client c in AllClientPlayerDictionary.Keys)
        {
            server.SendMessage(message, c.Connection);
        }
    }
    public void Update()
    {
        networkJobHandle.Complete();

        if (!connection.IsCreated)
        {
            return;
        }

        DataStreamReader reader;

        NetworkEvent.Type cmd;
        while ((cmd = connection.PopEvent(networkDriver, out reader)) != NetworkEvent.Type.Empty)
        {
            if (cmd == NetworkEvent.Type.Connect)
            {
                Debug.Log("Connected to server");
            }
            else if (cmd == NetworkEvent.Type.Data)
            {
                var messageType = (Message.MessageType)reader.ReadUShort();
                Debug.Log("Client Received: " + messageType + " from Host");

                Message message = null;
                switch (messageType)
                {
                case Message.MessageType.None: break;

                case Message.MessageType.NewPlayer: message = new NewPlayerMessage(); break;

                case Message.MessageType.Welcome: message = new WelcomeMessage(); break;

                case Message.MessageType.RequestDenied: message = new RequestDeniedMessage(); break;

                case Message.MessageType.PlayerLeft: message = new PlayerLeftMessage(); break;

                case Message.MessageType.StartGame: message = new StartGameMessage(); break;

                case Message.MessageType.PlayerTurn: message = new PlayerTurnMessage(); break;

                case Message.MessageType.RoomInfo: message = new RoomInfoMessage(); break;

                case Message.MessageType.PlayerEnterRoom: message = new PlayerEnterRoomMessage(); break;

                case Message.MessageType.PlayerLeaveRoom: message = new PlayerLeaveRoomMessage(); break;

                case Message.MessageType.ObtainTreasure: message = new ObtainTreasureMessage(); break;

                case Message.MessageType.HitMonster: message = new HitMonserMessage(); break;

                case Message.MessageType.HitByMonster: message = new HitByMonserMessage(); break;

                case Message.MessageType.PlayerDefends: message = new PlayerDefendsMessage(); break;

                case Message.MessageType.PlayerLeftDungeon: message = new PlayerLeftDungeonMessage(); break;

                case Message.MessageType.PlayerDies: message = new PlayerDiesMessage(); break;

                case Message.MessageType.EndGame:   break;

                default: break;
                }
                if (message != null)
                {
                    message.DeserializeObject(ref reader);
                    receivedMessagesQueue.Enqueue(message);
                }
            }
            else if (cmd == NetworkEvent.Type.Disconnect)
            {
                Debug.Log("Disconnected from server");
                connection = default;
            }
        }
        ProcessMessagesQueue();

        if (Time.time - lastSendTime > STAY_ALIVE_AFTER_SECONDS)
        {
            SendMessage(new NoneMessage());
        }
        networkJobHandle = networkDriver.ScheduleUpdate();
    }
Ejemplo n.º 3
0
    void Update()
    {
        networkJobHandle.Complete();
        for (int i = 0; i < connections.Length; ++i)
        {
            if (!connections[i].IsCreated)
            {
                connections.RemoveAtSwapBack(i);
                --i;
            }
        }

        NetworkConnection c;

        while ((c = networkDriver.Accept()) != default)
        {
            if (GameHasStarted)
            {
                MakeRequestDeniedMessage(c, 0);
                c.Disconnect(networkDriver);
                return;
            }

            if (connections.Length > 4)
            {
                MakeRequestDeniedMessage(c, 1);
                c.Disconnect(networkDriver);
                return;
            }

            //Accepted Connection
            connections.Add(c);

            var colour         = (Color32)UnityEngine.Random.ColorHSV();
            var welcomeMessage = new WelcomeMessage
            {
                PlayerID = playerID,
                Colour   = ((uint)colour.r << 24) | ((uint)colour.g << 16) | ((uint)colour.b << 8) | colour.a
            };

            PlayerManager.Instance.Players.Add(new Players(playerID, "", welcomeMessage.Colour));
            playerID++;
            NetworkManager.SendMessage(networkDriver, welcomeMessage, c);
        }

        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)
                    {
                    case MessageHeader.MessageType.None:
                        var noneMessage = NetworkManager.ReadMessage <StayAliveMessage>(reader, ServerMessageQueue);
                        NetworkManager.SendMessage(networkDriver, noneMessage, connections[i]);
                        break;

                    case MessageHeader.MessageType.SetName:
                        SetNameMessage setNameMessage = NetworkManager.ReadMessage <SetNameMessage>(reader, ServerMessageQueue) as SetNameMessage;
                        PlayerManager.Instance.Players[i].clientName = setNameMessage.Name;

                        var newPlayerMessage = new NewPlayerMessage()
                        {
                            PlayerID    = PlayerManager.Instance.Players[i].playerID,
                            PlayerColor = PlayerManager.Instance.Players[i].clientColor,
                            PlayerName  = setNameMessage.Name
                        };

                        //looping through all the connections to send the new player message
                        for (int j = 0; j < connections.Length; j++)
                        {
                            if (j != i)
                            {
                                NetworkManager.SendMessage(networkDriver, newPlayerMessage, connections[j]);

                                var connectedPlayersMessage = new NewPlayerMessage()
                                {
                                    PlayerID    = PlayerManager.Instance.Players[j].playerID,
                                    PlayerColor = PlayerManager.Instance.Players[j].clientColor,
                                    PlayerName  = PlayerManager.Instance.Players[j].clientName
                                };
                                NetworkManager.SendMessage(networkDriver, connectedPlayersMessage, connections[i]);
                            }
                        }

                        break;

                    case MessageHeader.MessageType.PlayerLeft:
                        PlayerLeftMessage leftMessage = NetworkManager.ReadMessage <PlayerLeftMessage>(reader, ServerMessageQueue) as PlayerLeftMessage;
                        leftMessage.playerLeftID = (uint)i;

                        for (int j = 0; j < connections.Length; j++)
                        {
                            if (leftMessage.playerLeftID != PlayerManager.Instance.Players[i].playerID)
                            {
                                NetworkManager.SendMessage(networkDriver, leftMessage, connections[i]);
                            }
                        }
                        connections[i] = default;
                        break;

                    case MessageHeader.MessageType.MoveRequest:
                        var moveRequest = NetworkManager.ReadMessage <MoveRequest>(reader, ServerMessageQueue);
                        Debug.Log("MoveRequest");
                        if (CheckTileContent(i, TileContent.Monster) || CheckTileContent(i, TileContent.Both))
                        {
                            MakeRequestDeniedMessage(i, 2);
                            SendNewRoomInfo();
                            return;
                        }

                        MakeLeaveRoomMessage(i);
                        PlayerManager.Instance.MovePlayer(moveRequest, i);
                        MakeEnterRoommessage(i);

                        SendNewRoomInfo();
                        MonsterTurn();
                        NewTurnMessage();
                        break;

                    case MessageHeader.MessageType.AttackRequest:
                        var request = NetworkManager.ReadMessage <AttackRequestMessage>(reader, serverMessagesQueue);
                        Debug.Log(DebugTileContent(i));

                        if (!CheckTileContent(i, TileContent.Monster) && !CheckTileContent(i, TileContent.Both))
                        {
                            Debug.Log(CheckTileContent(i, TileContent.Monster));
                            Debug.Log(CheckTileContent(i, TileContent.Both));

                            MakeRequestDeniedMessage(i, 4);
                            SendNewRoomInfo();
                            return;
                        }

                        if (CheckTileContent(i, TileContent.Monster))
                        {
                            SetTileContent(i, TileContent.None);
                        }
                        if (CheckTileContent(i, TileContent.Both))
                        {
                            SetTileContent(i, TileContent.Treasure);
                        }


                        var message = new HitMonsterMessage();
                        NetworkManager.SendMessage(networkDriver, message, connections[i]);
                        SendNewRoomInfo();
                        NewTurnMessage();
                        MonsterTurn();
                        break;

                    case MessageHeader.MessageType.DefendRequest:
                        NetworkManager.ReadMessage <DefendRequestMessage>(reader, serverMessagesQueue);
                        PlayerManager.Instance.Players[i].DefendOneTurn = true;
                        var playerDefendMessage = new PlayerDefendsMessage()
                        {
                            PlayerID = PlayerManager.Instance.Players[i].playerID
                        };

                        Debug.Log(connections.Length);
                        for (int j = 0; j < connections.Length; j++)
                        {
                            NetworkManager.SendMessage(networkDriver, playerDefendMessage, connections[j]);
                        }

                        SendNewRoomInfo();
                        NewTurnMessage();
                        MonsterTurn();
                        break;

                    case MessageHeader.MessageType.ObtainTreasureRequest:
                        NetworkManager.ReadMessage <ClaimTreasureRequestMessage>(reader, serverMessagesQueue);

                        if (!CheckTileContent(i, TileContent.Treasure) && !CheckTileContent(i, TileContent.Both))
                        {
                            MakeRequestDeniedMessage(i, 5);
                            SendNewRoomInfo();
                            return;
                        }
                        if (CheckTileContent(i, TileContent.Both))
                        {
                            MakeRequestDeniedMessage(i, 6);
                            SendNewRoomInfo();
                            return;
                        }

                        Dictionary <Players, uint> players = PlayerManager.Instance.ClaimTreasureDivideItForPlayers(i);

                        uint amount;

                        int SendedItem = 0;

                        foreach (KeyValuePair <Players, uint> item in players)
                        {
                            amount = item.Value;
                            ObtainTreasureMessage obtainTreasure = new ObtainTreasureMessage()
                            {
                                Amount = (ushort)amount
                            };

                            for (int j = 0; j < PlayerManager.Instance.Players.Count; j++)
                            {
                                if (PlayerManager.Instance.Players[j].playerID == item.Key.playerID)
                                {
                                    NetworkManager.SendMessage(networkDriver, obtainTreasure, connections[j]);
                                    SendedItem++;
                                }
                            }
                        }

                        SetTileContent(i, TileContent.None);
                        SendNewRoomInfo();
                        MonsterTurn();
                        NewTurnMessage();
                        break;


                    case MessageHeader.MessageType.LeaveDungeonRequest:
                        NetworkManager.ReadMessage <LeaveDungeonRequest>(reader, serverMessagesQueue);
                        PlayerManager.Instance.PlayersWhoLeft.Add(PlayerManager.Instance.Players[i]);

                        PlayerLeftDungeonMessage playerLeftDungeonMessage = new PlayerLeftDungeonMessage()
                        {
                            playerID = i
                        };

                        PlayerManager.Instance.Players.RemoveAt(i);

                        for (int j = 0; j < connections.Length; j++)
                        {
                            if (i != j)
                            {
                                NetworkManager.SendMessage(networkDriver, playerLeftDungeonMessage, connections[j]);
                            }
                        }

                        if (PlayerManager.Instance.Players.Count < 1)
                        {
                            EndGameMessage endGameMessage = new EndGameMessage();
                            for (int j = 0; j < PlayerManager.Instance.PlayersWhoLeft.Count; j++)
                            {
                                endGameMessage.playerID.Add(PlayerManager.Instance.PlayersWhoLeft[j].playerID);
                                endGameMessage.highScorePairs.Add((ushort)PlayerManager.Instance.PlayersWhoLeft[j].treasureAmount);
                                NetworkManager.SendMessage(networkDriver, endGameMessage, connections[j]);
                                connections[j].Disconnect(networkDriver);
                            }
                        }
                        else
                        {
                            MonsterTurn();
                            SendNewRoomInfo();
                            NewTurnMessage();
                        }
                        break;
                    }
                }
                else if (cmd == NetworkEvent.Type.Disconnect)
                {
                    PlayerLeftMessage leftMessage = new PlayerLeftMessage();
                    leftMessage.playerLeftID = (uint)i;

                    for (int j = 0; j < connections.Length; j++)
                    {
                        if (leftMessage.playerLeftID != PlayerManager.Instance.Players[j].playerID)
                        {
                            NetworkManager.SendMessage(networkDriver, leftMessage, connections[j]);
                        }
                    }

                    Debug.Log("Client disconnected");
                    connections[i] = default;
                }
            }
        }

        networkJobHandle = networkDriver.ScheduleUpdate();

        ProcessMessagesQueue();
    }
        internal void HandlePlayerLeftDungeon(Message message)
        {
            PlayerLeftDungeonMessage playerLeftDungeonMessage = (PlayerLeftDungeonMessage)message;

            Menu.Singleton.gameWindow.OutputText(lobby.players[playerLeftDungeonMessage.PlayerID].PlayerTextWithColorTag() + " left the dungeon");
        }