Пример #1
0
    public void FinalizeJoinRequest(string matchmakerTicket, UserAccountInfo userInfo, bool approved)
    {
        IClient client = tempTicketMap[matchmakerTicket];

        tempTicketMap.Remove(matchmakerTicket);

        //Respond to client with approval status
        using (DarkRiftWriter writer = DarkRiftWriter.Create()) {
            writer.Write(approved);

            using (Message message = Message.Create(NetworkTags.Connection, writer)) {
                client.SendMessage(message, SendMode.Reliable);
            }
        }

        //Record client in lobby map
        if (LobbyClientAccountMap.ContainsKey(client))
        {
            LobbyClientAccountMap[client] = userInfo;
        }
        else
        {
            LobbyClientAccountMap.Add(client, userInfo);
        }
    }
Пример #2
0
    protected void UserJoinGame(IClient client)
    {
        UserAccountInfo userInfo = null;

        if (LobbyClientAccountMap.ContainsKey(client))
        {
            userInfo = LobbyClientAccountMap[client];
            LobbyClientAccountMap.Remove(client);
        }
        else if (InGameClientAccountMap.ContainsKey(client))
        {
            userInfo = InGameClientAccountMap[client];
        }

        //Record client in game map
        if (InGameClientAccountMap.ContainsKey(client))
        {
            InGameClientAccountMap[client] = userInfo;
        }
        else
        {
            InGameClientAccountMap.Add(client, userInfo);
        }

        Player     player     = ServerGameManager.Instance.PlayerJoined(userInfo.PlayFabId, userInfo.TitleInfo.DisplayName);
        PlayerData playerData = DatabaseManager.GetPlayerData(userInfo.PlayFabId);

        player.maxSquadCost = playerData.MaxSquadCost;

        //Alert other players of the new player
        using (DarkRiftWriter writer = DarkRiftWriter.Create()) {
            writer.Write(player);

            using (Message message = Message.Create(NetworkTags.PlayerJoined, writer)) {
                foreach (IClient otherClient in InGameClientAccountMap.Keys)
                {
                    if (!otherClient.Equals(client))
                    {
                        otherClient.SendMessage(message, SendMode.Reliable);
                    }
                }
            }
        }

        //Send current game state to newly-joined player
        using (DarkRiftWriter writer = DarkRiftWriter.Create()) {
            writer.Write(ServerGameManager.Instance.GameState);
            //whether player already has entities spawned
            writer.Write(ServerEntityManager.Instance.GetUnitsForPlayer(player.id).Count > 0);

            using (Message message = Message.Create(NetworkTags.GameState, writer)) {
                client.SendMessage(message, SendMode.Reliable);
            }
        }

        ServerGameManager.Instance.TryToStartGame();
    }
Пример #3
0
    public void EndGame(GameState gameState)
    {
        //Send current game state to all players
        BroadcastGameState(gameState);

        //Mark all players as back in the lobby
        foreach (KeyValuePair <IClient, UserAccountInfo> client in InGameClientAccountMap)
        {
            LobbyClientAccountMap.Add(client.Key, client.Value);
        }
        InGameClientAccountMap.Clear();
    }
Пример #4
0
    private void DarkRift_OnClientDisconnected(object sender, ClientDisconnectedEventArgs e)
    {
        string playFabId = null;

        if (LobbyClientAccountMap.ContainsKey(e.Client))
        {
            playFabId = LobbyClientAccountMap[e.Client].PlayFabId;
            LobbyClientAccountMap.Remove(e.Client);
        }

        if (InGameClientAccountMap.ContainsKey(e.Client))
        {
            playFabId = InGameClientAccountMap[e.Client].PlayFabId;
            Player player = ServerGameManager.Instance.PlayerLeft(playFabId);

            InGameClientAccountMap.Remove(e.Client);

            if (player != null)
            {
                //Alert other players of the disconnection
                using (DarkRiftWriter writer = DarkRiftWriter.Create()) {
                    writer.Write(player);

                    using (Message message = Message.Create(NetworkTags.PlayerLeft, writer)) {
                        foreach (IClient otherClient in InGameClientAccountMap.Keys)
                        {
                            otherClient.SendMessage(message, SendMode.Reliable);
                        }
                    }
                }
            }
        }

        if (playFabId != null)
        {
            ServerPlayFabManager.Instance.NotifyPlayerLeft(playFabId);
        }
    }
