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
This commit is contained in:
Robert Paciorek 2023-09-01 00:44:19 +00:00 committed by Spirtix
parent c039337430
commit b5e76d1846
10 changed files with 201 additions and 50 deletions

View File

@ -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

View File

@ -78,6 +78,7 @@ methods = [
'DeleteProfile',
'DeleteAccountNotification',
'SetUserAchievementAndGetReward',
'ProcessRewardedItems',
]
def routable(path):

View File

@ -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,39 +947,18 @@ 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>(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);
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<ProcessRewardedItemsRequest>(request);
int shard = 0;
int gold = 0;
bool soldInventoryItems = false;
bool soldRewardBinItems = false;
var itemsAddedToInventory = new List<CommonInventoryResponseRewardBinItem>();
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<shard; ++i) {
inventoryResponse[i] = new CommonInventoryResponseItem {
CommonInventoryID = item.Id,
ItemID = item.ItemId,
Quantity = 0
};
}
// apply cash (gold) reward from sell items
achievementService.AddAchievementPoints(viking, AchievementPointTypes.GameCurrency, gold);
// save
ctx.SaveChanges();
return Ok(new ProcessRewardedItemsResponse {
SoldInventoryItems = soldInventoryItems,
SoldRewardBinItems = soldRewardBinItems,
MovedRewardBinItems = itemsAddedToInventory.ToArray(),
CommonInventoryResponse = new CommonInventoryResponse {
Success = false,
CommonInventoryIDs = inventoryResponse,
UserGameCurrency = achievementService.GetUserCurrency(viking)
}
});
}
[HttpPost]
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/ApplyRewards")]
@ -1091,6 +1126,7 @@ public class ContentController : Controller {
Item = item.Item,
ItemStats = item.ItemStatsMap.ItemStats,
ItemTier = item.ItemStatsMap.ItemTier,
UserItemStatsMapID = item.CommonInventoryID,
CreatedDate = new DateTime(DateTime.Now.Ticks)
};
}

16
src/Schema/ActionType.cs Normal file
View File

@ -0,0 +1,16 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "ACT")]
[Serializable]
public enum ActionType {
[XmlEnum("1")]
MoveToInventory = 1,
[XmlEnum("2")]
SellInventoryItem = 2,
[XmlEnum("3")]
SellRewardBinItem = 3
}

View File

@ -0,0 +1,10 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "CIRBI", Namespace = "")]
[Serializable]
public class CommonInventoryResponseRewardBinItem : CommonInventoryResponseItem {
[XmlElement(ElementName = "UISMID", IsNullable = false)]
public int UserItemStatsMapID { get; set; }
}

View File

@ -0,0 +1,19 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "IATM", IsNullable = true)]
[Serializable]
public class ItemActionTypeMap {
[XmlElement(ElementName = "ID", IsNullable = false)]
public int ID { get; set; }
[XmlElement(ElementName = "IM", IsNullable = false)]
public int InventoryMax { get; set; }
[XmlElement(ElementName = "IU", IsNullable = false)]
public int ItemUses { get; set; }
[XmlElement(ElementName = "ACT", IsNullable = false)]
public ActionType Action { get; set; }
}

View File

@ -0,0 +1,10 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "PRIREQ", IsNullable = true)]
[Serializable]
public class ProcessRewardedItemsRequest {
[XmlElement(ElementName = "IATM", IsNullable = false)]
public ItemActionTypeMap[] ItemsActionMap { get; set; }
}

View File

@ -0,0 +1,19 @@
using System.Xml.Serialization;
namespace sodoff.Schema;
[XmlRoot(ElementName = "PRIRES", IsNullable = true)]
[Serializable]
public class ProcessRewardedItemsResponse {
[XmlElement(ElementName = "SII", IsNullable = true)]
public bool? SoldInventoryItems { get; set; }
[XmlElement(ElementName = "SRBI", IsNullable = true)]
public bool? SoldRewardBinItems { get; set; }
[XmlElement(ElementName = "CIRRBIS", IsNullable = true)]
public CommonInventoryResponseRewardBinItem[] MovedRewardBinItems { get; set; }
[XmlElement(ElementName = "CIR", IsNullable = true)]
public CommonInventoryResponse CommonInventoryResponse { get; set; }
}

View File

@ -155,5 +155,15 @@ namespace sodoff.Services {
return new AchievementReward[0];
}
}
public UserGameCurrency GetUserCurrency(Viking viking) {
// TODO: return real values (after implement currency collecting methods)
return new UserGameCurrency {
CashCurrency = 65536,
GameCurrency = 65536,
UserGameCurrencyID = 1, // TODO: user's wallet ID?
UserID = Guid.Parse(viking.Id)
};
}
}
}

View File

@ -71,6 +71,35 @@ namespace sodoff.Services {
};
}
public void SellInventoryItem(Viking viking, int invItemID, ref int gold, ref int shard) {
// get item from inventory
InventoryItem? item = viking.Inventory.InventoryItems.FirstOrDefault(e => 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<InventoryItem> items = viking.Inventory.InventoryItems.ToList();