question

Kim Strasser avatar image
Kim Strasser asked

How can I use arrays/lists in CloudScript to update achievements?

I want to update a few achievements in one handlers.UpdateAchievementsReadOnlyData call, but I don't know how to use arrays/lists in CloudScript.

I want to update all the achievements which are in the client code "AchievementKey = Achievementobject".

I use "achievementkey" in "function ChooseanAchievement(result, achievementkey, achievementvalue)" to check if the key/value pair exists.

I use "result.Data[achievementkey].Value" to find out if the achievement is already accomplished before or not. I only need to update the achievement if "result.Data[achievementkey].Value" != true. I don't need to update achievements that are already accomplished before.

"achievementvalue" comes from the client code, I always set "achievementvalue" to "true" in the client code if I want to update an achievement in CloudScript. I think "achievementvalue" is redundant, but I'm not sure.

After checking the achievements in "function ChooseanAchievement", I continue with "foreach (string key in NewAchievement)" because I want to update all keys that are != "". For example, if key = "Finish level 1", then call server.UpdateUserReadOnlyData.

I know that my CloudScript code is not working, but I don't know how to create arrays/lists to update all key/value pairs together in one call.

How can I use arrays/lists in CloudScript to update achievements?

Client code:

Dictionary<string, bool> Achievementobject = new Dictionary<string, bool>();
Achievementobject.Add("Finish level 1", true);
Achievementobject.Add("Finish level 1 three times", true);
Achievementobject.Add("Get 10.000 points", true);
Achievementobject.Add("Kill all enemies in this level", true);

private async Task UpdateAchievements()
{
    var result = await PlayFabClientAPI.ExecuteCloudScriptAsync(new ExecuteCloudScriptRequest()
    {
        FunctionName = "UpdateAchievementsReadOnlyData",
        FunctionParameter = new { AchievementKey = Achievementobject },
        GeneratePlayStreamEvent = true
    });

    if (result.Error != null)
        Console.WriteLine(result.Error.Error.ToString());
    else
    {
        if (result.Result.FunctionResult != null)
            Console.WriteLine("Achievements: " + result.Result.FunctionResult);
    }
}

CloudScript:

handlers.UpdateAchievementsReadOnlyData = function (args, context)
{
    var resultdata = server.GetUserReadOnlyData({PlayFabId: currentPlayerId, Keys: args.AchievementKeys});
    string NewAchievement[];

    foreach (string key in args.AchievementKeys.Keys)
    {
        NewAchievement.Add(ChooseanAchievement(resultdata, args.AchievementKey, args.AchievementKey.Value));
    }
    
    foreach (string key in NewAchievement)
    {
        if (key != "")
        {
         var MyRequest = {
               PlayFabId: currentPlayerId,
               Data: {    },
               Permission: UserDataPermission.Public
               };    
               
               MyRequest.Data[key] = NewAchievement[key];         
               server.UpdateUserReadOnlyData(MyRequest);
               
               log.info("Updating achievement " + MyRequest.Data[key] + " was succuessful.");
          }
          else
          { 
              log.info("Could not find this achievement.");
          }
    }
   
   return NewAchievement;
}

