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; } }