I created 4 different achievements in Title Data but I don't know how to update the achievements.
I wrote some code to update the achievements in Title Data after the player has finished a level in my game, but I get this error when I want to save the CloudScript revision:
SyntaxError: Unexpected token . at Script Document [3]:20:20 -> args.AchievementKey: NewAchievement.addvalue
What is wrong with my code? How can I change the value of args.AchievementKey?
I create the achievements when the player starts the game the very first time:
handlers.CreateAchievementsReadOnlyData = function (args, context) { var resultdata = server.GetUserReadOnlyData({PlayFabId: currentPlayerId, Keys: "Finish level 1"}); // first search for the current achievement info if(resultdata.Data.hasOwnProperty("Finish level 1")) { // if achievements info already exists in readonly data log.info("Already has achievements info."); // notify the client that Achievements info already been set } else {// if achievements info hasn't been set yet, set it for the user server.UpdateUserReadOnlyData({ PlayFabId: currentPlayerId, Data: { "Finish level 1": "false", "Finish level 1 three times": "false", "Level1FinishTimes": "0", "Kill all enemies in this level": "false", "Get 10.000 points": "false", // You get points after you finiseh a level. I want to sum all points and check if the player has reached 10.000 points. "PlayerTotalpoints": "0" }, Permission: UserDataPermission.Public }); log.info("Achievements info has now been set."); } return resultdata; }
I always need to update the achievements after the player finished a level. But I don't know how to do this correctly.
handlers.UpdateAchievementReadOnlyData = function (args, context) { var resultdata = server.GetUserReadOnlyData({PlayFabId: currentPlayerId, Keys: args.AchievementKey}); var achievementkey = args.AchievementKey; var NewAchievement = ChooseanAchievement(args.AchievementKey); if ((resultdata.Data.hasOwnProperty(args.AchievementKey)) && (NewAchievement.achievement != "")) { // if achievement info already exists in readonly data if ((resultdata.Data.args.AchievementKey.Value != null) && (resultdata.Data.args.AchievementKey.Value != "")) { // make sure the value is not null or "" server.UpdateUserReadOnlyData({ PlayFabId: currentPlayerId, Data: { args.AchievementKey: NewAchievement.addvalue }, Permission: UserDataPermission.Public }); log.info("Updating achievement was succuessful."); } else { log.info("This achievement exists but has no value."); } } else { log.info("This achievement does not exist."); } return server.GetUserReadOnlyData({PlayFabID: currentPlayerId, Keys: args.AchievementKey}).Data.args.AchievementKey.Value; } function ChooseanAchievement(achievementkey) { switch (achievementkey) { case "Finish level 1": log.info("Trying to update achievement: Finish level 1"); return{achievement: "Finish level 1", addvalue: true}; 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": return{achievement: "Kill all enemies in this level", addvalue: true}; break; default: // if the achievementkey is not valid return{achievement: "", addvalue: 0}; break; } }
The two keys/value pairs "Level1FinishTimes": "0" and "PlayerTotalpoints": "0" are no achievements, I created these two key/value pairs in order to count how often the player finished level 1 and in order to count how many points the player has already collected.
What is the best way to update my achievements? Could you give me some recommendations or examples?
Client code:
string AchievementName = "Finish level 1"; private async Task UpdateAchievements() { var result = await PlayFabClientAPI.ExecuteCloudScriptAsync(new ExecuteCloudScriptRequest() { FunctionName = "UpdateAchievementReadOnlyData", FunctionParameter = new { AchievementKey = AchievementName }, GeneratePlayStreamEvent = true }); if (result.Error != null) Console.WriteLine(result.Error.Error.ToString()); else { if (result.Result.Logs.Count() > 0) { //... } } }
UPDATE:
I changed the code in handlers.UpdateAchievementReadOnlyData, but I still get a JavascriptException and I don't know how to fix this problem.
What is wrong with my code in handlers.UpdateAchievementReadOnlyData?
Raw event JSON { "EventName": "player_executed_cloudscript", "Source": "CloudScript", "FunctionName": "UpdateAchievementReadOnlyData", "CloudScriptExecutionResult": { "FunctionName": "UpdateAchievementReadOnlyData", "Revision": 92, "FunctionResult": null, "FunctionResultTooLarge": null, "Logs": [ { "Level": "Info", "Message": "Trying to update achievement: Finish level 1", "Data": null } ], "LogsTooLarge": null, "ExecutionTimeSeconds": 0.016638, "ProcessorTimeSeconds": 0, "MemoryConsumedBytes": 58768, "APIRequestsIssued": 1, "HttpRequestsIssued": 0, "Error": { "Error": "JavascriptException", "Message": "JavascriptException", "StackTrace": "TypeError: Cannot read property 'AchievementKey' of undefined\n at handlers.UpdateAchievementReadOnlyData (BFD0A-main.js:15:37)" } },
handlers.UpdateAchievementReadOnlyData = function (args, context) { var resultdata = server.GetUserReadOnlyData({PlayFabId: currentPlayerId, Keys: args.AchievementKey}); var achievementkey = args.AchievementKey; var NewAchievement = ChooseanAchievement(args.AchievementKey); if ((resultdata.Data.hasOwnProperty(args.AchievementKey)) && (NewAchievement.achievement != "")) { // if achievement info already exists in readonly data if ((resultdata.Data.args.AchievementKey.Value != null) && (resultdata.Data.args.AchievementKey.Value != "")) { // make sure the value is not null or "" var MyRequest = { PlayFabId: currentPlayerId, Data: { }, Permission: UserDataPermission.Public }; MyRequest.Data[args.AchievementKey] = NewAchievement.addvalue; server.UpdateUserReadOnlyData(MyRequest); log.info("Updating achievement " + NewAchievement.achievement.toString() + " was succuessful."); } else { log.info("This achievement exists but has no value."); } } else { log.info("This achievement does not exist."); } return server.GetUserReadOnlyData({PlayFabID: currentPlayerId, Keys: args.AchievementKey}).Data.args.AchievementKey.Value; }