diff --git a/README.md b/README.md index 0d40f5c..3d80b84 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Then run School of Dragons. - FuseItems - AddBattleItems - SetAchievementByEntityIDs +- RedeemMysteryBoxItems #### Implemented enough (probably) - GetRules (doesn't return any rules, probably doesn't need to) diff --git a/mitm-redirect.py b/mitm-redirect.py index 7d0c726..dc88cae 100644 --- a/mitm-redirect.py +++ b/mitm-redirect.py @@ -80,6 +80,7 @@ methods = [ 'SetUserAchievementAndGetReward', 'ProcessRewardedItems', 'ApplyPayout', + 'RedeemMysteryBoxItems', ] def routable(path): diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 3145392..8992c2d 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -607,22 +607,73 @@ public class ContentController : Controller { return Ok(new BuddyList { Buddy = new Buddy[0] }); } + [HttpPost] + [Produces("application/xml")] + [Route("/ContentWebService.asmx/RedeemMysteryBoxItems")] + [VikingSession] + public IActionResult RedeemMysteryBoxItems(Viking viking, [FromForm] string request) { + var req = XmlUtil.DeserializeXml(request); + + // get and reduce quantity of box item + InventoryItem? invItem = viking.Inventory.InventoryItems.FirstOrDefault(e => e.ItemId == req.ItemID); + if (invItem is null || invItem.Quantity < 1) { + return Ok(new CommonInventoryResponse{ Success = false }); + } + --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); + + // 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")) { + if (prizeItems.Count >= req.RedeemItemFetchCount) + break; + prizeItems.Add(itemService.GetItem(reward.ItemId)); + } + + return Ok(new CommonInventoryResponse{ + Success = true, + CommonInventoryIDs = new CommonInventoryResponseItem[]{ newInvItem }, + PrizeItems = new List{ new PrizeItemResponse{ + ItemID = req.ItemID, + PrizeItemID = newItem.ItemID, + MysteryPrizeItems = prizeItems, + }} + }); + } + [HttpPost] [Produces("application/xml")] [Route("V2/ContentWebService.asmx/PurchaseItems")] [VikingSession] public IActionResult PurchaseItems(Viking viking, [FromForm] string purchaseItemRequest) { PurchaseStoreItemRequest request = XmlUtil.DeserializeXml(purchaseItemRequest); - CommonInventoryResponseItem[] items = new CommonInventoryResponseItem[request.Items.Length]; + List items = new List(); for (int i = 0; i < request.Items.Length; i++) { - items[i] = inventoryService.AddItemToInventoryAndGetResponse(viking, request.Items[i], 1); + int itemId = request.Items[i]; + if (itemService.IsBundleItem(itemId) && !request.AddMysteryBoxToInventory) { + 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; + for (int j=0; j(itemIDArrayXml); CommonInventoryResponseItem[] items = new CommonInventoryResponseItem[itemIdArr.Length]; for (int i = 0; i < itemIdArr.Length; i++) { - items[i] = inventoryService.AddItemToInventoryAndGetResponse(viking, itemIdArr[i], 1); + int itemId = itemIdArr[i]; + if (itemService.IsBoxItem(itemId)) { + itemId = itemService.OpenBox(itemId).ItemId; + } + items[i] = 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. // Call AddItemToInventoryAndGetResponse with Quantity == 1 we get response with quantity == 0. } diff --git a/src/Services/ItemService.cs b/src/Services/ItemService.cs index ff5ddf3..59971a4 100644 --- a/src/Services/ItemService.cs +++ b/src/Services/ItemService.cs @@ -52,6 +52,18 @@ namespace sodoff.Services { return null; } + public ItemDataRelationship OpenBox(int boxItemId) { + return OpenBox(items[boxItemId]); + } + + public bool IsBoxItem(int itemId) { + return items[itemId].Relationship?.FirstOrDefault(e => e.Type == "Prize") != null; + } + + public bool IsBundleItem(int itemId) { + return items[itemId].Relationship?.FirstOrDefault(e => e.Type == "Bundle") != null; + } + public bool CheckItemGender(ItemData itemData, Gender gender) { string? itemGender = itemData.Attribute?.FirstOrDefault(e => e.Key == "Gender")?.Value; if (itemGender != null) {