forked from SoDOff-Project/sodoff
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)
|
- SetNextItemState (may require more work, we don't know yet)
|
||||||
- SetUserRoom
|
- SetUserRoom
|
||||||
- SetUserAchievementTask (returns a real reward but still use task placeholder)
|
- SetUserAchievementTask (returns a real reward but still use task placeholder)
|
||||||
|
- ProcessRewardedItems (need add cash reward)
|
||||||
- SellItems (need add cash reward)
|
- SellItems (need add cash reward)
|
||||||
- ApplyRewards
|
- ApplyRewards
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ methods = [
|
|||||||
'DeleteProfile',
|
'DeleteProfile',
|
||||||
'DeleteAccountNotification',
|
'DeleteAccountNotification',
|
||||||
'SetUserAchievementAndGetReward',
|
'SetUserAchievementAndGetReward',
|
||||||
|
'ProcessRewardedItems',
|
||||||
]
|
]
|
||||||
|
|
||||||
def routable(path):
|
def routable(path):
|
||||||
|
@ -620,12 +620,7 @@ public class ContentController : Controller {
|
|||||||
CommonInventoryResponse response = new CommonInventoryResponse {
|
CommonInventoryResponse response = new CommonInventoryResponse {
|
||||||
Success = true,
|
Success = true,
|
||||||
CommonInventoryIDs = items,
|
CommonInventoryIDs = items,
|
||||||
UserGameCurrency = new UserGameCurrency {
|
UserGameCurrency = achievementService.GetUserCurrency(viking)
|
||||||
UserID = Guid.Parse(viking.Id),
|
|
||||||
UserGameCurrencyID = 1, // TODO: user's wallet ID?
|
|
||||||
CashCurrency = 65536,
|
|
||||||
GameCurrency = 65536,
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
return Ok(response);
|
return Ok(response);
|
||||||
}
|
}
|
||||||
@ -646,12 +641,7 @@ public class ContentController : Controller {
|
|||||||
CommonInventoryResponse response = new CommonInventoryResponse {
|
CommonInventoryResponse response = new CommonInventoryResponse {
|
||||||
Success = true,
|
Success = true,
|
||||||
CommonInventoryIDs = items,
|
CommonInventoryIDs = items,
|
||||||
UserGameCurrency = new UserGameCurrency {
|
UserGameCurrency = achievementService.GetUserCurrency(viking)
|
||||||
UserID = Guid.Parse(viking.Id),
|
|
||||||
UserGameCurrencyID = 1, // TODO: user's wallet ID?
|
|
||||||
CashCurrency = 65536,
|
|
||||||
GameCurrency = 65536,
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
return Ok(response);
|
return Ok(response);
|
||||||
}
|
}
|
||||||
@ -803,14 +793,10 @@ public class ContentController : Controller {
|
|||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Produces("application/xml")]
|
[Produces("application/xml")]
|
||||||
[Route("ContentWebService.asmx/GetUserGameCurrency")]
|
[Route("ContentWebService.asmx/GetUserGameCurrency")]
|
||||||
public IActionResult GetUserGameCurrency([FromForm] string userId) {
|
[VikingSession]
|
||||||
|
public IActionResult GetUserGameCurrency(Viking viking) {
|
||||||
// TODO: This is a placeholder
|
// TODO: This is a placeholder
|
||||||
return Ok(new UserGameCurrency {
|
return Ok(achievementService.GetUserCurrency(viking));
|
||||||
CashCurrency = 65536,
|
|
||||||
GameCurrency = 65536,
|
|
||||||
UserGameCurrencyID = 0,
|
|
||||||
UserID = Guid.Parse(userId)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@ -947,6 +933,8 @@ public class ContentController : Controller {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: saved inside AddBattleItemToInventory
|
||||||
|
|
||||||
// return response with new item info
|
// return response with new item info
|
||||||
return Ok(new FuseItemsResponse {
|
return Ok(new FuseItemsResponse {
|
||||||
Status = Status.Success,
|
Status = Status.Success,
|
||||||
@ -959,40 +947,19 @@ public class ContentController : Controller {
|
|||||||
[Route("V2/ContentWebService.asmx/SellItems")]
|
[Route("V2/ContentWebService.asmx/SellItems")]
|
||||||
[VikingSession]
|
[VikingSession]
|
||||||
public IActionResult SellItems(Viking viking, [FromForm] string sellItemsRequest) {
|
public IActionResult SellItems(Viking viking, [FromForm] string sellItemsRequest) {
|
||||||
int price = 0;
|
int shard = 0;
|
||||||
|
int gold = 0;
|
||||||
SellItemsRequest req = XmlUtil.DeserializeXml<SellItemsRequest>(sellItemsRequest);
|
SellItemsRequest req = XmlUtil.DeserializeXml<SellItemsRequest>(sellItemsRequest);
|
||||||
foreach (var invItemID in req.UserInventoryCommonIDs) {
|
foreach (var invItemID in req.UserInventoryCommonIDs) {
|
||||||
// get item from inventory
|
inventoryService.SellInventoryItem(viking, invItemID, ref gold, ref shard);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
// save
|
||||||
ctx.SaveChanges();
|
ctx.SaveChanges();
|
||||||
|
|
||||||
@ -1001,7 +968,8 @@ public class ContentController : Controller {
|
|||||||
Success = true,
|
Success = true,
|
||||||
CommonInventoryIDs = new CommonInventoryResponseItem[] {
|
CommonInventoryIDs = new CommonInventoryResponseItem[] {
|
||||||
resShardsItem
|
resShardsItem
|
||||||
}
|
},
|
||||||
|
UserGameCurrency = achievementService.GetUserCurrency(viking)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1022,12 +990,79 @@ public class ContentController : Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: saved inside AddBattleItemToInventory
|
||||||
|
|
||||||
return Ok(new AddBattleItemsResponse{
|
return Ok(new AddBattleItemsResponse{
|
||||||
Status = Status.Success,
|
Status = Status.Success,
|
||||||
InventoryItemStatsMaps = resItemList
|
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]
|
[HttpPost]
|
||||||
[Produces("application/xml")]
|
[Produces("application/xml")]
|
||||||
[Route("V2/ContentWebService.asmx/ApplyRewards")]
|
[Route("V2/ContentWebService.asmx/ApplyRewards")]
|
||||||
@ -1091,6 +1126,7 @@ public class ContentController : Controller {
|
|||||||
Item = item.Item,
|
Item = item.Item,
|
||||||
ItemStats = item.ItemStatsMap.ItemStats,
|
ItemStats = item.ItemStatsMap.ItemStats,
|
||||||
ItemTier = item.ItemStatsMap.ItemTier,
|
ItemTier = item.ItemStatsMap.ItemTier,
|
||||||
|
UserItemStatsMapID = item.CommonInventoryID,
|
||||||
CreatedDate = new DateTime(DateTime.Now.Ticks)
|
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];
|
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) {
|
public CommonInventoryData GetCommonInventoryData(Viking viking) {
|
||||||
List<InventoryItem> items = viking.Inventory.InventoryItems.ToList();
|
List<InventoryItem> items = viking.Inventory.InventoryItems.ToList();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user