> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Fazendo mais com placares de líderes

> Recursos avançados de placares de líderes do PlayFab: crie placares de líderes com várias colunas, desempate aprimorado, entidades externas e consulte classificações em torno de um jogador.

Neste tutorial, vamos abordar os recursos avançados que o serviço tem a oferecer, como a criação de placares de líderes com várias colunas,
desempate aprimorado e várias maneiras de consultar o placar de líderes.

Para este exemplo, vamos supor que tudo o que é apresentado em [Criar um placar de líderes básico](/pt-BR/services/playfab/community/leaderboards/create-basic-leaderboard)
é familiar. Vamos começar com um jogo de tiro altamente competitivo como exemplo de como esses novos recursos podem nos ajudar a resolver
alguns problemas. Nesse jogo, há um modo chamado Team Death match, que consiste em duas equipes se enfrentando. Quem chegar a
75 eliminações primeiro vence. Esse jogo não se baseia em uma única pontuação para classificar os jogadores; em vez disso, ele se baseia no número
de eliminações, assistências e mortes para definir quem é o melhor.

## Criando uma definição de placar de líderes com várias colunas

Para começar este exemplo, precisamos criar uma definição de placar de líderes mais complexa do que a que tínhamos antes.
Vamos definir várias colunas para mapear os principais aspectos do jogo: eliminações, assistências e mortes.
O exemplo a seguir mostra como criar a definição do placar de líderes usando o SDK do C#.

```C# theme={null}
public static async Task CreateLeaderboardDefinitionAsync(PlayFabAuthenticationContext context, string leaderboardName)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    CreateLeaderboardDefinitionRequest leaderboardDefinitionRequest = new CreateLeaderboardDefinitionRequest()
    {
        AuthenticationContext = context,
        Name = leaderboardName,
        SizeLimit = 1000,
        EntityType = "title_player_account",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 1,
            ResetInterval = ResetInterval.Manual,
        },
        Columns = new List<LeaderboardColumn>()
        {
            new LeaderboardColumn()
            {
                Name = "Eliminations",
                SortDirection = LeaderboardSortDirection.Descending,
            },
            new LeaderboardColumn()
            {
                Name = "Assists",
                SortDirection = LeaderboardSortDirection.Descending,
            }
            new LeaderboardColumn()
            {
                Name = "Deaths",
                SortDirection = LeaderboardSortDirection.Ascending,
            }         
        }
    };

    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createLbDefinitionResult = await leaderboardsAPI.CreateLeaderboardDefinitionAsync(leaderboardDefinitionRequest);
}
```

Agora, vamos explicar alguns elementos importantes deste exemplo:

* `SizeLimit`: Este parâmetro é usado para limitar o número de linhas que o placar de líderes pode ter. O valor aqui é apenas um exemplo.
* `VersionConfiguration`: Este parâmetro nos permite ter controle de versão nos nossos placares de líderes. Consulte esta página para
  obter mais informações: [Placares de líderes sazonais](/pt-BR/services/playfab/community/leaderboards/seasonal-leaderboards)
* `Columns`: Este parâmetro nos permite definir várias colunas, com no máximo 5 por definição. Como você pode ver, configuramos Eliminations, Assists e Deaths.
  Um elemento importante aqui é o parâmetro `SortDirection`, que nos permite determinar a classificação do placar de líderes.
  Neste exemplo, um jogador fica em uma posição mais alta se tiver mais eliminações e assistências (SortDirection = Descending) e
  menos mortes (SortDirection = Ascending).

Para obter mais informações sobre outros parâmetros ou sobre como gerenciar definições de placares de líderes, consulte [Criar um placar de líderes básico](/pt-BR/services/playfab/community/leaderboards/create-basic-leaderboard).

## Trazer entidades externas

O serviço de placares de líderes pode ser usado como um componente independente que oferece suporte para trazer entidades externas que só fazem sentido no contexto do jogo. Se as identidades dos seus jogadores não estiverem vinculadas ao logon do PlayFab, você ainda poderá usar o serviço de placares de líderes. O tipo de entidade para as entradas no placar de líderes fora do sistema do PlayFab deve ser *external*. O entityId é então a identidade do jogador no seu sistema. Nesses casos, *todas* as entradas no placar de líderes devem ser entidades *external*.

## Adicionando dados a um placar de líderes

Agora que criamos o nosso placar de líderes, vamos adicionar dados. A principal diferença em relação ao nosso tutorial anterior sobre este assunto é
que agora precisamos adicionar três pontuações diferentes na mesma linha. O exemplo a seguir mostra como adicionar dados ao nosso placar de líderes
usando o SDK do C#.

