> ## 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.

# Buscar lobbies

> Busque lobbies públicos de PlayFab mediante cadenas de filtro y ordenación sobre propiedades de búsqueda, recuento de miembros y ordenación basada en distancia para la detección de lobbies.

A menudo resulta útil que los títulos permitan a los jugadores encontrar lobbies que cumplan un conjunto concreto de criterios, como el mapa y el nivel de dificultad, entre otras cualidades del juego. Esta funcionalidad de búsqueda permite a los jugadores encontrar las sesiones de juego que desean con las personas que desean.

En este artículo se explica cómo usar **FindLobbies** para permitir a los jugadores encontrar lobbies. Para ver cómo se puede usar la búsqueda de lobbies en los títulos de juegos, consulte [Escenarios comunes](#common-scenarios).

<Note>
  No se recomienda usar **FindLobbies** para implementar matchmaking en segundo plano. Recomendamos encarecidamente usar la [característica de matchmaking](/services/playfab/multiplayer/matchmaking) en ese escenario. De lo contrario, deberá controlar las colisiones de jugadores que intentan unirse a los mismos lobbies mediante filtrado, ordenación y otras técnicas, como el uso de valores de aleatorización en los campos de datos de búsqueda.
</Note>

## Descripción de la relación entre las propiedades de búsqueda del lobby y la búsqueda de lobbies

Los jugadores hacen que sus lobbies sean detectables definiendo propiedades de búsqueda. Los jugadores encuentran estos lobbies detectables llamando a **FindLobbies** con cadenas de consulta para filtrar y ordenar los resultados de la búsqueda en función de las propiedades de búsqueda definidas en los lobbies actualmente activos. Los lobbies que coinciden con estas consultas se devuelven al jugador que realiza la llamada.

Para obtener más información sobre la definición de propiedades de búsqueda, consulte [Crear lobbies con capacidad de búsqueda](/services/playfab/multiplayer/lobby/define-search-keywords)

## Cómo usar FindLobbies

Al llamar a **FindLobbies**, puede usar el parámetro de filtro para restringir la consulta de modo que solo devuelva resultados de búsqueda que coincidan con un conjunto de criterios basados en las propiedades de búsqueda personalizadas del lobby.

Además, puede usar el parámetro de ordenación para ordenar los resultados que recibe del servicio en función de las propiedades de búsqueda. Esto resulta útil, ya que el servicio solo devuelve un número limitado de resultados de búsqueda. La ordenación garantiza que vea los resultados de búsqueda más relevantes.

### Escenarios comunes

Estas son algunas formas comunes en las que se usa la funcionalidad **FindLobbies** en los títulos.

* Buscar lobbies de sesiones de juego para un modo de juego específico en su título
* Buscar lobbies de sesiones de juego que hospedan sus amigos
* Buscar lobbies de sesiones de juego con suficientes jugadores para todos los jugadores locales
* Buscar lobbies en los que ya está para recuperar una conexión después de un bloqueo inesperado del cliente de juego o del servidor de juego.

### Claves de búsqueda compatibles

Solo se permite usar un conjunto restringido de claves al definir propiedades de búsqueda personalizadas.

* Para las propiedades de cadena, se admiten las siguientes claves: string\_key1, string\_key2, \[...] string\_key30
* Para las propiedades numéricas, se admiten las siguientes claves: number\_key1, number\_key2, \[...] number\_key30

### Construcción de cadenas de consulta para FindLobbies

Las cadenas de consulta para las API de **FindLobbies** se estructuran con una sintaxis de tipo OData. El tamaño máximo de la cadena de filtro es de 600 caracteres.

Estos operadores de OData se pueden usar para componer cadenas de consulta. Los operadores distinguen mayúsculas de minúsculas.

| Operadores | Significado       | Ejemplo                                                 |
| ---------- | ----------------- | ------------------------------------------------------- |
| eq         | igual que         | string\_key1 eq 'CaptureTheFlag'                        |
| lt         | menor que         | number\_key2 lt 10                                      |
| le         | menor o igual que | number\_key2 le 10                                      |
| gt         | mayor que         | number\_key3 gt 100                                     |
| ge         | mayor o igual que | number\_key3 ge 100                                     |
| ne         | distinto de       | string\_key1 ne 'CaptureTheFlag'                        |
| and        | y                 | string\_key1 eq 'CaptureTheFlag' and number\_key2 lt 10 |

<Note>
  Al comparar propiedades de cadena, asegúrese de encerrar el valor comparado entre comillas simples. Por ejemplo, "string\_key1 eq **'SOME STRING VALUE'**". Las propiedades numéricas no necesitan encerrarse.
</Note>

También hay operadores predefinidos disponibles para su uso. Deben ir precedidos por "lobby/" al especificarse.

| Operadores           | Significado                                                                              | Ejemplo                            |
| -------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------- |
| memberCount          | número de jugadores en un lobby                                                          | lobby/memberCount eq 5             |
| maxMemberCount       | número máximo de jugadores permitidos en un lobby                                        | lobby/maxMemberCount gt 10         |
| memberCountRemaining | número restante de jugadores que pueden unirse al lobby                                  | lobby/memberCountRemaining gt 0    |
| membershipLock       | estado de bloqueo de los lobbies, debe ser igual a 'Unlocked' o 'Locked'                 | lobby/membershipLock eq 'Unlocked' |
| amOwner              | lobbies de los que usted es el propietario, debe ser igual a 'true'                      | lobby/amOwner eq 'true'            |
| amMember             | lobbies de los que usted es miembro, debe ser igual a 'true'                             | lobby/amMember eq 'true'           |
| amServer             | lobbies propiedad del cliente a los que se ha unido el servidor, debe ser igual a 'true' | lobby/amServer eq 'true'           |

La definición del SDK para estas constantes está documentada [aquí](/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pflobby/constants/pflobbysearchkeys).

### Ordenación

Cadena de estilo OData que contiene la ordenación de esta consulta en orden ascendente ("asc") o descendente ("desc"). Las cláusulas OrderBy se pueden usar con cualquiera de las claves de búsqueda numéricas o con las claves de búsqueda predefinidas que sean numéricas. Para ordenar por proximidad a un número, se puede usar el moniker distance para ordenar por distancia respecto a la clave de búsqueda numérica dada. No se puede usar ascendente ni descendente con la ordenación por distancia. Este campo solo admite una cláusula de ordenación o una cláusula de distancia. Si no se proporciona ninguna ordenación o si se necesita un criterio de desempate para la ordenación dada, la ordenación predeterminada sería descendente según la hora de creación.

| Ejemplo                     | Significado                                        |
| --------------------------- | -------------------------------------------------- |
| number\_key1 asc            | ordenar por clave de búsqueda numérica ascendente  |
| lobby/memberCount desc      | ordenar por clave de búsqueda numérica descendente |
| distance\{number\_key1 = 5} | ordenar por distancia respecto al número dado      |
| *predeterminado*            | ordenar por hora de creación descendente           |

## Ejemplo de búsqueda de lobbies con el SDK de Lobby y Matchmaking

En este ejemplo, el jugador quiere encontrar todos los lobbies con los siguientes requisitos:

* El modo de juego es "DeathMatch"
* El estilo de competición es "Ranked"
* El nivel de habilidad del jugador está dentro de los límites mínimo y máximo de habilidad del lobby.

Además, el jugador quiere que los resultados se ordenen con las siguientes directrices:

* Los lobbies con niveles de habilidad óptimos más cercanos al nivel de habilidad del jugador deben aparecer más arriba

```cpp theme={null}
static PFMultiplayerHandle g_pfmHandle = nullptr;

#define SUPPORT_XBL_CROSSPLAY

#define PFLOBBY_SEARCH_KEY_GAME_MODE "string_key1"
#define PFLOBBY_SEARCH_KEY_COMPETITION_STYLE "string_key2"
#define PFLOBBY_SEARCH_KEY_SKILL "number_key1"

#define GAME_MODE_DEATH_MATCH "DeathMatch"
#define COMPETITION_STYLE_RANKED "Ranked"

// Find lobbies based on player's search criteria.
void FindGamesWithRuntimeQuery(
    uint32_t minimumSkill,
    uint32_t maximumSkill,
    uint32_t optimalSkill)
{
    PFLobbySearchFriendsFilter friendsFilter;
    friendsFilter.includeSteamFriends = true;
#ifdef SUPPORT_XBL_CROSSPLAY
    friendsFilter.includeXboxFriendsToken = MyGame::GetLocalUserXboxToken();
#endif // SUPPORT_XBL_CROSSPLAY

    // Limit results based on friend's filter.
    PFLobbySearchConfiguration searchConfiguration = { 0 };
    searchConfiguration.friendsFilter = &friendsFilter;

    // Create filter string based on player's search parameters.
    std::string filterString;
    filterString += PFLOBBY_SEARCH_KEY_GAME_MODE + std::string(" eq ") + "'" + GAME_MODE_DEATH_MATCH + "'";
    filterString += " and ";
    filterString += PFLOBBY_SEARCH_KEY_COMPETITION_STYLE + std::string(" eq ") + "'" + COMPETITION_STYLE_RANKED + "'";
    filterString += " and ";
    filterString += PFLOBBY_SEARCH_KEY_SKILL + std::string(" ge ") + std::to_string(minimumSkill);
    filterString += " and ";
    filterString += PFLOBBY_SEARCH_KEY_SKILL + std::string(" le ") + std::to_string(maximumSkill);

    // Create sort string based on player's sort preference.
    std::string sortString;
    sortString += std::string("distance{") + PFLOBBY_SEARCH_KEY_SKILL + "=" + std::to_string(optimalSkill) + "}";

    searchConfiguration.filterString = filterString.c_str();
    searchConfiguration.sortString = sortString.c_str();

    HRESULT hr = PFMultiplayerFindLobbies(g_pfmHandle, &m_localUser, &searchConfiguration, nullptr);
}

void ProcessStateChanges()
{
    while (true)
    {
        uint32_t stateChangeCount;
        const PFLobbyStateChange* const* stateChanges;
        RETURN_VOID_IF_FAILED(PFMultiplayerStartProcessingLobbyStateChanges(
            g_pfmHandle,
            &stateChangeCount,
            &stateChanges));

        for (uint32_t i = 0; i < stateChangeCount; ++i)
        {
            const PFLobbyStateChange* stateChange = stateChanges[i];
            switch (stateChange->stateChangeType)
            {
                case PFLobbyStateChangeType::FindLobbiesCompleted:
                {
                    GuiPostCurrentLobbySearchResults(
                        static_cast<const PFLobbyFindLobbiesCompletedStateChange&>(*stateChange));
                    break;
                }
                default:
                {
                    break;
                }
            }
        }

        RETURN_VOID_IF_FAILED(PFMultiplayerFinishProcessingLobbyStateChanges(
            g_pfmHandle,
            stateChangeCount,
            stateChanges));
    }
}

// Update game UI to display search results when a list of matching lobbies is returned.
void GuiPostCurrentLobbySearchResults(
    const PFLobbyFindLobbiesCompletedStateChange& stateChange)
{
    if (FAILED(stateChange.result))
    {
        GuiToastErrorAndExitScreen();
        return;
    }

    for (uint32_t i = 0; i < stateChange.searchResultCount; ++i)
    {
        const PFLobbySearchResult& searchResult = stateChange.searchResults[i];
        GuiPostLobbySearchResultRow(searchResult); // defined elsewhere
    }
}
```

## Consulte también

* [Crear lobbies con capacidad de búsqueda](/services/playfab/multiplayer/lobby/define-search-keywords)
* [Unirse a lobbies](/services/playfab/multiplayer/lobby/join-lobbies)
* [Lobby y matchmaking](/services/playfab/multiplayer/lobby/lobby-and-matchmaking)
* [Propiedades del lobby](/services/playfab/multiplayer/lobby/lobby-properties)
* [Crear un lobby](/services/playfab/multiplayer/lobby/create-a-lobby)
