question

yazanshannek10 avatar image
yazanshannek10 asked

Solve a problem with Cloud Scripts,Solve a problem with Cloud Scripts and Currencies

I am designing a game and trying, when the player enters the game, to send a request to the Cloud script and have it return some player data. I am using the Cloud script to perform the command once and not send too many messages to reduce the waiting time for the player. After the Cloud sends the response, I organize the data. So far, the Cloud sends the level data, and this is the code in use handlers.getPlayerLevel = function (context) { try { var getPlayerDataRequest = { PlayFabId: currentPlayerId, Keys: ["Experience"] };

     var getPlayerDataResponse = server.GetUserData(getPlayerDataRequest);

     var playerExperience = 0;

     if (getPlayerDataResponse && getPlayerDataResponse.Data && getPlayerDataResponse.Data["Experience"]) {
         playerExperience = parseInt(getPlayerDataResponse.Data["Experience"].Value, 10);
     } else {
         var createPlayerExperienceRequest = {
             PlayFabId: currentPlayerId,
             Data: {
                 "Experience": "0"
             }
         };
         server.UpdateUserData(createPlayerExperienceRequest);
     }

     var playerLevel = calculatePlayerLevel(playerExperience);
     var remainingExperience = calculateRemainingExperience(playerExperience, playerLevel);

     return {
         CurrentLevel: playerLevel,
         CurrentExperience: playerExperience,
         RemainingExperienceForNextLevel: remainingExperience
     };
 } catch (error) {
     return error.message;
 }

};

function calculatePlayerLevel(experience) { var baseExperience = 100; var experienceMultiplier = 1.15;

 var level = 1;
 var requiredExperience = baseExperience;

 while (experience >= requiredExperience) {
     experience -= requiredExperience;
     level++;
     requiredExperience = Math.floor(baseExperience * Math.pow(experienceMultiplier, level - 1));
 }

 return level;

}

function calculateRemainingExperience(totalExperience, currentLevel) { var baseExperience = 100; var experienceMultiplier = 1.15;

 var requiredExperience = Math.floor(baseExperience * Math.pow(experienceMultiplier, currentLevel - 1));
 return Math.max(0, requiredExperience - totalExperience);

}

I tried to modify the code to return a 'CN' value, but it no longer works correctly, and I don't know why. Here is the new code."

handlers.getPlayerLevel = function (context) { try { var playerExperience = getPlayerExperience(); var currencyValue = getPlayerCurrency("CN"); var playerLevel = calculatePlayerLevel(playerExperience); var remainingExperience = calculateRemainingExperience(playerExperience, playerLevel);

     return {
         CurrentLevel: playerLevel,
         CurrentExperience: playerExperience,
         RemainingExperienceForNextLevel: remainingExperience
     };
 } catch (error) {
     console.error("Error in getPlayerLevel:", error);
     return { error: error.message };
 }

};

function getPlayerExperience() { var getPlayerDataRequest = { PlayFabId: currentPlayerId, Keys: ["Experience"] };

 var getPlayerDataResponse = server.GetUserData(getPlayerDataRequest);

 if (getPlayerDataResponse && getPlayerDataResponse.Data && getPlayerDataResponse.Data["Experience"]) {
     return parseInt(getPlayerDataResponse.Data["Experience"].Value, 10);
 } else {
     createPlayerExperience("0");
     return 0;
 }

}

function createPlayerExperience(value) { var createPlayerExperienceRequest = { PlayFabId: currentPlayerId, Data: { "Experience": value } }; server.UpdateUserData(createPlayerExperienceRequest); }

function calculatePlayerLevel(experience) { var baseExperience = 100; var experienceMultiplier = 1.15;

 return Math.floor(1 + Math.log(experience / baseExperience) / Math.log(experienceMultiplier));

}

function calculateRemainingExperience(totalExperience, currentLevel) { var baseExperience = 100; var experienceMultiplier = 1.15;

 var requiredExperience = Math.floor(baseExperience * Math.pow(experienceMultiplier, currentLevel - 1));
 return Math.max(0, requiredExperience - totalExperience);

}

function getPlayerCurrency(currencyCode) { var getUserCurrencyRequest = { PlayFabId: currentPlayerId }; var userCurrency = server.GetUserVirtualCurrencyBalance(getUserCurrencyRequest);

 return userCurrency && userCurrency.VirtualCurrency && userCurrency.VirtualCurrency[currencyCode] || 0;

}

CloudScriptIn-Game Economy
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

·
Xiao Zha avatar image
Xiao Zha answered

GetUserVirtualCurrencyBalance is not an API of PlayFab. And there is no need to get the player data and currency value in CloudScript as those data can be retrieved via Login API. You could just use the GetUserVirtualCurrency, GetUserData and UserDataKeys option in the InfoRequestParameters of the Login API call.

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.