```C# theme={null}
public static async Task UpdateLeaderboardForPlayer(PlayFabAuthenticationContext context, string leaderboardName, string entityId, int score)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    UpdateLeaderboardEntriesRequest updateLeaderboardRequest = new UpdateLeaderboardEntriesRequest()
    {
        Entries = new List<LeaderboardEntryUpdate>()
        {
            new LeaderboardEntryUpdate()
            {
                EntityId = entityId,
                Scores = new List<string> { score.ToString(), (score + 1).ToString(), (score + 2).ToString() },
                Metadata = "metadata",
            }
        },
        AuthenticationContext = context,
        LeaderboardName = leaderboardName,
    };

    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> updateResult = await leaderboardsAPI.UpdateLeaderboardEntriesAsync(updateLeaderboardRequest);
}
```

Algo importante a observar é que o parâmetro Scores recebe três valores. O comprimento da lista de pontuações especificada para qualquer entrada deve corresponder ao número de colunas da definição do placar de líderes. Cada um dos valores deve ser um inteiro de 64 bits válido (a representação em cadeia de caracteres serve apenas para garantir que todos os clientes possam lidar com valores de 64 bits).

## Recuperando dados de um placar de líderes

Agora vamos aprender diferentes maneiras de consultar um placar de líderes. Todas elas têm um propósito específico, com a intenção
de ajudar os desenvolvedores a obter os jogadores de que precisam para exibir no jogo.

### Obtendo o placar de líderes em torno de uma entidade

Essa forma específica de consultar o placar de líderes nos permite obter uma seção do placar de líderes próxima a uma entidade específica. Uma maneira prática
de ver esse cenário é quando temos um placar de líderes enorme e queremos mostrar apenas informações relevantes ao jogador que está ativo
no jogo. Se o jogador estiver na posição 1000, podemos mostrar os vizinhos próximos em vez dos melhores jogadores.
O exemplo a seguir mostra como consultar um placar de líderes em torno de uma entidade usando o SDK do C#.

```C# theme={null}
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardAroundEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetLeaderboardAroundEntityRequest getLbRequest = new GetLeaderboardAroundEntityRequest()
    {
        LeaderboardName = leaderboardName,
        AuthenticationContext = context,
        Entity = new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entityId,
            Type = EntityType
        },
        MaxSurroundingEntries = 20,
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardAroundEntityAsync(getLbRequest);
    
    return lbResponse.Result.Rankings;

}
```

O elemento mais importante aqui é o `MaxSurroundingEntries`, que nos permite extrair do placar de líderes as entidades classificadas em torno de uma entidade específica.
Por exemplo, se tivermos um jogador na posição 100 e usarmos
`MaxSurroundingEntries` = 20, ele recuperará os jogadores da posição 90 à 110. Se o jogador estiver no topo
do placar de líderes, ele recuperará os 20 primeiros resultados. Se o jogador estiver na parte inferior, ele recuperará os 20 últimos resultados. Exceto pelas posições no topo e na parte inferior do placar de líderes, a API tenta garantir que a entidade em torno da qual a classificação é solicitada fique no centro das posições recuperadas.

### Obtendo o placar de líderes para entidades

Esta API nos oferece outra maneira de consultar o placar de líderes. Ela funciona sempre que temos um caso em que queremos pesquisar várias entidades dentro
do placar de líderes e classificá-las. O exemplo a seguir mostra como consultar um placar de líderes para uma lista de entidades
usando o SDK do C#.

```C# theme={null}
public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardForEntities(PlayFabAuthenticationContext context, string leaderboardName, List<string> entityIds)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetLeaderboardForEntitiesRequest getLbRequest = new GetLeaderboardForEntitiesRequest()
    {
        LeaderboardName = leaderboardName,
        AuthenticationContext = context,
        EntityIds = entityIds,
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardForEntitiesAsync(getLbRequest);

    return lbResponse.Result.Rankings;
}
```

### Obtendo placares de líderes de amigos

Pode haver casos em que alguns jogadores casuais aparecem e jogam um jogo. Eles podem estar longe do topo do placar de líderes, mas, entre seus amigos, há uma competição acontecendo. Com esta API, podemos consultar o placar de líderes e encontrar os amigos do jogador.

```C# theme={null}
public static async Task<List<EntityLeaderboardEntry>> GetFriendLeaderboardForEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetFriendLeaderboardForEntityRequest getLbRequest = new GetFriendLeaderboardForEntityRequest()
    {
       LeaderboardName = leaderboardName,
       Entity = new PlayFab.LeaderboardsModels.EntityKey()
       {
           Id = entityId,
           Type = EntityType
       },
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetFriendLeaderboardForEntityAsync(getLbRequest);
  
    return lbResponse.Result.Rankings;
}
```

