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

# Utilisation des tickets de backfill de serveur - SDK Multiplayer

> Découvrez comment créer et utiliser les tickets de backfill de serveur PlayFab avec le SDK Multiplayer pour combler les places vacantes d'une session de jeu de matchmaking en cours.

Les jeux hébergés sur un serveur doivent parfois rechercher des joueurs
supplémentaires. Cela se produit le plus souvent lorsqu'un ou plusieurs joueurs se déconnectent
pendant la partie. Les tickets de backfill de serveur permettent à un serveur de jeu de rechercher
des joueurs supplémentaires qui s'intègrent dans la partie en cours.

Les tickets de backfill de serveur diffèrent des tickets de matchmaking ordinaires de plusieurs façons :

1. Mise en correspondance
   * Les tickets de backfill ne peuvent pas être mis en correspondance entre eux.
   * Les tickets de backfill sont prioritaires lors de la recherche, ce qui réduit
     la fragmentation de la base de joueurs.
2. Contrat
   * Les tickets de backfill peuvent être créés avec un champ `ServerDetails`. Cela permet
     au serveur d'indiquer comment les joueurs mis en correspondance doivent s'y connecter.
   * Les tickets de backfill peuvent être créés avec des affectations d'équipe. Cela permet aux jeux
     comportant des équipes de conserver leurs informations d'équipe.
