From b5e76d1846d5f48388ebf566aeb8561adf7fabe3 Mon Sep 17 00:00:00 2001 From: Robert Paciorek Date: Fri, 1 Sep 2023 00:44:19 +0000 Subject: [PATCH] DT reward bugfix + GetUserCurrency function - bugfix DT rewards: - fix selling from reward screen - fix showing in inventory without reload - add InventoryService.SellInventoryItem - add AchievementService.GetUserCurrency function --- README.md | 1 + mitm-redirect.py | 1 + src/Controllers/Common/ContentController.cs | 136 +++++++++++------- src/Schema/ActionType.cs | 16 +++ .../CommonInventoryResponseRewardBinItem.cs | 10 ++ src/Schema/ItemActionTypeMap.cs | 19 +++ src/Schema/ProcessRewardedItemsRequest.cs | 10 ++ src/Schema/ProcessRewardedItemsResponse.cs | 19 +++ src/Services/AchievementService.cs | 10 ++ src/Services/InventoryService.cs | 29 ++++ 10 files changed, 201 insertions(+), 50 deletions(-) create mode 100644 src/Schema/ActionType.cs create mode 100644 src/Schema/CommonInventoryResponseRewardBinItem.cs create mode 100644 src/Schema/ItemActionTypeMap.cs create mode 100644 src/Schema/ProcessRewardedItemsRequest.cs create mode 100644 src/Schema/ProcessRewardedItemsResponse.cs diff --git a/README.md b/README.md index 4998895..b88746b 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ Then run School of Dragons. - SetNextItemState (may require more work, we don't know yet) - SetUserRoom - SetUserAchievementTask (returns a real reward but still use task placeholder) +- ProcessRewardedItems (need add cash reward) - SellItems (need add cash reward) - ApplyRewards diff --git a/mitm-redirect.py b/mitm-redirect.py index 5b4bdcb..cb9c296 100644 --- a/mitm-redirect.py +++ b/mitm-redirect.py @@ -78,6 +78,7 @@ methods = [ 'DeleteProfile', 'DeleteAccountNotification', 'SetUserAchievementAndGetReward', + 'ProcessRewardedItems', ] def routable(path): diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index b281e12..fcf4656 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -620,12 +620,7 @@ public class ContentController : Controller { CommonInventoryResponse response = new CommonInventoryResponse { Success = true, CommonInventoryIDs = items, - UserGameCurrency = new UserGameCurrency { - UserID = Guid.Parse(viking.Id), - UserGameCurrencyID = 1, // TODO: user's wallet ID? - CashCurrency = 65536, - GameCurrency = 65536, - } + UserGameCurrency = achievementService.GetUserCurrency(viking) }; return Ok(response); } @@ -646,12 +641,7 @@ public class ContentController : Controller { CommonInventoryResponse response = new CommonInventoryResponse { Success = true, CommonInventoryIDs = items, - UserGameCurrency = new UserGameCurrency { - UserID = Guid.Parse(viking.Id), - UserGameCurrencyID = 1, // TODO: user's wallet ID? - CashCurrency = 65536, - GameCurrency = 65536, - } + UserGameCurrency = achievementService.GetUserCurrency(viking) }; return Ok(response); } @@ -803,14 +793,10 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] [Route("ContentWebService.asmx/GetUserGameCurrency")] - public IActionResult GetUserGameCurrency([FromForm] string userId) { + [VikingSession] + public IActionResult GetUserGameCurrency(Viking viking) { // TODO: This is a placeholder - return Ok(new UserGameCurrency { - CashCurrency = 65536, - GameCurrency = 65536, - UserGameCurrencyID = 0, - UserID = Guid.Parse(userId) - }); + return Ok(achievementService.GetUserCurrency(viking)); } [HttpPost] @@ -947,6 +933,8 @@ public class ContentController : Controller { ); } + // NOTE: saved inside AddBattleItemToInventory + // return response with new item info return Ok(new FuseItemsResponse { Status = Status.Success, @@ -959,40 +947,19 @@ public class ContentController : Controller { [Route("V2/ContentWebService.asmx/SellItems")] [VikingSession] public IActionResult SellItems(Viking viking, [FromForm] string sellItemsRequest) { - int price = 0; + int shard = 0; + int gold = 0; SellItemsRequest req = XmlUtil.DeserializeXml(sellItemsRequest); foreach (var invItemID in req.UserInventoryCommonIDs) { - // get item from inventory - InventoryItem? item = viking.Inventory.InventoryItems.FirstOrDefault(e => e.Id == invItemID); - - // get item data - ItemData? itemData = itemService.GetItem(item.ItemId); - - // calculate price - switch (itemData.ItemRarity) { - case ItemRarity.Common: - price += 1; - break; - case ItemRarity.Rare: - price += 3; - break; - case ItemRarity.Epic: - price += 5; - break; - case ItemRarity.Legendary: - price += 10; - break; - } - - // TODO: cash rewards - - // remove item - viking.Inventory.InventoryItems.Remove(item); + inventoryService.SellInventoryItem(viking, invItemID, ref gold, ref shard); } - - // apply shards reward - CommonInventoryResponseItem? resShardsItem = inventoryService.AddItemToInventoryAndGetResponse(viking, InventoryService.Shards, price); + // apply shards reward + CommonInventoryResponseItem resShardsItem = inventoryService.AddItemToInventoryAndGetResponse(viking, InventoryService.Shards, shard); + + // apply cash (gold) reward from sell items + achievementService.AddAchievementPoints(viking, AchievementPointTypes.GameCurrency, gold); + // save ctx.SaveChanges(); @@ -1001,7 +968,8 @@ public class ContentController : Controller { Success = true, CommonInventoryIDs = new CommonInventoryResponseItem[] { resShardsItem - } + }, + UserGameCurrency = achievementService.GetUserCurrency(viking) }); } @@ -1022,12 +990,79 @@ public class ContentController : Controller { } } + // NOTE: saved inside AddBattleItemToInventory + return Ok(new AddBattleItemsResponse{ Status = Status.Success, InventoryItemStatsMaps = resItemList }); } + [HttpPost] + [Produces("application/xml")] + [Route("V2/ContentWebService.asmx/ProcessRewardedItems")] + [VikingSession] + public IActionResult ProcessRewardedItems(Viking viking, [FromForm] string request) { + ProcessRewardedItemsRequest req = XmlUtil.DeserializeXml(request); + + int shard = 0; + int gold = 0; + bool soldInventoryItems = false; + bool soldRewardBinItems = false; + var itemsAddedToInventory = new List(); + foreach (ItemActionTypeMap actionMap in req.ItemsActionMap) { + switch (actionMap.Action) { + case ActionType.MoveToInventory: + // item is in inventory in result of ApplyRewards ... only add to itemsAddedToInventory + itemsAddedToInventory.Add (new CommonInventoryResponseRewardBinItem { + ItemID = viking.Inventory.InventoryItems.FirstOrDefault(e => e.Id == actionMap.ID).ItemId, + CommonInventoryID = actionMap.ID, + Quantity = 0, + UserItemStatsMapID = actionMap.ID + }); + break; + case ActionType.SellInventoryItem: + soldInventoryItems = true; + inventoryService.SellInventoryItem(viking, actionMap.ID, ref gold, ref shard); + break; + case ActionType.SellRewardBinItem: + soldRewardBinItems = true; + inventoryService.SellInventoryItem(viking, actionMap.ID, ref gold, ref shard); + break; + } + } + + // apply shards reward from sell items + InventoryItem item = inventoryService.AddItemToInventory(viking, InventoryService.Shards, shard); + + // NOTE: client expects multiple items each with quantity = 0 + var inventoryResponse = new CommonInventoryResponseItem[shard]; + for (int i=0; i e.Id == invItemID); + + // get item data + ItemData? itemData = itemService.GetItem(item.ItemId); + + // calculate shard price + switch (itemData.ItemRarity) { + case ItemRarity.Common: + shard += 1; + break; + case ItemRarity.Rare: + shard += 3; + break; + case ItemRarity.Epic: + shard += 5; + break; + case ItemRarity.Legendary: + shard += 10; + break; + } + + // TODO: calculate cash (gold) rewards + + // remove item + viking.Inventory.InventoryItems.Remove(item); + } + public CommonInventoryData GetCommonInventoryData(Viking viking) { List items = viking.Inventory.InventoryItems.ToList();