using System.Collections; using System.Collections.Generic; using UnityEngine; using PlayFab; using PlayFab.ClientModels; using System; public class PlayFabManager : MonoBehaviour { // this is a sorted, collated structure built from playerInventory. By default, this will only grab items that are in the primary catalog public static Dictionary<string, int> virtualCurrency; public static List<ItemInstance> playerInventory = new List<ItemInstance> ( ); public static Dictionary<string, int> userStatistics = new Dictionary<string, int> ( ); public string PlayFabId; //aggregation of player characters public static List<CharacterResult> playerCharacters = new List<CharacterResult> ( ); public static Dictionary<string, List<string>> characterAchievements = new Dictionary<string, List<string>> ( ); public static Dictionary<string, Dictionary<string, int>> characterStatistics = new Dictionary<string, Dictionary<string, int>> ( ); void OnEnable ( ) { Login ( "EFDE" ); } IEnumerator Start ( ) { yield return new WaitForSeconds ( 15 ); // ClientGetTitleData ( ); // GetUserData ( ); GetUserStatistics ( ); } void Login ( string titleId ) { LoginWithCustomIDRequest request = new LoginWithCustomIDRequest ( ) { TitleId = titleId, CreateAccount = true, CustomId = SystemInfo.deviceUniqueIdentifier }; PlayFabClientAPI.LoginWithCustomID ( request, ( result ) => { PlayFabId = result.PlayFabId; Debug.Log ( "Got PlayFabID: " + PlayFabId ); if ( result.NewlyCreated ) { Debug.Log ( "(new account)" ); } else { Debug.Log ( "(existing account)" ); } }, ( error ) => { Debug.Log ( "Error logging in player with custom ID:" ); Debug.Log ( error.ErrorMessage ); } ); } public void ClientGetTitleData ( ) { var getRequest = new PlayFab.ClientModels.GetTitleDataRequest ( ); PlayFabClientAPI.GetTitleData ( getRequest, ( result ) => { Debug.Log ( "Got the following titleData:" ); foreach ( var entry in result.Data ) { Debug.Log ( entry.Key + ": " + entry.Value ); } }, ( error ) => { Debug.Log ( "Got error getting titleData:" ); Debug.Log ( error.ErrorMessage ); } ); } void GetUserData ( ) { GetUserDataRequest request = new GetUserDataRequest ( ) { PlayFabId = PlayFabId, Keys = null }; PlayFabClientAPI.GetUserData ( request, ( result ) => { Debug.Log ( "Got user data:" ); if ( ( result.Data == null ) || ( result.Data.Count == 0 ) ) { Debug.Log ( "No user data available" ); } else { foreach ( var item in result.Data ) { Debug.Log ( " " + item.Key + " == " + item.Value.Value ); } } }, ( error ) => { Debug.Log ( "Got error retrieving user data:" ); Debug.Log ( error.ErrorMessage ); } ); } #region User Statistics public static void GetUserStatistics ( ) { GetPlayerStatisticsRequest request = new GetPlayerStatisticsRequest ( ); PlayFabClientAPI.GetPlayerStatistics ( request, OnGetUserStatisticsSuccess, OnGetUserStatisticsError ); } private static void OnGetUserStatisticsSuccess ( GetPlayerStatisticsResult result ) { //TODO update to use new PF_Bridge.RaiseCallbackSuccess ( result.Statistics.ToString(), PlayFabAPIMethods.GetUserStatistics, MessageDisplayStyle.none ); foreach ( var each in result.Statistics ) userStatistics [ each.StatisticName ] = each.Value; } private static void OnGetUserStatisticsError ( PlayFabError error ) { PF_Bridge.RaiseCallbackError ( error.ErrorMessage, PlayFabAPIMethods.GetUserStatistics, MessageDisplayStyle.error ); } public static void UpdateUserStatistics ( Dictionary<string, int> updates ) { var request = new UpdatePlayerStatisticsRequest ( ); request.Statistics = new List<StatisticUpdate> ( ); foreach ( var eachUpdate in updates ) // Copy the stats from the inputs to the request { int eachStat; userStatistics.TryGetValue ( eachUpdate.Key, out eachStat ); request.Statistics.Add ( new StatisticUpdate { StatisticName = eachUpdate.Key, Value = eachUpdate.Value } ); // Send the value to the server userStatistics [ eachUpdate.Key ] = eachStat + eachUpdate.Value; // Update the local cache so that future updates are using correct values } PlayFabClientAPI.UpdatePlayerStatistics ( request, OnUpdateUserStatisticsSuccess, OnUpdateUserStatisticsError ); } private static void OnUpdateUserStatisticsSuccess ( UpdatePlayerStatisticsResult result ) { PF_Bridge.RaiseCallbackSuccess ( "User Statistics Loaded", PlayFabAPIMethods.UpdateUserStatistics, MessageDisplayStyle.none ); GetCharacterStatistics ( ); // Refresh stats that we just updated } private static void OnUpdateUserStatisticsError ( PlayFabError error ) { PF_Bridge.RaiseCallbackError ( error.ErrorMessage, PlayFabAPIMethods.UpdateUserStatistics, MessageDisplayStyle.error ); } public static void GetCharacterStatistics ( ) { var characterIDs = new List<string> ( ); foreach ( var each in playerCharacters ) { characterIDs.Add ( each.CharacterId ); } var request = new ExecuteCloudScriptRequest { FunctionName = "GetCharacterStatistics", FunctionParameter = new { CharacterId = characterIDs }, }; PlayFabClientAPI.ExecuteCloudScript ( request, OnGetCharacterStatisticsSuccess, PF_Bridge.PlayFabErrorCallback ); } private static void OnGetCharacterStatisticsSuccess ( ExecuteCloudScriptResult result ) { if ( !PF_Bridge.VerifyErrorFreeCloudScriptResult ( result ) ) return; characterStatistics = PlayFab.Json.JsonWrapper.DeserializeObject<Dictionary<string, Dictionary<string, int>>> ( result.FunctionResult.ToString ( ) ); PF_Bridge.RaiseCallbackSuccess ( "", PlayFabAPIMethods.GetCharacterStatistics, MessageDisplayStyle.none ); } public static void UpdateCharacterStatistics ( string charID, Dictionary<string, int> updates ) { Dictionary<string, int> activeStats; characterStatistics.TryGetValue ( charID, out activeStats ); if ( activeStats != null ) { foreach ( var each in updates ) { if ( activeStats.ContainsKey ( each.Key ) ) { activeStats [ each.Key ] += each.Value; } else { activeStats.Add ( each.Key, each.Value ); } } var request = new ExecuteCloudScriptRequest { FunctionName = "UpdateCharacterStats", FunctionParameter = new { CharacterId = charID, CharacterStatistics = activeStats }, }; PlayFabClientAPI.ExecuteCloudScript ( request, OnUpdateCharacterStatisticsSuccess, PF_Bridge.PlayFabErrorCallback ); } } private static void OnUpdateCharacterStatisticsSuccess ( ExecuteCloudScriptResult result ) { if ( !PF_Bridge.VerifyErrorFreeCloudScriptResult ( result ) ) return; Debug.Log ( "Stats Saved!" ); PF_Bridge.RaiseCallbackSuccess ( "", PlayFabAPIMethods.UpdateCharacterStatistics, MessageDisplayStyle.none ); } } #endregion