Há várias maneiras de obter amigos dos serviços do PlayFab. Para obter mais informações sobre os parâmetros disponíveis, consulte [Referência de API](/pt-BR/services/playfab/community/leaderboards/api-reference).

### Desempate aprimorado

Considerando o nosso exemplo de um jogo de tiro altamente competitivo, há casos em que vários jogadores podem ter o mesmo número de
eliminações. Para esses cenários, precisamos de uma maneira diferente de desempatar. É nesse cenário que a funcionalidade de desempate aprimorado
entra em ação.

Ao criar uma definição de placar de líderes, você pode ter várias colunas. A forma como você as adiciona determina como vamos
classificar e desempatar alguns cenários. Há uma ordem de precedência, na qual a primeira coluna adicionada é a mais importante, depois a segunda,
e assim por diante. No nosso exemplo, isso significa que, sempre que houver um empate em eliminações, o segundo critério será o número de assistências,
e o critério final serão as mortes. No caso extremo de o empate ainda persistir, o padrão passa a ser o carimbo de data/hora:
quem alcançou as pontuações primeiro.

\| Classificação     | ID da entidade                         | Eliminações|  Assistências        | Mortes | LastUpdated\
\|----------------------|------------------------------------|-------------------|--------------------------
|1 | "player 3" | 103               |24 | 15|"2024-08-27T20:24:36.738Z"
|2 | "player 2" | 102               | 30| 20 |"2024-08-27T20:24:29.251Z"
|3 | **"player 1"** | 100               | 25 |18 |"2024-08-27T19:52:26.642Z"\
|4 | **"player 4"** | 100               | 25 | 18 |"2024-08-27T20:24:44.552Z"
|4 | **"player 5"** | 100               | 25 | 19 |"2024-08-27T20:25:47.552Z"

Neste exemplo, temos um empate entre três jogadores:

* "player 5": Apesar de ter a mesma quantidade de eliminações e assistências, ele tem mais mortes, o que significa que fica na
  parte inferior do placar de líderes.
* "player 4": Este jogador tem menos mortes que "player 5" e a mesma quantidade que "player 1", mas player 1 alcançou esses números primeiro.
* "player 1": Apesar de ter os mesmos números que "player 4", este jogador foi o primeiro a alcançar essa pontuação no jogo, portanto fica em uma posição mais alta neste cenário de desempate.

## Conclusões

Neste tutorial, aprendemos a realizar as seguintes operações:

* Criar um placar de líderes com várias colunas.
* Conferir as várias maneiras de consulta.
* Entender o mecanismo de desempate aprimorado.

## Consulte também

* [Criar um placar de líderes básico](/pt-BR/services/playfab/community/leaderboards/create-basic-leaderboard).
* [Placares de líderes sazonais](/pt-BR/services/playfab/community/leaderboards/seasonal-leaderboards).
* [Limites ](/pt-BR/services/playfab/community/leaderboards/limits-leaderboards).
* [Cota ](/pt-BR/services/playfab/community/leaderboards/quota-leaderboards).
* [Classificando jogadores por estatísticas](/pt-BR/services/playfab/community/leaderboards/leaderboards-linked-to-stats).
* [Placares de líderes de grupo](/pt-BR/services/playfab/community/leaderboards/group-leaderboards).
* [Níveis manuais](/pt-BR/services/playfab/community/leaderboards/manual-tiers).
* [Adicionar dados extras aos placares de líderes](/pt-BR/services/playfab/community/leaderboards/metadata-leaderboards).
* [Referência de API](/pt-BR/services/playfab/community/leaderboards/api-reference).
* [Placares de líderes e CloudScript](/pt-BR/services/playfab/community/leaderboards/leaderboards-cloudscript).
* [Placares de líderes com PlayStream](/pt-BR/services/playfab/community/leaderboards/leaderboards-with-playstream-and-telemetry)


## Related topics

- [Referência de API de placares de líderes](/pt-BR/services/playfab/community/leaderboards/api-reference.md)
- [Criar um placar de líderes básico](/pt-BR/services/playfab/community/leaderboards/create-basic-leaderboard.md)
- [Placares de líderes](/pt-BR/build/steam-porting-guide/features/steam-leaderboards.md)
- [Configurar placares de líderes no Partner Center](/pt-BR/publishing/game-publishing/how-to/data-platform-2013/how-to-configure-leaderboards-2013.md)
- [Documentação do PlayFab Community](/pt-BR/services/playfab/community/index.md)