3. Propriétés de la file d'attente
   * Les tickets de backfill ne déclenchent pas l'[allocation de Multiplayer Server](/fr-CA/services/playfab/multiplayer/matchmaking/multiplayer-servers).
   * Les tickets de backfill ne sont pas pris en compte dans les [statistiques de file d'attente](/fr-CA/services/playfab/multiplayer/matchmaking/display-statistics), car leurs joueurs
     sont déjà en train de jouer et fausseraient le temps d'attente.
4. Propriété
   * Les tickets de backfill appartiennent à un serveur de jeu, et non à un utilisateur. Les utilisateurs ne peuvent
     ni consulter les tickets de backfill ni interagir avec eux de quelque façon que ce soit.

## Prérequis

* Une connaissance de base du SDK PlayFab Multiplayer. Pour plus d'informations, consultez le [Démarrage rapide du SDK Matchmaking](/fr-CA/services/playfab/multiplayer/matchmaking/quickstart-client-sdk).
* Définissez `PFMULTIPLAYER_INCLUDE_SERVER_APIS` avant d'inclure l'en-tête de matchmaking. Par exemple :

```cpp theme={null}
#define PFMULTIPLAYER_INCLUDE_SERVER_APIS
#include <PFMatchmaking.h>
```

## Configurer un ticket de backfill de serveur

Créez et renseignez une structure [PFMatchmakingServerBackfillTicketConfiguration](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/structs/pfmatchmakingserverbackfillticketconfiguration) avec les détails nécessaires :

* **`timeoutInSeconds`** : durée, en secondes, pendant laquelle tenter de remplir le ticket.

* **`queueName`** : le nom d'une file d'attente de correspondance.

* **`memberCount`** : le nombre de membres actuellement dans la correspondance.

* **`members`** : les membres [PFMatchmakingMatchMember](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/structs/pfmatchmakingmatchmember) actuellement dans la correspondance.

* **`serverDetails`** (facultatif) : renseignez [PFMultiplayerServerDetails](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/structs/pfmultiplayerserverdetails) avec des informations sur votre serveur (FQDN, adresse IP, ports, région) qui sont fournies aux clients.

<Note>
  Le champ `PFMultiplayerServerDetails::ipv4Address` n'est pas validé et peut être utilisé pour fournir des informations de chaîne de connexion arbitraires aux clients.
</Note>

```cpp theme={null}
// Define the server port configuration.
PFMultiplayerPort serverPorts[] = {
    { "portname", 12345, PFMultiplayerProtocolType::Udp }
};

// Populate the server details.
PFMultiplayerServerDetails serverDetails = {};
serverDetails.fqdn = "your.server.fqdn.com";
serverDetails.ipv4Address = "123.234.123.234";
serverDetails.ports = serverPorts;
serverDetails.portCount = sizeof(serverPorts) / sizeof(serverPorts[0]);
serverDetails.region = "EastUS";

// Set up the backfill ticket configuration.
PFMatchmakingServerBackfillTicketConfiguration backfillConfig = {};
backfillConfig.timeoutInSeconds = 60;                 // Try for 60 seconds
backfillConfig.queueName = "YourQueueName";
backfillConfig.memberCount = currentMatchMemberCount; // e.g., 4
backfillConfig.members = currentMatchMembers;         // Pointer to an array of PFMatchmakingMatchMember
backfillConfig.serverDetails = &serverDetails;        // Optional; can be nullptr if not needed
```

## Création d'un ticket de backfill de serveur

Pour créer un ticket de backfill de serveur avec [PFMultiplayerCreateServerBackfillTicket](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/functions/pfmultiplayercreateserverbackfillticket), nous devons transmettre l'entité de notre serveur de jeu (sous forme de [PFEntityKey](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmultiplayer/pfentitykey_clientsdk)) ainsi que la configuration de backfill créée à l'étape précédente.

```cpp theme={null}
PFMatchmakingTicketHandle backfillTicket = nullptr;
HRESULT hr = PFMultiplayerCreateServerBackfillTicket(
    multiplayerHandle,            // The handle of the PFMultiplayer API instance.
    &serverEntity,                // PFEntityKey for your game server entity
    &backfillConfig,              // The backfill ticket configuration.
    nullptr,                      // Optional async context
    &backfillTicket               // The resulting ticket object.
);

if (FAILED(hr))
{
    // handle ticket creation failure
}
```

## Vérifier l'état du ticket de matchmaking

Vous devez vérifier les mises à jour du ticket en appelant [PFMultiplayerStartProcessingMatchmakingStateChanges](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/functions/pfmultiplayerstartprocessingmatchmakingstatechanges) pour recevoir les changements d'état, puis en appelant [PFMultiplayerFinishProcessingMatchmakingStateChanges](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/functions/pfmultiplayerfinishprocessingmatchmakingstatechanges) lorsque vous avez terminé de traiter ces changements d'état.

Le SDK retourne un changement d'état **TicketStatusChanged** chaque fois que l'état du ticket change, et un changement d'état **TicketCompleted** lorsque le matchmaking est terminé.

```cpp theme={null}
HRESULT hrTicketError = S_OK;

uint32_t stateChangeCount;
const PFMatchmakingStateChange * const * stateChanges;
HRESULT hr = PFMultiplayerStartProcessingMatchmakingStateChanges(g_pfmHandle, &stateChangeCount, &stateChanges);
if (FAILED(hr))  
{  
    return;  
}  

for (uint32_t i = 0; i < stateChangeCount; ++i)
{
    const PFMatchmakingStateChange& stateChange = *stateChanges[i];

    switch (stateChange.stateChangeType)
    {
        case PFMatchmakingStateChangeType::TicketStatusChanged:
        {
            const auto& ticketStatusChanged = static_cast<const PFMatchmakingTicketStatusChangedStateChange&>(stateChange);

            PFMatchmakingTicketStatus status;
            if (SUCCEEDED(PFMatchmakingTicketGetStatus(ticketStatusChanged.ticket, &status)))
            {
                printf("Ticket status is now: %i.\n", status);
            }

            break;
        }
        case PFMatchmakingStateChangeType::TicketCompleted:
        {
            const auto& ticketCompleted = static_cast<const PFMatchmakingTicketCompletedStateChange&>(stateChange);

            printf("PFMatchmaking completed with Result 0x%08x.\n", ticketCompleted.result);

            if (FAILED(ticketCompleted.result))
            {
                // On failure, we must record the HRESULT so we can return the state change(s) and then bail
                // out of this function.
                hrTicketError = ticketCompleted.result;
            }

            break;
        }
    }
}

hr = PFMultiplayerFinishProcessingMatchmakingStateChanges(g_pfmHandle, stateChangeCount, stateChanges);
if (FAILED(hr))  
{  
    return;  
}  

// Now that we've returned the state change(s), bail out if we detected ticket failure.
if (FAILED(hrTicketError))  
{  
    return;  
}  
```

## Obtenir la correspondance

Après avoir reçu le changement d'état **PFMatchmakingStateChangeType::TicketCompleted**, appelez [PFMatchmakingTicketGetMatch](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/functions/pfmatchmakingticketgetmatch) pour obtenir les détails de la correspondance. Ces détails contiennent l'ID de la correspondance, les utilisateurs qui ont été mis en correspondance, la région préférée pour la correspondance et une chaîne d'arrangement pour le lobby associé à la correspondance.

Une fois que vous avez récupéré les informations dont vous avez besoin dans la structure **PFMatchmakingMatchDetails**, le ticket doit être détruit avec [PFMultiplayerDestroyMatchmakingTicket](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/functions/pfmultiplayerdestroymatchmakingticket).

```cpp theme={null}
const PFMatchmakingMatchDetails* match;
HREULT hr = PFMatchmakingTicketGetMatch(ticket, &match);
if (FAILED(hr))  
{  
    return;  
}  

std::string matchId = match->matchId;
std::string lobbyArrangementString = match->lobbyArrangementString;

PFMultiplayerDestroyMatchmakingTicket(g_pfmHandle, ticket);
```

## Annulation d'un ticket

Si vous souhaitez annuler le processus de matchmaking avant l'expiration du délai défini dans `PFMatchmakingServerBackfillTicketConfiguration`, appelez [PFMatchmakingTicketCancel](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/functions/pfmatchmakingticketcancel) avec le handle du ticket.

L'appel de cette API ne garantit pas l'annulation du ticket. Le ticket peut encore se terminer avant que l'annulation puisse être traitée, ou la demande d'annulation peut échouer en raison d'erreurs réseau ou de service. Vous pouvez toujours traiter les changements d'état du matchmaking pour obtenir le résultat du ticket si vous souhaitez confirmer que l'annulation du ticket est terminée avant de continuer. Sinon, vous pouvez appeler immédiatement [PFMultiplayerDestroyMatchmakingTicket](/fr-CA/services/playfab/multiplayer/lobby/playfabmultiplayerreference-cpp/pfmatchmaking/functions/pfmultiplayerdestroymatchmakingticket).

```cpp theme={null}
HRESULT hr = PFMatchmakingTicketCancel(ticket);

PFMultiplayerDestroyMatchmakingTicket(g_pfmHandle, ticket);
```


## Related topics

- [Utilisation des tickets de backfill de serveur - API REST](/fr-CA/services/playfab/multiplayer/matchmaking/backfill-tickets.md)
- [Débogage local des serveurs de jeu et intégration à PlayFab](/fr-CA/services/playfab/multiplayer/servers/locally-debugging-game-servers-and-integration-with-playfab.md)
- [Notes de version du SDK C++ PlayFab Multiplayer](/fr-CA/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/lobby-and-matchmaking-release-notes.md)
- [Créer un ticket de remplissage de serveur](/fr-CA/services/playfab/api-references/rest/multiplayer/matchmaking/create-server-backfill-ticket.md)
- [CreateServerBackfillTicket](/fr-CA/services/playfab/multiplayer/lobby/unity-multiplayer-api-reference/PlayFab.Multiplayer/PlayFabMultiplayer.PlayFabMultiplayerServer/CreateServerBackfillTicket.md)