Пример #5
0
    private void DarkRift_OnMessageReceived(object sender, MessageReceivedEventArgs e)
    {
        using (Message message = e.GetMessage())
            using (DarkRiftReader reader = message.GetReader()) {
                if (InGameClientAccountMap.ContainsKey(e.Client))
                {
                    //valid, joined player
                    if (ServerGameManager.Instance.GameState.currentState == GameStates.GAME_IN_PROGRESS)
                    {
                        //game is in progress
                        if (message.Tag == NetworkTags.Command)
                        {
                            ServerEntityManager.Instance.HandleCommand(reader.ReadSerializable <EntityCommand>(), InGameClientAccountMap[e.Client].PlayFabId);
                        }
                        else if (message.Tag == NetworkTags.Construction)
                        {
                            ServerEntityManager.Instance.SpawnStructure(ServerGameManager.Instance.GameState.GetPlayer(InGameClientAccountMap[e.Client].PlayFabId),
                                                                        reader.ReadString(),
                                                                        new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()));
                        }
                        else if (message.Tag == NetworkTags.PlayerEvent)
                        {
                            ServerEntityManager.Instance.SpawnPlayerEvent(ServerGameManager.Instance.GameState.GetPlayer(InGameClientAccountMap[e.Client].PlayFabId),
                                                                          reader.ReadString(),
                                                                          new Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()));
                        }
                        else if (message.Tag == NetworkTags.ChatMessage)
                        {
                            string messageText = reader.ReadString();

                            using (DarkRiftWriter writer = DarkRiftWriter.Create()) {
                                writer.Write(InGameClientAccountMap[e.Client].PlayFabId);
                                writer.Write(messageText);

                                using (Message response = Message.Create(NetworkTags.ChatMessage, writer)) {
                                    e.Client.SendMessage(response, SendMode.Reliable);
                                }
                            }
                        }
                        else if (message.Tag == NetworkTags.UnitList)
                        {
                            List <PlayerUnit> playerUnits = ServerEntityManager.Instance.GetUsablePlayerUnits(InGameClientAccountMap[e.Client].PlayFabId);
                            if (playerUnits == null)
                            {
                                playerUnits = DatabaseManager.GetPlayerUnits(InGameClientAccountMap[e.Client].PlayFabId);
                                ServerEntityManager.Instance.SetPlayerUnits(InGameClientAccountMap[e.Client].PlayFabId, playerUnits);
                            }

                            using (DarkRiftWriter writer = DarkRiftWriter.Create()) {
                                foreach (PlayerUnit playerUnit in playerUnits)
                                {
                                    writer.Write(playerUnit);
                                }

                                using (Message response = Message.Create(NetworkTags.UnitList, writer)) {
                                    e.Client.SendMessage(response, SendMode.Reliable);
                                }
                            }
                        }
                        else if (message.Tag == NetworkTags.SquadSelection)
                        {
                            List <SelectedPlayerUnit> selectedUnits = new List <SelectedPlayerUnit>();
                            while (reader.Position < reader.Length)
                            {
                                selectedUnits.Add(reader.ReadSerializable <SelectedPlayerUnit>());
                            }
                            ServerEntityManager.Instance.SpawnPlayerSquad(ServerGameManager.Instance.GameState.GetPlayer(InGameClientAccountMap[e.Client].PlayFabId), selectedUnits);
                        }
                    }
                }
                else if (LobbyClientAccountMap.ContainsKey(e.Client))
                {
                    if (message.Tag == NetworkTags.FullUnitList)
                    {
                        List <PlayerUnit> playerUnits = DatabaseManager.GetPlayerUnits(LobbyClientAccountMap[e.Client].PlayFabId);

                        using (DarkRiftWriter writer = DarkRiftWriter.Create()) {
                            foreach (PlayerUnit playerUnit in playerUnits)
                            {
                                writer.Write(playerUnit);
                            }

                            using (Message response = Message.Create(NetworkTags.FullUnitList, writer)) {
                                e.Client.SendMessage(response, SendMode.Reliable);
                            }
                        }
                    }
                    else if (message.Tag == NetworkTags.CustomizedUnits)
                    {
                        List <SelectedPlayerUnit> customizedUnits = new List <SelectedPlayerUnit>();
                        while (reader.Position < reader.Length)
                        {
                            customizedUnits.Add(reader.ReadSerializable <SelectedPlayerUnit>());
                        }
                        foreach (SelectedPlayerUnit customizedUnit in customizedUnits)
                        {
                            DatabaseManager.SavePlayerUnit(LobbyClientAccountMap[e.Client].PlayFabId, customizedUnit);
                        }
                    }
                }

                if (message.Tag == NetworkTags.Connection)
                {
                    //Matchmaker join request from a client, submit ticket to PlayFab
                    string matchmakerTicket = reader.ReadString();
                    tempTicketMap.Add(matchmakerTicket, e.Client);
                    ServerPlayFabManager.Instance.RedeemMatchmakerTicket(matchmakerTicket);
                }
                else if (message.Tag == NetworkTags.JoinGame)
                {
                    UserJoinGame(e.Client);
                }
            }
    }