I need to update the value of the achievement "Level1FinishTimes" with server.UpdateUserReadOnlyData(MyRequest); before I call ChooseanAchievement() for the next key/value pair.
For example, it's necessary that the achievement "Level1FinishTimes" is already updated before I call
ChooseanAchievement()-->case "Finish level 1 three times". Because I need to check in case "Finish level 1 three times" if ((Number(resultdatalevel1finish.Data.Level1FinishTimes.Value) >= 3).
But I get a JavascriptException in my for loop:
"Error": { "Error": "JavascriptException", "Message": "JavascriptException", "StackTrace": "TypeError: Cannot read property 'achievement' of undefined\n at handlers.UpdateAchievementsReadOnlyData (BFD0A-main.js:24:34)\n at Object.invokeFunction (Script:116:33)" }
What is wrong with "newAchievements[key].achievement" in my for loop?
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 "Level1FinishTimes": if (result.Data.hasOwnProperty(achievementkey)) { if ((result.Data[achievementkey].Value != null) && (result.Data[achievementkey].Value != "")) { if (Number(achievementvalue) == 1) { log.info("Level1FinishTimes ok" + achievementkey + achievementvalue); return { achievement: achievementkey, addvalue: Number(result.Data[achievementkey].Value) + Number(achievementvalue) }; } else { log.info("Level1FinishTimes" + achievementkey + achievementvalue); 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 ((Number(resultdatalevel1finish.Data.Level1FinishTimes.Value) >= 3) && (achievementvalue == true)) { log.info("Finish level 1 three times ok" + achievementkey + achievementvalue); return { achievement: achievementkey, addvalue: achievementvalue }; } else { log.info("Finish level 1 three times" + achievementkey + achievementvalue); return { achievement: achievementkey, addvalue: result.Data[achievementkey].Value }; } } else return { achievement: "", addvalue: false }; } else return { achievement: "", addvalue: false }; break; } }