メインコンテンツまでスキップ

ルートボックスロール関数入門

Last updated on August 13, 2024
備考

Extend is in Open Beta for AGS Private Cloud! This means that the Extend add-on is available for you to try in your development environment. You can submit your feedback via our Extend Open Beta feedback form.

Overview

This article walks you through how to modify the Extend Override app template for the loot box roll function and transform it into your own app that fits your requirements.

Contract function

There is only one function in the contract. It is shown in the snippet below which is a unary function called RollLootBoxRewards.

service LootBox {
rpc RollLootBoxRewards(RollLootBoxRewardsRequest) returns (RollLootBoxRewardsResponse);
}

RollLootBoxRewards

RollLootBoxRewards is called by AccelByte Gaming Services (AGS) when a player consumes a loot box, and it is used for implementing the logic to decide which reward items will be given to a specified player from a given loot box rewards list.

In this example, we are generating as many reward item results in the requested quantity.

First, we select rewards randomly based on the total reward weight sum. The bigger the weight, the higher probability for the reward to be selected. We will also get a random item from the selected reward. Finally, we add that item to the final results as the response.

In the app template, the following function can be found in src/AccelByte.PluginArch.LootBox.Demo.Server/Services/LootboxFunctionService.cs.

public override Task<RollLootBoxRewardsResponse> RollLootBoxRewards(RollLootBoxRewardsRequest request, ServerCallContext context)
{
var rewards = request.ItemInfo.LootBoxRewards;

int rewardWeightSum = 0;
foreach (var reward in rewards)
rewardWeightSum += reward.Weight;

Random rand = new Random();

List<RewardObject> result = new List<RewardObject>();
for (int i = 0; i < request.Quantity; i++)
{
int selectedIdx = 0;
for (double r = rand.NextDouble() * rewardWeightSum; selectedIdx < rewards.Count - 1; selectedIdx++)
{
r -= rewards[selectedIdx].Weight;
if (r <= 0.0)
break;
}

var selectedReward = rewards[selectedIdx];
int itemCount = selectedReward.Items.Count;

int selectedItemIdx = (int)Math.Round(rand.NextDouble() * (double)(itemCount - 1));
BoxItemObject selectedItem = selectedReward.Items[selectedItemIdx];

var rewardObject = new RewardObject()
{
ItemId = selectedItem.ItemId,
ItemSku = selectedItem.ItemSku,
Count = selectedItem.Count
};
result.Add(rewardObject);
}

RollLootBoxRewardsResponse response = new RollLootBoxRewardsResponse();
response.Rewards.AddRange(result);

return Task.FromResult(response);
}