mirror of
https://github.com/SoDOff-Project/sodoff.git
synced 2025-10-11 08:18:49 -07:00
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:
parent
c039337430
commit
b5e76d1846
@ -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
|
||||
|
||||
|
@ -78,6 +78,7 @@ methods = [
|
||||
'DeleteProfile',
|
||||
'DeleteAccountNotification',
|
||||
'SetUserAchievementAndGetReward',
|
||||
'ProcessRewardedItems',
|
||||
]
|
||||
|
||||
def routable(path):
|
||||
|
@ -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>(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<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
16
src/Schema/ActionType.cs
Normal 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
|
||||
}
|
10
src/Schema/CommonInventoryResponseRewardBinItem.cs
Normal file
10
src/Schema/CommonInventoryResponseRewardBinItem.cs
Normal 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; }
|
||||
}
|
19
src/Schema/ItemActionTypeMap.cs
Normal file
19
src/Schema/ItemActionTypeMap.cs
Normal 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; }
|
||||
}
|
10
src/Schema/ProcessRewardedItemsRequest.cs
Normal file
10
src/Schema/ProcessRewardedItemsRequest.cs
Normal 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; }
|
||||
}
|
19
src/Schema/ProcessRewardedItemsResponse.cs
Normal file
19
src/Schema/ProcessRewardedItemsResponse.cs
Normal 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; }
|
||||
}
|
@ -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)
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user