function ChooseanAchievement(result, achievementkey, achievementvalue)
{
    switch (achievementkey)
    {
    case "Finish level 1":
        if (result.Data.hasOwnProperty(achievementKey)
        {
        if ((result.Data[achievementkey].Value != null) && (result.Data[achievementkey].Value != ""))
        {
              if ((result.Data[achievementkey].Value == false) && (achievementvalue == true))
                  return{achievement: achievementkey, addvalue: achievementvalue};
              else
                  return{achievement: achievementkey, addvalue: result.Data[achievementkey].Value};
        }
        else
           return{achievement: "", addvalue: false};
        }
         else
           return{achievement: "", addvalue: false};
        break;
    case "Finish level 1 three times":
        var resultdatalevel1finish = server.GetUserReadOnlyData({PlayFabId: currentPlayerId, Keys: "Level1FinishTimes"});
        if(resultdatalevel1finish.Data.hasOwnProperty("Level1FinishTimes"))
        {
          if ((resultdatalevel1finish.Data.Level1FinishTimes.Value != null) && (resultdatalevel1finish.Data.Level1FinishTimes.Value != ""))
          { 
            if (resultdatalevel1finish.Data.Level1FinishTimes.Value >= 3)
              return{achievement: "Finish level 1 three times", addvalue: true};
            else
              return{achievement: "Finish level 1 three times", addvalue: false};
          }
          else
           return{achievement: "", addvalue: false};
        }
        else
         return{achievement: "", addvalue: false};
        break;
    case "Get 10.000 points":
        var resultdatapoints = server.GetUserReadOnlyData({PlayFabId: currentPlayerId, Keys: "PlayerTotalpoints"});
        if(resultdatapoints.Data.hasOwnProperty("PlayerTotalpoints"))
        {
          if ((resultdatapoints.Data.PlayerTotalpoints.Value != null) && (resultdatapoints.Data.PlayerTotalpoints.Value != ""))
          { 
            if (resultdatapoints.Data.PlayerTotalpoints.Value >= 10000)
              return{achievement: "Get 10.000 points", addvalue: true};
            else
              return{achievement: "Get 10.000 points", addvalue: false};
          }
          else
           return{achievement: "", addvalue: false};
        }
        else
         return{achievement: "", addvalue: false};
        break;
    case "Kill all enemies in this level":
        if (result.Data.hasOwnProperty(achievementKey)
        {
        if ((result.Data[achievementkey].Value != null) && (result.Data[achievementkey].Value != ""))
        {
          if ((result.Data[achievementkey].Value == false) && (achievementvalue == true))
              return{achievement: achievementkey, addvalue: achievementvalue};
          else
              return{achievement: achievementkey, addvalue: result.Data[achievementkey].Value};
        }
        else
           return{achievement: "", addvalue: false};
        }
         else
           return{achievement: "", addvalue: false};
        break;
    default: // if the achievementkey is not valid
        return{achievement: "", addvalue: false};
        break;
    }
}
CloudScript
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

1 Answer

·
Sarah Zhang avatar image
Sarah Zhang answered

Please refer to the following CloudScript code. There are several Js syntax issues in your code. You can search the basic JS syntaxes by yourself. For example, JavaScript Arrays, JavaScript Array forEach() Method, etc.

handlers.UpdateAchievementsReadOnlyData = function (args, context) {
    var achievementObject = args.AchievementObject;
    var achievementKeys = [];
    var newAchievements = [];

    for (var key in achievementObject) {
        achievementKeys.push(key);
    };


    log.info(achievementKeys);

    var getUserReadOnlyDataResult = server.GetUserReadOnlyData({ PlayFabId: currentPlayerId, Keys: achievementKeys });

    for (var key in achievementObject) {
        log.info("achievementObject[key]--->" + achievementObject[key]);
        newAchievements.push(ChooseanAchievement(getUserReadOnlyDataResult, key, achievementObject[key]));
    };

    for (var key in newAchievements) {


        if (newAchievements[key].achievement != "") {
            log.info("newAchievements.achievement " + newAchievements[key].achievement, "newAchievements.addvalue " + newAchievements[key].addvalue);
            var MyRequest = {
                PlayFabId: currentPlayerId,
                Data: {},
                Permission: UserDataPermission.Public
            };

            MyRequest.Data[newAchievements[key].achievement] = newAchievements[key].addvalue;
            server.UpdateUserReadOnlyData(MyRequest);

            log.info("Updating achievement " + newAchievements[key].achievement + " was succuessful.");
        }
        else {
            log.info("Could not find this achievement.");
        }
    };

}

function ChooseanAchievement(result, achievementkey, achievementvalue) {

    switch (achievementkey) {
        case "Finish level 1":
            if (result.Data.hasOwnProperty(achievementkey)) {
                if ((result.Data[achievementkey].Value != null) && (resultData[achievementkey].Value != "")) {
                    if ((result.Data[achievementkey].Value == "false") && (achievementvalue == true))
                        return { achievement: achievementkey, addvalue: achievementvalue };
                    else
                        return { achievement: achievementkey, addvalue: result.Data[achievementkey].Value };
                }
                else
                    return { achievement: "", addvalue: false };
            }
            else
                return { achievement: "", addvalue: false };
            break;

        case "Finish level 1 three times":
            var resultdatalevel1finish = server.GetUserReadOnlyData({ PlayFabId: currentPlayerId, Keys: ["Level1FinishTimes"] });

            if (resultdatalevel1finish.Data.hasOwnProperty("Level1FinishTimes")) {
                if ((resultdatalevel1finish.Data.Level1FinishTimes.Value != null) && (resultdatalevel1finish.Data.Level1FinishTimes.Value != "")) {
                    if (resultdatalevel1finish.Data.Level1FinishTimes.Value >= 3)
                        return { achievement: "Finish level 1 three times", addvalue: true };
                    else
                        return { achievement: "Finish level 1 three times", addvalue: false };
                }
                else
                    return { achievement: "", addvalue: false };
            }
            else
                return { achievement: "", addvalue: false };
            break;

        case "Get 10.000 points":
            var resultdatapoints = server.GetUserReadOnlyData({ PlayFabId: currentPlayerId, Keys: ["PlayerTotalpoints"] });

            if (resultdatapoints.Data.hasOwnProperty("PlayerTotalpoints")) {
                if ((resultdatapoints.Data.PlayerTotalpoints.Value != null) && (resultdatapoints.Data.PlayerTotalpoints.Value != "")) {
                    if (resultdatapoints.Data.PlayerTotalpoints.Value >= 10000)
                        return { achievement: "Get 10.000 points", addvalue: true };
                    else
                        return { achievement: "Get 10.000 points", addvalue: false };
                }
                else
                    return { achievement: "", addvalue: false };
            }
            else
                return { achievement: "", addvalue: false };
            break;

        case "Kill all enemies in this level":


            if (result.Data.hasOwnProperty(achievementkey)) {
                if ((result.Data[achievementkey].Value != null) && (result.Data[achievementkey].Value != "")) {

                    if ((result.Data[achievementkey].Value == "false") && (achievementvalue == true)) {

                        return { achievement: achievementkey, addvalue: achievementvalue };

                    }
                    else
                        return { achievement: achievementkey, addvalue: result.Data[achievementkey].Value };
                }
                else
                    return { achievement: "", addvalue: false };
            }
            else
                return { achievement: "", addvalue: false };
            break;
        default: // if the achievementkey is not valid
            return { achievement: "", addvalue: false };
            break;
    }
}



10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.