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

# Utiliser les données d'éditeur des joueurs pour récompenser le jeu sur plusieurs titres

> Utilisez les données d'éditeur des joueurs PlayFab et CloudScript pour suivre les connexions inter-titres et accorder des récompenses en monnaie virtuelle aux joueurs qui jouent à plusieurs titres.

Les récompenses impliquent généralement *d'autres* systèmes que les données des joueurs; cet exemple montre donc, par souci de simplicité, comment attribuer de la monnaie virtuelle.

## Exigences

* Un [compte de développeur PlayFab](https://developer.playfab.com).
* Un joueur doit se connecter aux *deux* titres avec les mêmes informations d'identification. Une approche consiste à utiliser des **informations d'identification récupérables** (Recoverable Credentials), comme décrit dans notre tutoriel [Principes de base et pratiques exemplaires de connexion](/fr-CA/services/playfab/identity/player-identity/login/login-basics-best-practices). Pour ajouter une connexion **récupérable** à un compte anonyme, consultez notre tutoriel sur la [liaison de comptes](/fr-CA/services/playfab/identity/player-identity/login/quickstart).
* Cet exemple nécessite une connaissance pratique de [CloudScript](/fr-CA/services/playfab/live-service-management/service-gateway/automation/cloudscript/writing-custom-cloudscript) :
  * Notre exemple illustre une sécurité des données de base afin d'éviter la triche des joueurs. Vous pourriez de la même façon utiliser l'API serveur sur un serveur de jeu personnalisé, si le titre en utilise.
* Les récompenses déclenchées au moyen de PlayFab nécessitent l'utilisation des fonctionnalités PlayFab appropriées. Les récompenses PlayFab peuvent prendre la forme de [**monnaie virtuelle**](/fr-CA/services/playfab/economy-monetization/economy-v2/tutorials/currencies), d'[**objets d'inventaire**](/fr-CA/services/playfab/player-progression/player-data/player-inventory), de [**données de joueur personnalisées**](/fr-CA/services/playfab/player-progression/player-data/quickstart), de [**statistiques**](/fr-CA/services/playfab/community/leaderboards/tournaments-leaderboards/using-player-statistics), etc. La distribution de récompenses en dehors des systèmes PlayFab est un sujet avancé qui n'est pas traité dans ce tutoriel.

Nous recommandons également aux développeurs de mettre en place une bonne gestion des erreurs pour tous les appels d'API serveur effectués depuis CloudScript.

## Chaque jeu signale une connexion dans les données d'éditeur

Chaque jeu doit signaler qu'une connexion a eu lieu. Par souci de simplicité, notre exemple ne fournit *qu'une* récompense par titre, pour chaque autre titre de l'éditeur auquel le joueur a joué.

N'hésitez pas à développer cette idée avec des compteurs, des horodatages ou d'autres mécanismes pour offrir des récompenses progressives ou séquentielles.

Le CloudScript suivant doit être présent dans *chaque* jeu de votre studio.

```javascript theme={null}
// CloudScript/Javascript

var PUBLISHER_USED_TITLES_KEY = "playedTitleIds";
handlers.TrackTitleUsage = function () {
    // Get the User Publisher Data for this player, and convert it into our expected format
    var getRequest = { Keys: [PUBLISHER_USED_TITLES_KEY], PlayFabId: currentPlayerId };
    var getResult = server.GetUserPublisherInternalData(getRequest);
    var playedTitlesList = JSON.parse(getResult.Data[PUBLISHER_USED_TITLES_KEY].Value); // format is arbitrary, but this example assumes Array<string>
    if (!playedTitlesList)
        playedTitlesList = [];
    // Check if we've played this title already
    var alreadyPlayed = false;
    for (var i = 0; i < playedTitlesList.length; i++)
        alreadyPlayed = alreadyPlayed || playedTitlesList[i] === script.titleId;
    if (alreadyPlayed)
        return; // Nothing to do
    // Update the list of played titles, and re-save
    playedTitlesList.push(script.titleId);
    var setRequest = { PlayFabId: currentPlayerId, Data: { PUBLISHER_USED_TITLES_KEY: JSON.stringify(playedTitlesList) } };
    server.UpdateUserPublisherInternalData(setRequest);
}
```

Plus précisément, cet exemple montre l'utilisation de :

* server.[GetUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.getuserpublisherinternaldata)
* server.[UpdateUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherinternaldata).

## Chaque jeu vérifie les récompenses échangeables

Une fois que vous suivez les titres joués, vous devez suivre et accorder les récompenses. Cette fonction CloudScript recherche et accorde les récompenses disponibles, en fonction des autres titres auxquels le joueur a joué.

```javascript theme={null}
// CloudScript/Javascript

var PUBLISHER_REDEEMED_TITLES_KEY = "redeemedTitleIds";
var MY_CROSS_TITLE_REWARDS = { "AU": 10 };
handlers.CheckCrossTitleRewards = function () {
    // Get the publisher data concerning cross-title rewards for this player
    var getRequest = { Keys: [PUBLISHER_USED_TITLES_KEY, PUBLISHER_REDEEMED_TITLES_KEY], PlayFabId: currentPlayerId };
    var getResult = server.GetUserPublisherInternalData(getRequest);
    var redeemedTitleRewards = JSON.parse(getResult.Data[PUBLISHER_REDEEMED_TITLES_KEY].Value); // format is arbitrary, but this example assumes { [key: string]: Array<string> }
    if (!redeemedTitleRewards)
        redeemedTitleRewards = {};
    var playedTitlesList = JSON.parse(getResult.Data[PUBLISHER_USED_TITLES_KEY].Value); // format is arbitrary, but this example assumes Array<string>
    if (!playedTitlesList)
        playedTitlesList = [];

    // Determine which titles are un-redeemed
    var unredeemedTitleIds = [];
    for (var i = 0; i < playedTitlesList.length; i++) {
        if (!redeemedTitleRewards.hasOwnProperty(playedTitlesList[i]) && playedTitlesList[i] !== script.titleId)
            unredeemedTitleIds.push(playedTitlesList[i]);
    }
    if (unredeemedTitleIds.length === 0)
        return null; // Nothing to redeem

    // Give the cross title rewards
    var multiplier = unredeemedTitleIds.length;
    var actualRewards = {}; // MY_CROSS_TITLE_REWARDS is a global constant, so don't modify it or you'll mess up future calls
    // Please note that the number of API calls that may be made from CloudScript, as well as the total available processing time is limited,
    // and so the number of rewards should be as small as possible (only one VC, in this case)
    for (var eachKey in MY_CROSS_TITLE_REWARDS) {
        actualRewards[eachKey] = MY_CROSS_TITLE_REWARDS[eachKey] * multiplier;
        server.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: eachKey, Amount: MY_CROSS_TITLE_REWARDS[eachKey] }); // Can only add 1 VC at a time
    }

    // Save the Publisher data indicating rewards are claimed
    redeemedTitleRewards[script.titleId] = playedTitlesList;
    var setRequest = { PlayFabId: currentPlayerId, Data: { PUBLISHER_REDEEMED_TITLES_KEY: JSON.stringify(redeemedTitleRewards) } };
    server.UpdateUserPublisherInternalData(setRequest);

    // Tell the client the reward
    return actualRewards;
};
```

<Note>
  Cet exemple illustre l'utilisation de server.[GetUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.getuserpublisherinternaldata) (avec demande de plusieurs clés), server.[UpdateUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherinternaldata) et server.[AddUserVirtualCurrency](xref:titleid.playfabapi.com.server.playeritemmanagement.adduservirtualcurrency).
</Note>

Les blocs de code représentent les étapes suivantes :

* Récupération des données depuis PlayFab et analyse de celles-ci dans des structures de données locales (appel de [GetUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.getuserpublisherinternaldata)).
* Examen des données et recherche des ID de titre non encore récompensés.
* Attribution des récompenses (appel de [AddUserVirtualCurrency](xref:titleid.playfabapi.com.server.playeritemmanagement.adduservirtualcurrency)).
* Mise à jour des récompenses réclamées (appel de [UpdateUserPublisherInternalData](xref:titleid.playfabapi.com.server.playerdatamanagement.updateuserpublisherinternaldata)).
* Mise à disposition du montant de la récompense au client (au moyen de l'instruction return de CloudScript).

## Conclusion

Les données d'éditeur des joueurs et les données des joueurs sont structurellement identiques.

Les données des joueurs doivent être *propres au titre*, tandis que les données d'éditeur des joueurs ne doivent contenir *que* des informations pertinentes pour l'ensemble de vos titres.

## Voir aussi

[Simple In-Game Cross Promotion](https://github.com/PlayFab/PlayFab-Samples/tree/master/Recipes/SimpleCrossPromotion) : récompensez les joueurs qui participent à plusieurs de vos jeux.


## Related topics

- [Données des joueurs](/fr-CA/services/playfab/player-progression/player-data/index.md)
- [Utilisation des données d'éditeur](/fr-CA/services/playfab/live-service-management/game-configuration/titledata/using-publisher-data.md)
- [Packages de contenu d'éditeur (Publisher Content)](/fr-CA/build/core-features/common/packaging/packaging-publisher-content.md)
- [XR-013 Liaison des comptes Microsoft aux comptes d'éditeur](/fr-CA/publishing/certification/xr/xr-013.md)
- [Configurer les récompenses des succès XBOX](/fr-CA/services/xbox-services/player-data/achievements/title-managed/concepts/live-achievement-rewards.md)
