diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index f3a48b1..41c5499 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -620,15 +620,15 @@ public class ContentController : Controller { } --invItem.Quantity; - // get real item id (from box) and add it to inventory - ItemData boxItem = itemService.GetItem(req.ItemID); - ItemData newItem = itemService.GetItem(itemService.OpenBox(boxItem).ItemId); - CommonInventoryResponseItem newInvItem = inventoryService.AddItemToInventoryAndGetResponse(viking, newItem.ItemID, 1); + // get real item id (from box) add it to inventory + itemService.OpenBox(req.ItemID, out int newItemId, out int quantity); + ItemData newItem = itemService.GetItem(newItemId); + CommonInventoryResponseItem newInvItem = inventoryService.AddItemToInventoryAndGetResponse(viking, newItem.ItemID, quantity); // prepare list of possible rewards for response List prizeItems = new List(); prizeItems.Add(newItem); - foreach (var reward in boxItem.Relationship.Where(e => e.Type == "Prize")) { + foreach (var reward in itemService.GetItem(req.ItemID).Relationship.Where(e => e.Type == "Prize")) { if (prizeItems.Count >= req.RedeemItemFetchCount) break; prizeItems.Add(itemService.GetItem(reward.ItemId)); @@ -654,17 +654,23 @@ public class ContentController : Controller { List items = new List(); for (int i = 0; i < request.Items.Length; i++) { int itemId = request.Items[i]; - if (itemService.IsBundleItem(itemId) && !request.AddMysteryBoxToInventory) { + if (request.AddMysteryBoxToInventory) { + // force add boxes as item (without "opening") + items.Add(inventoryService.AddItemToInventoryAndGetResponse(viking, itemId, 1)); + } else if (itemService.IsBundleItem(itemId)) { + // open and add bundle ItemData bundleItem = itemService.GetItem(itemId); foreach (var reward in bundleItem.Relationship.Where(e => e.Type == "Bundle")) { - int quantity = reward.Quantity; - if (quantity == 0) - quantity = 1; + int quantity = itemService.GetItemQuantity(reward); for (int j=0; j(itemIDArrayXml); - CommonInventoryResponseItem[] items = new CommonInventoryResponseItem[itemIdArr.Length]; + List items = new List(); for (int i = 0; i < itemIdArr.Length; i++) { - int itemId = itemIdArr[i]; - if (itemService.IsBoxItem(itemId)) { - itemId = itemService.OpenBox(itemId).ItemId; + itemService.CheckAndOpenBox(itemIdArr[i], out int itemId, out int quantity); + for (int j=0; j(request); List achievementRewards = new List(); - UserItemStatsMap? rewardedItem = null; - CommonInventoryResponse? rewardedBlueprint = null; + UserItemStatsMap? rewardedBattleItem = null; + CommonInventoryResponse? rewardedStandardItem = null; int rewardMultipler = 0; if (req.LevelRewardType == LevelRewardType.LevelFailure) { @@ -1175,23 +1174,26 @@ public class ContentController : Controller { ); } - // - battle backpack items and blueprints + // - battle backpack items, blueprints and other items if (req.LevelRewardType != LevelRewardType.LevelFailure) { Gender gender = XmlUtil.DeserializeXml(viking.AvatarSerialized).GenderType; ItemData rewardItem = itemService.GetDTReward(gender); - if (itemService.ItemHasCategory(rewardItem, 651)) { - // blueprint - CommonInventoryResponseItem blueprintItem = inventoryService.AddItemToInventoryAndGetResponse(viking, rewardItem.ItemID, 1); - rewardedBlueprint = new CommonInventoryResponse { + if (itemService.ItemHasCategory(rewardItem, 651) || rewardItem.PossibleStatsMap is null) { + // blueprint or no battle item (including box) + List standardItems = new List(); + itemService.CheckAndOpenBox(rewardItem.ItemID, out int itemId, out int quantity); + for (int i=0; i16160 16209 16162 + + + 18794 + 18794 + 18794 + 18794 diff --git a/src/Schema/ItemDataRelationship.cs b/src/Schema/ItemDataRelationship.cs index b9b918a..c15424b 100644 --- a/src/Schema/ItemDataRelationship.cs +++ b/src/Schema/ItemDataRelationship.cs @@ -17,4 +17,7 @@ public class ItemDataRelationship [XmlElement(ElementName = "q")] public int Quantity; + + [XmlElement(ElementName = "mxq")] + public int? MaxQuantity; } diff --git a/src/Services/ItemService.cs b/src/Services/ItemService.cs index 59971a4..ce8cc9b 100644 --- a/src/Services/ItemService.cs +++ b/src/Services/ItemService.cs @@ -35,6 +35,16 @@ namespace sodoff.Services { return items[itemID]; } + public int GetItemQuantity(ItemDataRelationship itemData) { + if (itemData.MaxQuantity is null || itemData.MaxQuantity < 2 || itemData.MaxQuantity == itemData.Quantity) { + if (itemData.Quantity == 0) + return 1; + else + return itemData.Quantity; + } + return random.Next(1, (int)itemData.MaxQuantity + 1); + } + public ItemDataRelationship OpenBox(ItemData boxItem) { var boxRewards = boxItem.Relationship.Where(e => e.Type == "Prize").ToArray(); int totalWeight = boxRewards.Sum(e => e.Weight); @@ -52,8 +62,19 @@ namespace sodoff.Services { return null; } - public ItemDataRelationship OpenBox(int boxItemId) { - return OpenBox(items[boxItemId]); + public void OpenBox(int boxItemId, out int itemId, out int quantity) { + var reward = OpenBox(items[boxItemId]); + itemId = reward.ItemId; + quantity = GetItemQuantity(reward); + } + + public void CheckAndOpenBox(int boxItemId, out int itemId, out int quantity) { + if (IsBoxItem(boxItemId)) { + OpenBox(boxItemId, out itemId, out quantity); + } else { + itemId = boxItemId; + quantity = 1; + } } public bool IsBoxItem(int itemId) {