bugfix: check item gender for mystery box rewards

This commit is contained in:
Robert Paciorek 2023-10-09 12:07:32 +00:00 committed by Spirtix
parent 6b12363dbd
commit 132057911f
2 changed files with 20 additions and 11 deletions

View File

@ -714,7 +714,8 @@ public class ContentController : Controller {
--invItem.Quantity; --invItem.Quantity;
// get real item id (from box) add it to inventory // get real item id (from box) add it to inventory
itemService.OpenBox(req.ItemID, out int newItemId, out int quantity); Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
itemService.OpenBox(req.ItemID, gender, out int newItemId, out int quantity);
ItemData newItem = itemService.GetItem(newItemId); ItemData newItem = itemService.GetItem(newItemId);
CommonInventoryResponseItem newInvItem = inventoryService.AddItemToInventoryAndGetResponse(viking, newItem.ItemID, quantity); CommonInventoryResponseItem newInvItem = inventoryService.AddItemToInventoryAndGetResponse(viking, newItem.ItemID, quantity);
@ -745,6 +746,7 @@ public class ContentController : Controller {
public IActionResult PurchaseItems(Viking viking, [FromForm] string purchaseItemRequest) { public IActionResult PurchaseItems(Viking viking, [FromForm] string purchaseItemRequest) {
PurchaseStoreItemRequest request = XmlUtil.DeserializeXml<PurchaseStoreItemRequest>(purchaseItemRequest); PurchaseStoreItemRequest request = XmlUtil.DeserializeXml<PurchaseStoreItemRequest>(purchaseItemRequest);
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>(); List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
for (int i = 0; i < request.Items.Length; i++) { for (int i = 0; i < request.Items.Length; i++) {
int itemId = request.Items[i]; int itemId = request.Items[i];
if (request.AddMysteryBoxToInventory) { if (request.AddMysteryBoxToInventory) {
@ -760,7 +762,7 @@ public class ContentController : Controller {
} }
} else { } else {
// check for mystery box ... open if need // check for mystery box ... open if need
itemService.CheckAndOpenBox(itemId, out itemId, out int quantity); itemService.CheckAndOpenBox(itemId, gender, out itemId, out int quantity);
for (int j=0; j<quantity; ++j) { for (int j=0; j<quantity; ++j) {
items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1)); items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
} }
@ -784,8 +786,9 @@ public class ContentController : Controller {
public IActionResult PurchaseItemsV1(Viking viking, [FromForm] string itemIDArrayXml) { public IActionResult PurchaseItemsV1(Viking viking, [FromForm] string itemIDArrayXml) {
int[] itemIdArr = XmlUtil.DeserializeXml<int[]>(itemIDArrayXml); int[] itemIdArr = XmlUtil.DeserializeXml<int[]>(itemIDArrayXml);
List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>(); List<CommonInventoryResponseItem> items = new List<CommonInventoryResponseItem>();
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
for (int i = 0; i < itemIdArr.Length; i++) { for (int i = 0; i < itemIdArr.Length; i++) {
itemService.CheckAndOpenBox(itemIdArr[i], out int itemId, out int quantity); itemService.CheckAndOpenBox(itemIdArr[i], gender, out int itemId, out int quantity);
for (int j=0; j<quantity; ++j) { for (int j=0; j<quantity; ++j) {
items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1)); items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
// NOTE: The quantity of purchased items is always 0 and the items are instead duplicated in both the request and the response. // NOTE: The quantity of purchased items is always 0 and the items are instead duplicated in both the request and the response.
@ -1095,11 +1098,12 @@ public class ContentController : Controller {
// NOTE: we haven't saved any changes so far ... so we can safely interrupt "fusing" by return in loops above // NOTE: we haven't saved any changes so far ... so we can safely interrupt "fusing" by return in loops above
var resItemList = new List<InventoryItemStatsMap>(); var resItemList = new List<InventoryItemStatsMap>();
Gender gender = XmlUtil.DeserializeXml<AvatarData>(viking.AvatarSerialized).GenderType;
foreach (BluePrintSpecification output in blueprintItem.BluePrint.Outputs) { foreach (BluePrintSpecification output in blueprintItem.BluePrint.Outputs) {
if (output.ItemID is null) if (output.ItemID is null)
continue; continue;
itemService.CheckAndOpenBox((int)(output.ItemID), out int newItemId, out int quantity); itemService.CheckAndOpenBox((int)(output.ItemID), gender, out int newItemId, out int quantity);
for (int i=0; i<quantity; ++i) { for (int i=0; i<quantity; ++i) {
resItemList.Add( resItemList.Add(
inventoryService.AddBattleItemToInventory(viking, newItemId, (int)output.Tier) inventoryService.AddBattleItemToInventory(viking, newItemId, (int)output.Tier)
@ -1295,7 +1299,7 @@ public class ContentController : Controller {
if (itemService.ItemHasCategory(rewardItem, 651) || rewardItem.PossibleStatsMap is null) { if (itemService.ItemHasCategory(rewardItem, 651) || rewardItem.PossibleStatsMap is null) {
// blueprint or no battle item (including box) // blueprint or no battle item (including box)
List<CommonInventoryResponseItem> standardItems = new List<CommonInventoryResponseItem>(); List<CommonInventoryResponseItem> standardItems = new List<CommonInventoryResponseItem>();
itemService.CheckAndOpenBox(rewardItem.ItemID, out int itemId, out int quantity); itemService.CheckAndOpenBox(rewardItem.ItemID, gender, out int itemId, out int quantity);
for (int i=0; i<quantity; ++i) { for (int i=0; i<quantity; ++i) {
standardItems.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1)); standardItems.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1));
// NOTE: client require single quantity items // NOTE: client require single quantity items

View File

@ -45,7 +45,7 @@ namespace sodoff.Services {
return random.Next(1, (int)itemData.MaxQuantity + 1); return random.Next(1, (int)itemData.MaxQuantity + 1);
} }
public ItemDataRelationship OpenBox(ItemData boxItem) { public ItemDataRelationship OpenBox(ItemData boxItem, Gender gender) {
var boxRewards = boxItem.Relationship.Where(e => e.Type == "Prize").ToArray(); var boxRewards = boxItem.Relationship.Where(e => e.Type == "Prize").ToArray();
int totalWeight = boxRewards.Sum(e => e.Weight); int totalWeight = boxRewards.Sum(e => e.Weight);
if (totalWeight == 0) { if (totalWeight == 0) {
@ -55,22 +55,27 @@ namespace sodoff.Services {
int win = random.Next(0, totalWeight); int win = random.Next(0, totalWeight);
foreach (var reward in boxRewards) { foreach (var reward in boxRewards) {
cnt += reward.Weight; cnt += reward.Weight;
if (cnt > win) { if (cnt > win && CheckItemGender(items[reward.ItemId], gender)) {
return reward;
}
}
foreach (var reward in boxRewards) { // do again in case high `win` value and CheckItemGender fail
if (CheckItemGender(items[reward.ItemId], gender)) {
return reward; return reward;
} }
} }
return null; return null;
} }
public void OpenBox(int boxItemId, out int itemId, out int quantity) { public void OpenBox(int boxItemId, Gender gender, out int itemId, out int quantity) {
var reward = OpenBox(items[boxItemId]); var reward = OpenBox(items[boxItemId], gender);
itemId = reward.ItemId; itemId = reward.ItemId;
quantity = GetItemQuantity(reward); quantity = GetItemQuantity(reward);
} }
public void CheckAndOpenBox(int boxItemId, out int itemId, out int quantity) { public void CheckAndOpenBox(int boxItemId, Gender gender, out int itemId, out int quantity) {
if (IsBoxItem(boxItemId)) { if (IsBoxItem(boxItemId)) {
OpenBox(boxItemId, out itemId, out quantity); OpenBox(boxItemId, gender, out itemId, out quantity);
} else { } else {
itemId = boxItemId; itemId = boxItemId;
quantity = 1; quantity = 1;